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/ExprCXX.h" 23 #include "clang/AST/ExprConcepts.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/EnterExpressionEvaluationContext.h" 35 #include "clang/Sema/Lookup.h" 36 #include "clang/Sema/Ownership.h" 37 #include "clang/Sema/ParsedTemplate.h" 38 #include "clang/Sema/ScopeInfo.h" 39 #include "clang/Sema/SemaDiagnostic.h" 40 #include "clang/Sema/SemaInternal.h" 41 #include "llvm/ADT/ArrayRef.h" 42 #include "llvm/Support/ErrorHandling.h" 43 #include <algorithm> 44 #include <optional> 45 46 using namespace llvm::omp; 47 48 namespace clang { 49 using namespace sema; 50 51 /// A semantic tree transformation that allows one to transform one 52 /// abstract syntax tree into another. 53 /// 54 /// A new tree transformation is defined by creating a new subclass \c X of 55 /// \c TreeTransform<X> and then overriding certain operations to provide 56 /// behavior specific to that transformation. For example, template 57 /// instantiation is implemented as a tree transformation where the 58 /// transformation of TemplateTypeParmType nodes involves substituting the 59 /// template arguments for their corresponding template parameters; a similar 60 /// transformation is performed for non-type template parameters and 61 /// template template parameters. 62 /// 63 /// This tree-transformation template uses static polymorphism to allow 64 /// subclasses to customize any of its operations. Thus, a subclass can 65 /// override any of the transformation or rebuild operators by providing an 66 /// operation with the same signature as the default implementation. The 67 /// overriding function should not be virtual. 68 /// 69 /// Semantic tree transformations are split into two stages, either of which 70 /// can be replaced by a subclass. The "transform" step transforms an AST node 71 /// or the parts of an AST node using the various transformation functions, 72 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 73 /// node of the appropriate kind from the pieces. The default transformation 74 /// routines recursively transform the operands to composite AST nodes (e.g., 75 /// the pointee type of a PointerType node) and, if any of those operand nodes 76 /// were changed by the transformation, invokes the rebuild operation to create 77 /// a new AST node. 78 /// 79 /// Subclasses can customize the transformation at various levels. The 80 /// most coarse-grained transformations involve replacing TransformType(), 81 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 82 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 83 /// new implementations. 84 /// 85 /// For more fine-grained transformations, subclasses can replace any of the 86 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 87 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 88 /// replacing TransformTemplateTypeParmType() allows template instantiation 89 /// to substitute template arguments for their corresponding template 90 /// parameters. Additionally, subclasses can override the \c RebuildXXX 91 /// functions to control how AST nodes are rebuilt when their operands change. 92 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 93 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 94 /// be able to use more efficient rebuild steps. 95 /// 96 /// There are a handful of other functions that can be overridden, allowing one 97 /// to avoid traversing nodes that don't need any transformation 98 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 99 /// operands have not changed (\c AlwaysRebuild()), and customize the 100 /// default locations and entity names used for type-checking 101 /// (\c getBaseLocation(), \c getBaseEntity()). 102 template<typename Derived> 103 class TreeTransform { 104 /// Private RAII object that helps us forget and then re-remember 105 /// the template argument corresponding to a partially-substituted parameter 106 /// pack. 107 class ForgetPartiallySubstitutedPackRAII { 108 Derived &Self; 109 TemplateArgument Old; 110 111 public: 112 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 113 Old = Self.ForgetPartiallySubstitutedPack(); 114 } 115 116 ~ForgetPartiallySubstitutedPackRAII() { 117 Self.RememberPartiallySubstitutedPack(Old); 118 } 119 }; 120 121 protected: 122 Sema &SemaRef; 123 124 /// The set of local declarations that have been transformed, for 125 /// cases where we are forced to build new declarations within the transformer 126 /// rather than in the subclass (e.g., lambda closure types). 127 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 128 129 public: 130 /// Initializes a new tree transformer. 131 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 132 133 /// Retrieves a reference to the derived class. 134 Derived &getDerived() { return static_cast<Derived&>(*this); } 135 136 /// Retrieves a reference to the derived class. 137 const Derived &getDerived() const { 138 return static_cast<const Derived&>(*this); 139 } 140 141 static inline ExprResult Owned(Expr *E) { return E; } 142 static inline StmtResult Owned(Stmt *S) { return S; } 143 144 /// Retrieves a reference to the semantic analysis object used for 145 /// this tree transform. 146 Sema &getSema() const { return SemaRef; } 147 148 /// Whether the transformation should always rebuild AST nodes, even 149 /// if none of the children have changed. 150 /// 151 /// Subclasses may override this function to specify when the transformation 152 /// should rebuild all AST nodes. 153 /// 154 /// We must always rebuild all AST nodes when performing variadic template 155 /// pack expansion, in order to avoid violating the AST invariant that each 156 /// statement node appears at most once in its containing declaration. 157 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 158 159 /// Whether the transformation is forming an expression or statement that 160 /// replaces the original. In this case, we'll reuse mangling numbers from 161 /// existing lambdas. 162 bool ReplacingOriginal() { return false; } 163 164 /// Wether CXXConstructExpr can be skipped when they are implicit. 165 /// They will be reconstructed when used if needed. 166 /// This is useful when the user that cause rebuilding of the 167 /// CXXConstructExpr is outside of the expression at which the TreeTransform 168 /// started. 169 bool AllowSkippingCXXConstructExpr() { return true; } 170 171 /// Returns the location of the entity being transformed, if that 172 /// information was not available elsewhere in the AST. 173 /// 174 /// By default, returns no source-location information. Subclasses can 175 /// provide an alternative implementation that provides better location 176 /// information. 177 SourceLocation getBaseLocation() { return SourceLocation(); } 178 179 /// Returns the name of the entity being transformed, if that 180 /// information was not available elsewhere in the AST. 181 /// 182 /// By default, returns an empty name. Subclasses can provide an alternative 183 /// implementation with a more precise name. 184 DeclarationName getBaseEntity() { return DeclarationName(); } 185 186 /// Sets the "base" location and entity when that 187 /// information is known based on another transformation. 188 /// 189 /// By default, the source location and entity are ignored. Subclasses can 190 /// override this function to provide a customized implementation. 191 void setBase(SourceLocation Loc, DeclarationName Entity) { } 192 193 /// RAII object that temporarily sets the base location and entity 194 /// used for reporting diagnostics in types. 195 class TemporaryBase { 196 TreeTransform &Self; 197 SourceLocation OldLocation; 198 DeclarationName OldEntity; 199 200 public: 201 TemporaryBase(TreeTransform &Self, SourceLocation Location, 202 DeclarationName Entity) : Self(Self) { 203 OldLocation = Self.getDerived().getBaseLocation(); 204 OldEntity = Self.getDerived().getBaseEntity(); 205 206 if (Location.isValid()) 207 Self.getDerived().setBase(Location, Entity); 208 } 209 210 ~TemporaryBase() { 211 Self.getDerived().setBase(OldLocation, OldEntity); 212 } 213 }; 214 215 /// Determine whether the given type \p T has already been 216 /// transformed. 217 /// 218 /// Subclasses can provide an alternative implementation of this routine 219 /// to short-circuit evaluation when it is known that a given type will 220 /// not change. For example, template instantiation need not traverse 221 /// non-dependent types. 222 bool AlreadyTransformed(QualType T) { 223 return T.isNull(); 224 } 225 226 /// Transform a template parameter depth level. 227 /// 228 /// During a transformation that transforms template parameters, this maps 229 /// an old template parameter depth to a new depth. 230 unsigned TransformTemplateDepth(unsigned Depth) { 231 return Depth; 232 } 233 234 /// Determine whether the given call argument should be dropped, e.g., 235 /// because it is a default argument. 236 /// 237 /// Subclasses can provide an alternative implementation of this routine to 238 /// determine which kinds of call arguments get dropped. By default, 239 /// CXXDefaultArgument nodes are dropped (prior to transformation). 240 bool DropCallArgument(Expr *E) { 241 return E->isDefaultArgument(); 242 } 243 244 /// Determine whether we should expand a pack expansion with the 245 /// given set of parameter packs into separate arguments by repeatedly 246 /// transforming the pattern. 247 /// 248 /// By default, the transformer never tries to expand pack expansions. 249 /// Subclasses can override this routine to provide different behavior. 250 /// 251 /// \param EllipsisLoc The location of the ellipsis that identifies the 252 /// pack expansion. 253 /// 254 /// \param PatternRange The source range that covers the entire pattern of 255 /// the pack expansion. 256 /// 257 /// \param Unexpanded The set of unexpanded parameter packs within the 258 /// pattern. 259 /// 260 /// \param ShouldExpand Will be set to \c true if the transformer should 261 /// expand the corresponding pack expansions into separate arguments. When 262 /// set, \c NumExpansions must also be set. 263 /// 264 /// \param RetainExpansion Whether the caller should add an unexpanded 265 /// pack expansion after all of the expanded arguments. This is used 266 /// when extending explicitly-specified template argument packs per 267 /// C++0x [temp.arg.explicit]p9. 268 /// 269 /// \param NumExpansions The number of separate arguments that will be in 270 /// the expanded form of the corresponding pack expansion. This is both an 271 /// input and an output parameter, which can be set by the caller if the 272 /// number of expansions is known a priori (e.g., due to a prior substitution) 273 /// and will be set by the callee when the number of expansions is known. 274 /// The callee must set this value when \c ShouldExpand is \c true; it may 275 /// set this value in other cases. 276 /// 277 /// \returns true if an error occurred (e.g., because the parameter packs 278 /// are to be instantiated with arguments of different lengths), false 279 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 280 /// must be set. 281 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 282 SourceRange PatternRange, 283 ArrayRef<UnexpandedParameterPack> Unexpanded, 284 bool &ShouldExpand, bool &RetainExpansion, 285 std::optional<unsigned> &NumExpansions) { 286 ShouldExpand = false; 287 return false; 288 } 289 290 /// "Forget" about the partially-substituted pack template argument, 291 /// when performing an instantiation that must preserve the parameter pack 292 /// use. 293 /// 294 /// This routine is meant to be overridden by the template instantiator. 295 TemplateArgument ForgetPartiallySubstitutedPack() { 296 return TemplateArgument(); 297 } 298 299 /// "Remember" the partially-substituted pack template argument 300 /// after performing an instantiation that must preserve the parameter pack 301 /// use. 302 /// 303 /// This routine is meant to be overridden by the template instantiator. 304 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 305 306 /// Note to the derived class when a function parameter pack is 307 /// being expanded. 308 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 309 310 /// Transforms the given type into another type. 311 /// 312 /// By default, this routine transforms a type by creating a 313 /// TypeSourceInfo for it and delegating to the appropriate 314 /// function. This is expensive, but we don't mind, because 315 /// this method is deprecated anyway; all users should be 316 /// switched to storing TypeSourceInfos. 317 /// 318 /// \returns the transformed type. 319 QualType TransformType(QualType T); 320 321 /// Transforms the given type-with-location into a new 322 /// type-with-location. 323 /// 324 /// By default, this routine transforms a type by delegating to the 325 /// appropriate TransformXXXType to build a new type. Subclasses 326 /// may override this function (to take over all type 327 /// transformations) or some set of the TransformXXXType functions 328 /// to alter the transformation. 329 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 330 331 /// Transform the given type-with-location into a new 332 /// type, collecting location information in the given builder 333 /// as necessary. 334 /// 335 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 336 337 /// Transform a type that is permitted to produce a 338 /// DeducedTemplateSpecializationType. 339 /// 340 /// This is used in the (relatively rare) contexts where it is acceptable 341 /// for transformation to produce a class template type with deduced 342 /// template arguments. 343 /// @{ 344 QualType TransformTypeWithDeducedTST(QualType T); 345 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 346 /// @} 347 348 /// The reason why the value of a statement is not discarded, if any. 349 enum StmtDiscardKind { 350 SDK_Discarded, 351 SDK_NotDiscarded, 352 SDK_StmtExprResult, 353 }; 354 355 /// Transform the given statement. 356 /// 357 /// By default, this routine transforms a statement by delegating to the 358 /// appropriate TransformXXXStmt function to transform a specific kind of 359 /// statement or the TransformExpr() function to transform an expression. 360 /// Subclasses may override this function to transform statements using some 361 /// other mechanism. 362 /// 363 /// \returns the transformed statement. 364 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 365 366 /// Transform the given statement. 367 /// 368 /// By default, this routine transforms a statement by delegating to the 369 /// appropriate TransformOMPXXXClause function to transform a specific kind 370 /// of clause. Subclasses may override this function to transform statements 371 /// using some other mechanism. 372 /// 373 /// \returns the transformed OpenMP clause. 374 OMPClause *TransformOMPClause(OMPClause *S); 375 376 /// Transform the given attribute. 377 /// 378 /// By default, this routine transforms a statement by delegating to the 379 /// appropriate TransformXXXAttr function to transform a specific kind 380 /// of attribute. Subclasses may override this function to transform 381 /// attributed statements/types using some other mechanism. 382 /// 383 /// \returns the transformed attribute 384 const Attr *TransformAttr(const Attr *S); 385 386 // Transform the given statement attribute. 387 // 388 // Delegates to the appropriate TransformXXXAttr function to transform a 389 // specific kind of statement attribute. Unlike the non-statement taking 390 // version of this, this implements all attributes, not just pragmas. 391 const Attr *TransformStmtAttr(const Stmt *OrigS, const Stmt *InstS, 392 const Attr *A); 393 394 // Transform the specified attribute. 395 // 396 // Subclasses should override the transformation of attributes with a pragma 397 // spelling to transform expressions stored within the attribute. 398 // 399 // \returns the transformed attribute. 400 #define ATTR(X) \ 401 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 402 #include "clang/Basic/AttrList.inc" 403 404 // Transform the specified attribute. 405 // 406 // Subclasses should override the transformation of attributes to do 407 // transformation and checking of statement attributes. By default, this 408 // delegates to the non-statement taking version. 409 // 410 // \returns the transformed attribute. 411 #define ATTR(X) \ 412 const X##Attr *TransformStmt##X##Attr(const Stmt *, const Stmt *, \ 413 const X##Attr *A) { \ 414 return getDerived().Transform##X##Attr(A); \ 415 } 416 #include "clang/Basic/AttrList.inc" 417 418 /// Transform the given expression. 419 /// 420 /// By default, this routine transforms an expression by delegating to the 421 /// appropriate TransformXXXExpr function to build a new expression. 422 /// Subclasses may override this function to transform expressions using some 423 /// other mechanism. 424 /// 425 /// \returns the transformed expression. 426 ExprResult TransformExpr(Expr *E); 427 428 /// Transform the given initializer. 429 /// 430 /// By default, this routine transforms an initializer by stripping off the 431 /// semantic nodes added by initialization, then passing the result to 432 /// TransformExpr or TransformExprs. 433 /// 434 /// \returns the transformed initializer. 435 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 436 437 /// Transform the given list of expressions. 438 /// 439 /// This routine transforms a list of expressions by invoking 440 /// \c TransformExpr() for each subexpression. However, it also provides 441 /// support for variadic templates by expanding any pack expansions (if the 442 /// derived class permits such expansion) along the way. When pack expansions 443 /// are present, the number of outputs may not equal the number of inputs. 444 /// 445 /// \param Inputs The set of expressions to be transformed. 446 /// 447 /// \param NumInputs The number of expressions in \c Inputs. 448 /// 449 /// \param IsCall If \c true, then this transform is being performed on 450 /// function-call arguments, and any arguments that should be dropped, will 451 /// be. 452 /// 453 /// \param Outputs The transformed input expressions will be added to this 454 /// vector. 455 /// 456 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 457 /// due to transformation. 458 /// 459 /// \returns true if an error occurred, false otherwise. 460 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 461 SmallVectorImpl<Expr *> &Outputs, 462 bool *ArgChanged = nullptr); 463 464 /// Transform the given declaration, which is referenced from a type 465 /// or expression. 466 /// 467 /// By default, acts as the identity function on declarations, unless the 468 /// transformer has had to transform the declaration itself. Subclasses 469 /// may override this function to provide alternate behavior. 470 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 471 llvm::DenseMap<Decl *, Decl *>::iterator Known 472 = TransformedLocalDecls.find(D); 473 if (Known != TransformedLocalDecls.end()) 474 return Known->second; 475 476 return D; 477 } 478 479 /// Transform the specified condition. 480 /// 481 /// By default, this transforms the variable and expression and rebuilds 482 /// the condition. 483 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 484 Expr *Expr, 485 Sema::ConditionKind Kind); 486 487 /// Transform the attributes associated with the given declaration and 488 /// place them on the new declaration. 489 /// 490 /// By default, this operation does nothing. Subclasses may override this 491 /// behavior to transform attributes. 492 void transformAttrs(Decl *Old, Decl *New) { } 493 494 /// Note that a local declaration has been transformed by this 495 /// transformer. 496 /// 497 /// Local declarations are typically transformed via a call to 498 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 499 /// the transformer itself has to transform the declarations. This routine 500 /// can be overridden by a subclass that keeps track of such mappings. 501 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 502 assert(New.size() == 1 && 503 "must override transformedLocalDecl if performing pack expansion"); 504 TransformedLocalDecls[Old] = New.front(); 505 } 506 507 /// Transform the definition of the given declaration. 508 /// 509 /// By default, invokes TransformDecl() to transform the declaration. 510 /// Subclasses may override this function to provide alternate behavior. 511 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 512 return getDerived().TransformDecl(Loc, D); 513 } 514 515 /// Transform the given declaration, which was the first part of a 516 /// nested-name-specifier in a member access expression. 517 /// 518 /// This specific declaration transformation only applies to the first 519 /// identifier in a nested-name-specifier of a member access expression, e.g., 520 /// the \c T in \c x->T::member 521 /// 522 /// By default, invokes TransformDecl() to transform the declaration. 523 /// Subclasses may override this function to provide alternate behavior. 524 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 525 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 526 } 527 528 /// Transform the set of declarations in an OverloadExpr. 529 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 530 LookupResult &R); 531 532 /// Transform the given nested-name-specifier with source-location 533 /// information. 534 /// 535 /// By default, transforms all of the types and declarations within the 536 /// nested-name-specifier. Subclasses may override this function to provide 537 /// alternate behavior. 538 NestedNameSpecifierLoc 539 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 540 QualType ObjectType = QualType(), 541 NamedDecl *FirstQualifierInScope = nullptr); 542 543 /// Transform the given declaration name. 544 /// 545 /// By default, transforms the types of conversion function, constructor, 546 /// and destructor names and then (if needed) rebuilds the declaration name. 547 /// Identifiers and selectors are returned unmodified. Subclasses may 548 /// override this function to provide alternate behavior. 549 DeclarationNameInfo 550 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 551 552 bool TransformRequiresExprRequirements( 553 ArrayRef<concepts::Requirement *> Reqs, 554 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 555 concepts::TypeRequirement * 556 TransformTypeRequirement(concepts::TypeRequirement *Req); 557 concepts::ExprRequirement * 558 TransformExprRequirement(concepts::ExprRequirement *Req); 559 concepts::NestedRequirement * 560 TransformNestedRequirement(concepts::NestedRequirement *Req); 561 562 /// Transform the given template name. 563 /// 564 /// \param SS The nested-name-specifier that qualifies the template 565 /// name. This nested-name-specifier must already have been transformed. 566 /// 567 /// \param Name The template name to transform. 568 /// 569 /// \param NameLoc The source location of the template name. 570 /// 571 /// \param ObjectType If we're translating a template name within a member 572 /// access expression, this is the type of the object whose member template 573 /// is being referenced. 574 /// 575 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 576 /// also refers to a name within the current (lexical) scope, this is the 577 /// declaration it refers to. 578 /// 579 /// By default, transforms the template name by transforming the declarations 580 /// and nested-name-specifiers that occur within the template name. 581 /// Subclasses may override this function to provide alternate behavior. 582 TemplateName 583 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 584 SourceLocation NameLoc, 585 QualType ObjectType = QualType(), 586 NamedDecl *FirstQualifierInScope = nullptr, 587 bool AllowInjectedClassName = false); 588 589 /// Transform the given template argument. 590 /// 591 /// By default, this operation transforms the type, expression, or 592 /// declaration stored within the template argument and constructs a 593 /// new template argument from the transformed result. Subclasses may 594 /// override this function to provide alternate behavior. 595 /// 596 /// Returns true if there was an error. 597 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 598 TemplateArgumentLoc &Output, 599 bool Uneval = false); 600 601 /// Transform the given set of template arguments. 602 /// 603 /// By default, this operation transforms all of the template arguments 604 /// in the input set using \c TransformTemplateArgument(), and appends 605 /// the transformed arguments to the output list. 606 /// 607 /// Note that this overload of \c TransformTemplateArguments() is merely 608 /// a convenience function. Subclasses that wish to override this behavior 609 /// should override the iterator-based member template version. 610 /// 611 /// \param Inputs The set of template arguments to be transformed. 612 /// 613 /// \param NumInputs The number of template arguments in \p Inputs. 614 /// 615 /// \param Outputs The set of transformed template arguments output by this 616 /// routine. 617 /// 618 /// Returns true if an error occurred. 619 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 620 unsigned NumInputs, 621 TemplateArgumentListInfo &Outputs, 622 bool Uneval = false) { 623 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 624 Uneval); 625 } 626 627 /// Transform the given set of template arguments. 628 /// 629 /// By default, this operation transforms all of the template arguments 630 /// in the input set using \c TransformTemplateArgument(), and appends 631 /// the transformed arguments to the output list. 632 /// 633 /// \param First An iterator to the first template argument. 634 /// 635 /// \param Last An iterator one step past the last template argument. 636 /// 637 /// \param Outputs The set of transformed template arguments output by this 638 /// routine. 639 /// 640 /// Returns true if an error occurred. 641 template<typename InputIterator> 642 bool TransformTemplateArguments(InputIterator First, 643 InputIterator Last, 644 TemplateArgumentListInfo &Outputs, 645 bool Uneval = false); 646 647 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 648 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 649 TemplateArgumentLoc &ArgLoc); 650 651 /// Fakes up a TypeSourceInfo for a type. 652 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 653 return SemaRef.Context.getTrivialTypeSourceInfo(T, 654 getDerived().getBaseLocation()); 655 } 656 657 #define ABSTRACT_TYPELOC(CLASS, PARENT) 658 #define TYPELOC(CLASS, PARENT) \ 659 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 660 #include "clang/AST/TypeLocNodes.def" 661 662 QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB, 663 TemplateTypeParmTypeLoc TL, 664 bool SuppressObjCLifetime); 665 QualType 666 TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB, 667 SubstTemplateTypeParmPackTypeLoc TL, 668 bool SuppressObjCLifetime); 669 670 template<typename Fn> 671 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 672 FunctionProtoTypeLoc TL, 673 CXXRecordDecl *ThisContext, 674 Qualifiers ThisTypeQuals, 675 Fn TransformExceptionSpec); 676 677 template <typename Fn> 678 QualType TransformAttributedType(TypeLocBuilder &TLB, AttributedTypeLoc TL, 679 Fn TransformModifiedType); 680 681 bool TransformExceptionSpec(SourceLocation Loc, 682 FunctionProtoType::ExceptionSpecInfo &ESI, 683 SmallVectorImpl<QualType> &Exceptions, 684 bool &Changed); 685 686 StmtResult TransformSEHHandler(Stmt *Handler); 687 688 QualType 689 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 690 TemplateSpecializationTypeLoc TL, 691 TemplateName Template); 692 693 QualType 694 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 695 DependentTemplateSpecializationTypeLoc TL, 696 TemplateName Template, 697 CXXScopeSpec &SS); 698 699 QualType TransformDependentTemplateSpecializationType( 700 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 701 NestedNameSpecifierLoc QualifierLoc); 702 703 /// Transforms the parameters of a function type into the 704 /// given vectors. 705 /// 706 /// The result vectors should be kept in sync; null entries in the 707 /// variables vector are acceptable. 708 /// 709 /// LastParamTransformed, if non-null, will be set to the index of the last 710 /// parameter on which transfromation was started. In the event of an error, 711 /// this will contain the parameter which failed to instantiate. 712 /// 713 /// Return true on error. 714 bool TransformFunctionTypeParams( 715 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 716 const QualType *ParamTypes, 717 const FunctionProtoType::ExtParameterInfo *ParamInfos, 718 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 719 Sema::ExtParameterInfoBuilder &PInfos, unsigned *LastParamTransformed); 720 721 bool TransformFunctionTypeParams( 722 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 723 const QualType *ParamTypes, 724 const FunctionProtoType::ExtParameterInfo *ParamInfos, 725 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 726 Sema::ExtParameterInfoBuilder &PInfos) { 727 return getDerived().TransformFunctionTypeParams( 728 Loc, Params, ParamTypes, ParamInfos, PTypes, PVars, PInfos, nullptr); 729 } 730 731 /// Transforms the parameters of a requires expresison into the given vectors. 732 /// 733 /// The result vectors should be kept in sync; null entries in the 734 /// variables vector are acceptable. 735 /// 736 /// Returns an unset ExprResult on success. Returns an ExprResult the 'not 737 /// satisfied' RequiresExpr if subsitution failed, OR an ExprError, both of 738 /// which are cases where transformation shouldn't continue. 739 ExprResult TransformRequiresTypeParams( 740 SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE, 741 RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params, 742 SmallVectorImpl<QualType> &PTypes, 743 SmallVectorImpl<ParmVarDecl *> &TransParams, 744 Sema::ExtParameterInfoBuilder &PInfos) { 745 if (getDerived().TransformFunctionTypeParams( 746 KWLoc, Params, /*ParamTypes=*/nullptr, 747 /*ParamInfos=*/nullptr, PTypes, &TransParams, PInfos)) 748 return ExprError(); 749 750 return ExprResult{}; 751 } 752 753 /// Transforms a single function-type parameter. Return null 754 /// on error. 755 /// 756 /// \param indexAdjustment - A number to add to the parameter's 757 /// scope index; can be negative 758 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 759 int indexAdjustment, 760 std::optional<unsigned> NumExpansions, 761 bool ExpectParameterPack); 762 763 /// Transform the body of a lambda-expression. 764 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 765 /// Alternative implementation of TransformLambdaBody that skips transforming 766 /// the body. 767 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 768 769 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 770 771 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 772 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 773 774 TemplateParameterList *TransformTemplateParameterList( 775 TemplateParameterList *TPL) { 776 return TPL; 777 } 778 779 ExprResult TransformAddressOfOperand(Expr *E); 780 781 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 782 bool IsAddressOfOperand, 783 TypeSourceInfo **RecoveryTSI); 784 785 ExprResult TransformParenDependentScopeDeclRefExpr( 786 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 787 TypeSourceInfo **RecoveryTSI); 788 789 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 790 791 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 792 // amount of stack usage with clang. 793 #define STMT(Node, Parent) \ 794 LLVM_ATTRIBUTE_NOINLINE \ 795 StmtResult Transform##Node(Node *S); 796 #define VALUESTMT(Node, Parent) \ 797 LLVM_ATTRIBUTE_NOINLINE \ 798 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 799 #define EXPR(Node, Parent) \ 800 LLVM_ATTRIBUTE_NOINLINE \ 801 ExprResult Transform##Node(Node *E); 802 #define ABSTRACT_STMT(Stmt) 803 #include "clang/AST/StmtNodes.inc" 804 805 #define GEN_CLANG_CLAUSE_CLASS 806 #define CLAUSE_CLASS(Enum, Str, Class) \ 807 LLVM_ATTRIBUTE_NOINLINE \ 808 OMPClause *Transform##Class(Class *S); 809 #include "llvm/Frontend/OpenMP/OMP.inc" 810 811 /// Build a new qualified type given its unqualified type and type location. 812 /// 813 /// By default, this routine adds type qualifiers only to types that can 814 /// have qualifiers, and silently suppresses those qualifiers that are not 815 /// permitted. Subclasses may override this routine to provide different 816 /// behavior. 817 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 818 819 /// Build a new pointer type given its pointee type. 820 /// 821 /// By default, performs semantic analysis when building the pointer type. 822 /// Subclasses may override this routine to provide different behavior. 823 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 824 825 /// Build a new block pointer type given its pointee type. 826 /// 827 /// By default, performs semantic analysis when building the block pointer 828 /// type. Subclasses may override this routine to provide different behavior. 829 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 830 831 /// Build a new reference type given the type it references. 832 /// 833 /// By default, performs semantic analysis when building the 834 /// reference type. Subclasses may override this routine to provide 835 /// different behavior. 836 /// 837 /// \param LValue whether the type was written with an lvalue sigil 838 /// or an rvalue sigil. 839 QualType RebuildReferenceType(QualType ReferentType, 840 bool LValue, 841 SourceLocation Sigil); 842 843 /// Build a new member pointer type given the pointee type and the 844 /// class type it refers into. 845 /// 846 /// By default, performs semantic analysis when building the member pointer 847 /// type. Subclasses may override this routine to provide different behavior. 848 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 849 SourceLocation Sigil); 850 851 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 852 SourceLocation ProtocolLAngleLoc, 853 ArrayRef<ObjCProtocolDecl *> Protocols, 854 ArrayRef<SourceLocation> ProtocolLocs, 855 SourceLocation ProtocolRAngleLoc); 856 857 /// Build an Objective-C object type. 858 /// 859 /// By default, performs semantic analysis when building the object type. 860 /// Subclasses may override this routine to provide different behavior. 861 QualType RebuildObjCObjectType(QualType BaseType, 862 SourceLocation Loc, 863 SourceLocation TypeArgsLAngleLoc, 864 ArrayRef<TypeSourceInfo *> TypeArgs, 865 SourceLocation TypeArgsRAngleLoc, 866 SourceLocation ProtocolLAngleLoc, 867 ArrayRef<ObjCProtocolDecl *> Protocols, 868 ArrayRef<SourceLocation> ProtocolLocs, 869 SourceLocation ProtocolRAngleLoc); 870 871 /// Build a new Objective-C object pointer type given the pointee type. 872 /// 873 /// By default, directly builds the pointer type, with no additional semantic 874 /// analysis. 875 QualType RebuildObjCObjectPointerType(QualType PointeeType, 876 SourceLocation Star); 877 878 /// Build a new array type given the element type, size 879 /// modifier, size of the array (if known), size expression, and index type 880 /// qualifiers. 881 /// 882 /// By default, performs semantic analysis when building the array type. 883 /// Subclasses may override this routine to provide different behavior. 884 /// Also by default, all of the other Rebuild*Array 885 QualType RebuildArrayType(QualType ElementType, ArraySizeModifier SizeMod, 886 const llvm::APInt *Size, Expr *SizeExpr, 887 unsigned IndexTypeQuals, SourceRange BracketsRange); 888 889 /// Build a new constant array type given the element type, size 890 /// modifier, (known) size of the array, and index type qualifiers. 891 /// 892 /// By default, performs semantic analysis when building the array type. 893 /// Subclasses may override this routine to provide different behavior. 894 QualType RebuildConstantArrayType(QualType ElementType, 895 ArraySizeModifier SizeMod, 896 const llvm::APInt &Size, Expr *SizeExpr, 897 unsigned IndexTypeQuals, 898 SourceRange BracketsRange); 899 900 /// Build a new incomplete array type given the element type, size 901 /// modifier, and index type qualifiers. 902 /// 903 /// By default, performs semantic analysis when building the array type. 904 /// Subclasses may override this routine to provide different behavior. 905 QualType RebuildIncompleteArrayType(QualType ElementType, 906 ArraySizeModifier SizeMod, 907 unsigned IndexTypeQuals, 908 SourceRange BracketsRange); 909 910 /// Build a new variable-length array type given the element type, 911 /// size modifier, size expression, and index type qualifiers. 912 /// 913 /// By default, performs semantic analysis when building the array type. 914 /// Subclasses may override this routine to provide different behavior. 915 QualType RebuildVariableArrayType(QualType ElementType, 916 ArraySizeModifier SizeMod, Expr *SizeExpr, 917 unsigned IndexTypeQuals, 918 SourceRange BracketsRange); 919 920 /// Build a new dependent-sized array type given the element type, 921 /// size modifier, size expression, and index type qualifiers. 922 /// 923 /// By default, performs semantic analysis when building the array type. 924 /// Subclasses may override this routine to provide different behavior. 925 QualType RebuildDependentSizedArrayType(QualType ElementType, 926 ArraySizeModifier SizeMod, 927 Expr *SizeExpr, 928 unsigned IndexTypeQuals, 929 SourceRange BracketsRange); 930 931 /// Build a new vector type given the element type and 932 /// number of elements. 933 /// 934 /// By default, performs semantic analysis when building the vector type. 935 /// Subclasses may override this routine to provide different behavior. 936 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 937 VectorKind VecKind); 938 939 /// Build a new potentially dependently-sized extended vector type 940 /// given the element type and number of elements. 941 /// 942 /// By default, performs semantic analysis when building the vector type. 943 /// Subclasses may override this routine to provide different behavior. 944 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 945 SourceLocation AttributeLoc, VectorKind); 946 947 /// Build a new extended vector type given the element type and 948 /// number of elements. 949 /// 950 /// By default, performs semantic analysis when building the vector type. 951 /// Subclasses may override this routine to provide different behavior. 952 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 953 SourceLocation AttributeLoc); 954 955 /// Build a new potentially dependently-sized extended vector type 956 /// given the element type and number of elements. 957 /// 958 /// By default, performs semantic analysis when building the vector type. 959 /// Subclasses may override this routine to provide different behavior. 960 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 961 Expr *SizeExpr, 962 SourceLocation AttributeLoc); 963 964 /// Build a new matrix type given the element type and dimensions. 965 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 966 unsigned NumColumns); 967 968 /// Build a new matrix type given the type and dependently-defined 969 /// dimensions. 970 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 971 Expr *ColumnExpr, 972 SourceLocation AttributeLoc); 973 974 /// Build a new DependentAddressSpaceType or return the pointee 975 /// type variable with the correct address space (retrieved from 976 /// AddrSpaceExpr) applied to it. The former will be returned in cases 977 /// where the address space remains dependent. 978 /// 979 /// By default, performs semantic analysis when building the type with address 980 /// space applied. Subclasses may override this routine to provide different 981 /// behavior. 982 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 983 Expr *AddrSpaceExpr, 984 SourceLocation AttributeLoc); 985 986 /// Build a new function type. 987 /// 988 /// By default, performs semantic analysis when building the function type. 989 /// Subclasses may override this routine to provide different behavior. 990 QualType RebuildFunctionProtoType(QualType T, 991 MutableArrayRef<QualType> ParamTypes, 992 const FunctionProtoType::ExtProtoInfo &EPI); 993 994 /// Build a new unprototyped function type. 995 QualType RebuildFunctionNoProtoType(QualType ResultType); 996 997 /// Rebuild an unresolved typename type, given the decl that 998 /// the UnresolvedUsingTypenameDecl was transformed to. 999 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 1000 1001 /// Build a new type found via an alias. 1002 QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) { 1003 return SemaRef.Context.getUsingType(Found, Underlying); 1004 } 1005 1006 /// Build a new typedef type. 1007 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 1008 return SemaRef.Context.getTypeDeclType(Typedef); 1009 } 1010 1011 /// Build a new MacroDefined type. 1012 QualType RebuildMacroQualifiedType(QualType T, 1013 const IdentifierInfo *MacroII) { 1014 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 1015 } 1016 1017 /// Build a new class/struct/union type. 1018 QualType RebuildRecordType(RecordDecl *Record) { 1019 return SemaRef.Context.getTypeDeclType(Record); 1020 } 1021 1022 /// Build a new Enum type. 1023 QualType RebuildEnumType(EnumDecl *Enum) { 1024 return SemaRef.Context.getTypeDeclType(Enum); 1025 } 1026 1027 /// Build a new typeof(expr) type. 1028 /// 1029 /// By default, performs semantic analysis when building the typeof type. 1030 /// Subclasses may override this routine to provide different behavior. 1031 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc, 1032 TypeOfKind Kind); 1033 1034 /// Build a new typeof(type) type. 1035 /// 1036 /// By default, builds a new TypeOfType with the given underlying type. 1037 QualType RebuildTypeOfType(QualType Underlying, TypeOfKind Kind); 1038 1039 /// Build a new unary transform type. 1040 QualType RebuildUnaryTransformType(QualType BaseType, 1041 UnaryTransformType::UTTKind UKind, 1042 SourceLocation Loc); 1043 1044 /// Build a new C++11 decltype type. 1045 /// 1046 /// By default, performs semantic analysis when building the decltype type. 1047 /// Subclasses may override this routine to provide different behavior. 1048 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 1049 1050 /// Build a new C++11 auto type. 1051 /// 1052 /// By default, builds a new AutoType with the given deduced type. 1053 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 1054 ConceptDecl *TypeConstraintConcept, 1055 ArrayRef<TemplateArgument> TypeConstraintArgs) { 1056 // Note, IsDependent is always false here: we implicitly convert an 'auto' 1057 // which has been deduced to a dependent type into an undeduced 'auto', so 1058 // that we'll retry deduction after the transformation. 1059 return SemaRef.Context.getAutoType(Deduced, Keyword, 1060 /*IsDependent*/ false, /*IsPack=*/false, 1061 TypeConstraintConcept, 1062 TypeConstraintArgs); 1063 } 1064 1065 /// By default, builds a new DeducedTemplateSpecializationType with the given 1066 /// deduced type. 1067 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 1068 QualType Deduced) { 1069 return SemaRef.Context.getDeducedTemplateSpecializationType( 1070 Template, Deduced, /*IsDependent*/ false); 1071 } 1072 1073 /// Build a new template specialization type. 1074 /// 1075 /// By default, performs semantic analysis when building the template 1076 /// specialization type. Subclasses may override this routine to provide 1077 /// different behavior. 1078 QualType RebuildTemplateSpecializationType(TemplateName Template, 1079 SourceLocation TemplateLoc, 1080 TemplateArgumentListInfo &Args); 1081 1082 /// Build a new parenthesized type. 1083 /// 1084 /// By default, builds a new ParenType type from the inner type. 1085 /// Subclasses may override this routine to provide different behavior. 1086 QualType RebuildParenType(QualType InnerType) { 1087 return SemaRef.BuildParenType(InnerType); 1088 } 1089 1090 /// Build a new qualified name type. 1091 /// 1092 /// By default, builds a new ElaboratedType type from the keyword, 1093 /// the nested-name-specifier and the named type. 1094 /// Subclasses may override this routine to provide different behavior. 1095 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1096 ElaboratedTypeKeyword Keyword, 1097 NestedNameSpecifierLoc QualifierLoc, 1098 QualType Named) { 1099 return SemaRef.Context.getElaboratedType(Keyword, 1100 QualifierLoc.getNestedNameSpecifier(), 1101 Named); 1102 } 1103 1104 /// Build a new typename type that refers to a template-id. 1105 /// 1106 /// By default, builds a new DependentNameType type from the 1107 /// nested-name-specifier and the given type. Subclasses may override 1108 /// this routine to provide different behavior. 1109 QualType RebuildDependentTemplateSpecializationType( 1110 ElaboratedTypeKeyword Keyword, 1111 NestedNameSpecifierLoc QualifierLoc, 1112 SourceLocation TemplateKWLoc, 1113 const IdentifierInfo *Name, 1114 SourceLocation NameLoc, 1115 TemplateArgumentListInfo &Args, 1116 bool AllowInjectedClassName) { 1117 // Rebuild the template name. 1118 // TODO: avoid TemplateName abstraction 1119 CXXScopeSpec SS; 1120 SS.Adopt(QualifierLoc); 1121 TemplateName InstName = getDerived().RebuildTemplateName( 1122 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1123 AllowInjectedClassName); 1124 1125 if (InstName.isNull()) 1126 return QualType(); 1127 1128 // If it's still dependent, make a dependent specialization. 1129 if (InstName.getAsDependentTemplateName()) 1130 return SemaRef.Context.getDependentTemplateSpecializationType( 1131 Keyword, QualifierLoc.getNestedNameSpecifier(), Name, 1132 Args.arguments()); 1133 1134 // Otherwise, make an elaborated type wrapping a non-dependent 1135 // specialization. 1136 QualType T = 1137 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1138 if (T.isNull()) 1139 return QualType(); 1140 return SemaRef.Context.getElaboratedType( 1141 Keyword, QualifierLoc.getNestedNameSpecifier(), T); 1142 } 1143 1144 /// Build a new typename type that refers to an identifier. 1145 /// 1146 /// By default, performs semantic analysis when building the typename type 1147 /// (or elaborated type). Subclasses may override this routine to provide 1148 /// different behavior. 1149 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1150 SourceLocation KeywordLoc, 1151 NestedNameSpecifierLoc QualifierLoc, 1152 const IdentifierInfo *Id, 1153 SourceLocation IdLoc, 1154 bool DeducedTSTContext) { 1155 CXXScopeSpec SS; 1156 SS.Adopt(QualifierLoc); 1157 1158 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1159 // If the name is still dependent, just build a new dependent name type. 1160 if (!SemaRef.computeDeclContext(SS)) 1161 return SemaRef.Context.getDependentNameType(Keyword, 1162 QualifierLoc.getNestedNameSpecifier(), 1163 Id); 1164 } 1165 1166 if (Keyword == ElaboratedTypeKeyword::None || 1167 Keyword == ElaboratedTypeKeyword::Typename) { 1168 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1169 *Id, IdLoc, DeducedTSTContext); 1170 } 1171 1172 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1173 1174 // We had a dependent elaborated-type-specifier that has been transformed 1175 // into a non-dependent elaborated-type-specifier. Find the tag we're 1176 // referring to. 1177 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1178 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1179 if (!DC) 1180 return QualType(); 1181 1182 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1183 return QualType(); 1184 1185 TagDecl *Tag = nullptr; 1186 SemaRef.LookupQualifiedName(Result, DC); 1187 switch (Result.getResultKind()) { 1188 case LookupResult::NotFound: 1189 case LookupResult::NotFoundInCurrentInstantiation: 1190 break; 1191 1192 case LookupResult::Found: 1193 Tag = Result.getAsSingle<TagDecl>(); 1194 break; 1195 1196 case LookupResult::FoundOverloaded: 1197 case LookupResult::FoundUnresolvedValue: 1198 llvm_unreachable("Tag lookup cannot find non-tags"); 1199 1200 case LookupResult::Ambiguous: 1201 // Let the LookupResult structure handle ambiguities. 1202 return QualType(); 1203 } 1204 1205 if (!Tag) { 1206 // Check where the name exists but isn't a tag type and use that to emit 1207 // better diagnostics. 1208 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1209 SemaRef.LookupQualifiedName(Result, DC); 1210 switch (Result.getResultKind()) { 1211 case LookupResult::Found: 1212 case LookupResult::FoundOverloaded: 1213 case LookupResult::FoundUnresolvedValue: { 1214 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1215 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1216 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) 1217 << SomeDecl << NTK << llvm::to_underlying(Kind); 1218 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1219 break; 1220 } 1221 default: 1222 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1223 << llvm::to_underlying(Kind) << Id << DC 1224 << QualifierLoc.getSourceRange(); 1225 break; 1226 } 1227 return QualType(); 1228 } 1229 1230 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1231 IdLoc, Id)) { 1232 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1233 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1234 return QualType(); 1235 } 1236 1237 // Build the elaborated-type-specifier type. 1238 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1239 return SemaRef.Context.getElaboratedType(Keyword, 1240 QualifierLoc.getNestedNameSpecifier(), 1241 T); 1242 } 1243 1244 /// Build a new pack expansion type. 1245 /// 1246 /// By default, builds a new PackExpansionType type from the given pattern. 1247 /// Subclasses may override this routine to provide different behavior. 1248 QualType RebuildPackExpansionType(QualType Pattern, SourceRange PatternRange, 1249 SourceLocation EllipsisLoc, 1250 std::optional<unsigned> NumExpansions) { 1251 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1252 NumExpansions); 1253 } 1254 1255 /// Build a new atomic type given its value type. 1256 /// 1257 /// By default, performs semantic analysis when building the atomic type. 1258 /// Subclasses may override this routine to provide different behavior. 1259 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1260 1261 /// Build a new pipe type given its value type. 1262 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1263 bool isReadPipe); 1264 1265 /// Build a bit-precise int given its value type. 1266 QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits, 1267 SourceLocation Loc); 1268 1269 /// Build a dependent bit-precise int given its value type. 1270 QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr, 1271 SourceLocation Loc); 1272 1273 /// Build a new template name given a nested name specifier, a flag 1274 /// indicating whether the "template" keyword was provided, and the template 1275 /// that the template name refers to. 1276 /// 1277 /// By default, builds the new template name directly. Subclasses may override 1278 /// this routine to provide different behavior. 1279 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1280 bool TemplateKW, 1281 TemplateDecl *Template); 1282 1283 /// Build a new template name given a nested name specifier and the 1284 /// name that is referred to as a template. 1285 /// 1286 /// By default, performs semantic analysis to determine whether the name can 1287 /// be resolved to a specific template, then builds the appropriate kind of 1288 /// template name. Subclasses may override this routine to provide different 1289 /// behavior. 1290 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1291 SourceLocation TemplateKWLoc, 1292 const IdentifierInfo &Name, 1293 SourceLocation NameLoc, QualType ObjectType, 1294 NamedDecl *FirstQualifierInScope, 1295 bool AllowInjectedClassName); 1296 1297 /// Build a new template name given a nested name specifier and the 1298 /// overloaded operator name that is referred to as a template. 1299 /// 1300 /// By default, performs semantic analysis to determine whether the name can 1301 /// be resolved to a specific template, then builds the appropriate kind of 1302 /// template name. Subclasses may override this routine to provide different 1303 /// behavior. 1304 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1305 SourceLocation TemplateKWLoc, 1306 OverloadedOperatorKind Operator, 1307 SourceLocation NameLoc, QualType ObjectType, 1308 bool AllowInjectedClassName); 1309 1310 /// Build a new template name given a template template parameter pack 1311 /// and the 1312 /// 1313 /// By default, performs semantic analysis to determine whether the name can 1314 /// be resolved to a specific template, then builds the appropriate kind of 1315 /// template name. Subclasses may override this routine to provide different 1316 /// behavior. 1317 TemplateName RebuildTemplateName(const TemplateArgument &ArgPack, 1318 Decl *AssociatedDecl, unsigned Index, 1319 bool Final) { 1320 return getSema().Context.getSubstTemplateTemplateParmPack( 1321 ArgPack, AssociatedDecl, Index, Final); 1322 } 1323 1324 /// Build a new compound statement. 1325 /// 1326 /// By default, performs semantic analysis to build the new statement. 1327 /// Subclasses may override this routine to provide different behavior. 1328 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1329 MultiStmtArg Statements, 1330 SourceLocation RBraceLoc, 1331 bool IsStmtExpr) { 1332 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1333 IsStmtExpr); 1334 } 1335 1336 /// Build a new case statement. 1337 /// 1338 /// By default, performs semantic analysis to build the new statement. 1339 /// Subclasses may override this routine to provide different behavior. 1340 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1341 Expr *LHS, 1342 SourceLocation EllipsisLoc, 1343 Expr *RHS, 1344 SourceLocation ColonLoc) { 1345 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1346 ColonLoc); 1347 } 1348 1349 /// Attach the body to a new case statement. 1350 /// 1351 /// By default, performs semantic analysis to build the new statement. 1352 /// Subclasses may override this routine to provide different behavior. 1353 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1354 getSema().ActOnCaseStmtBody(S, Body); 1355 return S; 1356 } 1357 1358 /// Build a new default statement. 1359 /// 1360 /// By default, performs semantic analysis to build the new statement. 1361 /// Subclasses may override this routine to provide different behavior. 1362 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1363 SourceLocation ColonLoc, 1364 Stmt *SubStmt) { 1365 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1366 /*CurScope=*/nullptr); 1367 } 1368 1369 /// Build a new label statement. 1370 /// 1371 /// By default, performs semantic analysis to build the new statement. 1372 /// Subclasses may override this routine to provide different behavior. 1373 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1374 SourceLocation ColonLoc, Stmt *SubStmt) { 1375 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1376 } 1377 1378 /// Build a new attributed statement. 1379 /// 1380 /// By default, performs semantic analysis to build the new statement. 1381 /// Subclasses may override this routine to provide different behavior. 1382 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1383 ArrayRef<const Attr *> Attrs, 1384 Stmt *SubStmt) { 1385 if (SemaRef.CheckRebuiltStmtAttributes(Attrs)) 1386 return StmtError(); 1387 return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt); 1388 } 1389 1390 /// Build a new "if" statement. 1391 /// 1392 /// By default, performs semantic analysis to build the new statement. 1393 /// Subclasses may override this routine to provide different behavior. 1394 StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind, 1395 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1396 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1397 SourceLocation ElseLoc, Stmt *Else) { 1398 return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc, 1399 Then, ElseLoc, Else); 1400 } 1401 1402 /// Start building a new switch statement. 1403 /// 1404 /// By default, performs semantic analysis to build the new statement. 1405 /// Subclasses may override this routine to provide different behavior. 1406 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1407 SourceLocation LParenLoc, Stmt *Init, 1408 Sema::ConditionResult Cond, 1409 SourceLocation RParenLoc) { 1410 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1411 RParenLoc); 1412 } 1413 1414 /// Attach the body to the switch statement. 1415 /// 1416 /// By default, performs semantic analysis to build the new statement. 1417 /// Subclasses may override this routine to provide different behavior. 1418 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1419 Stmt *Switch, Stmt *Body) { 1420 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1421 } 1422 1423 /// Build a new while statement. 1424 /// 1425 /// By default, performs semantic analysis to build the new statement. 1426 /// Subclasses may override this routine to provide different behavior. 1427 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1428 Sema::ConditionResult Cond, 1429 SourceLocation RParenLoc, Stmt *Body) { 1430 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1431 } 1432 1433 /// Build a new do-while statement. 1434 /// 1435 /// By default, performs semantic analysis to build the new statement. 1436 /// Subclasses may override this routine to provide different behavior. 1437 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1438 SourceLocation WhileLoc, SourceLocation LParenLoc, 1439 Expr *Cond, SourceLocation RParenLoc) { 1440 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1441 Cond, RParenLoc); 1442 } 1443 1444 /// Build a new for statement. 1445 /// 1446 /// By default, performs semantic analysis to build the new statement. 1447 /// Subclasses may override this routine to provide different behavior. 1448 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1449 Stmt *Init, Sema::ConditionResult Cond, 1450 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1451 Stmt *Body) { 1452 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1453 Inc, RParenLoc, Body); 1454 } 1455 1456 /// Build a new goto statement. 1457 /// 1458 /// By default, performs semantic analysis to build the new statement. 1459 /// Subclasses may override this routine to provide different behavior. 1460 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1461 LabelDecl *Label) { 1462 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1463 } 1464 1465 /// Build a new indirect goto statement. 1466 /// 1467 /// By default, performs semantic analysis to build the new statement. 1468 /// Subclasses may override this routine to provide different behavior. 1469 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1470 SourceLocation StarLoc, 1471 Expr *Target) { 1472 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1473 } 1474 1475 /// Build a new return statement. 1476 /// 1477 /// By default, performs semantic analysis to build the new statement. 1478 /// Subclasses may override this routine to provide different behavior. 1479 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1480 return getSema().BuildReturnStmt(ReturnLoc, Result); 1481 } 1482 1483 /// Build a new declaration statement. 1484 /// 1485 /// By default, performs semantic analysis to build the new statement. 1486 /// Subclasses may override this routine to provide different behavior. 1487 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1488 SourceLocation StartLoc, SourceLocation EndLoc) { 1489 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1490 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1491 } 1492 1493 /// Build a new inline asm statement. 1494 /// 1495 /// By default, performs semantic analysis to build the new statement. 1496 /// Subclasses may override this routine to provide different behavior. 1497 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1498 bool IsVolatile, unsigned NumOutputs, 1499 unsigned NumInputs, IdentifierInfo **Names, 1500 MultiExprArg Constraints, MultiExprArg Exprs, 1501 Expr *AsmString, MultiExprArg Clobbers, 1502 unsigned NumLabels, 1503 SourceLocation RParenLoc) { 1504 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1505 NumInputs, Names, Constraints, Exprs, 1506 AsmString, Clobbers, NumLabels, RParenLoc); 1507 } 1508 1509 /// Build a new MS style inline asm statement. 1510 /// 1511 /// By default, performs semantic analysis to build the new statement. 1512 /// Subclasses may override this routine to provide different behavior. 1513 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1514 ArrayRef<Token> AsmToks, 1515 StringRef AsmString, 1516 unsigned NumOutputs, unsigned NumInputs, 1517 ArrayRef<StringRef> Constraints, 1518 ArrayRef<StringRef> Clobbers, 1519 ArrayRef<Expr*> Exprs, 1520 SourceLocation EndLoc) { 1521 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1522 NumOutputs, NumInputs, 1523 Constraints, Clobbers, Exprs, EndLoc); 1524 } 1525 1526 /// Build a new co_return statement. 1527 /// 1528 /// By default, performs semantic analysis to build the new statement. 1529 /// Subclasses may override this routine to provide different behavior. 1530 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1531 bool IsImplicit) { 1532 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1533 } 1534 1535 /// Build a new co_await expression. 1536 /// 1537 /// By default, performs semantic analysis to build the new expression. 1538 /// Subclasses may override this routine to provide different behavior. 1539 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand, 1540 UnresolvedLookupExpr *OpCoawaitLookup, 1541 bool IsImplicit) { 1542 // This function rebuilds a coawait-expr given its operator. 1543 // For an explicit coawait-expr, the rebuild involves the full set 1544 // of transformations performed by BuildUnresolvedCoawaitExpr(), 1545 // including calling await_transform(). 1546 // For an implicit coawait-expr, we need to rebuild the "operator 1547 // coawait" but not await_transform(), so use BuildResolvedCoawaitExpr(). 1548 // This mirrors how the implicit CoawaitExpr is originally created 1549 // in Sema::ActOnCoroutineBodyStart(). 1550 if (IsImplicit) { 1551 ExprResult Suspend = getSema().BuildOperatorCoawaitCall( 1552 CoawaitLoc, Operand, OpCoawaitLookup); 1553 if (Suspend.isInvalid()) 1554 return ExprError(); 1555 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Operand, 1556 Suspend.get(), true); 1557 } 1558 1559 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Operand, 1560 OpCoawaitLookup); 1561 } 1562 1563 /// Build a new co_await expression. 1564 /// 1565 /// By default, performs semantic analysis to build the new expression. 1566 /// Subclasses may override this routine to provide different behavior. 1567 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1568 Expr *Result, 1569 UnresolvedLookupExpr *Lookup) { 1570 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1571 } 1572 1573 /// Build a new co_yield expression. 1574 /// 1575 /// By default, performs semantic analysis to build the new expression. 1576 /// Subclasses may override this routine to provide different behavior. 1577 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1578 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1579 } 1580 1581 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1582 return getSema().BuildCoroutineBodyStmt(Args); 1583 } 1584 1585 /// Build a new Objective-C \@try statement. 1586 /// 1587 /// By default, performs semantic analysis to build the new statement. 1588 /// Subclasses may override this routine to provide different behavior. 1589 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1590 Stmt *TryBody, 1591 MultiStmtArg CatchStmts, 1592 Stmt *Finally) { 1593 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1594 Finally); 1595 } 1596 1597 /// Rebuild an Objective-C exception declaration. 1598 /// 1599 /// By default, performs semantic analysis to build the new declaration. 1600 /// Subclasses may override this routine to provide different behavior. 1601 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1602 TypeSourceInfo *TInfo, QualType T) { 1603 return getSema().BuildObjCExceptionDecl(TInfo, T, 1604 ExceptionDecl->getInnerLocStart(), 1605 ExceptionDecl->getLocation(), 1606 ExceptionDecl->getIdentifier()); 1607 } 1608 1609 /// Build a new Objective-C \@catch statement. 1610 /// 1611 /// By default, performs semantic analysis to build the new statement. 1612 /// Subclasses may override this routine to provide different behavior. 1613 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1614 SourceLocation RParenLoc, 1615 VarDecl *Var, 1616 Stmt *Body) { 1617 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1618 Var, Body); 1619 } 1620 1621 /// Build a new Objective-C \@finally statement. 1622 /// 1623 /// By default, performs semantic analysis to build the new statement. 1624 /// Subclasses may override this routine to provide different behavior. 1625 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1626 Stmt *Body) { 1627 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1628 } 1629 1630 /// Build a new Objective-C \@throw statement. 1631 /// 1632 /// By default, performs semantic analysis to build the new statement. 1633 /// Subclasses may override this routine to provide different behavior. 1634 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1635 Expr *Operand) { 1636 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1637 } 1638 1639 /// Build a new OpenMP Canonical loop. 1640 /// 1641 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1642 /// OMPCanonicalLoop. 1643 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1644 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1645 } 1646 1647 /// Build a new OpenMP executable directive. 1648 /// 1649 /// By default, performs semantic analysis to build the new statement. 1650 /// Subclasses may override this routine to provide different behavior. 1651 StmtResult RebuildOMPExecutableDirective( 1652 OpenMPDirectiveKind Kind, DeclarationNameInfo DirName, 1653 OpenMPDirectiveKind CancelRegion, ArrayRef<OMPClause *> Clauses, 1654 Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc, 1655 OpenMPDirectiveKind PrevMappedDirective = OMPD_unknown) { 1656 1657 return getSema().ActOnOpenMPExecutableDirective( 1658 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc, 1659 PrevMappedDirective); 1660 } 1661 1662 /// Build a new OpenMP 'if' 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 *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1667 Expr *Condition, SourceLocation StartLoc, 1668 SourceLocation LParenLoc, 1669 SourceLocation NameModifierLoc, 1670 SourceLocation ColonLoc, 1671 SourceLocation EndLoc) { 1672 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1673 LParenLoc, NameModifierLoc, ColonLoc, 1674 EndLoc); 1675 } 1676 1677 /// Build a new OpenMP 'final' clause. 1678 /// 1679 /// By default, performs semantic analysis to build the new OpenMP clause. 1680 /// Subclasses may override this routine to provide different behavior. 1681 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1682 SourceLocation LParenLoc, 1683 SourceLocation EndLoc) { 1684 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1685 EndLoc); 1686 } 1687 1688 /// Build a new OpenMP 'num_threads' clause. 1689 /// 1690 /// By default, performs semantic analysis to build the new OpenMP clause. 1691 /// Subclasses may override this routine to provide different behavior. 1692 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1693 SourceLocation StartLoc, 1694 SourceLocation LParenLoc, 1695 SourceLocation EndLoc) { 1696 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1697 LParenLoc, EndLoc); 1698 } 1699 1700 /// Build a new OpenMP 'safelen' clause. 1701 /// 1702 /// By default, performs semantic analysis to build the new OpenMP clause. 1703 /// Subclasses may override this routine to provide different behavior. 1704 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1705 SourceLocation LParenLoc, 1706 SourceLocation EndLoc) { 1707 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1708 } 1709 1710 /// Build a new OpenMP 'simdlen' clause. 1711 /// 1712 /// By default, performs semantic analysis to build the new OpenMP clause. 1713 /// Subclasses may override this routine to provide different behavior. 1714 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1715 SourceLocation LParenLoc, 1716 SourceLocation EndLoc) { 1717 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1718 } 1719 1720 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1721 SourceLocation StartLoc, 1722 SourceLocation LParenLoc, 1723 SourceLocation EndLoc) { 1724 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1725 } 1726 1727 /// Build a new OpenMP 'full' clause. 1728 OMPClause *RebuildOMPFullClause(SourceLocation StartLoc, 1729 SourceLocation EndLoc) { 1730 return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc); 1731 } 1732 1733 /// Build a new OpenMP 'partial' clause. 1734 OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc, 1735 SourceLocation LParenLoc, 1736 SourceLocation EndLoc) { 1737 return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc, 1738 EndLoc); 1739 } 1740 1741 /// Build a new OpenMP 'allocator' clause. 1742 /// 1743 /// By default, performs semantic analysis to build the new OpenMP clause. 1744 /// Subclasses may override this routine to provide different behavior. 1745 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1746 SourceLocation LParenLoc, 1747 SourceLocation EndLoc) { 1748 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1749 } 1750 1751 /// Build a new OpenMP 'collapse' clause. 1752 /// 1753 /// By default, performs semantic analysis to build the new OpenMP clause. 1754 /// Subclasses may override this routine to provide different behavior. 1755 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1756 SourceLocation LParenLoc, 1757 SourceLocation EndLoc) { 1758 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1759 EndLoc); 1760 } 1761 1762 /// Build a new OpenMP 'default' clause. 1763 /// 1764 /// By default, performs semantic analysis to build the new OpenMP clause. 1765 /// Subclasses may override this routine to provide different behavior. 1766 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1767 SourceLocation StartLoc, 1768 SourceLocation LParenLoc, 1769 SourceLocation EndLoc) { 1770 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1771 StartLoc, LParenLoc, EndLoc); 1772 } 1773 1774 /// Build a new OpenMP 'proc_bind' clause. 1775 /// 1776 /// By default, performs semantic analysis to build the new OpenMP clause. 1777 /// Subclasses may override this routine to provide different behavior. 1778 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1779 SourceLocation KindKwLoc, 1780 SourceLocation StartLoc, 1781 SourceLocation LParenLoc, 1782 SourceLocation EndLoc) { 1783 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1784 StartLoc, LParenLoc, EndLoc); 1785 } 1786 1787 /// Build a new OpenMP 'schedule' clause. 1788 /// 1789 /// By default, performs semantic analysis to build the new OpenMP clause. 1790 /// Subclasses may override this routine to provide different behavior. 1791 OMPClause *RebuildOMPScheduleClause( 1792 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1793 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1794 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1795 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1796 return getSema().ActOnOpenMPScheduleClause( 1797 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1798 CommaLoc, EndLoc); 1799 } 1800 1801 /// Build a new OpenMP 'ordered' clause. 1802 /// 1803 /// By default, performs semantic analysis to build the new OpenMP clause. 1804 /// Subclasses may override this routine to provide different behavior. 1805 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1806 SourceLocation EndLoc, 1807 SourceLocation LParenLoc, Expr *Num) { 1808 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1809 } 1810 1811 /// Build a new OpenMP 'private' clause. 1812 /// 1813 /// By default, performs semantic analysis to build the new OpenMP clause. 1814 /// Subclasses may override this routine to provide different behavior. 1815 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1816 SourceLocation StartLoc, 1817 SourceLocation LParenLoc, 1818 SourceLocation EndLoc) { 1819 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1820 EndLoc); 1821 } 1822 1823 /// Build a new OpenMP 'firstprivate' clause. 1824 /// 1825 /// By default, performs semantic analysis to build the new OpenMP clause. 1826 /// Subclasses may override this routine to provide different behavior. 1827 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1828 SourceLocation StartLoc, 1829 SourceLocation LParenLoc, 1830 SourceLocation EndLoc) { 1831 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1832 EndLoc); 1833 } 1834 1835 /// Build a new OpenMP 'lastprivate' clause. 1836 /// 1837 /// By default, performs semantic analysis to build the new OpenMP clause. 1838 /// Subclasses may override this routine to provide different behavior. 1839 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1840 OpenMPLastprivateModifier LPKind, 1841 SourceLocation LPKindLoc, 1842 SourceLocation ColonLoc, 1843 SourceLocation StartLoc, 1844 SourceLocation LParenLoc, 1845 SourceLocation EndLoc) { 1846 return getSema().ActOnOpenMPLastprivateClause( 1847 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1848 } 1849 1850 /// Build a new OpenMP 'shared' clause. 1851 /// 1852 /// By default, performs semantic analysis to build the new OpenMP clause. 1853 /// Subclasses may override this routine to provide different behavior. 1854 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1855 SourceLocation StartLoc, 1856 SourceLocation LParenLoc, 1857 SourceLocation EndLoc) { 1858 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1859 EndLoc); 1860 } 1861 1862 /// Build a new OpenMP 'reduction' clause. 1863 /// 1864 /// By default, performs semantic analysis to build the new statement. 1865 /// Subclasses may override this routine to provide different behavior. 1866 OMPClause *RebuildOMPReductionClause( 1867 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1868 SourceLocation StartLoc, SourceLocation LParenLoc, 1869 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1870 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1871 const DeclarationNameInfo &ReductionId, 1872 ArrayRef<Expr *> UnresolvedReductions) { 1873 return getSema().ActOnOpenMPReductionClause( 1874 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1875 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1876 } 1877 1878 /// Build a new OpenMP 'task_reduction' clause. 1879 /// 1880 /// By default, performs semantic analysis to build the new statement. 1881 /// Subclasses may override this routine to provide different behavior. 1882 OMPClause *RebuildOMPTaskReductionClause( 1883 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1884 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1885 CXXScopeSpec &ReductionIdScopeSpec, 1886 const DeclarationNameInfo &ReductionId, 1887 ArrayRef<Expr *> UnresolvedReductions) { 1888 return getSema().ActOnOpenMPTaskReductionClause( 1889 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1890 ReductionId, UnresolvedReductions); 1891 } 1892 1893 /// Build a new OpenMP 'in_reduction' clause. 1894 /// 1895 /// By default, performs semantic analysis to build the new statement. 1896 /// Subclasses may override this routine to provide different behavior. 1897 OMPClause * 1898 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1899 SourceLocation LParenLoc, SourceLocation ColonLoc, 1900 SourceLocation EndLoc, 1901 CXXScopeSpec &ReductionIdScopeSpec, 1902 const DeclarationNameInfo &ReductionId, 1903 ArrayRef<Expr *> UnresolvedReductions) { 1904 return getSema().ActOnOpenMPInReductionClause( 1905 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1906 ReductionId, UnresolvedReductions); 1907 } 1908 1909 /// Build a new OpenMP 'linear' clause. 1910 /// 1911 /// By default, performs semantic analysis to build the new OpenMP clause. 1912 /// Subclasses may override this routine to provide different behavior. 1913 OMPClause *RebuildOMPLinearClause( 1914 ArrayRef<Expr *> VarList, Expr *Step, SourceLocation StartLoc, 1915 SourceLocation LParenLoc, OpenMPLinearClauseKind Modifier, 1916 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1917 SourceLocation StepModifierLoc, SourceLocation EndLoc) { 1918 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1919 Modifier, ModifierLoc, ColonLoc, 1920 StepModifierLoc, EndLoc); 1921 } 1922 1923 /// Build a new OpenMP 'aligned' clause. 1924 /// 1925 /// By default, performs semantic analysis to build the new OpenMP clause. 1926 /// Subclasses may override this routine to provide different behavior. 1927 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1928 SourceLocation StartLoc, 1929 SourceLocation LParenLoc, 1930 SourceLocation ColonLoc, 1931 SourceLocation EndLoc) { 1932 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1933 LParenLoc, ColonLoc, EndLoc); 1934 } 1935 1936 /// Build a new OpenMP 'copyin' 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 *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1941 SourceLocation StartLoc, 1942 SourceLocation LParenLoc, 1943 SourceLocation EndLoc) { 1944 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1945 EndLoc); 1946 } 1947 1948 /// Build a new OpenMP 'copyprivate' 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 *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1953 SourceLocation StartLoc, 1954 SourceLocation LParenLoc, 1955 SourceLocation EndLoc) { 1956 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1957 EndLoc); 1958 } 1959 1960 /// Build a new OpenMP 'flush' pseudo clause. 1961 /// 1962 /// By default, performs semantic analysis to build the new OpenMP clause. 1963 /// Subclasses may override this routine to provide different behavior. 1964 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1965 SourceLocation StartLoc, 1966 SourceLocation LParenLoc, 1967 SourceLocation EndLoc) { 1968 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1969 EndLoc); 1970 } 1971 1972 /// Build a new OpenMP 'depobj' pseudo clause. 1973 /// 1974 /// By default, performs semantic analysis to build the new OpenMP clause. 1975 /// Subclasses may override this routine to provide different behavior. 1976 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1977 SourceLocation LParenLoc, 1978 SourceLocation EndLoc) { 1979 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1980 EndLoc); 1981 } 1982 1983 /// Build a new OpenMP 'depend' pseudo clause. 1984 /// 1985 /// By default, performs semantic analysis to build the new OpenMP clause. 1986 /// Subclasses may override this routine to provide different behavior. 1987 OMPClause *RebuildOMPDependClause(OMPDependClause::DependDataTy Data, 1988 Expr *DepModifier, ArrayRef<Expr *> VarList, 1989 SourceLocation StartLoc, 1990 SourceLocation LParenLoc, 1991 SourceLocation EndLoc) { 1992 return getSema().ActOnOpenMPDependClause(Data, DepModifier, VarList, 1993 StartLoc, LParenLoc, EndLoc); 1994 } 1995 1996 /// Build a new OpenMP 'device' clause. 1997 /// 1998 /// By default, performs semantic analysis to build the new statement. 1999 /// Subclasses may override this routine to provide different behavior. 2000 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 2001 Expr *Device, SourceLocation StartLoc, 2002 SourceLocation LParenLoc, 2003 SourceLocation ModifierLoc, 2004 SourceLocation EndLoc) { 2005 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 2006 LParenLoc, ModifierLoc, EndLoc); 2007 } 2008 2009 /// Build a new OpenMP 'map' clause. 2010 /// 2011 /// By default, performs semantic analysis to build the new OpenMP clause. 2012 /// Subclasses may override this routine to provide different behavior. 2013 OMPClause *RebuildOMPMapClause( 2014 Expr *IteratorModifier, ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 2015 ArrayRef<SourceLocation> MapTypeModifiersLoc, 2016 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 2017 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 2018 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 2019 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 2020 return getSema().ActOnOpenMPMapClause( 2021 IteratorModifier, MapTypeModifiers, MapTypeModifiersLoc, 2022 MapperIdScopeSpec, MapperId, MapType, IsMapTypeImplicit, MapLoc, 2023 ColonLoc, VarList, Locs, 2024 /*NoDiagnose=*/false, UnresolvedMappers); 2025 } 2026 2027 /// Build a new OpenMP 'allocate' clause. 2028 /// 2029 /// By default, performs semantic analysis to build the new OpenMP clause. 2030 /// Subclasses may override this routine to provide different behavior. 2031 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 2032 SourceLocation StartLoc, 2033 SourceLocation LParenLoc, 2034 SourceLocation ColonLoc, 2035 SourceLocation EndLoc) { 2036 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 2037 LParenLoc, ColonLoc, EndLoc); 2038 } 2039 2040 /// Build a new OpenMP 'num_teams' clause. 2041 /// 2042 /// By default, performs semantic analysis to build the new statement. 2043 /// Subclasses may override this routine to provide different behavior. 2044 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 2045 SourceLocation LParenLoc, 2046 SourceLocation EndLoc) { 2047 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 2048 EndLoc); 2049 } 2050 2051 /// Build a new OpenMP 'thread_limit' clause. 2052 /// 2053 /// By default, performs semantic analysis to build the new statement. 2054 /// Subclasses may override this routine to provide different behavior. 2055 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 2056 SourceLocation StartLoc, 2057 SourceLocation LParenLoc, 2058 SourceLocation EndLoc) { 2059 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 2060 LParenLoc, EndLoc); 2061 } 2062 2063 /// Build a new OpenMP 'priority' 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 *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 2068 SourceLocation LParenLoc, 2069 SourceLocation EndLoc) { 2070 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 2071 EndLoc); 2072 } 2073 2074 /// Build a new OpenMP 'grainsize' clause. 2075 /// 2076 /// By default, performs semantic analysis to build the new statement. 2077 /// Subclasses may override this routine to provide different behavior. 2078 OMPClause *RebuildOMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier, 2079 Expr *Device, SourceLocation StartLoc, 2080 SourceLocation LParenLoc, 2081 SourceLocation ModifierLoc, 2082 SourceLocation EndLoc) { 2083 return getSema().ActOnOpenMPGrainsizeClause(Modifier, Device, StartLoc, 2084 LParenLoc, ModifierLoc, EndLoc); 2085 } 2086 2087 /// Build a new OpenMP 'num_tasks' clause. 2088 /// 2089 /// By default, performs semantic analysis to build the new statement. 2090 /// Subclasses may override this routine to provide different behavior. 2091 OMPClause *RebuildOMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier, 2092 Expr *NumTasks, SourceLocation StartLoc, 2093 SourceLocation LParenLoc, 2094 SourceLocation ModifierLoc, 2095 SourceLocation EndLoc) { 2096 return getSema().ActOnOpenMPNumTasksClause(Modifier, NumTasks, StartLoc, 2097 LParenLoc, ModifierLoc, EndLoc); 2098 } 2099 2100 /// Build a new OpenMP 'hint' clause. 2101 /// 2102 /// By default, performs semantic analysis to build the new statement. 2103 /// Subclasses may override this routine to provide different behavior. 2104 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 2105 SourceLocation LParenLoc, 2106 SourceLocation EndLoc) { 2107 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2108 } 2109 2110 /// Build a new OpenMP 'detach' clause. 2111 /// 2112 /// By default, performs semantic analysis to build the new statement. 2113 /// Subclasses may override this routine to provide different behavior. 2114 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2115 SourceLocation LParenLoc, 2116 SourceLocation EndLoc) { 2117 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2118 } 2119 2120 /// Build a new OpenMP 'dist_schedule' clause. 2121 /// 2122 /// By default, performs semantic analysis to build the new OpenMP clause. 2123 /// Subclasses may override this routine to provide different behavior. 2124 OMPClause * 2125 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2126 Expr *ChunkSize, SourceLocation StartLoc, 2127 SourceLocation LParenLoc, SourceLocation KindLoc, 2128 SourceLocation CommaLoc, SourceLocation EndLoc) { 2129 return getSema().ActOnOpenMPDistScheduleClause( 2130 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2131 } 2132 2133 /// Build a new OpenMP 'to' clause. 2134 /// 2135 /// By default, performs semantic analysis to build the new statement. 2136 /// Subclasses may override this routine to provide different behavior. 2137 OMPClause * 2138 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2139 ArrayRef<SourceLocation> MotionModifiersLoc, 2140 CXXScopeSpec &MapperIdScopeSpec, 2141 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2142 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2143 ArrayRef<Expr *> UnresolvedMappers) { 2144 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2145 MapperIdScopeSpec, MapperId, ColonLoc, 2146 VarList, Locs, UnresolvedMappers); 2147 } 2148 2149 /// Build a new OpenMP 'from' clause. 2150 /// 2151 /// By default, performs semantic analysis to build the new statement. 2152 /// Subclasses may override this routine to provide different behavior. 2153 OMPClause * 2154 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2155 ArrayRef<SourceLocation> MotionModifiersLoc, 2156 CXXScopeSpec &MapperIdScopeSpec, 2157 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2158 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2159 ArrayRef<Expr *> UnresolvedMappers) { 2160 return getSema().ActOnOpenMPFromClause( 2161 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2162 ColonLoc, VarList, Locs, UnresolvedMappers); 2163 } 2164 2165 /// Build a new OpenMP 'use_device_ptr' clause. 2166 /// 2167 /// By default, performs semantic analysis to build the new OpenMP clause. 2168 /// Subclasses may override this routine to provide different behavior. 2169 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2170 const OMPVarListLocTy &Locs) { 2171 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2172 } 2173 2174 /// Build a new OpenMP 'use_device_addr' clause. 2175 /// 2176 /// By default, performs semantic analysis to build the new OpenMP clause. 2177 /// Subclasses may override this routine to provide different behavior. 2178 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2179 const OMPVarListLocTy &Locs) { 2180 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2181 } 2182 2183 /// Build a new OpenMP 'is_device_ptr' clause. 2184 /// 2185 /// By default, performs semantic analysis to build the new OpenMP clause. 2186 /// Subclasses may override this routine to provide different behavior. 2187 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2188 const OMPVarListLocTy &Locs) { 2189 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2190 } 2191 2192 /// Build a new OpenMP 'has_device_addr' 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 *RebuildOMPHasDeviceAddrClause(ArrayRef<Expr *> VarList, 2197 const OMPVarListLocTy &Locs) { 2198 return getSema().ActOnOpenMPHasDeviceAddrClause(VarList, Locs); 2199 } 2200 2201 /// Build a new OpenMP 'defaultmap' clause. 2202 /// 2203 /// By default, performs semantic analysis to build the new OpenMP clause. 2204 /// Subclasses may override this routine to provide different behavior. 2205 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2206 OpenMPDefaultmapClauseKind Kind, 2207 SourceLocation StartLoc, 2208 SourceLocation LParenLoc, 2209 SourceLocation MLoc, 2210 SourceLocation KindLoc, 2211 SourceLocation EndLoc) { 2212 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2213 MLoc, KindLoc, EndLoc); 2214 } 2215 2216 /// Build a new OpenMP 'nontemporal' 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 *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2221 SourceLocation StartLoc, 2222 SourceLocation LParenLoc, 2223 SourceLocation EndLoc) { 2224 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2225 EndLoc); 2226 } 2227 2228 /// Build a new OpenMP 'inclusive' 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 *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2233 SourceLocation StartLoc, 2234 SourceLocation LParenLoc, 2235 SourceLocation EndLoc) { 2236 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2237 EndLoc); 2238 } 2239 2240 /// Build a new OpenMP 'exclusive' clause. 2241 /// 2242 /// By default, performs semantic analysis to build the new OpenMP clause. 2243 /// Subclasses may override this routine to provide different behavior. 2244 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2245 SourceLocation StartLoc, 2246 SourceLocation LParenLoc, 2247 SourceLocation EndLoc) { 2248 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2249 EndLoc); 2250 } 2251 2252 /// Build a new OpenMP 'uses_allocators' 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 *RebuildOMPUsesAllocatorsClause( 2257 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2258 SourceLocation LParenLoc, SourceLocation EndLoc) { 2259 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2260 Data); 2261 } 2262 2263 /// Build a new OpenMP 'affinity' clause. 2264 /// 2265 /// By default, performs semantic analysis to build the new OpenMP clause. 2266 /// Subclasses may override this routine to provide different behavior. 2267 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2268 SourceLocation LParenLoc, 2269 SourceLocation ColonLoc, 2270 SourceLocation EndLoc, Expr *Modifier, 2271 ArrayRef<Expr *> Locators) { 2272 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2273 EndLoc, Modifier, Locators); 2274 } 2275 2276 /// Build a new OpenMP 'order' clause. 2277 /// 2278 /// By default, performs semantic analysis to build the new OpenMP clause. 2279 /// Subclasses may override this routine to provide different behavior. 2280 OMPClause *RebuildOMPOrderClause( 2281 OpenMPOrderClauseKind Kind, SourceLocation KindKwLoc, 2282 SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, 2283 OpenMPOrderClauseModifier Modifier, SourceLocation ModifierKwLoc) { 2284 return getSema().ActOnOpenMPOrderClause(Modifier, Kind, StartLoc, LParenLoc, 2285 ModifierKwLoc, KindKwLoc, EndLoc); 2286 } 2287 2288 /// Build a new OpenMP 'init' 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 *RebuildOMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo, 2293 SourceLocation StartLoc, 2294 SourceLocation LParenLoc, 2295 SourceLocation VarLoc, 2296 SourceLocation EndLoc) { 2297 return getSema().ActOnOpenMPInitClause(InteropVar, InteropInfo, StartLoc, 2298 LParenLoc, VarLoc, EndLoc); 2299 } 2300 2301 /// Build a new OpenMP 'use' clause. 2302 /// 2303 /// By default, performs semantic analysis to build the new OpenMP clause. 2304 /// Subclasses may override this routine to provide different behavior. 2305 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2306 SourceLocation LParenLoc, 2307 SourceLocation VarLoc, SourceLocation EndLoc) { 2308 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2309 VarLoc, EndLoc); 2310 } 2311 2312 /// Build a new OpenMP 'destroy' 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 *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2317 SourceLocation LParenLoc, 2318 SourceLocation VarLoc, 2319 SourceLocation EndLoc) { 2320 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2321 VarLoc, EndLoc); 2322 } 2323 2324 /// Build a new OpenMP 'novariants' clause. 2325 /// 2326 /// By default, performs semantic analysis to build the new OpenMP clause. 2327 /// Subclasses may override this routine to provide different behavior. 2328 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2329 SourceLocation StartLoc, 2330 SourceLocation LParenLoc, 2331 SourceLocation EndLoc) { 2332 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2333 EndLoc); 2334 } 2335 2336 /// Build a new OpenMP 'nocontext' clause. 2337 /// 2338 /// By default, performs semantic analysis to build the new OpenMP clause. 2339 /// Subclasses may override this routine to provide different behavior. 2340 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2341 SourceLocation LParenLoc, 2342 SourceLocation EndLoc) { 2343 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2344 EndLoc); 2345 } 2346 2347 /// Build a new OpenMP 'filter' 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 *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2352 SourceLocation LParenLoc, 2353 SourceLocation EndLoc) { 2354 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2355 EndLoc); 2356 } 2357 2358 /// Build a new OpenMP 'bind' 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 *RebuildOMPBindClause(OpenMPBindClauseKind Kind, 2363 SourceLocation KindLoc, 2364 SourceLocation StartLoc, 2365 SourceLocation LParenLoc, 2366 SourceLocation EndLoc) { 2367 return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc, 2368 EndLoc); 2369 } 2370 2371 /// Build a new OpenMP 'ompx_dyn_cgroup_mem' clause. 2372 /// 2373 /// By default, performs semantic analysis to build the new OpenMP clause. 2374 /// Subclasses may override this routine to provide different behavior. 2375 OMPClause *RebuildOMPXDynCGroupMemClause(Expr *Size, SourceLocation StartLoc, 2376 SourceLocation LParenLoc, 2377 SourceLocation EndLoc) { 2378 return getSema().ActOnOpenMPXDynCGroupMemClause(Size, StartLoc, LParenLoc, 2379 EndLoc); 2380 } 2381 2382 /// Build a new OpenMP 'ompx_attribute' clause. 2383 /// 2384 /// By default, performs semantic analysis to build the new OpenMP clause. 2385 /// Subclasses may override this routine to provide different behavior. 2386 OMPClause *RebuildOMPXAttributeClause(ArrayRef<const Attr *> Attrs, 2387 SourceLocation StartLoc, 2388 SourceLocation LParenLoc, 2389 SourceLocation EndLoc) { 2390 return getSema().ActOnOpenMPXAttributeClause(Attrs, StartLoc, LParenLoc, 2391 EndLoc); 2392 } 2393 2394 /// Build a new OpenMP 'ompx_bare' clause. 2395 /// 2396 /// By default, performs semantic analysis to build the new OpenMP clause. 2397 /// Subclasses may override this routine to provide different behavior. 2398 OMPClause *RebuildOMPXBareClause(SourceLocation StartLoc, 2399 SourceLocation EndLoc) { 2400 return getSema().ActOnOpenMPXBareClause(StartLoc, EndLoc); 2401 } 2402 2403 /// Build a new OpenMP 'align' clause. 2404 /// 2405 /// By default, performs semantic analysis to build the new OpenMP clause. 2406 /// Subclasses may override this routine to provide different behavior. 2407 OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc, 2408 SourceLocation LParenLoc, 2409 SourceLocation EndLoc) { 2410 return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc); 2411 } 2412 2413 /// Build a new OpenMP 'at' clause. 2414 /// 2415 /// By default, performs semantic analysis to build the new OpenMP clause. 2416 /// Subclasses may override this routine to provide different behavior. 2417 OMPClause *RebuildOMPAtClause(OpenMPAtClauseKind Kind, SourceLocation KwLoc, 2418 SourceLocation StartLoc, 2419 SourceLocation LParenLoc, 2420 SourceLocation EndLoc) { 2421 return getSema().ActOnOpenMPAtClause(Kind, KwLoc, StartLoc, LParenLoc, 2422 EndLoc); 2423 } 2424 2425 /// Build a new OpenMP 'severity' clause. 2426 /// 2427 /// By default, performs semantic analysis to build the new OpenMP clause. 2428 /// Subclasses may override this routine to provide different behavior. 2429 OMPClause *RebuildOMPSeverityClause(OpenMPSeverityClauseKind Kind, 2430 SourceLocation KwLoc, 2431 SourceLocation StartLoc, 2432 SourceLocation LParenLoc, 2433 SourceLocation EndLoc) { 2434 return getSema().ActOnOpenMPSeverityClause(Kind, KwLoc, StartLoc, LParenLoc, 2435 EndLoc); 2436 } 2437 2438 /// Build a new OpenMP 'message' clause. 2439 /// 2440 /// By default, performs semantic analysis to build the new OpenMP clause. 2441 /// Subclasses may override this routine to provide different behavior. 2442 OMPClause *RebuildOMPMessageClause(Expr *MS, SourceLocation StartLoc, 2443 SourceLocation LParenLoc, 2444 SourceLocation EndLoc) { 2445 return getSema().ActOnOpenMPMessageClause(MS, StartLoc, LParenLoc, EndLoc); 2446 } 2447 2448 /// Build a new OpenMP 'doacross' clause. 2449 /// 2450 /// By default, performs semantic analysis to build the new OpenMP clause. 2451 /// Subclasses may override this routine to provide different behavior. 2452 OMPClause * 2453 RebuildOMPDoacrossClause(OpenMPDoacrossClauseModifier DepType, 2454 SourceLocation DepLoc, SourceLocation ColonLoc, 2455 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 2456 SourceLocation LParenLoc, SourceLocation EndLoc) { 2457 return getSema().ActOnOpenMPDoacrossClause( 2458 DepType, DepLoc, ColonLoc, VarList, StartLoc, LParenLoc, EndLoc); 2459 } 2460 2461 /// Rebuild the operand to an Objective-C \@synchronized statement. 2462 /// 2463 /// By default, performs semantic analysis to build the new statement. 2464 /// Subclasses may override this routine to provide different behavior. 2465 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2466 Expr *object) { 2467 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2468 } 2469 2470 /// Build a new Objective-C \@synchronized statement. 2471 /// 2472 /// By default, performs semantic analysis to build the new statement. 2473 /// Subclasses may override this routine to provide different behavior. 2474 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2475 Expr *Object, Stmt *Body) { 2476 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2477 } 2478 2479 /// Build a new Objective-C \@autoreleasepool statement. 2480 /// 2481 /// By default, performs semantic analysis to build the new statement. 2482 /// Subclasses may override this routine to provide different behavior. 2483 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2484 Stmt *Body) { 2485 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2486 } 2487 2488 /// Build a new Objective-C fast enumeration statement. 2489 /// 2490 /// By default, performs semantic analysis to build the new statement. 2491 /// Subclasses may override this routine to provide different behavior. 2492 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2493 Stmt *Element, 2494 Expr *Collection, 2495 SourceLocation RParenLoc, 2496 Stmt *Body) { 2497 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2498 Element, 2499 Collection, 2500 RParenLoc); 2501 if (ForEachStmt.isInvalid()) 2502 return StmtError(); 2503 2504 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2505 } 2506 2507 /// Build a new C++ exception declaration. 2508 /// 2509 /// By default, performs semantic analysis to build the new decaration. 2510 /// Subclasses may override this routine to provide different behavior. 2511 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2512 TypeSourceInfo *Declarator, 2513 SourceLocation StartLoc, 2514 SourceLocation IdLoc, 2515 IdentifierInfo *Id) { 2516 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2517 StartLoc, IdLoc, Id); 2518 if (Var) 2519 getSema().CurContext->addDecl(Var); 2520 return Var; 2521 } 2522 2523 /// Build a new C++ catch statement. 2524 /// 2525 /// By default, performs semantic analysis to build the new statement. 2526 /// Subclasses may override this routine to provide different behavior. 2527 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2528 VarDecl *ExceptionDecl, 2529 Stmt *Handler) { 2530 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2531 Handler)); 2532 } 2533 2534 /// Build a new C++ try statement. 2535 /// 2536 /// By default, performs semantic analysis to build the new statement. 2537 /// Subclasses may override this routine to provide different behavior. 2538 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2539 ArrayRef<Stmt *> Handlers) { 2540 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2541 } 2542 2543 /// Build a new C++0x range-based for statement. 2544 /// 2545 /// By default, performs semantic analysis to build the new statement. 2546 /// Subclasses may override this routine to provide different behavior. 2547 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2548 SourceLocation CoawaitLoc, Stmt *Init, 2549 SourceLocation ColonLoc, Stmt *Range, 2550 Stmt *Begin, Stmt *End, Expr *Cond, 2551 Expr *Inc, Stmt *LoopVar, 2552 SourceLocation RParenLoc) { 2553 // If we've just learned that the range is actually an Objective-C 2554 // collection, treat this as an Objective-C fast enumeration loop. 2555 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2556 if (RangeStmt->isSingleDecl()) { 2557 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2558 if (RangeVar->isInvalidDecl()) 2559 return StmtError(); 2560 2561 Expr *RangeExpr = RangeVar->getInit(); 2562 if (!RangeExpr->isTypeDependent() && 2563 RangeExpr->getType()->isObjCObjectPointerType()) { 2564 // FIXME: Support init-statements in Objective-C++20 ranged for 2565 // statement. 2566 if (Init) { 2567 return SemaRef.Diag(Init->getBeginLoc(), 2568 diag::err_objc_for_range_init_stmt) 2569 << Init->getSourceRange(); 2570 } 2571 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2572 RangeExpr, RParenLoc); 2573 } 2574 } 2575 } 2576 } 2577 2578 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2579 Range, Begin, End, Cond, Inc, LoopVar, 2580 RParenLoc, Sema::BFRK_Rebuild); 2581 } 2582 2583 /// Build a new C++0x range-based for statement. 2584 /// 2585 /// By default, performs semantic analysis to build the new statement. 2586 /// Subclasses may override this routine to provide different behavior. 2587 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2588 bool IsIfExists, 2589 NestedNameSpecifierLoc QualifierLoc, 2590 DeclarationNameInfo NameInfo, 2591 Stmt *Nested) { 2592 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2593 QualifierLoc, NameInfo, Nested); 2594 } 2595 2596 /// Attach body to a C++0x range-based for statement. 2597 /// 2598 /// By default, performs semantic analysis to finish the new statement. 2599 /// Subclasses may override this routine to provide different behavior. 2600 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2601 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2602 } 2603 2604 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2605 Stmt *TryBlock, Stmt *Handler) { 2606 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2607 } 2608 2609 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2610 Stmt *Block) { 2611 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2612 } 2613 2614 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2615 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2616 } 2617 2618 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2619 SourceLocation LParen, 2620 SourceLocation RParen, 2621 TypeSourceInfo *TSI) { 2622 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2623 } 2624 2625 /// Build a new predefined expression. 2626 /// 2627 /// By default, performs semantic analysis to build the new expression. 2628 /// Subclasses may override this routine to provide different behavior. 2629 ExprResult RebuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK) { 2630 return getSema().BuildPredefinedExpr(Loc, IK); 2631 } 2632 2633 /// Build a new expression that references a declaration. 2634 /// 2635 /// By default, performs semantic analysis to build the new expression. 2636 /// Subclasses may override this routine to provide different behavior. 2637 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2638 LookupResult &R, 2639 bool RequiresADL) { 2640 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2641 } 2642 2643 2644 /// Build a new expression that references a declaration. 2645 /// 2646 /// By default, performs semantic analysis to build the new expression. 2647 /// Subclasses may override this routine to provide different behavior. 2648 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2649 ValueDecl *VD, 2650 const DeclarationNameInfo &NameInfo, 2651 NamedDecl *Found, 2652 TemplateArgumentListInfo *TemplateArgs) { 2653 CXXScopeSpec SS; 2654 SS.Adopt(QualifierLoc); 2655 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2656 TemplateArgs); 2657 } 2658 2659 /// Build a new expression in parentheses. 2660 /// 2661 /// By default, performs semantic analysis to build the new expression. 2662 /// Subclasses may override this routine to provide different behavior. 2663 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2664 SourceLocation RParen) { 2665 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2666 } 2667 2668 /// Build a new pseudo-destructor expression. 2669 /// 2670 /// By default, performs semantic analysis to build the new expression. 2671 /// Subclasses may override this routine to provide different behavior. 2672 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2673 SourceLocation OperatorLoc, 2674 bool isArrow, 2675 CXXScopeSpec &SS, 2676 TypeSourceInfo *ScopeType, 2677 SourceLocation CCLoc, 2678 SourceLocation TildeLoc, 2679 PseudoDestructorTypeStorage Destroyed); 2680 2681 /// Build a new unary operator expression. 2682 /// 2683 /// By default, performs semantic analysis to build the new expression. 2684 /// Subclasses may override this routine to provide different behavior. 2685 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2686 UnaryOperatorKind Opc, 2687 Expr *SubExpr) { 2688 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2689 } 2690 2691 /// Build a new builtin offsetof expression. 2692 /// 2693 /// By default, performs semantic analysis to build the new expression. 2694 /// Subclasses may override this routine to provide different behavior. 2695 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2696 TypeSourceInfo *Type, 2697 ArrayRef<Sema::OffsetOfComponent> Components, 2698 SourceLocation RParenLoc) { 2699 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2700 RParenLoc); 2701 } 2702 2703 /// Build a new sizeof, alignof or vec_step expression with a 2704 /// type argument. 2705 /// 2706 /// By default, performs semantic analysis to build the new expression. 2707 /// Subclasses may override this routine to provide different behavior. 2708 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2709 SourceLocation OpLoc, 2710 UnaryExprOrTypeTrait ExprKind, 2711 SourceRange R) { 2712 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2713 } 2714 2715 /// Build a new sizeof, alignof or vec step expression with an 2716 /// expression argument. 2717 /// 2718 /// By default, performs semantic analysis to build the new expression. 2719 /// Subclasses may override this routine to provide different behavior. 2720 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2721 UnaryExprOrTypeTrait ExprKind, 2722 SourceRange R) { 2723 ExprResult Result 2724 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2725 if (Result.isInvalid()) 2726 return ExprError(); 2727 2728 return Result; 2729 } 2730 2731 /// Build a new array subscript expression. 2732 /// 2733 /// By default, performs semantic analysis to build the new expression. 2734 /// Subclasses may override this routine to provide different behavior. 2735 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2736 SourceLocation LBracketLoc, 2737 Expr *RHS, 2738 SourceLocation RBracketLoc) { 2739 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2740 LBracketLoc, RHS, 2741 RBracketLoc); 2742 } 2743 2744 /// Build a new matrix subscript expression. 2745 /// 2746 /// By default, performs semantic analysis to build the new expression. 2747 /// Subclasses may override this routine to provide different behavior. 2748 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2749 Expr *ColumnIdx, 2750 SourceLocation RBracketLoc) { 2751 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2752 RBracketLoc); 2753 } 2754 2755 /// Build a new array section 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 RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2760 Expr *LowerBound, 2761 SourceLocation ColonLocFirst, 2762 SourceLocation ColonLocSecond, 2763 Expr *Length, Expr *Stride, 2764 SourceLocation RBracketLoc) { 2765 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2766 ColonLocFirst, ColonLocSecond, 2767 Length, Stride, RBracketLoc); 2768 } 2769 2770 /// Build a new array shaping expression. 2771 /// 2772 /// By default, performs semantic analysis to build the new expression. 2773 /// Subclasses may override this routine to provide different behavior. 2774 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2775 SourceLocation RParenLoc, 2776 ArrayRef<Expr *> Dims, 2777 ArrayRef<SourceRange> BracketsRanges) { 2778 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2779 BracketsRanges); 2780 } 2781 2782 /// Build a new iterator expression. 2783 /// 2784 /// By default, performs semantic analysis to build the new expression. 2785 /// Subclasses may override this routine to provide different behavior. 2786 ExprResult RebuildOMPIteratorExpr( 2787 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2788 ArrayRef<Sema::OMPIteratorData> Data) { 2789 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2790 LLoc, RLoc, Data); 2791 } 2792 2793 /// Build a new call expression. 2794 /// 2795 /// By default, performs semantic analysis to build the new expression. 2796 /// Subclasses may override this routine to provide different behavior. 2797 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2798 MultiExprArg Args, 2799 SourceLocation RParenLoc, 2800 Expr *ExecConfig = nullptr) { 2801 return getSema().ActOnCallExpr( 2802 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2803 } 2804 2805 ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc, 2806 MultiExprArg Args, 2807 SourceLocation RParenLoc) { 2808 return getSema().ActOnArraySubscriptExpr( 2809 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc); 2810 } 2811 2812 /// Build a new member access expression. 2813 /// 2814 /// By default, performs semantic analysis to build the new expression. 2815 /// Subclasses may override this routine to provide different behavior. 2816 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2817 bool isArrow, 2818 NestedNameSpecifierLoc QualifierLoc, 2819 SourceLocation TemplateKWLoc, 2820 const DeclarationNameInfo &MemberNameInfo, 2821 ValueDecl *Member, 2822 NamedDecl *FoundDecl, 2823 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2824 NamedDecl *FirstQualifierInScope) { 2825 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2826 isArrow); 2827 if (!Member->getDeclName()) { 2828 // We have a reference to an unnamed field. This is always the 2829 // base of an anonymous struct/union member access, i.e. the 2830 // field is always of record type. 2831 assert(Member->getType()->isRecordType() && 2832 "unnamed member not of record type?"); 2833 2834 BaseResult = 2835 getSema().PerformObjectMemberConversion(BaseResult.get(), 2836 QualifierLoc.getNestedNameSpecifier(), 2837 FoundDecl, Member); 2838 if (BaseResult.isInvalid()) 2839 return ExprError(); 2840 Base = BaseResult.get(); 2841 2842 CXXScopeSpec EmptySS; 2843 return getSema().BuildFieldReferenceExpr( 2844 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2845 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2846 } 2847 2848 CXXScopeSpec SS; 2849 SS.Adopt(QualifierLoc); 2850 2851 Base = BaseResult.get(); 2852 QualType BaseType = Base->getType(); 2853 2854 if (isArrow && !BaseType->isPointerType()) 2855 return ExprError(); 2856 2857 // FIXME: this involves duplicating earlier analysis in a lot of 2858 // cases; we should avoid this when possible. 2859 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2860 R.addDecl(FoundDecl); 2861 R.resolveKind(); 2862 2863 if (getSema().isUnevaluatedContext() && Base->isImplicitCXXThis() && 2864 isa<FieldDecl, IndirectFieldDecl, MSPropertyDecl>(Member)) { 2865 if (auto *ThisClass = cast<CXXThisExpr>(Base) 2866 ->getType() 2867 ->getPointeeType() 2868 ->getAsCXXRecordDecl()) { 2869 auto *Class = cast<CXXRecordDecl>(Member->getDeclContext()); 2870 // In unevaluated contexts, an expression supposed to be a member access 2871 // might reference a member in an unrelated class. 2872 if (!ThisClass->Equals(Class) && !ThisClass->isDerivedFrom(Class)) 2873 return getSema().BuildDeclRefExpr(Member, Member->getType(), 2874 VK_LValue, Member->getLocation()); 2875 } 2876 } 2877 2878 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2879 SS, TemplateKWLoc, 2880 FirstQualifierInScope, 2881 R, ExplicitTemplateArgs, 2882 /*S*/nullptr); 2883 } 2884 2885 /// Build a new binary operator expression. 2886 /// 2887 /// By default, performs semantic analysis to build the new expression. 2888 /// Subclasses may override this routine to provide different behavior. 2889 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2890 BinaryOperatorKind Opc, 2891 Expr *LHS, Expr *RHS) { 2892 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2893 } 2894 2895 /// Build a new rewritten operator expression. 2896 /// 2897 /// By default, performs semantic analysis to build the new expression. 2898 /// Subclasses may override this routine to provide different behavior. 2899 ExprResult RebuildCXXRewrittenBinaryOperator( 2900 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2901 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2902 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2903 RHS, /*RequiresADL*/false); 2904 } 2905 2906 /// Build a new conditional operator expression. 2907 /// 2908 /// By default, performs semantic analysis to build the new expression. 2909 /// Subclasses may override this routine to provide different behavior. 2910 ExprResult RebuildConditionalOperator(Expr *Cond, 2911 SourceLocation QuestionLoc, 2912 Expr *LHS, 2913 SourceLocation ColonLoc, 2914 Expr *RHS) { 2915 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2916 LHS, RHS); 2917 } 2918 2919 /// Build a new C-style cast expression. 2920 /// 2921 /// By default, performs semantic analysis to build the new expression. 2922 /// Subclasses may override this routine to provide different behavior. 2923 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2924 TypeSourceInfo *TInfo, 2925 SourceLocation RParenLoc, 2926 Expr *SubExpr) { 2927 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2928 SubExpr); 2929 } 2930 2931 /// Build a new compound literal expression. 2932 /// 2933 /// By default, performs semantic analysis to build the new expression. 2934 /// Subclasses may override this routine to provide different behavior. 2935 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2936 TypeSourceInfo *TInfo, 2937 SourceLocation RParenLoc, 2938 Expr *Init) { 2939 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2940 Init); 2941 } 2942 2943 /// Build a new extended vector element access expression. 2944 /// 2945 /// By default, performs semantic analysis to build the new expression. 2946 /// Subclasses may override this routine to provide different behavior. 2947 ExprResult RebuildExtVectorElementExpr(Expr *Base, SourceLocation OpLoc, 2948 bool IsArrow, 2949 SourceLocation AccessorLoc, 2950 IdentifierInfo &Accessor) { 2951 2952 CXXScopeSpec SS; 2953 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2954 return getSema().BuildMemberReferenceExpr( 2955 Base, Base->getType(), OpLoc, IsArrow, SS, SourceLocation(), 2956 /*FirstQualifierInScope*/ nullptr, NameInfo, 2957 /* TemplateArgs */ nullptr, 2958 /*S*/ nullptr); 2959 } 2960 2961 /// Build a new initializer list expression. 2962 /// 2963 /// By default, performs semantic analysis to build the new expression. 2964 /// Subclasses may override this routine to provide different behavior. 2965 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2966 MultiExprArg Inits, 2967 SourceLocation RBraceLoc) { 2968 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2969 } 2970 2971 /// Build a new designated initializer expression. 2972 /// 2973 /// By default, performs semantic analysis to build the new expression. 2974 /// Subclasses may override this routine to provide different behavior. 2975 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2976 MultiExprArg ArrayExprs, 2977 SourceLocation EqualOrColonLoc, 2978 bool GNUSyntax, 2979 Expr *Init) { 2980 ExprResult Result 2981 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2982 Init); 2983 if (Result.isInvalid()) 2984 return ExprError(); 2985 2986 return Result; 2987 } 2988 2989 /// Build a new value-initialized expression. 2990 /// 2991 /// By default, builds the implicit value initialization without performing 2992 /// any semantic analysis. Subclasses may override this routine to provide 2993 /// different behavior. 2994 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2995 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2996 } 2997 2998 /// Build a new \c va_arg expression. 2999 /// 3000 /// By default, performs semantic analysis to build the new expression. 3001 /// Subclasses may override this routine to provide different behavior. 3002 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 3003 Expr *SubExpr, TypeSourceInfo *TInfo, 3004 SourceLocation RParenLoc) { 3005 return getSema().BuildVAArgExpr(BuiltinLoc, 3006 SubExpr, TInfo, 3007 RParenLoc); 3008 } 3009 3010 /// Build a new expression list in parentheses. 3011 /// 3012 /// By default, performs semantic analysis to build the new expression. 3013 /// Subclasses may override this routine to provide different behavior. 3014 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 3015 MultiExprArg SubExprs, 3016 SourceLocation RParenLoc) { 3017 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 3018 } 3019 3020 /// Build a new address-of-label expression. 3021 /// 3022 /// By default, performs semantic analysis, using the name of the label 3023 /// rather than attempting to map the label statement itself. 3024 /// Subclasses may override this routine to provide different behavior. 3025 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 3026 SourceLocation LabelLoc, LabelDecl *Label) { 3027 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 3028 } 3029 3030 /// Build a new GNU statement expression. 3031 /// 3032 /// By default, performs semantic analysis to build the new expression. 3033 /// Subclasses may override this routine to provide different behavior. 3034 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 3035 SourceLocation RParenLoc, unsigned TemplateDepth) { 3036 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 3037 TemplateDepth); 3038 } 3039 3040 /// Build a new __builtin_choose_expr expression. 3041 /// 3042 /// By default, performs semantic analysis to build the new expression. 3043 /// Subclasses may override this routine to provide different behavior. 3044 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 3045 Expr *Cond, Expr *LHS, Expr *RHS, 3046 SourceLocation RParenLoc) { 3047 return SemaRef.ActOnChooseExpr(BuiltinLoc, 3048 Cond, LHS, RHS, 3049 RParenLoc); 3050 } 3051 3052 /// Build a new generic selection expression with an expression predicate. 3053 /// 3054 /// By default, performs semantic analysis to build the new expression. 3055 /// Subclasses may override this routine to provide different behavior. 3056 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 3057 SourceLocation DefaultLoc, 3058 SourceLocation RParenLoc, 3059 Expr *ControllingExpr, 3060 ArrayRef<TypeSourceInfo *> Types, 3061 ArrayRef<Expr *> Exprs) { 3062 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 3063 /*PredicateIsExpr=*/true, 3064 ControllingExpr, Types, Exprs); 3065 } 3066 3067 /// Build a new generic selection expression with a type predicate. 3068 /// 3069 /// By default, performs semantic analysis to build the new expression. 3070 /// Subclasses may override this routine to provide different behavior. 3071 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 3072 SourceLocation DefaultLoc, 3073 SourceLocation RParenLoc, 3074 TypeSourceInfo *ControllingType, 3075 ArrayRef<TypeSourceInfo *> Types, 3076 ArrayRef<Expr *> Exprs) { 3077 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 3078 /*PredicateIsExpr=*/false, 3079 ControllingType, Types, Exprs); 3080 } 3081 3082 /// Build a new overloaded operator call expression. 3083 /// 3084 /// By default, performs semantic analysis to build the new expression. 3085 /// The semantic analysis provides the behavior of template instantiation, 3086 /// copying with transformations that turn what looks like an overloaded 3087 /// operator call into a use of a builtin operator, performing 3088 /// argument-dependent lookup, etc. Subclasses may override this routine to 3089 /// provide different behavior. 3090 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 3091 SourceLocation OpLoc, 3092 SourceLocation CalleeLoc, 3093 bool RequiresADL, 3094 const UnresolvedSetImpl &Functions, 3095 Expr *First, Expr *Second); 3096 3097 /// Build a new C++ "named" cast expression, such as static_cast or 3098 /// reinterpret_cast. 3099 /// 3100 /// By default, this routine dispatches to one of the more-specific routines 3101 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 3102 /// Subclasses may override this routine to provide different behavior. 3103 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 3104 Stmt::StmtClass Class, 3105 SourceLocation LAngleLoc, 3106 TypeSourceInfo *TInfo, 3107 SourceLocation RAngleLoc, 3108 SourceLocation LParenLoc, 3109 Expr *SubExpr, 3110 SourceLocation RParenLoc) { 3111 switch (Class) { 3112 case Stmt::CXXStaticCastExprClass: 3113 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 3114 RAngleLoc, LParenLoc, 3115 SubExpr, RParenLoc); 3116 3117 case Stmt::CXXDynamicCastExprClass: 3118 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 3119 RAngleLoc, LParenLoc, 3120 SubExpr, RParenLoc); 3121 3122 case Stmt::CXXReinterpretCastExprClass: 3123 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 3124 RAngleLoc, LParenLoc, 3125 SubExpr, 3126 RParenLoc); 3127 3128 case Stmt::CXXConstCastExprClass: 3129 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 3130 RAngleLoc, LParenLoc, 3131 SubExpr, RParenLoc); 3132 3133 case Stmt::CXXAddrspaceCastExprClass: 3134 return getDerived().RebuildCXXAddrspaceCastExpr( 3135 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 3136 3137 default: 3138 llvm_unreachable("Invalid C++ named cast"); 3139 } 3140 } 3141 3142 /// Build a new C++ static_cast expression. 3143 /// 3144 /// By default, performs semantic analysis to build the new expression. 3145 /// Subclasses may override this routine to provide different behavior. 3146 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 3147 SourceLocation LAngleLoc, 3148 TypeSourceInfo *TInfo, 3149 SourceLocation RAngleLoc, 3150 SourceLocation LParenLoc, 3151 Expr *SubExpr, 3152 SourceLocation RParenLoc) { 3153 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 3154 TInfo, SubExpr, 3155 SourceRange(LAngleLoc, RAngleLoc), 3156 SourceRange(LParenLoc, RParenLoc)); 3157 } 3158 3159 /// Build a new C++ dynamic_cast expression. 3160 /// 3161 /// By default, performs semantic analysis to build the new expression. 3162 /// Subclasses may override this routine to provide different behavior. 3163 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 3164 SourceLocation LAngleLoc, 3165 TypeSourceInfo *TInfo, 3166 SourceLocation RAngleLoc, 3167 SourceLocation LParenLoc, 3168 Expr *SubExpr, 3169 SourceLocation RParenLoc) { 3170 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 3171 TInfo, SubExpr, 3172 SourceRange(LAngleLoc, RAngleLoc), 3173 SourceRange(LParenLoc, RParenLoc)); 3174 } 3175 3176 /// Build a new C++ reinterpret_cast expression. 3177 /// 3178 /// By default, performs semantic analysis to build the new expression. 3179 /// Subclasses may override this routine to provide different behavior. 3180 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 3181 SourceLocation LAngleLoc, 3182 TypeSourceInfo *TInfo, 3183 SourceLocation RAngleLoc, 3184 SourceLocation LParenLoc, 3185 Expr *SubExpr, 3186 SourceLocation RParenLoc) { 3187 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 3188 TInfo, SubExpr, 3189 SourceRange(LAngleLoc, RAngleLoc), 3190 SourceRange(LParenLoc, RParenLoc)); 3191 } 3192 3193 /// Build a new C++ const_cast expression. 3194 /// 3195 /// By default, performs semantic analysis to build the new expression. 3196 /// Subclasses may override this routine to provide different behavior. 3197 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 3198 SourceLocation LAngleLoc, 3199 TypeSourceInfo *TInfo, 3200 SourceLocation RAngleLoc, 3201 SourceLocation LParenLoc, 3202 Expr *SubExpr, 3203 SourceLocation RParenLoc) { 3204 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 3205 TInfo, SubExpr, 3206 SourceRange(LAngleLoc, RAngleLoc), 3207 SourceRange(LParenLoc, RParenLoc)); 3208 } 3209 3210 ExprResult 3211 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 3212 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 3213 SourceLocation LParenLoc, Expr *SubExpr, 3214 SourceLocation RParenLoc) { 3215 return getSema().BuildCXXNamedCast( 3216 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 3217 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 3218 } 3219 3220 /// Build a new C++ functional-style cast expression. 3221 /// 3222 /// By default, performs semantic analysis to build the new expression. 3223 /// Subclasses may override this routine to provide different behavior. 3224 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 3225 SourceLocation LParenLoc, 3226 Expr *Sub, 3227 SourceLocation RParenLoc, 3228 bool ListInitialization) { 3229 // If Sub is a ParenListExpr, then Sub is the syntatic form of a 3230 // CXXParenListInitExpr. Pass its expanded arguments so that the 3231 // CXXParenListInitExpr can be rebuilt. 3232 if (auto *PLE = dyn_cast<ParenListExpr>(Sub)) 3233 return getSema().BuildCXXTypeConstructExpr( 3234 TInfo, LParenLoc, MultiExprArg(PLE->getExprs(), PLE->getNumExprs()), 3235 RParenLoc, ListInitialization); 3236 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3237 MultiExprArg(&Sub, 1), RParenLoc, 3238 ListInitialization); 3239 } 3240 3241 /// Build a new C++ __builtin_bit_cast expression. 3242 /// 3243 /// By default, performs semantic analysis to build the new expression. 3244 /// Subclasses may override this routine to provide different behavior. 3245 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3246 TypeSourceInfo *TSI, Expr *Sub, 3247 SourceLocation RParenLoc) { 3248 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3249 } 3250 3251 /// Build a new C++ typeid(type) expression. 3252 /// 3253 /// By default, performs semantic analysis to build the new expression. 3254 /// Subclasses may override this routine to provide different behavior. 3255 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3256 SourceLocation TypeidLoc, 3257 TypeSourceInfo *Operand, 3258 SourceLocation RParenLoc) { 3259 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3260 RParenLoc); 3261 } 3262 3263 3264 /// Build a new C++ typeid(expr) expression. 3265 /// 3266 /// By default, performs semantic analysis to build the new expression. 3267 /// Subclasses may override this routine to provide different behavior. 3268 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3269 SourceLocation TypeidLoc, 3270 Expr *Operand, 3271 SourceLocation RParenLoc) { 3272 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3273 RParenLoc); 3274 } 3275 3276 /// Build a new C++ __uuidof(type) 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 RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3281 TypeSourceInfo *Operand, 3282 SourceLocation RParenLoc) { 3283 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3284 } 3285 3286 /// Build a new C++ __uuidof(expr) expression. 3287 /// 3288 /// By default, performs semantic analysis to build the new expression. 3289 /// Subclasses may override this routine to provide different behavior. 3290 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3291 Expr *Operand, SourceLocation RParenLoc) { 3292 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3293 } 3294 3295 /// Build a new C++ "this" expression. 3296 /// 3297 /// By default, builds a new "this" expression without performing any 3298 /// semantic analysis. Subclasses may override this routine to provide 3299 /// different behavior. 3300 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3301 QualType ThisType, 3302 bool isImplicit) { 3303 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3304 } 3305 3306 /// Build a new C++ throw expression. 3307 /// 3308 /// By default, performs semantic analysis to build the new expression. 3309 /// Subclasses may override this routine to provide different behavior. 3310 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3311 bool IsThrownVariableInScope) { 3312 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3313 } 3314 3315 /// Build a new C++ default-argument expression. 3316 /// 3317 /// By default, builds a new default-argument expression, which does not 3318 /// require any semantic analysis. Subclasses may override this routine to 3319 /// provide different behavior. 3320 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param, 3321 Expr *RewrittenExpr) { 3322 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3323 RewrittenExpr, getSema().CurContext); 3324 } 3325 3326 /// Build a new C++11 default-initialization expression. 3327 /// 3328 /// By default, builds a new default field initialization expression, which 3329 /// does not require any semantic analysis. Subclasses may override this 3330 /// routine to provide different behavior. 3331 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3332 FieldDecl *Field) { 3333 return getSema().BuildCXXDefaultInitExpr(Loc, Field); 3334 } 3335 3336 /// Build a new C++ zero-initialization expression. 3337 /// 3338 /// By default, performs semantic analysis to build the new expression. 3339 /// Subclasses may override this routine to provide different behavior. 3340 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3341 SourceLocation LParenLoc, 3342 SourceLocation RParenLoc) { 3343 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, std::nullopt, 3344 RParenLoc, 3345 /*ListInitialization=*/false); 3346 } 3347 3348 /// Build a new C++ "new" expression. 3349 /// 3350 /// By default, performs semantic analysis to build the new expression. 3351 /// Subclasses may override this routine to provide different behavior. 3352 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, bool UseGlobal, 3353 SourceLocation PlacementLParen, 3354 MultiExprArg PlacementArgs, 3355 SourceLocation PlacementRParen, 3356 SourceRange TypeIdParens, QualType AllocatedType, 3357 TypeSourceInfo *AllocatedTypeInfo, 3358 std::optional<Expr *> ArraySize, 3359 SourceRange DirectInitRange, Expr *Initializer) { 3360 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3361 PlacementLParen, 3362 PlacementArgs, 3363 PlacementRParen, 3364 TypeIdParens, 3365 AllocatedType, 3366 AllocatedTypeInfo, 3367 ArraySize, 3368 DirectInitRange, 3369 Initializer); 3370 } 3371 3372 /// Build a new C++ "delete" expression. 3373 /// 3374 /// By default, performs semantic analysis to build the new expression. 3375 /// Subclasses may override this routine to provide different behavior. 3376 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3377 bool IsGlobalDelete, 3378 bool IsArrayForm, 3379 Expr *Operand) { 3380 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3381 Operand); 3382 } 3383 3384 /// Build a new type trait expression. 3385 /// 3386 /// By default, performs semantic analysis to build the new expression. 3387 /// Subclasses may override this routine to provide different behavior. 3388 ExprResult RebuildTypeTrait(TypeTrait Trait, 3389 SourceLocation StartLoc, 3390 ArrayRef<TypeSourceInfo *> Args, 3391 SourceLocation RParenLoc) { 3392 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3393 } 3394 3395 /// Build a new array type trait expression. 3396 /// 3397 /// By default, performs semantic analysis to build the new expression. 3398 /// Subclasses may override this routine to provide different behavior. 3399 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3400 SourceLocation StartLoc, 3401 TypeSourceInfo *TSInfo, 3402 Expr *DimExpr, 3403 SourceLocation RParenLoc) { 3404 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3405 } 3406 3407 /// Build a new expression trait expression. 3408 /// 3409 /// By default, performs semantic analysis to build the new expression. 3410 /// Subclasses may override this routine to provide different behavior. 3411 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3412 SourceLocation StartLoc, 3413 Expr *Queried, 3414 SourceLocation RParenLoc) { 3415 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3416 } 3417 3418 /// Build a new (previously unresolved) declaration reference 3419 /// expression. 3420 /// 3421 /// By default, performs semantic analysis to build the new expression. 3422 /// Subclasses may override this routine to provide different behavior. 3423 ExprResult RebuildDependentScopeDeclRefExpr( 3424 NestedNameSpecifierLoc QualifierLoc, 3425 SourceLocation TemplateKWLoc, 3426 const DeclarationNameInfo &NameInfo, 3427 const TemplateArgumentListInfo *TemplateArgs, 3428 bool IsAddressOfOperand, 3429 TypeSourceInfo **RecoveryTSI) { 3430 CXXScopeSpec SS; 3431 SS.Adopt(QualifierLoc); 3432 3433 if (TemplateArgs || TemplateKWLoc.isValid()) 3434 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3435 TemplateArgs); 3436 3437 return getSema().BuildQualifiedDeclarationNameExpr( 3438 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3439 } 3440 3441 /// Build a new template-id expression. 3442 /// 3443 /// By default, performs semantic analysis to build the new expression. 3444 /// Subclasses may override this routine to provide different behavior. 3445 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3446 SourceLocation TemplateKWLoc, 3447 LookupResult &R, 3448 bool RequiresADL, 3449 const TemplateArgumentListInfo *TemplateArgs) { 3450 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3451 TemplateArgs); 3452 } 3453 3454 /// Build a new object-construction 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 RebuildCXXConstructExpr( 3459 QualType T, SourceLocation Loc, CXXConstructorDecl *Constructor, 3460 bool IsElidable, MultiExprArg Args, bool HadMultipleCandidates, 3461 bool ListInitialization, bool StdInitListInitialization, 3462 bool RequiresZeroInit, CXXConstructionKind ConstructKind, 3463 SourceRange ParenRange) { 3464 // Reconstruct the constructor we originally found, which might be 3465 // different if this is a call to an inherited constructor. 3466 CXXConstructorDecl *FoundCtor = Constructor; 3467 if (Constructor->isInheritingConstructor()) 3468 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3469 3470 SmallVector<Expr *, 8> ConvertedArgs; 3471 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3472 ConvertedArgs)) 3473 return ExprError(); 3474 3475 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3476 IsElidable, 3477 ConvertedArgs, 3478 HadMultipleCandidates, 3479 ListInitialization, 3480 StdInitListInitialization, 3481 RequiresZeroInit, ConstructKind, 3482 ParenRange); 3483 } 3484 3485 /// Build a new implicit construction via inherited constructor 3486 /// expression. 3487 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3488 CXXConstructorDecl *Constructor, 3489 bool ConstructsVBase, 3490 bool InheritedFromVBase) { 3491 return new (getSema().Context) CXXInheritedCtorInitExpr( 3492 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3493 } 3494 3495 /// Build a new object-construction expression. 3496 /// 3497 /// By default, performs semantic analysis to build the new expression. 3498 /// Subclasses may override this routine to provide different behavior. 3499 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3500 SourceLocation LParenOrBraceLoc, 3501 MultiExprArg Args, 3502 SourceLocation RParenOrBraceLoc, 3503 bool ListInitialization) { 3504 return getSema().BuildCXXTypeConstructExpr( 3505 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3506 } 3507 3508 /// Build a new object-construction expression. 3509 /// 3510 /// By default, performs semantic analysis to build the new expression. 3511 /// Subclasses may override this routine to provide different behavior. 3512 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3513 SourceLocation LParenLoc, 3514 MultiExprArg Args, 3515 SourceLocation RParenLoc, 3516 bool ListInitialization) { 3517 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3518 RParenLoc, ListInitialization); 3519 } 3520 3521 /// Build a new member reference expression. 3522 /// 3523 /// By default, performs semantic analysis to build the new expression. 3524 /// Subclasses may override this routine to provide different behavior. 3525 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3526 QualType BaseType, 3527 bool IsArrow, 3528 SourceLocation OperatorLoc, 3529 NestedNameSpecifierLoc QualifierLoc, 3530 SourceLocation TemplateKWLoc, 3531 NamedDecl *FirstQualifierInScope, 3532 const DeclarationNameInfo &MemberNameInfo, 3533 const TemplateArgumentListInfo *TemplateArgs) { 3534 CXXScopeSpec SS; 3535 SS.Adopt(QualifierLoc); 3536 3537 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3538 OperatorLoc, IsArrow, 3539 SS, TemplateKWLoc, 3540 FirstQualifierInScope, 3541 MemberNameInfo, 3542 TemplateArgs, /*S*/nullptr); 3543 } 3544 3545 /// Build a new member reference expression. 3546 /// 3547 /// By default, performs semantic analysis to build the new expression. 3548 /// Subclasses may override this routine to provide different behavior. 3549 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3550 SourceLocation OperatorLoc, 3551 bool IsArrow, 3552 NestedNameSpecifierLoc QualifierLoc, 3553 SourceLocation TemplateKWLoc, 3554 NamedDecl *FirstQualifierInScope, 3555 LookupResult &R, 3556 const TemplateArgumentListInfo *TemplateArgs) { 3557 CXXScopeSpec SS; 3558 SS.Adopt(QualifierLoc); 3559 3560 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3561 OperatorLoc, IsArrow, 3562 SS, TemplateKWLoc, 3563 FirstQualifierInScope, 3564 R, TemplateArgs, /*S*/nullptr); 3565 } 3566 3567 /// Build a new noexcept expression. 3568 /// 3569 /// By default, performs semantic analysis to build the new expression. 3570 /// Subclasses may override this routine to provide different behavior. 3571 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3572 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3573 } 3574 3575 /// Build a new expression to compute the length of a parameter pack. 3576 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack, 3577 SourceLocation PackLoc, 3578 SourceLocation RParenLoc, 3579 std::optional<unsigned> Length, 3580 ArrayRef<TemplateArgument> PartialArgs) { 3581 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3582 RParenLoc, Length, PartialArgs); 3583 } 3584 3585 /// Build a new expression representing a call to a source location 3586 /// builtin. 3587 /// 3588 /// By default, performs semantic analysis to build the new expression. 3589 /// Subclasses may override this routine to provide different behavior. 3590 ExprResult RebuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy, 3591 SourceLocation BuiltinLoc, 3592 SourceLocation RPLoc, 3593 DeclContext *ParentContext) { 3594 return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc, 3595 ParentContext); 3596 } 3597 3598 /// Build a new Objective-C boxed expression. 3599 /// 3600 /// By default, performs semantic analysis to build the new expression. 3601 /// Subclasses may override this routine to provide different behavior. 3602 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3603 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3604 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3605 TemplateArgumentListInfo *TALI) { 3606 CXXScopeSpec SS; 3607 SS.Adopt(NNS); 3608 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3609 ConceptNameInfo, 3610 FoundDecl, 3611 NamedConcept, TALI); 3612 if (Result.isInvalid()) 3613 return ExprError(); 3614 return Result; 3615 } 3616 3617 /// \brief Build a new requires expression. 3618 /// 3619 /// By default, performs semantic analysis to build the new expression. 3620 /// Subclasses may override this routine to provide different behavior. 3621 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3622 RequiresExprBodyDecl *Body, 3623 SourceLocation LParenLoc, 3624 ArrayRef<ParmVarDecl *> LocalParameters, 3625 SourceLocation RParenLoc, 3626 ArrayRef<concepts::Requirement *> Requirements, 3627 SourceLocation ClosingBraceLoc) { 3628 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, LParenLoc, 3629 LocalParameters, RParenLoc, Requirements, 3630 ClosingBraceLoc); 3631 } 3632 3633 concepts::TypeRequirement * 3634 RebuildTypeRequirement( 3635 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3636 return SemaRef.BuildTypeRequirement(SubstDiag); 3637 } 3638 3639 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3640 return SemaRef.BuildTypeRequirement(T); 3641 } 3642 3643 concepts::ExprRequirement * 3644 RebuildExprRequirement( 3645 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3646 SourceLocation NoexceptLoc, 3647 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3648 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3649 std::move(Ret)); 3650 } 3651 3652 concepts::ExprRequirement * 3653 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3654 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3655 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3656 std::move(Ret)); 3657 } 3658 3659 concepts::NestedRequirement * 3660 RebuildNestedRequirement(StringRef InvalidConstraintEntity, 3661 const ASTConstraintSatisfaction &Satisfaction) { 3662 return SemaRef.BuildNestedRequirement(InvalidConstraintEntity, 3663 Satisfaction); 3664 } 3665 3666 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3667 return SemaRef.BuildNestedRequirement(Constraint); 3668 } 3669 3670 /// \brief Build a new Objective-C boxed expression. 3671 /// 3672 /// By default, performs semantic analysis to build the new expression. 3673 /// Subclasses may override this routine to provide different behavior. 3674 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3675 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3676 } 3677 3678 /// Build a new Objective-C array literal. 3679 /// 3680 /// By default, performs semantic analysis to build the new expression. 3681 /// Subclasses may override this routine to provide different behavior. 3682 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3683 Expr **Elements, unsigned NumElements) { 3684 return getSema().BuildObjCArrayLiteral(Range, 3685 MultiExprArg(Elements, NumElements)); 3686 } 3687 3688 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3689 Expr *Base, Expr *Key, 3690 ObjCMethodDecl *getterMethod, 3691 ObjCMethodDecl *setterMethod) { 3692 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3693 getterMethod, setterMethod); 3694 } 3695 3696 /// Build a new Objective-C dictionary literal. 3697 /// 3698 /// By default, performs semantic analysis to build the new expression. 3699 /// Subclasses may override this routine to provide different behavior. 3700 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3701 MutableArrayRef<ObjCDictionaryElement> Elements) { 3702 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3703 } 3704 3705 /// Build a new Objective-C \@encode expression. 3706 /// 3707 /// By default, performs semantic analysis to build the new expression. 3708 /// Subclasses may override this routine to provide different behavior. 3709 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3710 TypeSourceInfo *EncodeTypeInfo, 3711 SourceLocation RParenLoc) { 3712 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3713 } 3714 3715 /// Build a new Objective-C class message. 3716 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3717 Selector Sel, 3718 ArrayRef<SourceLocation> SelectorLocs, 3719 ObjCMethodDecl *Method, 3720 SourceLocation LBracLoc, 3721 MultiExprArg Args, 3722 SourceLocation RBracLoc) { 3723 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3724 ReceiverTypeInfo->getType(), 3725 /*SuperLoc=*/SourceLocation(), 3726 Sel, Method, LBracLoc, SelectorLocs, 3727 RBracLoc, Args); 3728 } 3729 3730 /// Build a new Objective-C instance message. 3731 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3732 Selector Sel, 3733 ArrayRef<SourceLocation> SelectorLocs, 3734 ObjCMethodDecl *Method, 3735 SourceLocation LBracLoc, 3736 MultiExprArg Args, 3737 SourceLocation RBracLoc) { 3738 return SemaRef.BuildInstanceMessage(Receiver, 3739 Receiver->getType(), 3740 /*SuperLoc=*/SourceLocation(), 3741 Sel, Method, LBracLoc, SelectorLocs, 3742 RBracLoc, Args); 3743 } 3744 3745 /// Build a new Objective-C instance/class message to 'super'. 3746 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3747 Selector Sel, 3748 ArrayRef<SourceLocation> SelectorLocs, 3749 QualType SuperType, 3750 ObjCMethodDecl *Method, 3751 SourceLocation LBracLoc, 3752 MultiExprArg Args, 3753 SourceLocation RBracLoc) { 3754 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3755 SuperType, 3756 SuperLoc, 3757 Sel, Method, LBracLoc, SelectorLocs, 3758 RBracLoc, Args) 3759 : SemaRef.BuildClassMessage(nullptr, 3760 SuperType, 3761 SuperLoc, 3762 Sel, Method, LBracLoc, SelectorLocs, 3763 RBracLoc, Args); 3764 3765 3766 } 3767 3768 /// Build a new Objective-C ivar reference expression. 3769 /// 3770 /// By default, performs semantic analysis to build the new expression. 3771 /// Subclasses may override this routine to provide different behavior. 3772 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3773 SourceLocation IvarLoc, 3774 bool IsArrow, bool IsFreeIvar) { 3775 CXXScopeSpec SS; 3776 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3777 ExprResult Result = getSema().BuildMemberReferenceExpr( 3778 BaseArg, BaseArg->getType(), 3779 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3780 /*FirstQualifierInScope=*/nullptr, NameInfo, 3781 /*TemplateArgs=*/nullptr, 3782 /*S=*/nullptr); 3783 if (IsFreeIvar && Result.isUsable()) 3784 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3785 return Result; 3786 } 3787 3788 /// Build a new Objective-C property reference expression. 3789 /// 3790 /// By default, performs semantic analysis to build the new expression. 3791 /// Subclasses may override this routine to provide different behavior. 3792 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3793 ObjCPropertyDecl *Property, 3794 SourceLocation PropertyLoc) { 3795 CXXScopeSpec SS; 3796 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3797 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3798 /*FIXME:*/PropertyLoc, 3799 /*IsArrow=*/false, 3800 SS, SourceLocation(), 3801 /*FirstQualifierInScope=*/nullptr, 3802 NameInfo, 3803 /*TemplateArgs=*/nullptr, 3804 /*S=*/nullptr); 3805 } 3806 3807 /// Build a new Objective-C property reference expression. 3808 /// 3809 /// By default, performs semantic analysis to build the new expression. 3810 /// Subclasses may override this routine to provide different behavior. 3811 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3812 ObjCMethodDecl *Getter, 3813 ObjCMethodDecl *Setter, 3814 SourceLocation PropertyLoc) { 3815 // Since these expressions can only be value-dependent, we do not 3816 // need to perform semantic analysis again. 3817 return Owned( 3818 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3819 VK_LValue, OK_ObjCProperty, 3820 PropertyLoc, Base)); 3821 } 3822 3823 /// Build a new Objective-C "isa" expression. 3824 /// 3825 /// By default, performs semantic analysis to build the new expression. 3826 /// Subclasses may override this routine to provide different behavior. 3827 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3828 SourceLocation OpLoc, bool IsArrow) { 3829 CXXScopeSpec SS; 3830 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3831 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3832 OpLoc, IsArrow, 3833 SS, SourceLocation(), 3834 /*FirstQualifierInScope=*/nullptr, 3835 NameInfo, 3836 /*TemplateArgs=*/nullptr, 3837 /*S=*/nullptr); 3838 } 3839 3840 /// Build a new shuffle vector expression. 3841 /// 3842 /// By default, performs semantic analysis to build the new expression. 3843 /// Subclasses may override this routine to provide different behavior. 3844 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3845 MultiExprArg SubExprs, 3846 SourceLocation RParenLoc) { 3847 // Find the declaration for __builtin_shufflevector 3848 const IdentifierInfo &Name 3849 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3850 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3851 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3852 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3853 3854 // Build a reference to the __builtin_shufflevector builtin 3855 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3856 Expr *Callee = new (SemaRef.Context) 3857 DeclRefExpr(SemaRef.Context, Builtin, false, 3858 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3859 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3860 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3861 CK_BuiltinFnToFnPtr).get(); 3862 3863 // Build the CallExpr 3864 ExprResult TheCall = CallExpr::Create( 3865 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3866 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3867 FPOptionsOverride()); 3868 3869 // Type-check the __builtin_shufflevector expression. 3870 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3871 } 3872 3873 /// Build a new convert vector expression. 3874 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3875 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3876 SourceLocation RParenLoc) { 3877 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3878 BuiltinLoc, RParenLoc); 3879 } 3880 3881 /// Build a new template argument pack expansion. 3882 /// 3883 /// By default, performs semantic analysis to build a new pack expansion 3884 /// for a template argument. Subclasses may override this routine to provide 3885 /// different behavior. 3886 TemplateArgumentLoc 3887 RebuildPackExpansion(TemplateArgumentLoc Pattern, SourceLocation EllipsisLoc, 3888 std::optional<unsigned> NumExpansions) { 3889 switch (Pattern.getArgument().getKind()) { 3890 case TemplateArgument::Expression: { 3891 ExprResult Result 3892 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3893 EllipsisLoc, NumExpansions); 3894 if (Result.isInvalid()) 3895 return TemplateArgumentLoc(); 3896 3897 return TemplateArgumentLoc(Result.get(), Result.get()); 3898 } 3899 3900 case TemplateArgument::Template: 3901 return TemplateArgumentLoc( 3902 SemaRef.Context, 3903 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3904 NumExpansions), 3905 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3906 EllipsisLoc); 3907 3908 case TemplateArgument::Null: 3909 case TemplateArgument::Integral: 3910 case TemplateArgument::Declaration: 3911 case TemplateArgument::Pack: 3912 case TemplateArgument::TemplateExpansion: 3913 case TemplateArgument::NullPtr: 3914 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3915 3916 case TemplateArgument::Type: 3917 if (TypeSourceInfo *Expansion 3918 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3919 EllipsisLoc, 3920 NumExpansions)) 3921 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3922 Expansion); 3923 break; 3924 } 3925 3926 return TemplateArgumentLoc(); 3927 } 3928 3929 /// Build a new expression pack expansion. 3930 /// 3931 /// By default, performs semantic analysis to build a new pack expansion 3932 /// for an expression. Subclasses may override this routine to provide 3933 /// different behavior. 3934 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3935 std::optional<unsigned> NumExpansions) { 3936 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3937 } 3938 3939 /// Build a new C++1z fold-expression. 3940 /// 3941 /// By default, performs semantic analysis in order to build a new fold 3942 /// expression. 3943 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3944 SourceLocation LParenLoc, Expr *LHS, 3945 BinaryOperatorKind Operator, 3946 SourceLocation EllipsisLoc, Expr *RHS, 3947 SourceLocation RParenLoc, 3948 std::optional<unsigned> NumExpansions) { 3949 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3950 EllipsisLoc, RHS, RParenLoc, 3951 NumExpansions); 3952 } 3953 3954 /// Build an empty C++1z fold-expression with the given operator. 3955 /// 3956 /// By default, produces the fallback value for the fold-expression, or 3957 /// produce an error if there is no fallback value. 3958 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3959 BinaryOperatorKind Operator) { 3960 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3961 } 3962 3963 /// Build a new atomic operation expression. 3964 /// 3965 /// By default, performs semantic analysis to build the new expression. 3966 /// Subclasses may override this routine to provide different behavior. 3967 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3968 AtomicExpr::AtomicOp Op, 3969 SourceLocation RParenLoc) { 3970 // Use this for all of the locations, since we don't know the difference 3971 // between the call and the expr at this point. 3972 SourceRange Range{BuiltinLoc, RParenLoc}; 3973 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3974 Sema::AtomicArgumentOrder::AST); 3975 } 3976 3977 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3978 ArrayRef<Expr *> SubExprs, QualType Type) { 3979 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3980 } 3981 3982 private: 3983 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3984 QualType ObjectType, 3985 NamedDecl *FirstQualifierInScope, 3986 CXXScopeSpec &SS); 3987 3988 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3989 QualType ObjectType, 3990 NamedDecl *FirstQualifierInScope, 3991 CXXScopeSpec &SS); 3992 3993 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3994 NamedDecl *FirstQualifierInScope, 3995 CXXScopeSpec &SS); 3996 3997 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3998 DependentNameTypeLoc TL, 3999 bool DeducibleTSTContext); 4000 }; 4001 4002 template <typename Derived> 4003 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 4004 if (!S) 4005 return S; 4006 4007 switch (S->getStmtClass()) { 4008 case Stmt::NoStmtClass: break; 4009 4010 // Transform individual statement nodes 4011 // Pass SDK into statements that can produce a value 4012 #define STMT(Node, Parent) \ 4013 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 4014 #define VALUESTMT(Node, Parent) \ 4015 case Stmt::Node##Class: \ 4016 return getDerived().Transform##Node(cast<Node>(S), SDK); 4017 #define ABSTRACT_STMT(Node) 4018 #define EXPR(Node, Parent) 4019 #include "clang/AST/StmtNodes.inc" 4020 4021 // Transform expressions by calling TransformExpr. 4022 #define STMT(Node, Parent) 4023 #define ABSTRACT_STMT(Stmt) 4024 #define EXPR(Node, Parent) case Stmt::Node##Class: 4025 #include "clang/AST/StmtNodes.inc" 4026 { 4027 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 4028 4029 if (SDK == SDK_StmtExprResult) 4030 E = getSema().ActOnStmtExprResult(E); 4031 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 4032 } 4033 } 4034 4035 return S; 4036 } 4037 4038 template<typename Derived> 4039 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 4040 if (!S) 4041 return S; 4042 4043 switch (S->getClauseKind()) { 4044 default: break; 4045 // Transform individual clause nodes 4046 #define GEN_CLANG_CLAUSE_CLASS 4047 #define CLAUSE_CLASS(Enum, Str, Class) \ 4048 case Enum: \ 4049 return getDerived().Transform##Class(cast<Class>(S)); 4050 #include "llvm/Frontend/OpenMP/OMP.inc" 4051 } 4052 4053 return S; 4054 } 4055 4056 4057 template<typename Derived> 4058 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 4059 if (!E) 4060 return E; 4061 4062 switch (E->getStmtClass()) { 4063 case Stmt::NoStmtClass: break; 4064 #define STMT(Node, Parent) case Stmt::Node##Class: break; 4065 #define ABSTRACT_STMT(Stmt) 4066 #define EXPR(Node, Parent) \ 4067 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 4068 #include "clang/AST/StmtNodes.inc" 4069 } 4070 4071 return E; 4072 } 4073 4074 template<typename Derived> 4075 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 4076 bool NotCopyInit) { 4077 // Initializers are instantiated like expressions, except that various outer 4078 // layers are stripped. 4079 if (!Init) 4080 return Init; 4081 4082 if (auto *FE = dyn_cast<FullExpr>(Init)) 4083 Init = FE->getSubExpr(); 4084 4085 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 4086 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 4087 Init = OVE->getSourceExpr(); 4088 } 4089 4090 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 4091 Init = MTE->getSubExpr(); 4092 4093 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 4094 Init = Binder->getSubExpr(); 4095 4096 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 4097 Init = ICE->getSubExprAsWritten(); 4098 4099 if (CXXStdInitializerListExpr *ILE = 4100 dyn_cast<CXXStdInitializerListExpr>(Init)) 4101 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 4102 4103 // If this is copy-initialization, we only need to reconstruct 4104 // InitListExprs. Other forms of copy-initialization will be a no-op if 4105 // the initializer is already the right type. 4106 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 4107 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 4108 return getDerived().TransformExpr(Init); 4109 4110 // Revert value-initialization back to empty parens. 4111 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 4112 SourceRange Parens = VIE->getSourceRange(); 4113 return getDerived().RebuildParenListExpr(Parens.getBegin(), std::nullopt, 4114 Parens.getEnd()); 4115 } 4116 4117 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 4118 if (isa<ImplicitValueInitExpr>(Init)) 4119 return getDerived().RebuildParenListExpr(SourceLocation(), std::nullopt, 4120 SourceLocation()); 4121 4122 // Revert initialization by constructor back to a parenthesized or braced list 4123 // of expressions. Any other form of initializer can just be reused directly. 4124 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 4125 return getDerived().TransformExpr(Init); 4126 4127 // If the initialization implicitly converted an initializer list to a 4128 // std::initializer_list object, unwrap the std::initializer_list too. 4129 if (Construct && Construct->isStdInitListInitialization()) 4130 return TransformInitializer(Construct->getArg(0), NotCopyInit); 4131 4132 // Enter a list-init context if this was list initialization. 4133 EnterExpressionEvaluationContext Context( 4134 getSema(), EnterExpressionEvaluationContext::InitList, 4135 Construct->isListInitialization()); 4136 4137 SmallVector<Expr*, 8> NewArgs; 4138 bool ArgChanged = false; 4139 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 4140 /*IsCall*/true, NewArgs, &ArgChanged)) 4141 return ExprError(); 4142 4143 // If this was list initialization, revert to syntactic list form. 4144 if (Construct->isListInitialization()) 4145 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 4146 Construct->getEndLoc()); 4147 4148 // Build a ParenListExpr to represent anything else. 4149 SourceRange Parens = Construct->getParenOrBraceRange(); 4150 if (Parens.isInvalid()) { 4151 // This was a variable declaration's initialization for which no initializer 4152 // was specified. 4153 assert(NewArgs.empty() && 4154 "no parens or braces but have direct init with arguments?"); 4155 return ExprEmpty(); 4156 } 4157 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 4158 Parens.getEnd()); 4159 } 4160 4161 template<typename Derived> 4162 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 4163 unsigned NumInputs, 4164 bool IsCall, 4165 SmallVectorImpl<Expr *> &Outputs, 4166 bool *ArgChanged) { 4167 for (unsigned I = 0; I != NumInputs; ++I) { 4168 // If requested, drop call arguments that need to be dropped. 4169 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 4170 if (ArgChanged) 4171 *ArgChanged = true; 4172 4173 break; 4174 } 4175 4176 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 4177 Expr *Pattern = Expansion->getPattern(); 4178 4179 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4180 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4181 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4182 4183 // Determine whether the set of unexpanded parameter packs can and should 4184 // be expanded. 4185 bool Expand = true; 4186 bool RetainExpansion = false; 4187 std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 4188 std::optional<unsigned> NumExpansions = OrigNumExpansions; 4189 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 4190 Pattern->getSourceRange(), 4191 Unexpanded, 4192 Expand, RetainExpansion, 4193 NumExpansions)) 4194 return true; 4195 4196 if (!Expand) { 4197 // The transform has determined that we should perform a simple 4198 // transformation on the pack expansion, producing another pack 4199 // expansion. 4200 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4201 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 4202 if (OutPattern.isInvalid()) 4203 return true; 4204 4205 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 4206 Expansion->getEllipsisLoc(), 4207 NumExpansions); 4208 if (Out.isInvalid()) 4209 return true; 4210 4211 if (ArgChanged) 4212 *ArgChanged = true; 4213 Outputs.push_back(Out.get()); 4214 continue; 4215 } 4216 4217 // Record right away that the argument was changed. This needs 4218 // to happen even if the array expands to nothing. 4219 if (ArgChanged) *ArgChanged = true; 4220 4221 // The transform has determined that we should perform an elementwise 4222 // expansion of the pattern. Do so. 4223 for (unsigned I = 0; I != *NumExpansions; ++I) { 4224 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4225 ExprResult Out = getDerived().TransformExpr(Pattern); 4226 if (Out.isInvalid()) 4227 return true; 4228 4229 if (Out.get()->containsUnexpandedParameterPack()) { 4230 Out = getDerived().RebuildPackExpansion( 4231 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4232 if (Out.isInvalid()) 4233 return true; 4234 } 4235 4236 Outputs.push_back(Out.get()); 4237 } 4238 4239 // If we're supposed to retain a pack expansion, do so by temporarily 4240 // forgetting the partially-substituted parameter pack. 4241 if (RetainExpansion) { 4242 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4243 4244 ExprResult Out = getDerived().TransformExpr(Pattern); 4245 if (Out.isInvalid()) 4246 return true; 4247 4248 Out = getDerived().RebuildPackExpansion( 4249 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4250 if (Out.isInvalid()) 4251 return true; 4252 4253 Outputs.push_back(Out.get()); 4254 } 4255 4256 continue; 4257 } 4258 4259 ExprResult Result = 4260 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4261 : getDerived().TransformExpr(Inputs[I]); 4262 if (Result.isInvalid()) 4263 return true; 4264 4265 if (Result.get() != Inputs[I] && ArgChanged) 4266 *ArgChanged = true; 4267 4268 Outputs.push_back(Result.get()); 4269 } 4270 4271 return false; 4272 } 4273 4274 template <typename Derived> 4275 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4276 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4277 if (Var) { 4278 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4279 getDerived().TransformDefinition(Var->getLocation(), Var)); 4280 4281 if (!ConditionVar) 4282 return Sema::ConditionError(); 4283 4284 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4285 } 4286 4287 if (Expr) { 4288 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4289 4290 if (CondExpr.isInvalid()) 4291 return Sema::ConditionError(); 4292 4293 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind, 4294 /*MissingOK=*/true); 4295 } 4296 4297 return Sema::ConditionResult(); 4298 } 4299 4300 template <typename Derived> 4301 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4302 NestedNameSpecifierLoc NNS, QualType ObjectType, 4303 NamedDecl *FirstQualifierInScope) { 4304 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4305 4306 auto insertNNS = [&Qualifiers](NestedNameSpecifierLoc NNS) { 4307 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4308 Qualifier = Qualifier.getPrefix()) 4309 Qualifiers.push_back(Qualifier); 4310 }; 4311 insertNNS(NNS); 4312 4313 CXXScopeSpec SS; 4314 while (!Qualifiers.empty()) { 4315 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4316 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4317 4318 switch (QNNS->getKind()) { 4319 case NestedNameSpecifier::Identifier: { 4320 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4321 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4322 ObjectType); 4323 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4324 SS, FirstQualifierInScope, false)) 4325 return NestedNameSpecifierLoc(); 4326 break; 4327 } 4328 4329 case NestedNameSpecifier::Namespace: { 4330 NamespaceDecl *NS = 4331 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4332 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4333 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4334 break; 4335 } 4336 4337 case NestedNameSpecifier::NamespaceAlias: { 4338 NamespaceAliasDecl *Alias = 4339 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4340 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4341 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4342 Q.getLocalEndLoc()); 4343 break; 4344 } 4345 4346 case NestedNameSpecifier::Global: 4347 // There is no meaningful transformation that one could perform on the 4348 // global scope. 4349 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4350 break; 4351 4352 case NestedNameSpecifier::Super: { 4353 CXXRecordDecl *RD = 4354 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4355 SourceLocation(), QNNS->getAsRecordDecl())); 4356 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4357 break; 4358 } 4359 4360 case NestedNameSpecifier::TypeSpecWithTemplate: 4361 case NestedNameSpecifier::TypeSpec: { 4362 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4363 FirstQualifierInScope, SS); 4364 4365 if (!TL) 4366 return NestedNameSpecifierLoc(); 4367 4368 QualType T = TL.getType(); 4369 if (T->isDependentType() || T->isRecordType() || 4370 (SemaRef.getLangOpts().CPlusPlus11 && T->isEnumeralType())) { 4371 if (T->isEnumeralType()) 4372 SemaRef.Diag(TL.getBeginLoc(), 4373 diag::warn_cxx98_compat_enum_nested_name_spec); 4374 4375 if (const auto ETL = TL.getAs<ElaboratedTypeLoc>()) { 4376 SS.Adopt(ETL.getQualifierLoc()); 4377 TL = ETL.getNamedTypeLoc(); 4378 } 4379 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4380 Q.getLocalEndLoc()); 4381 break; 4382 } 4383 // If the nested-name-specifier is an invalid type def, don't emit an 4384 // error because a previous error should have already been emitted. 4385 TypedefTypeLoc TTL = TL.getAsAdjusted<TypedefTypeLoc>(); 4386 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4387 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4388 << T << SS.getRange(); 4389 } 4390 return NestedNameSpecifierLoc(); 4391 } 4392 } 4393 4394 // The qualifier-in-scope and object type only apply to the leftmost entity. 4395 FirstQualifierInScope = nullptr; 4396 ObjectType = QualType(); 4397 } 4398 4399 // Don't rebuild the nested-name-specifier if we don't have to. 4400 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4401 !getDerived().AlwaysRebuild()) 4402 return NNS; 4403 4404 // If we can re-use the source-location data from the original 4405 // nested-name-specifier, do so. 4406 if (SS.location_size() == NNS.getDataLength() && 4407 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4408 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4409 4410 // Allocate new nested-name-specifier location information. 4411 return SS.getWithLocInContext(SemaRef.Context); 4412 } 4413 4414 template<typename Derived> 4415 DeclarationNameInfo 4416 TreeTransform<Derived> 4417 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4418 DeclarationName Name = NameInfo.getName(); 4419 if (!Name) 4420 return DeclarationNameInfo(); 4421 4422 switch (Name.getNameKind()) { 4423 case DeclarationName::Identifier: 4424 case DeclarationName::ObjCZeroArgSelector: 4425 case DeclarationName::ObjCOneArgSelector: 4426 case DeclarationName::ObjCMultiArgSelector: 4427 case DeclarationName::CXXOperatorName: 4428 case DeclarationName::CXXLiteralOperatorName: 4429 case DeclarationName::CXXUsingDirective: 4430 return NameInfo; 4431 4432 case DeclarationName::CXXDeductionGuideName: { 4433 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4434 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4435 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4436 if (!NewTemplate) 4437 return DeclarationNameInfo(); 4438 4439 DeclarationNameInfo NewNameInfo(NameInfo); 4440 NewNameInfo.setName( 4441 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4442 return NewNameInfo; 4443 } 4444 4445 case DeclarationName::CXXConstructorName: 4446 case DeclarationName::CXXDestructorName: 4447 case DeclarationName::CXXConversionFunctionName: { 4448 TypeSourceInfo *NewTInfo; 4449 CanQualType NewCanTy; 4450 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4451 NewTInfo = getDerived().TransformType(OldTInfo); 4452 if (!NewTInfo) 4453 return DeclarationNameInfo(); 4454 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4455 } 4456 else { 4457 NewTInfo = nullptr; 4458 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4459 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4460 if (NewT.isNull()) 4461 return DeclarationNameInfo(); 4462 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4463 } 4464 4465 DeclarationName NewName 4466 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4467 NewCanTy); 4468 DeclarationNameInfo NewNameInfo(NameInfo); 4469 NewNameInfo.setName(NewName); 4470 NewNameInfo.setNamedTypeInfo(NewTInfo); 4471 return NewNameInfo; 4472 } 4473 } 4474 4475 llvm_unreachable("Unknown name kind."); 4476 } 4477 4478 template<typename Derived> 4479 TemplateName 4480 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4481 TemplateName Name, 4482 SourceLocation NameLoc, 4483 QualType ObjectType, 4484 NamedDecl *FirstQualifierInScope, 4485 bool AllowInjectedClassName) { 4486 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4487 TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl(); 4488 assert(Template && "qualified template name must refer to a template"); 4489 4490 TemplateDecl *TransTemplate 4491 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4492 Template)); 4493 if (!TransTemplate) 4494 return TemplateName(); 4495 4496 if (!getDerived().AlwaysRebuild() && 4497 SS.getScopeRep() == QTN->getQualifier() && 4498 TransTemplate == Template) 4499 return Name; 4500 4501 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4502 TransTemplate); 4503 } 4504 4505 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4506 if (SS.getScopeRep()) { 4507 // These apply to the scope specifier, not the template. 4508 ObjectType = QualType(); 4509 FirstQualifierInScope = nullptr; 4510 } 4511 4512 if (!getDerived().AlwaysRebuild() && 4513 SS.getScopeRep() == DTN->getQualifier() && 4514 ObjectType.isNull()) 4515 return Name; 4516 4517 // FIXME: Preserve the location of the "template" keyword. 4518 SourceLocation TemplateKWLoc = NameLoc; 4519 4520 if (DTN->isIdentifier()) { 4521 return getDerived().RebuildTemplateName(SS, 4522 TemplateKWLoc, 4523 *DTN->getIdentifier(), 4524 NameLoc, 4525 ObjectType, 4526 FirstQualifierInScope, 4527 AllowInjectedClassName); 4528 } 4529 4530 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4531 DTN->getOperator(), NameLoc, 4532 ObjectType, AllowInjectedClassName); 4533 } 4534 4535 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4536 TemplateDecl *TransTemplate 4537 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4538 Template)); 4539 if (!TransTemplate) 4540 return TemplateName(); 4541 4542 if (!getDerived().AlwaysRebuild() && 4543 TransTemplate == Template) 4544 return Name; 4545 4546 return TemplateName(TransTemplate); 4547 } 4548 4549 if (SubstTemplateTemplateParmPackStorage *SubstPack 4550 = Name.getAsSubstTemplateTemplateParmPack()) { 4551 return getDerived().RebuildTemplateName( 4552 SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(), 4553 SubstPack->getIndex(), SubstPack->getFinal()); 4554 } 4555 4556 // These should be getting filtered out before they reach the AST. 4557 llvm_unreachable("overloaded function decl survived to here"); 4558 } 4559 4560 template<typename Derived> 4561 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4562 const TemplateArgument &Arg, 4563 TemplateArgumentLoc &Output) { 4564 Output = getSema().getTrivialTemplateArgumentLoc( 4565 Arg, QualType(), getDerived().getBaseLocation()); 4566 } 4567 4568 template <typename Derived> 4569 bool TreeTransform<Derived>::TransformTemplateArgument( 4570 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4571 bool Uneval) { 4572 const TemplateArgument &Arg = Input.getArgument(); 4573 switch (Arg.getKind()) { 4574 case TemplateArgument::Null: 4575 case TemplateArgument::Pack: 4576 llvm_unreachable("Unexpected TemplateArgument"); 4577 4578 case TemplateArgument::Integral: 4579 case TemplateArgument::NullPtr: 4580 case TemplateArgument::Declaration: { 4581 // Transform a resolved template argument straight to a resolved template 4582 // argument. We get here when substituting into an already-substituted 4583 // template type argument during concept satisfaction checking. 4584 QualType T = Arg.getNonTypeTemplateArgumentType(); 4585 QualType NewT = getDerived().TransformType(T); 4586 if (NewT.isNull()) 4587 return true; 4588 4589 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4590 ? Arg.getAsDecl() 4591 : nullptr; 4592 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4593 getDerived().getBaseLocation(), D)) 4594 : nullptr; 4595 if (D && !NewD) 4596 return true; 4597 4598 if (NewT == T && D == NewD) 4599 Output = Input; 4600 else if (Arg.getKind() == TemplateArgument::Integral) 4601 Output = TemplateArgumentLoc( 4602 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4603 TemplateArgumentLocInfo()); 4604 else if (Arg.getKind() == TemplateArgument::NullPtr) 4605 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4606 TemplateArgumentLocInfo()); 4607 else 4608 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4609 TemplateArgumentLocInfo()); 4610 4611 return false; 4612 } 4613 4614 case TemplateArgument::Type: { 4615 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4616 if (!DI) 4617 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4618 4619 DI = getDerived().TransformType(DI); 4620 if (!DI) 4621 return true; 4622 4623 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4624 return false; 4625 } 4626 4627 case TemplateArgument::Template: { 4628 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4629 if (QualifierLoc) { 4630 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4631 if (!QualifierLoc) 4632 return true; 4633 } 4634 4635 CXXScopeSpec SS; 4636 SS.Adopt(QualifierLoc); 4637 TemplateName Template = getDerived().TransformTemplateName( 4638 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4639 if (Template.isNull()) 4640 return true; 4641 4642 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4643 QualifierLoc, Input.getTemplateNameLoc()); 4644 return false; 4645 } 4646 4647 case TemplateArgument::TemplateExpansion: 4648 llvm_unreachable("Caller should expand pack expansions"); 4649 4650 case TemplateArgument::Expression: { 4651 // Template argument expressions are constant expressions. 4652 EnterExpressionEvaluationContext Unevaluated( 4653 getSema(), 4654 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4655 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4656 Sema::ReuseLambdaContextDecl, /*ExprContext=*/ 4657 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4658 4659 Expr *InputExpr = Input.getSourceExpression(); 4660 if (!InputExpr) 4661 InputExpr = Input.getArgument().getAsExpr(); 4662 4663 ExprResult E = getDerived().TransformExpr(InputExpr); 4664 E = SemaRef.ActOnConstantExpression(E); 4665 if (E.isInvalid()) 4666 return true; 4667 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4668 return false; 4669 } 4670 } 4671 4672 // Work around bogus GCC warning 4673 return true; 4674 } 4675 4676 /// Iterator adaptor that invents template argument location information 4677 /// for each of the template arguments in its underlying iterator. 4678 template<typename Derived, typename InputIterator> 4679 class TemplateArgumentLocInventIterator { 4680 TreeTransform<Derived> &Self; 4681 InputIterator Iter; 4682 4683 public: 4684 typedef TemplateArgumentLoc value_type; 4685 typedef TemplateArgumentLoc reference; 4686 typedef typename std::iterator_traits<InputIterator>::difference_type 4687 difference_type; 4688 typedef std::input_iterator_tag iterator_category; 4689 4690 class pointer { 4691 TemplateArgumentLoc Arg; 4692 4693 public: 4694 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4695 4696 const TemplateArgumentLoc *operator->() const { return &Arg; } 4697 }; 4698 4699 TemplateArgumentLocInventIterator() { } 4700 4701 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4702 InputIterator Iter) 4703 : Self(Self), Iter(Iter) { } 4704 4705 TemplateArgumentLocInventIterator &operator++() { 4706 ++Iter; 4707 return *this; 4708 } 4709 4710 TemplateArgumentLocInventIterator operator++(int) { 4711 TemplateArgumentLocInventIterator Old(*this); 4712 ++(*this); 4713 return Old; 4714 } 4715 4716 reference operator*() const { 4717 TemplateArgumentLoc Result; 4718 Self.InventTemplateArgumentLoc(*Iter, Result); 4719 return Result; 4720 } 4721 4722 pointer operator->() const { return pointer(**this); } 4723 4724 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4725 const TemplateArgumentLocInventIterator &Y) { 4726 return X.Iter == Y.Iter; 4727 } 4728 4729 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4730 const TemplateArgumentLocInventIterator &Y) { 4731 return X.Iter != Y.Iter; 4732 } 4733 }; 4734 4735 template<typename Derived> 4736 template<typename InputIterator> 4737 bool TreeTransform<Derived>::TransformTemplateArguments( 4738 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4739 bool Uneval) { 4740 for (; First != Last; ++First) { 4741 TemplateArgumentLoc Out; 4742 TemplateArgumentLoc In = *First; 4743 4744 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4745 // Unpack argument packs, which we translate them into separate 4746 // arguments. 4747 // FIXME: We could do much better if we could guarantee that the 4748 // TemplateArgumentLocInfo for the pack expansion would be usable for 4749 // all of the template arguments in the argument pack. 4750 typedef TemplateArgumentLocInventIterator<Derived, 4751 TemplateArgument::pack_iterator> 4752 PackLocIterator; 4753 if (TransformTemplateArguments(PackLocIterator(*this, 4754 In.getArgument().pack_begin()), 4755 PackLocIterator(*this, 4756 In.getArgument().pack_end()), 4757 Outputs, Uneval)) 4758 return true; 4759 4760 continue; 4761 } 4762 4763 if (In.getArgument().isPackExpansion()) { 4764 // We have a pack expansion, for which we will be substituting into 4765 // the pattern. 4766 SourceLocation Ellipsis; 4767 std::optional<unsigned> OrigNumExpansions; 4768 TemplateArgumentLoc Pattern 4769 = getSema().getTemplateArgumentPackExpansionPattern( 4770 In, Ellipsis, OrigNumExpansions); 4771 4772 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4773 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4774 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4775 4776 // Determine whether the set of unexpanded parameter packs can and should 4777 // be expanded. 4778 bool Expand = true; 4779 bool RetainExpansion = false; 4780 std::optional<unsigned> NumExpansions = OrigNumExpansions; 4781 if (getDerived().TryExpandParameterPacks(Ellipsis, 4782 Pattern.getSourceRange(), 4783 Unexpanded, 4784 Expand, 4785 RetainExpansion, 4786 NumExpansions)) 4787 return true; 4788 4789 if (!Expand) { 4790 // The transform has determined that we should perform a simple 4791 // transformation on the pack expansion, producing another pack 4792 // expansion. 4793 TemplateArgumentLoc OutPattern; 4794 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4795 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4796 return true; 4797 4798 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4799 NumExpansions); 4800 if (Out.getArgument().isNull()) 4801 return true; 4802 4803 Outputs.addArgument(Out); 4804 continue; 4805 } 4806 4807 // The transform has determined that we should perform an elementwise 4808 // expansion of the pattern. Do so. 4809 for (unsigned I = 0; I != *NumExpansions; ++I) { 4810 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4811 4812 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4813 return true; 4814 4815 if (Out.getArgument().containsUnexpandedParameterPack()) { 4816 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4817 OrigNumExpansions); 4818 if (Out.getArgument().isNull()) 4819 return true; 4820 } 4821 4822 Outputs.addArgument(Out); 4823 } 4824 4825 // If we're supposed to retain a pack expansion, do so by temporarily 4826 // forgetting the partially-substituted parameter pack. 4827 if (RetainExpansion) { 4828 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4829 4830 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4831 return true; 4832 4833 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4834 OrigNumExpansions); 4835 if (Out.getArgument().isNull()) 4836 return true; 4837 4838 Outputs.addArgument(Out); 4839 } 4840 4841 continue; 4842 } 4843 4844 // The simple case: 4845 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4846 return true; 4847 4848 Outputs.addArgument(Out); 4849 } 4850 4851 return false; 4852 4853 } 4854 4855 //===----------------------------------------------------------------------===// 4856 // Type transformation 4857 //===----------------------------------------------------------------------===// 4858 4859 template<typename Derived> 4860 QualType TreeTransform<Derived>::TransformType(QualType T) { 4861 if (getDerived().AlreadyTransformed(T)) 4862 return T; 4863 4864 // Temporary workaround. All of these transformations should 4865 // eventually turn into transformations on TypeLocs. 4866 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4867 getDerived().getBaseLocation()); 4868 4869 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4870 4871 if (!NewDI) 4872 return QualType(); 4873 4874 return NewDI->getType(); 4875 } 4876 4877 template<typename Derived> 4878 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4879 // Refine the base location to the type's location. 4880 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4881 getDerived().getBaseEntity()); 4882 if (getDerived().AlreadyTransformed(DI->getType())) 4883 return DI; 4884 4885 TypeLocBuilder TLB; 4886 4887 TypeLoc TL = DI->getTypeLoc(); 4888 TLB.reserve(TL.getFullDataSize()); 4889 4890 QualType Result = getDerived().TransformType(TLB, TL); 4891 if (Result.isNull()) 4892 return nullptr; 4893 4894 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4895 } 4896 4897 template<typename Derived> 4898 QualType 4899 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4900 switch (T.getTypeLocClass()) { 4901 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4902 #define TYPELOC(CLASS, PARENT) \ 4903 case TypeLoc::CLASS: \ 4904 return getDerived().Transform##CLASS##Type(TLB, \ 4905 T.castAs<CLASS##TypeLoc>()); 4906 #include "clang/AST/TypeLocNodes.def" 4907 } 4908 4909 llvm_unreachable("unhandled type loc!"); 4910 } 4911 4912 template<typename Derived> 4913 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4914 if (!isa<DependentNameType>(T)) 4915 return TransformType(T); 4916 4917 if (getDerived().AlreadyTransformed(T)) 4918 return T; 4919 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4920 getDerived().getBaseLocation()); 4921 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4922 return NewDI ? NewDI->getType() : QualType(); 4923 } 4924 4925 template<typename Derived> 4926 TypeSourceInfo * 4927 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4928 if (!isa<DependentNameType>(DI->getType())) 4929 return TransformType(DI); 4930 4931 // Refine the base location to the type's location. 4932 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4933 getDerived().getBaseEntity()); 4934 if (getDerived().AlreadyTransformed(DI->getType())) 4935 return DI; 4936 4937 TypeLocBuilder TLB; 4938 4939 TypeLoc TL = DI->getTypeLoc(); 4940 TLB.reserve(TL.getFullDataSize()); 4941 4942 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4943 if (QTL) 4944 TL = QTL.getUnqualifiedLoc(); 4945 4946 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4947 4948 QualType Result = getDerived().TransformDependentNameType( 4949 TLB, DNTL, /*DeducedTSTContext*/true); 4950 if (Result.isNull()) 4951 return nullptr; 4952 4953 if (QTL) { 4954 Result = getDerived().RebuildQualifiedType(Result, QTL); 4955 if (Result.isNull()) 4956 return nullptr; 4957 TLB.TypeWasModifiedSafely(Result); 4958 } 4959 4960 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4961 } 4962 4963 template<typename Derived> 4964 QualType 4965 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4966 QualifiedTypeLoc T) { 4967 QualType Result; 4968 TypeLoc UnqualTL = T.getUnqualifiedLoc(); 4969 auto SuppressObjCLifetime = 4970 T.getType().getLocalQualifiers().hasObjCLifetime(); 4971 if (auto TTP = UnqualTL.getAs<TemplateTypeParmTypeLoc>()) { 4972 Result = getDerived().TransformTemplateTypeParmType(TLB, TTP, 4973 SuppressObjCLifetime); 4974 } else if (auto STTP = UnqualTL.getAs<SubstTemplateTypeParmPackTypeLoc>()) { 4975 Result = getDerived().TransformSubstTemplateTypeParmPackType( 4976 TLB, STTP, SuppressObjCLifetime); 4977 } else { 4978 Result = getDerived().TransformType(TLB, UnqualTL); 4979 } 4980 4981 if (Result.isNull()) 4982 return QualType(); 4983 4984 Result = getDerived().RebuildQualifiedType(Result, T); 4985 4986 if (Result.isNull()) 4987 return QualType(); 4988 4989 // RebuildQualifiedType might have updated the type, but not in a way 4990 // that invalidates the TypeLoc. (There's no location information for 4991 // qualifiers.) 4992 TLB.TypeWasModifiedSafely(Result); 4993 4994 return Result; 4995 } 4996 4997 template <typename Derived> 4998 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4999 QualifiedTypeLoc TL) { 5000 5001 SourceLocation Loc = TL.getBeginLoc(); 5002 Qualifiers Quals = TL.getType().getLocalQualifiers(); 5003 5004 if ((T.getAddressSpace() != LangAS::Default && 5005 Quals.getAddressSpace() != LangAS::Default) && 5006 T.getAddressSpace() != Quals.getAddressSpace()) { 5007 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 5008 << TL.getType() << T; 5009 return QualType(); 5010 } 5011 5012 // C++ [dcl.fct]p7: 5013 // [When] adding cv-qualifications on top of the function type [...] the 5014 // cv-qualifiers are ignored. 5015 if (T->isFunctionType()) { 5016 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 5017 Quals.getAddressSpace()); 5018 return T; 5019 } 5020 5021 // C++ [dcl.ref]p1: 5022 // when the cv-qualifiers are introduced through the use of a typedef-name 5023 // or decltype-specifier [...] the cv-qualifiers are ignored. 5024 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 5025 // applied to a reference type. 5026 if (T->isReferenceType()) { 5027 // The only qualifier that applies to a reference type is restrict. 5028 if (!Quals.hasRestrict()) 5029 return T; 5030 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 5031 } 5032 5033 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 5034 // resulting type. 5035 if (Quals.hasObjCLifetime()) { 5036 if (!T->isObjCLifetimeType() && !T->isDependentType()) 5037 Quals.removeObjCLifetime(); 5038 else if (T.getObjCLifetime()) { 5039 // Objective-C ARC: 5040 // A lifetime qualifier applied to a substituted template parameter 5041 // overrides the lifetime qualifier from the template argument. 5042 const AutoType *AutoTy; 5043 if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 5044 // 'auto' types behave the same way as template parameters. 5045 QualType Deduced = AutoTy->getDeducedType(); 5046 Qualifiers Qs = Deduced.getQualifiers(); 5047 Qs.removeObjCLifetime(); 5048 Deduced = 5049 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 5050 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 5051 AutoTy->isDependentType(), 5052 /*isPack=*/false, 5053 AutoTy->getTypeConstraintConcept(), 5054 AutoTy->getTypeConstraintArguments()); 5055 } else { 5056 // Otherwise, complain about the addition of a qualifier to an 5057 // already-qualified type. 5058 // FIXME: Why is this check not in Sema::BuildQualifiedType? 5059 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 5060 Quals.removeObjCLifetime(); 5061 } 5062 } 5063 } 5064 5065 return SemaRef.BuildQualifiedType(T, Loc, Quals); 5066 } 5067 5068 template<typename Derived> 5069 TypeLoc 5070 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 5071 QualType ObjectType, 5072 NamedDecl *UnqualLookup, 5073 CXXScopeSpec &SS) { 5074 if (getDerived().AlreadyTransformed(TL.getType())) 5075 return TL; 5076 5077 TypeSourceInfo *TSI = 5078 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 5079 if (TSI) 5080 return TSI->getTypeLoc(); 5081 return TypeLoc(); 5082 } 5083 5084 template<typename Derived> 5085 TypeSourceInfo * 5086 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 5087 QualType ObjectType, 5088 NamedDecl *UnqualLookup, 5089 CXXScopeSpec &SS) { 5090 if (getDerived().AlreadyTransformed(TSInfo->getType())) 5091 return TSInfo; 5092 5093 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 5094 UnqualLookup, SS); 5095 } 5096 5097 template <typename Derived> 5098 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 5099 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 5100 CXXScopeSpec &SS) { 5101 QualType T = TL.getType(); 5102 assert(!getDerived().AlreadyTransformed(T)); 5103 5104 TypeLocBuilder TLB; 5105 QualType Result; 5106 5107 if (isa<TemplateSpecializationType>(T)) { 5108 TemplateSpecializationTypeLoc SpecTL = 5109 TL.castAs<TemplateSpecializationTypeLoc>(); 5110 5111 TemplateName Template = getDerived().TransformTemplateName( 5112 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 5113 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 5114 if (Template.isNull()) 5115 return nullptr; 5116 5117 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 5118 Template); 5119 } else if (isa<DependentTemplateSpecializationType>(T)) { 5120 DependentTemplateSpecializationTypeLoc SpecTL = 5121 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 5122 5123 TemplateName Template 5124 = getDerived().RebuildTemplateName(SS, 5125 SpecTL.getTemplateKeywordLoc(), 5126 *SpecTL.getTypePtr()->getIdentifier(), 5127 SpecTL.getTemplateNameLoc(), 5128 ObjectType, UnqualLookup, 5129 /*AllowInjectedClassName*/true); 5130 if (Template.isNull()) 5131 return nullptr; 5132 5133 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 5134 SpecTL, 5135 Template, 5136 SS); 5137 } else { 5138 // Nothing special needs to be done for these. 5139 Result = getDerived().TransformType(TLB, TL); 5140 } 5141 5142 if (Result.isNull()) 5143 return nullptr; 5144 5145 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 5146 } 5147 5148 template <class TyLoc> static inline 5149 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 5150 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 5151 NewT.setNameLoc(T.getNameLoc()); 5152 return T.getType(); 5153 } 5154 5155 template<typename Derived> 5156 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 5157 BuiltinTypeLoc T) { 5158 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 5159 NewT.setBuiltinLoc(T.getBuiltinLoc()); 5160 if (T.needsExtraLocalData()) 5161 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 5162 return T.getType(); 5163 } 5164 5165 template<typename Derived> 5166 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 5167 ComplexTypeLoc T) { 5168 // FIXME: recurse? 5169 return TransformTypeSpecType(TLB, T); 5170 } 5171 5172 template <typename Derived> 5173 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 5174 AdjustedTypeLoc TL) { 5175 // Adjustments applied during transformation are handled elsewhere. 5176 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 5177 } 5178 5179 template<typename Derived> 5180 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 5181 DecayedTypeLoc TL) { 5182 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 5183 if (OriginalType.isNull()) 5184 return QualType(); 5185 5186 QualType Result = TL.getType(); 5187 if (getDerived().AlwaysRebuild() || 5188 OriginalType != TL.getOriginalLoc().getType()) 5189 Result = SemaRef.Context.getDecayedType(OriginalType); 5190 TLB.push<DecayedTypeLoc>(Result); 5191 // Nothing to set for DecayedTypeLoc. 5192 return Result; 5193 } 5194 5195 template<typename Derived> 5196 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 5197 PointerTypeLoc TL) { 5198 QualType PointeeType 5199 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5200 if (PointeeType.isNull()) 5201 return QualType(); 5202 5203 QualType Result = TL.getType(); 5204 if (PointeeType->getAs<ObjCObjectType>()) { 5205 // A dependent pointer type 'T *' has is being transformed such 5206 // that an Objective-C class type is being replaced for 'T'. The 5207 // resulting pointer type is an ObjCObjectPointerType, not a 5208 // PointerType. 5209 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 5210 5211 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 5212 NewT.setStarLoc(TL.getStarLoc()); 5213 return Result; 5214 } 5215 5216 if (getDerived().AlwaysRebuild() || 5217 PointeeType != TL.getPointeeLoc().getType()) { 5218 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 5219 if (Result.isNull()) 5220 return QualType(); 5221 } 5222 5223 // Objective-C ARC can add lifetime qualifiers to the type that we're 5224 // pointing to. 5225 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5226 5227 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5228 NewT.setSigilLoc(TL.getSigilLoc()); 5229 return Result; 5230 } 5231 5232 template<typename Derived> 5233 QualType 5234 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5235 BlockPointerTypeLoc TL) { 5236 QualType PointeeType 5237 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5238 if (PointeeType.isNull()) 5239 return QualType(); 5240 5241 QualType Result = TL.getType(); 5242 if (getDerived().AlwaysRebuild() || 5243 PointeeType != TL.getPointeeLoc().getType()) { 5244 Result = getDerived().RebuildBlockPointerType(PointeeType, 5245 TL.getSigilLoc()); 5246 if (Result.isNull()) 5247 return QualType(); 5248 } 5249 5250 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5251 NewT.setSigilLoc(TL.getSigilLoc()); 5252 return Result; 5253 } 5254 5255 /// Transforms a reference type. Note that somewhat paradoxically we 5256 /// don't care whether the type itself is an l-value type or an r-value 5257 /// type; we only care if the type was *written* as an l-value type 5258 /// or an r-value type. 5259 template<typename Derived> 5260 QualType 5261 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5262 ReferenceTypeLoc TL) { 5263 const ReferenceType *T = TL.getTypePtr(); 5264 5265 // Note that this works with the pointee-as-written. 5266 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5267 if (PointeeType.isNull()) 5268 return QualType(); 5269 5270 QualType Result = TL.getType(); 5271 if (getDerived().AlwaysRebuild() || 5272 PointeeType != T->getPointeeTypeAsWritten()) { 5273 Result = getDerived().RebuildReferenceType(PointeeType, 5274 T->isSpelledAsLValue(), 5275 TL.getSigilLoc()); 5276 if (Result.isNull()) 5277 return QualType(); 5278 } 5279 5280 // Objective-C ARC can add lifetime qualifiers to the type that we're 5281 // referring to. 5282 TLB.TypeWasModifiedSafely( 5283 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5284 5285 // r-value references can be rebuilt as l-value references. 5286 ReferenceTypeLoc NewTL; 5287 if (isa<LValueReferenceType>(Result)) 5288 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5289 else 5290 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5291 NewTL.setSigilLoc(TL.getSigilLoc()); 5292 5293 return Result; 5294 } 5295 5296 template<typename Derived> 5297 QualType 5298 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5299 LValueReferenceTypeLoc TL) { 5300 return TransformReferenceType(TLB, TL); 5301 } 5302 5303 template<typename Derived> 5304 QualType 5305 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5306 RValueReferenceTypeLoc TL) { 5307 return TransformReferenceType(TLB, TL); 5308 } 5309 5310 template<typename Derived> 5311 QualType 5312 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5313 MemberPointerTypeLoc TL) { 5314 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5315 if (PointeeType.isNull()) 5316 return QualType(); 5317 5318 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5319 TypeSourceInfo *NewClsTInfo = nullptr; 5320 if (OldClsTInfo) { 5321 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5322 if (!NewClsTInfo) 5323 return QualType(); 5324 } 5325 5326 const MemberPointerType *T = TL.getTypePtr(); 5327 QualType OldClsType = QualType(T->getClass(), 0); 5328 QualType NewClsType; 5329 if (NewClsTInfo) 5330 NewClsType = NewClsTInfo->getType(); 5331 else { 5332 NewClsType = getDerived().TransformType(OldClsType); 5333 if (NewClsType.isNull()) 5334 return QualType(); 5335 } 5336 5337 QualType Result = TL.getType(); 5338 if (getDerived().AlwaysRebuild() || 5339 PointeeType != T->getPointeeType() || 5340 NewClsType != OldClsType) { 5341 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5342 TL.getStarLoc()); 5343 if (Result.isNull()) 5344 return QualType(); 5345 } 5346 5347 // If we had to adjust the pointee type when building a member pointer, make 5348 // sure to push TypeLoc info for it. 5349 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5350 if (MPT && PointeeType != MPT->getPointeeType()) { 5351 assert(isa<AdjustedType>(MPT->getPointeeType())); 5352 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5353 } 5354 5355 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5356 NewTL.setSigilLoc(TL.getSigilLoc()); 5357 NewTL.setClassTInfo(NewClsTInfo); 5358 5359 return Result; 5360 } 5361 5362 template<typename Derived> 5363 QualType 5364 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5365 ConstantArrayTypeLoc TL) { 5366 const ConstantArrayType *T = TL.getTypePtr(); 5367 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5368 if (ElementType.isNull()) 5369 return QualType(); 5370 5371 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5372 Expr *OldSize = TL.getSizeExpr(); 5373 if (!OldSize) 5374 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5375 Expr *NewSize = nullptr; 5376 if (OldSize) { 5377 EnterExpressionEvaluationContext Unevaluated( 5378 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5379 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5380 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5381 } 5382 5383 QualType Result = TL.getType(); 5384 if (getDerived().AlwaysRebuild() || 5385 ElementType != T->getElementType() || 5386 (T->getSizeExpr() && NewSize != OldSize)) { 5387 Result = getDerived().RebuildConstantArrayType(ElementType, 5388 T->getSizeModifier(), 5389 T->getSize(), NewSize, 5390 T->getIndexTypeCVRQualifiers(), 5391 TL.getBracketsRange()); 5392 if (Result.isNull()) 5393 return QualType(); 5394 } 5395 5396 // We might have either a ConstantArrayType or a VariableArrayType now: 5397 // a ConstantArrayType is allowed to have an element type which is a 5398 // VariableArrayType if the type is dependent. Fortunately, all array 5399 // types have the same location layout. 5400 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5401 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5402 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5403 NewTL.setSizeExpr(NewSize); 5404 5405 return Result; 5406 } 5407 5408 template<typename Derived> 5409 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5410 TypeLocBuilder &TLB, 5411 IncompleteArrayTypeLoc TL) { 5412 const IncompleteArrayType *T = TL.getTypePtr(); 5413 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5414 if (ElementType.isNull()) 5415 return QualType(); 5416 5417 QualType Result = TL.getType(); 5418 if (getDerived().AlwaysRebuild() || 5419 ElementType != T->getElementType()) { 5420 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5421 T->getSizeModifier(), 5422 T->getIndexTypeCVRQualifiers(), 5423 TL.getBracketsRange()); 5424 if (Result.isNull()) 5425 return QualType(); 5426 } 5427 5428 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5429 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5430 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5431 NewTL.setSizeExpr(nullptr); 5432 5433 return Result; 5434 } 5435 5436 template<typename Derived> 5437 QualType 5438 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5439 VariableArrayTypeLoc TL) { 5440 const VariableArrayType *T = TL.getTypePtr(); 5441 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5442 if (ElementType.isNull()) 5443 return QualType(); 5444 5445 ExprResult SizeResult; 5446 { 5447 EnterExpressionEvaluationContext Context( 5448 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5449 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5450 } 5451 if (SizeResult.isInvalid()) 5452 return QualType(); 5453 SizeResult = 5454 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5455 if (SizeResult.isInvalid()) 5456 return QualType(); 5457 5458 Expr *Size = SizeResult.get(); 5459 5460 QualType Result = TL.getType(); 5461 if (getDerived().AlwaysRebuild() || 5462 ElementType != T->getElementType() || 5463 Size != T->getSizeExpr()) { 5464 Result = getDerived().RebuildVariableArrayType(ElementType, 5465 T->getSizeModifier(), 5466 Size, 5467 T->getIndexTypeCVRQualifiers(), 5468 TL.getBracketsRange()); 5469 if (Result.isNull()) 5470 return QualType(); 5471 } 5472 5473 // We might have constant size array now, but fortunately it has the same 5474 // location layout. 5475 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5476 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5477 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5478 NewTL.setSizeExpr(Size); 5479 5480 return Result; 5481 } 5482 5483 template<typename Derived> 5484 QualType 5485 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5486 DependentSizedArrayTypeLoc TL) { 5487 const DependentSizedArrayType *T = TL.getTypePtr(); 5488 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5489 if (ElementType.isNull()) 5490 return QualType(); 5491 5492 // Array bounds are constant expressions. 5493 EnterExpressionEvaluationContext Unevaluated( 5494 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5495 5496 // If we have a VLA then it won't be a constant. 5497 SemaRef.ExprEvalContexts.back().InConditionallyConstantEvaluateContext = true; 5498 5499 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5500 Expr *origSize = TL.getSizeExpr(); 5501 if (!origSize) origSize = T->getSizeExpr(); 5502 5503 ExprResult sizeResult 5504 = getDerived().TransformExpr(origSize); 5505 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5506 if (sizeResult.isInvalid()) 5507 return QualType(); 5508 5509 Expr *size = sizeResult.get(); 5510 5511 QualType Result = TL.getType(); 5512 if (getDerived().AlwaysRebuild() || 5513 ElementType != T->getElementType() || 5514 size != origSize) { 5515 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5516 T->getSizeModifier(), 5517 size, 5518 T->getIndexTypeCVRQualifiers(), 5519 TL.getBracketsRange()); 5520 if (Result.isNull()) 5521 return QualType(); 5522 } 5523 5524 // We might have any sort of array type now, but fortunately they 5525 // all have the same location layout. 5526 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5527 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5528 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5529 NewTL.setSizeExpr(size); 5530 5531 return Result; 5532 } 5533 5534 template <typename Derived> 5535 QualType TreeTransform<Derived>::TransformDependentVectorType( 5536 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5537 const DependentVectorType *T = TL.getTypePtr(); 5538 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5539 if (ElementType.isNull()) 5540 return QualType(); 5541 5542 EnterExpressionEvaluationContext Unevaluated( 5543 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5544 5545 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5546 Size = SemaRef.ActOnConstantExpression(Size); 5547 if (Size.isInvalid()) 5548 return QualType(); 5549 5550 QualType Result = TL.getType(); 5551 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5552 Size.get() != T->getSizeExpr()) { 5553 Result = getDerived().RebuildDependentVectorType( 5554 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5555 if (Result.isNull()) 5556 return QualType(); 5557 } 5558 5559 // Result might be dependent or not. 5560 if (isa<DependentVectorType>(Result)) { 5561 DependentVectorTypeLoc NewTL = 5562 TLB.push<DependentVectorTypeLoc>(Result); 5563 NewTL.setNameLoc(TL.getNameLoc()); 5564 } else { 5565 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5566 NewTL.setNameLoc(TL.getNameLoc()); 5567 } 5568 5569 return Result; 5570 } 5571 5572 template<typename Derived> 5573 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5574 TypeLocBuilder &TLB, 5575 DependentSizedExtVectorTypeLoc TL) { 5576 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5577 5578 // FIXME: ext vector locs should be nested 5579 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5580 if (ElementType.isNull()) 5581 return QualType(); 5582 5583 // Vector sizes are constant expressions. 5584 EnterExpressionEvaluationContext Unevaluated( 5585 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5586 5587 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5588 Size = SemaRef.ActOnConstantExpression(Size); 5589 if (Size.isInvalid()) 5590 return QualType(); 5591 5592 QualType Result = TL.getType(); 5593 if (getDerived().AlwaysRebuild() || 5594 ElementType != T->getElementType() || 5595 Size.get() != T->getSizeExpr()) { 5596 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5597 Size.get(), 5598 T->getAttributeLoc()); 5599 if (Result.isNull()) 5600 return QualType(); 5601 } 5602 5603 // Result might be dependent or not. 5604 if (isa<DependentSizedExtVectorType>(Result)) { 5605 DependentSizedExtVectorTypeLoc NewTL 5606 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5607 NewTL.setNameLoc(TL.getNameLoc()); 5608 } else { 5609 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5610 NewTL.setNameLoc(TL.getNameLoc()); 5611 } 5612 5613 return Result; 5614 } 5615 5616 template <typename Derived> 5617 QualType 5618 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5619 ConstantMatrixTypeLoc TL) { 5620 const ConstantMatrixType *T = TL.getTypePtr(); 5621 QualType ElementType = getDerived().TransformType(T->getElementType()); 5622 if (ElementType.isNull()) 5623 return QualType(); 5624 5625 QualType Result = TL.getType(); 5626 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5627 Result = getDerived().RebuildConstantMatrixType( 5628 ElementType, T->getNumRows(), T->getNumColumns()); 5629 if (Result.isNull()) 5630 return QualType(); 5631 } 5632 5633 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5634 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5635 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5636 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5637 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5638 5639 return Result; 5640 } 5641 5642 template <typename Derived> 5643 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5644 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5645 const DependentSizedMatrixType *T = TL.getTypePtr(); 5646 5647 QualType ElementType = getDerived().TransformType(T->getElementType()); 5648 if (ElementType.isNull()) { 5649 return QualType(); 5650 } 5651 5652 // Matrix dimensions are constant expressions. 5653 EnterExpressionEvaluationContext Unevaluated( 5654 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5655 5656 Expr *origRows = TL.getAttrRowOperand(); 5657 if (!origRows) 5658 origRows = T->getRowExpr(); 5659 Expr *origColumns = TL.getAttrColumnOperand(); 5660 if (!origColumns) 5661 origColumns = T->getColumnExpr(); 5662 5663 ExprResult rowResult = getDerived().TransformExpr(origRows); 5664 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5665 if (rowResult.isInvalid()) 5666 return QualType(); 5667 5668 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5669 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5670 if (columnResult.isInvalid()) 5671 return QualType(); 5672 5673 Expr *rows = rowResult.get(); 5674 Expr *columns = columnResult.get(); 5675 5676 QualType Result = TL.getType(); 5677 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5678 rows != origRows || columns != origColumns) { 5679 Result = getDerived().RebuildDependentSizedMatrixType( 5680 ElementType, rows, columns, T->getAttributeLoc()); 5681 5682 if (Result.isNull()) 5683 return QualType(); 5684 } 5685 5686 // We might have any sort of matrix type now, but fortunately they 5687 // all have the same location layout. 5688 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5689 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5690 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5691 NewTL.setAttrRowOperand(rows); 5692 NewTL.setAttrColumnOperand(columns); 5693 return Result; 5694 } 5695 5696 template <typename Derived> 5697 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5698 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5699 const DependentAddressSpaceType *T = TL.getTypePtr(); 5700 5701 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5702 5703 if (pointeeType.isNull()) 5704 return QualType(); 5705 5706 // Address spaces are constant expressions. 5707 EnterExpressionEvaluationContext Unevaluated( 5708 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5709 5710 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5711 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5712 if (AddrSpace.isInvalid()) 5713 return QualType(); 5714 5715 QualType Result = TL.getType(); 5716 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5717 AddrSpace.get() != T->getAddrSpaceExpr()) { 5718 Result = getDerived().RebuildDependentAddressSpaceType( 5719 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5720 if (Result.isNull()) 5721 return QualType(); 5722 } 5723 5724 // Result might be dependent or not. 5725 if (isa<DependentAddressSpaceType>(Result)) { 5726 DependentAddressSpaceTypeLoc NewTL = 5727 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5728 5729 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5730 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5731 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5732 5733 } else { 5734 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5735 Result, getDerived().getBaseLocation()); 5736 TransformType(TLB, DI->getTypeLoc()); 5737 } 5738 5739 return Result; 5740 } 5741 5742 template <typename Derived> 5743 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5744 VectorTypeLoc TL) { 5745 const VectorType *T = TL.getTypePtr(); 5746 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5747 if (ElementType.isNull()) 5748 return QualType(); 5749 5750 QualType Result = TL.getType(); 5751 if (getDerived().AlwaysRebuild() || 5752 ElementType != T->getElementType()) { 5753 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5754 T->getVectorKind()); 5755 if (Result.isNull()) 5756 return QualType(); 5757 } 5758 5759 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5760 NewTL.setNameLoc(TL.getNameLoc()); 5761 5762 return Result; 5763 } 5764 5765 template<typename Derived> 5766 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5767 ExtVectorTypeLoc TL) { 5768 const VectorType *T = TL.getTypePtr(); 5769 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5770 if (ElementType.isNull()) 5771 return QualType(); 5772 5773 QualType Result = TL.getType(); 5774 if (getDerived().AlwaysRebuild() || 5775 ElementType != T->getElementType()) { 5776 Result = getDerived().RebuildExtVectorType(ElementType, 5777 T->getNumElements(), 5778 /*FIXME*/ SourceLocation()); 5779 if (Result.isNull()) 5780 return QualType(); 5781 } 5782 5783 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5784 NewTL.setNameLoc(TL.getNameLoc()); 5785 5786 return Result; 5787 } 5788 5789 template <typename Derived> 5790 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5791 ParmVarDecl *OldParm, int indexAdjustment, 5792 std::optional<unsigned> NumExpansions, bool ExpectParameterPack) { 5793 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5794 TypeSourceInfo *NewDI = nullptr; 5795 5796 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5797 // If we're substituting into a pack expansion type and we know the 5798 // length we want to expand to, just substitute for the pattern. 5799 TypeLoc OldTL = OldDI->getTypeLoc(); 5800 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5801 5802 TypeLocBuilder TLB; 5803 TypeLoc NewTL = OldDI->getTypeLoc(); 5804 TLB.reserve(NewTL.getFullDataSize()); 5805 5806 QualType Result = getDerived().TransformType(TLB, 5807 OldExpansionTL.getPatternLoc()); 5808 if (Result.isNull()) 5809 return nullptr; 5810 5811 Result = RebuildPackExpansionType(Result, 5812 OldExpansionTL.getPatternLoc().getSourceRange(), 5813 OldExpansionTL.getEllipsisLoc(), 5814 NumExpansions); 5815 if (Result.isNull()) 5816 return nullptr; 5817 5818 PackExpansionTypeLoc NewExpansionTL 5819 = TLB.push<PackExpansionTypeLoc>(Result); 5820 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5821 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5822 } else 5823 NewDI = getDerived().TransformType(OldDI); 5824 if (!NewDI) 5825 return nullptr; 5826 5827 if (NewDI == OldDI && indexAdjustment == 0) 5828 return OldParm; 5829 5830 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5831 OldParm->getDeclContext(), 5832 OldParm->getInnerLocStart(), 5833 OldParm->getLocation(), 5834 OldParm->getIdentifier(), 5835 NewDI->getType(), 5836 NewDI, 5837 OldParm->getStorageClass(), 5838 /* DefArg */ nullptr); 5839 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5840 OldParm->getFunctionScopeIndex() + indexAdjustment); 5841 transformedLocalDecl(OldParm, {newParm}); 5842 return newParm; 5843 } 5844 5845 template <typename Derived> 5846 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5847 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5848 const QualType *ParamTypes, 5849 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5850 SmallVectorImpl<QualType> &OutParamTypes, 5851 SmallVectorImpl<ParmVarDecl *> *PVars, 5852 Sema::ExtParameterInfoBuilder &PInfos, 5853 unsigned *LastParamTransformed) { 5854 int indexAdjustment = 0; 5855 5856 unsigned NumParams = Params.size(); 5857 for (unsigned i = 0; i != NumParams; ++i) { 5858 if (LastParamTransformed) 5859 *LastParamTransformed = i; 5860 if (ParmVarDecl *OldParm = Params[i]) { 5861 assert(OldParm->getFunctionScopeIndex() == i); 5862 5863 std::optional<unsigned> NumExpansions; 5864 ParmVarDecl *NewParm = nullptr; 5865 if (OldParm->isParameterPack()) { 5866 // We have a function parameter pack that may need to be expanded. 5867 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5868 5869 // Find the parameter packs that could be expanded. 5870 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5871 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5872 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5873 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5874 5875 // Determine whether we should expand the parameter packs. 5876 bool ShouldExpand = false; 5877 bool RetainExpansion = false; 5878 std::optional<unsigned> OrigNumExpansions; 5879 if (Unexpanded.size() > 0) { 5880 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5881 NumExpansions = OrigNumExpansions; 5882 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5883 Pattern.getSourceRange(), 5884 Unexpanded, 5885 ShouldExpand, 5886 RetainExpansion, 5887 NumExpansions)) { 5888 return true; 5889 } 5890 } else { 5891 #ifndef NDEBUG 5892 const AutoType *AT = 5893 Pattern.getType().getTypePtr()->getContainedAutoType(); 5894 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5895 "Could not find parameter packs or undeduced auto type!"); 5896 #endif 5897 } 5898 5899 if (ShouldExpand) { 5900 // Expand the function parameter pack into multiple, separate 5901 // parameters. 5902 getDerived().ExpandingFunctionParameterPack(OldParm); 5903 for (unsigned I = 0; I != *NumExpansions; ++I) { 5904 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5905 ParmVarDecl *NewParm 5906 = getDerived().TransformFunctionTypeParam(OldParm, 5907 indexAdjustment++, 5908 OrigNumExpansions, 5909 /*ExpectParameterPack=*/false); 5910 if (!NewParm) 5911 return true; 5912 5913 if (ParamInfos) 5914 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5915 OutParamTypes.push_back(NewParm->getType()); 5916 if (PVars) 5917 PVars->push_back(NewParm); 5918 } 5919 5920 // If we're supposed to retain a pack expansion, do so by temporarily 5921 // forgetting the partially-substituted parameter pack. 5922 if (RetainExpansion) { 5923 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5924 ParmVarDecl *NewParm 5925 = getDerived().TransformFunctionTypeParam(OldParm, 5926 indexAdjustment++, 5927 OrigNumExpansions, 5928 /*ExpectParameterPack=*/false); 5929 if (!NewParm) 5930 return true; 5931 5932 if (ParamInfos) 5933 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5934 OutParamTypes.push_back(NewParm->getType()); 5935 if (PVars) 5936 PVars->push_back(NewParm); 5937 } 5938 5939 // The next parameter should have the same adjustment as the 5940 // last thing we pushed, but we post-incremented indexAdjustment 5941 // on every push. Also, if we push nothing, the adjustment should 5942 // go down by one. 5943 indexAdjustment--; 5944 5945 // We're done with the pack expansion. 5946 continue; 5947 } 5948 5949 // We'll substitute the parameter now without expanding the pack 5950 // expansion. 5951 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5952 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5953 indexAdjustment, 5954 NumExpansions, 5955 /*ExpectParameterPack=*/true); 5956 assert(NewParm->isParameterPack() && 5957 "Parameter pack no longer a parameter pack after " 5958 "transformation."); 5959 } else { 5960 NewParm = getDerived().TransformFunctionTypeParam( 5961 OldParm, indexAdjustment, std::nullopt, 5962 /*ExpectParameterPack=*/false); 5963 } 5964 5965 if (!NewParm) 5966 return true; 5967 5968 if (ParamInfos) 5969 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5970 OutParamTypes.push_back(NewParm->getType()); 5971 if (PVars) 5972 PVars->push_back(NewParm); 5973 continue; 5974 } 5975 5976 // Deal with the possibility that we don't have a parameter 5977 // declaration for this parameter. 5978 assert(ParamTypes); 5979 QualType OldType = ParamTypes[i]; 5980 bool IsPackExpansion = false; 5981 std::optional<unsigned> NumExpansions; 5982 QualType NewType; 5983 if (const PackExpansionType *Expansion 5984 = dyn_cast<PackExpansionType>(OldType)) { 5985 // We have a function parameter pack that may need to be expanded. 5986 QualType Pattern = Expansion->getPattern(); 5987 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5988 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5989 5990 // Determine whether we should expand the parameter packs. 5991 bool ShouldExpand = false; 5992 bool RetainExpansion = false; 5993 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5994 Unexpanded, 5995 ShouldExpand, 5996 RetainExpansion, 5997 NumExpansions)) { 5998 return true; 5999 } 6000 6001 if (ShouldExpand) { 6002 // Expand the function parameter pack into multiple, separate 6003 // parameters. 6004 for (unsigned I = 0; I != *NumExpansions; ++I) { 6005 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 6006 QualType NewType = getDerived().TransformType(Pattern); 6007 if (NewType.isNull()) 6008 return true; 6009 6010 if (NewType->containsUnexpandedParameterPack()) { 6011 NewType = getSema().getASTContext().getPackExpansionType( 6012 NewType, std::nullopt); 6013 6014 if (NewType.isNull()) 6015 return true; 6016 } 6017 6018 if (ParamInfos) 6019 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 6020 OutParamTypes.push_back(NewType); 6021 if (PVars) 6022 PVars->push_back(nullptr); 6023 } 6024 6025 // We're done with the pack expansion. 6026 continue; 6027 } 6028 6029 // If we're supposed to retain a pack expansion, do so by temporarily 6030 // forgetting the partially-substituted parameter pack. 6031 if (RetainExpansion) { 6032 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 6033 QualType NewType = getDerived().TransformType(Pattern); 6034 if (NewType.isNull()) 6035 return true; 6036 6037 if (ParamInfos) 6038 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 6039 OutParamTypes.push_back(NewType); 6040 if (PVars) 6041 PVars->push_back(nullptr); 6042 } 6043 6044 // We'll substitute the parameter now without expanding the pack 6045 // expansion. 6046 OldType = Expansion->getPattern(); 6047 IsPackExpansion = true; 6048 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6049 NewType = getDerived().TransformType(OldType); 6050 } else { 6051 NewType = getDerived().TransformType(OldType); 6052 } 6053 6054 if (NewType.isNull()) 6055 return true; 6056 6057 if (IsPackExpansion) 6058 NewType = getSema().Context.getPackExpansionType(NewType, 6059 NumExpansions); 6060 6061 if (ParamInfos) 6062 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 6063 OutParamTypes.push_back(NewType); 6064 if (PVars) 6065 PVars->push_back(nullptr); 6066 } 6067 6068 #ifndef NDEBUG 6069 if (PVars) { 6070 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 6071 if (ParmVarDecl *parm = (*PVars)[i]) 6072 assert(parm->getFunctionScopeIndex() == i); 6073 } 6074 #endif 6075 6076 return false; 6077 } 6078 6079 template<typename Derived> 6080 QualType 6081 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 6082 FunctionProtoTypeLoc TL) { 6083 SmallVector<QualType, 4> ExceptionStorage; 6084 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 6085 return getDerived().TransformFunctionProtoType( 6086 TLB, TL, nullptr, Qualifiers(), 6087 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 6088 return This->getDerived().TransformExceptionSpec( 6089 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 6090 }); 6091 } 6092 6093 template<typename Derived> template<typename Fn> 6094 QualType TreeTransform<Derived>::TransformFunctionProtoType( 6095 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 6096 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 6097 6098 // Transform the parameters and return type. 6099 // 6100 // We are required to instantiate the params and return type in source order. 6101 // When the function has a trailing return type, we instantiate the 6102 // parameters before the return type, since the return type can then refer 6103 // to the parameters themselves (via decltype, sizeof, etc.). 6104 // 6105 SmallVector<QualType, 4> ParamTypes; 6106 SmallVector<ParmVarDecl*, 4> ParamDecls; 6107 Sema::ExtParameterInfoBuilder ExtParamInfos; 6108 const FunctionProtoType *T = TL.getTypePtr(); 6109 6110 QualType ResultType; 6111 6112 if (T->hasTrailingReturn()) { 6113 if (getDerived().TransformFunctionTypeParams( 6114 TL.getBeginLoc(), TL.getParams(), 6115 TL.getTypePtr()->param_type_begin(), 6116 T->getExtParameterInfosOrNull(), 6117 ParamTypes, &ParamDecls, ExtParamInfos)) 6118 return QualType(); 6119 6120 { 6121 // C++11 [expr.prim.general]p3: 6122 // If a declaration declares a member function or member function 6123 // template of a class X, the expression this is a prvalue of type 6124 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 6125 // and the end of the function-definition, member-declarator, or 6126 // declarator. 6127 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 6128 6129 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6130 if (ResultType.isNull()) 6131 return QualType(); 6132 } 6133 } 6134 else { 6135 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6136 if (ResultType.isNull()) 6137 return QualType(); 6138 6139 if (getDerived().TransformFunctionTypeParams( 6140 TL.getBeginLoc(), TL.getParams(), 6141 TL.getTypePtr()->param_type_begin(), 6142 T->getExtParameterInfosOrNull(), 6143 ParamTypes, &ParamDecls, ExtParamInfos)) 6144 return QualType(); 6145 } 6146 6147 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 6148 6149 bool EPIChanged = false; 6150 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 6151 return QualType(); 6152 6153 // Handle extended parameter information. 6154 if (auto NewExtParamInfos = 6155 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 6156 if (!EPI.ExtParameterInfos || 6157 llvm::ArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) != 6158 llvm::ArrayRef(NewExtParamInfos, ParamTypes.size())) { 6159 EPIChanged = true; 6160 } 6161 EPI.ExtParameterInfos = NewExtParamInfos; 6162 } else if (EPI.ExtParameterInfos) { 6163 EPIChanged = true; 6164 EPI.ExtParameterInfos = nullptr; 6165 } 6166 6167 QualType Result = TL.getType(); 6168 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 6169 T->getParamTypes() != llvm::ArrayRef(ParamTypes) || EPIChanged) { 6170 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 6171 if (Result.isNull()) 6172 return QualType(); 6173 } 6174 6175 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 6176 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6177 NewTL.setLParenLoc(TL.getLParenLoc()); 6178 NewTL.setRParenLoc(TL.getRParenLoc()); 6179 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 6180 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6181 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 6182 NewTL.setParam(i, ParamDecls[i]); 6183 6184 return Result; 6185 } 6186 6187 template<typename Derived> 6188 bool TreeTransform<Derived>::TransformExceptionSpec( 6189 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 6190 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 6191 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 6192 6193 // Instantiate a dynamic noexcept expression, if any. 6194 if (isComputedNoexcept(ESI.Type)) { 6195 // Update this scrope because ContextDecl in Sema will be used in 6196 // TransformExpr. 6197 auto *Method = dyn_cast_if_present<CXXMethodDecl>(ESI.SourceTemplate); 6198 Sema::CXXThisScopeRAII ThisScope( 6199 SemaRef, Method ? Method->getParent() : nullptr, 6200 Method ? Method->getMethodQualifiers() : Qualifiers{}, 6201 Method != nullptr); 6202 EnterExpressionEvaluationContext Unevaluated( 6203 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 6204 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 6205 if (NoexceptExpr.isInvalid()) 6206 return true; 6207 6208 ExceptionSpecificationType EST = ESI.Type; 6209 NoexceptExpr = 6210 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 6211 if (NoexceptExpr.isInvalid()) 6212 return true; 6213 6214 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 6215 Changed = true; 6216 ESI.NoexceptExpr = NoexceptExpr.get(); 6217 ESI.Type = EST; 6218 } 6219 6220 if (ESI.Type != EST_Dynamic) 6221 return false; 6222 6223 // Instantiate a dynamic exception specification's type. 6224 for (QualType T : ESI.Exceptions) { 6225 if (const PackExpansionType *PackExpansion = 6226 T->getAs<PackExpansionType>()) { 6227 Changed = true; 6228 6229 // We have a pack expansion. Instantiate it. 6230 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6231 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6232 Unexpanded); 6233 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6234 6235 // Determine whether the set of unexpanded parameter packs can and 6236 // should 6237 // be expanded. 6238 bool Expand = false; 6239 bool RetainExpansion = false; 6240 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6241 // FIXME: Track the location of the ellipsis (and track source location 6242 // information for the types in the exception specification in general). 6243 if (getDerived().TryExpandParameterPacks( 6244 Loc, SourceRange(), Unexpanded, Expand, 6245 RetainExpansion, NumExpansions)) 6246 return true; 6247 6248 if (!Expand) { 6249 // We can't expand this pack expansion into separate arguments yet; 6250 // just substitute into the pattern and create a new pack expansion 6251 // type. 6252 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6253 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6254 if (U.isNull()) 6255 return true; 6256 6257 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6258 Exceptions.push_back(U); 6259 continue; 6260 } 6261 6262 // Substitute into the pack expansion pattern for each slice of the 6263 // pack. 6264 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6265 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6266 6267 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6268 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6269 return true; 6270 6271 Exceptions.push_back(U); 6272 } 6273 } else { 6274 QualType U = getDerived().TransformType(T); 6275 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6276 return true; 6277 if (T != U) 6278 Changed = true; 6279 6280 Exceptions.push_back(U); 6281 } 6282 } 6283 6284 ESI.Exceptions = Exceptions; 6285 if (ESI.Exceptions.empty()) 6286 ESI.Type = EST_DynamicNone; 6287 return false; 6288 } 6289 6290 template<typename Derived> 6291 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6292 TypeLocBuilder &TLB, 6293 FunctionNoProtoTypeLoc TL) { 6294 const FunctionNoProtoType *T = TL.getTypePtr(); 6295 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6296 if (ResultType.isNull()) 6297 return QualType(); 6298 6299 QualType Result = TL.getType(); 6300 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6301 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6302 6303 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6304 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6305 NewTL.setLParenLoc(TL.getLParenLoc()); 6306 NewTL.setRParenLoc(TL.getRParenLoc()); 6307 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6308 6309 return Result; 6310 } 6311 6312 template <typename Derived> 6313 QualType TreeTransform<Derived>::TransformUnresolvedUsingType( 6314 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) { 6315 const UnresolvedUsingType *T = TL.getTypePtr(); 6316 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6317 if (!D) 6318 return QualType(); 6319 6320 QualType Result = TL.getType(); 6321 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6322 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6323 if (Result.isNull()) 6324 return QualType(); 6325 } 6326 6327 // We might get an arbitrary type spec type back. We should at 6328 // least always get a type spec type, though. 6329 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6330 NewTL.setNameLoc(TL.getNameLoc()); 6331 6332 return Result; 6333 } 6334 6335 template <typename Derived> 6336 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB, 6337 UsingTypeLoc TL) { 6338 const UsingType *T = TL.getTypePtr(); 6339 6340 auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl( 6341 TL.getLocalSourceRange().getBegin(), T->getFoundDecl())); 6342 if (!Found) 6343 return QualType(); 6344 6345 QualType Underlying = getDerived().TransformType(T->desugar()); 6346 if (Underlying.isNull()) 6347 return QualType(); 6348 6349 QualType Result = TL.getType(); 6350 if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() || 6351 Underlying != T->getUnderlyingType()) { 6352 Result = getDerived().RebuildUsingType(Found, Underlying); 6353 if (Result.isNull()) 6354 return QualType(); 6355 } 6356 6357 TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc()); 6358 return Result; 6359 } 6360 6361 template<typename Derived> 6362 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6363 TypedefTypeLoc TL) { 6364 const TypedefType *T = TL.getTypePtr(); 6365 TypedefNameDecl *Typedef 6366 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6367 T->getDecl())); 6368 if (!Typedef) 6369 return QualType(); 6370 6371 QualType Result = TL.getType(); 6372 if (getDerived().AlwaysRebuild() || 6373 Typedef != T->getDecl()) { 6374 Result = getDerived().RebuildTypedefType(Typedef); 6375 if (Result.isNull()) 6376 return QualType(); 6377 } 6378 6379 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6380 NewTL.setNameLoc(TL.getNameLoc()); 6381 6382 return Result; 6383 } 6384 6385 template<typename Derived> 6386 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6387 TypeOfExprTypeLoc TL) { 6388 // typeof expressions are not potentially evaluated contexts 6389 EnterExpressionEvaluationContext Unevaluated( 6390 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6391 Sema::ReuseLambdaContextDecl); 6392 6393 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6394 if (E.isInvalid()) 6395 return QualType(); 6396 6397 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6398 if (E.isInvalid()) 6399 return QualType(); 6400 6401 QualType Result = TL.getType(); 6402 TypeOfKind Kind = Result->getAs<TypeOfExprType>()->getKind(); 6403 if (getDerived().AlwaysRebuild() || E.get() != TL.getUnderlyingExpr()) { 6404 Result = 6405 getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc(), Kind); 6406 if (Result.isNull()) 6407 return QualType(); 6408 } 6409 6410 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6411 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6412 NewTL.setLParenLoc(TL.getLParenLoc()); 6413 NewTL.setRParenLoc(TL.getRParenLoc()); 6414 6415 return Result; 6416 } 6417 6418 template<typename Derived> 6419 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6420 TypeOfTypeLoc TL) { 6421 TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo(); 6422 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6423 if (!New_Under_TI) 6424 return QualType(); 6425 6426 QualType Result = TL.getType(); 6427 TypeOfKind Kind = Result->getAs<TypeOfType>()->getKind(); 6428 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6429 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind); 6430 if (Result.isNull()) 6431 return QualType(); 6432 } 6433 6434 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6435 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6436 NewTL.setLParenLoc(TL.getLParenLoc()); 6437 NewTL.setRParenLoc(TL.getRParenLoc()); 6438 NewTL.setUnmodifiedTInfo(New_Under_TI); 6439 6440 return Result; 6441 } 6442 6443 template<typename Derived> 6444 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6445 DecltypeTypeLoc TL) { 6446 const DecltypeType *T = TL.getTypePtr(); 6447 6448 // decltype expressions are not potentially evaluated contexts 6449 EnterExpressionEvaluationContext Unevaluated( 6450 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6451 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6452 6453 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6454 if (E.isInvalid()) 6455 return QualType(); 6456 6457 E = getSema().ActOnDecltypeExpression(E.get()); 6458 if (E.isInvalid()) 6459 return QualType(); 6460 6461 QualType Result = TL.getType(); 6462 if (getDerived().AlwaysRebuild() || 6463 E.get() != T->getUnderlyingExpr()) { 6464 Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc()); 6465 if (Result.isNull()) 6466 return QualType(); 6467 } 6468 else E.get(); 6469 6470 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6471 NewTL.setDecltypeLoc(TL.getDecltypeLoc()); 6472 NewTL.setRParenLoc(TL.getRParenLoc()); 6473 return Result; 6474 } 6475 6476 template<typename Derived> 6477 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6478 TypeLocBuilder &TLB, 6479 UnaryTransformTypeLoc TL) { 6480 QualType Result = TL.getType(); 6481 if (Result->isDependentType()) { 6482 const UnaryTransformType *T = TL.getTypePtr(); 6483 QualType NewBase = 6484 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6485 Result = getDerived().RebuildUnaryTransformType(NewBase, 6486 T->getUTTKind(), 6487 TL.getKWLoc()); 6488 if (Result.isNull()) 6489 return QualType(); 6490 } 6491 6492 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6493 NewTL.setKWLoc(TL.getKWLoc()); 6494 NewTL.setParensRange(TL.getParensRange()); 6495 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6496 return Result; 6497 } 6498 6499 template<typename Derived> 6500 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6501 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6502 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6503 6504 CXXScopeSpec SS; 6505 TemplateName TemplateName = getDerived().TransformTemplateName( 6506 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6507 if (TemplateName.isNull()) 6508 return QualType(); 6509 6510 QualType OldDeduced = T->getDeducedType(); 6511 QualType NewDeduced; 6512 if (!OldDeduced.isNull()) { 6513 NewDeduced = getDerived().TransformType(OldDeduced); 6514 if (NewDeduced.isNull()) 6515 return QualType(); 6516 } 6517 6518 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6519 TemplateName, NewDeduced); 6520 if (Result.isNull()) 6521 return QualType(); 6522 6523 DeducedTemplateSpecializationTypeLoc NewTL = 6524 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6525 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6526 6527 return Result; 6528 } 6529 6530 template<typename Derived> 6531 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6532 RecordTypeLoc TL) { 6533 const RecordType *T = TL.getTypePtr(); 6534 RecordDecl *Record 6535 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6536 T->getDecl())); 6537 if (!Record) 6538 return QualType(); 6539 6540 QualType Result = TL.getType(); 6541 if (getDerived().AlwaysRebuild() || 6542 Record != T->getDecl()) { 6543 Result = getDerived().RebuildRecordType(Record); 6544 if (Result.isNull()) 6545 return QualType(); 6546 } 6547 6548 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6549 NewTL.setNameLoc(TL.getNameLoc()); 6550 6551 return Result; 6552 } 6553 6554 template<typename Derived> 6555 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6556 EnumTypeLoc TL) { 6557 const EnumType *T = TL.getTypePtr(); 6558 EnumDecl *Enum 6559 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6560 T->getDecl())); 6561 if (!Enum) 6562 return QualType(); 6563 6564 QualType Result = TL.getType(); 6565 if (getDerived().AlwaysRebuild() || 6566 Enum != T->getDecl()) { 6567 Result = getDerived().RebuildEnumType(Enum); 6568 if (Result.isNull()) 6569 return QualType(); 6570 } 6571 6572 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6573 NewTL.setNameLoc(TL.getNameLoc()); 6574 6575 return Result; 6576 } 6577 6578 template<typename Derived> 6579 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6580 TypeLocBuilder &TLB, 6581 InjectedClassNameTypeLoc TL) { 6582 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6583 TL.getTypePtr()->getDecl()); 6584 if (!D) return QualType(); 6585 6586 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6587 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6588 return T; 6589 } 6590 6591 template<typename Derived> 6592 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6593 TypeLocBuilder &TLB, 6594 TemplateTypeParmTypeLoc TL) { 6595 return getDerived().TransformTemplateTypeParmType( 6596 TLB, TL, 6597 /*SuppressObjCLifetime=*/false); 6598 } 6599 6600 template <typename Derived> 6601 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6602 TypeLocBuilder &TLB, TemplateTypeParmTypeLoc TL, bool) { 6603 return TransformTypeSpecType(TLB, TL); 6604 } 6605 6606 template<typename Derived> 6607 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6608 TypeLocBuilder &TLB, 6609 SubstTemplateTypeParmTypeLoc TL) { 6610 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6611 6612 Decl *NewReplaced = 6613 getDerived().TransformDecl(TL.getNameLoc(), T->getAssociatedDecl()); 6614 6615 // Substitute into the replacement type, which itself might involve something 6616 // that needs to be transformed. This only tends to occur with default 6617 // template arguments of template template parameters. 6618 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6619 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6620 if (Replacement.isNull()) 6621 return QualType(); 6622 6623 QualType Result = SemaRef.Context.getSubstTemplateTypeParmType( 6624 Replacement, NewReplaced, T->getIndex(), T->getPackIndex()); 6625 6626 // Propagate type-source information. 6627 SubstTemplateTypeParmTypeLoc NewTL 6628 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6629 NewTL.setNameLoc(TL.getNameLoc()); 6630 return Result; 6631 6632 } 6633 6634 template<typename Derived> 6635 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6636 TypeLocBuilder &TLB, 6637 SubstTemplateTypeParmPackTypeLoc TL) { 6638 return getDerived().TransformSubstTemplateTypeParmPackType( 6639 TLB, TL, /*SuppressObjCLifetime=*/false); 6640 } 6641 6642 template <typename Derived> 6643 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6644 TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL, bool) { 6645 return TransformTypeSpecType(TLB, TL); 6646 } 6647 6648 template<typename Derived> 6649 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6650 TypeLocBuilder &TLB, 6651 TemplateSpecializationTypeLoc TL) { 6652 const TemplateSpecializationType *T = TL.getTypePtr(); 6653 6654 // The nested-name-specifier never matters in a TemplateSpecializationType, 6655 // because we can't have a dependent nested-name-specifier anyway. 6656 CXXScopeSpec SS; 6657 TemplateName Template 6658 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6659 TL.getTemplateNameLoc()); 6660 if (Template.isNull()) 6661 return QualType(); 6662 6663 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6664 } 6665 6666 template<typename Derived> 6667 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6668 AtomicTypeLoc TL) { 6669 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6670 if (ValueType.isNull()) 6671 return QualType(); 6672 6673 QualType Result = TL.getType(); 6674 if (getDerived().AlwaysRebuild() || 6675 ValueType != TL.getValueLoc().getType()) { 6676 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6677 if (Result.isNull()) 6678 return QualType(); 6679 } 6680 6681 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6682 NewTL.setKWLoc(TL.getKWLoc()); 6683 NewTL.setLParenLoc(TL.getLParenLoc()); 6684 NewTL.setRParenLoc(TL.getRParenLoc()); 6685 6686 return Result; 6687 } 6688 6689 template <typename Derived> 6690 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6691 PipeTypeLoc TL) { 6692 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6693 if (ValueType.isNull()) 6694 return QualType(); 6695 6696 QualType Result = TL.getType(); 6697 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6698 const PipeType *PT = Result->castAs<PipeType>(); 6699 bool isReadPipe = PT->isReadOnly(); 6700 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6701 if (Result.isNull()) 6702 return QualType(); 6703 } 6704 6705 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6706 NewTL.setKWLoc(TL.getKWLoc()); 6707 6708 return Result; 6709 } 6710 6711 template <typename Derived> 6712 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB, 6713 BitIntTypeLoc TL) { 6714 const BitIntType *EIT = TL.getTypePtr(); 6715 QualType Result = TL.getType(); 6716 6717 if (getDerived().AlwaysRebuild()) { 6718 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(), 6719 EIT->getNumBits(), TL.getNameLoc()); 6720 if (Result.isNull()) 6721 return QualType(); 6722 } 6723 6724 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6725 NewTL.setNameLoc(TL.getNameLoc()); 6726 return Result; 6727 } 6728 6729 template <typename Derived> 6730 QualType TreeTransform<Derived>::TransformDependentBitIntType( 6731 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) { 6732 const DependentBitIntType *EIT = TL.getTypePtr(); 6733 6734 EnterExpressionEvaluationContext Unevaluated( 6735 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6736 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6737 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6738 6739 if (BitsExpr.isInvalid()) 6740 return QualType(); 6741 6742 QualType Result = TL.getType(); 6743 6744 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6745 Result = getDerived().RebuildDependentBitIntType( 6746 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6747 6748 if (Result.isNull()) 6749 return QualType(); 6750 } 6751 6752 if (isa<DependentBitIntType>(Result)) { 6753 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result); 6754 NewTL.setNameLoc(TL.getNameLoc()); 6755 } else { 6756 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6757 NewTL.setNameLoc(TL.getNameLoc()); 6758 } 6759 return Result; 6760 } 6761 6762 /// Simple iterator that traverses the template arguments in a 6763 /// container that provides a \c getArgLoc() member function. 6764 /// 6765 /// This iterator is intended to be used with the iterator form of 6766 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6767 template<typename ArgLocContainer> 6768 class TemplateArgumentLocContainerIterator { 6769 ArgLocContainer *Container; 6770 unsigned Index; 6771 6772 public: 6773 typedef TemplateArgumentLoc value_type; 6774 typedef TemplateArgumentLoc reference; 6775 typedef int difference_type; 6776 typedef std::input_iterator_tag iterator_category; 6777 6778 class pointer { 6779 TemplateArgumentLoc Arg; 6780 6781 public: 6782 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6783 6784 const TemplateArgumentLoc *operator->() const { 6785 return &Arg; 6786 } 6787 }; 6788 6789 6790 TemplateArgumentLocContainerIterator() {} 6791 6792 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6793 unsigned Index) 6794 : Container(&Container), Index(Index) { } 6795 6796 TemplateArgumentLocContainerIterator &operator++() { 6797 ++Index; 6798 return *this; 6799 } 6800 6801 TemplateArgumentLocContainerIterator operator++(int) { 6802 TemplateArgumentLocContainerIterator Old(*this); 6803 ++(*this); 6804 return Old; 6805 } 6806 6807 TemplateArgumentLoc operator*() const { 6808 return Container->getArgLoc(Index); 6809 } 6810 6811 pointer operator->() const { 6812 return pointer(Container->getArgLoc(Index)); 6813 } 6814 6815 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6816 const TemplateArgumentLocContainerIterator &Y) { 6817 return X.Container == Y.Container && X.Index == Y.Index; 6818 } 6819 6820 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6821 const TemplateArgumentLocContainerIterator &Y) { 6822 return !(X == Y); 6823 } 6824 }; 6825 6826 template<typename Derived> 6827 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6828 AutoTypeLoc TL) { 6829 const AutoType *T = TL.getTypePtr(); 6830 QualType OldDeduced = T->getDeducedType(); 6831 QualType NewDeduced; 6832 if (!OldDeduced.isNull()) { 6833 NewDeduced = getDerived().TransformType(OldDeduced); 6834 if (NewDeduced.isNull()) 6835 return QualType(); 6836 } 6837 6838 ConceptDecl *NewCD = nullptr; 6839 TemplateArgumentListInfo NewTemplateArgs; 6840 NestedNameSpecifierLoc NewNestedNameSpec; 6841 if (T->isConstrained()) { 6842 assert(TL.getConceptReference()); 6843 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6844 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6845 6846 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6847 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6848 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6849 if (getDerived().TransformTemplateArguments( 6850 ArgIterator(TL, 0), ArgIterator(TL, TL.getNumArgs()), 6851 NewTemplateArgs)) 6852 return QualType(); 6853 6854 if (TL.getNestedNameSpecifierLoc()) { 6855 NewNestedNameSpec 6856 = getDerived().TransformNestedNameSpecifierLoc( 6857 TL.getNestedNameSpecifierLoc()); 6858 if (!NewNestedNameSpec) 6859 return QualType(); 6860 } 6861 } 6862 6863 QualType Result = TL.getType(); 6864 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6865 T->isDependentType() || T->isConstrained()) { 6866 // FIXME: Maybe don't rebuild if all template arguments are the same. 6867 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6868 NewArgList.reserve(NewTemplateArgs.size()); 6869 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6870 NewArgList.push_back(ArgLoc.getArgument()); 6871 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6872 NewArgList); 6873 if (Result.isNull()) 6874 return QualType(); 6875 } 6876 6877 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6878 NewTL.setNameLoc(TL.getNameLoc()); 6879 NewTL.setRParenLoc(TL.getRParenLoc()); 6880 NewTL.setConceptReference(nullptr); 6881 6882 if (T->isConstrained()) { 6883 DeclarationNameInfo DNI = DeclarationNameInfo( 6884 TL.getTypePtr()->getTypeConstraintConcept()->getDeclName(), 6885 TL.getConceptNameLoc(), 6886 TL.getTypePtr()->getTypeConstraintConcept()->getDeclName()); 6887 auto *CR = ConceptReference::Create( 6888 SemaRef.Context, NewNestedNameSpec, TL.getTemplateKWLoc(), DNI, 6889 TL.getFoundDecl(), TL.getTypePtr()->getTypeConstraintConcept(), 6890 ASTTemplateArgumentListInfo::Create(SemaRef.Context, NewTemplateArgs)); 6891 NewTL.setConceptReference(CR); 6892 } 6893 6894 return Result; 6895 } 6896 6897 template <typename Derived> 6898 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6899 TypeLocBuilder &TLB, 6900 TemplateSpecializationTypeLoc TL, 6901 TemplateName Template) { 6902 TemplateArgumentListInfo NewTemplateArgs; 6903 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6904 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6905 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6906 ArgIterator; 6907 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6908 ArgIterator(TL, TL.getNumArgs()), 6909 NewTemplateArgs)) 6910 return QualType(); 6911 6912 // FIXME: maybe don't rebuild if all the template arguments are the same. 6913 6914 QualType Result = 6915 getDerived().RebuildTemplateSpecializationType(Template, 6916 TL.getTemplateNameLoc(), 6917 NewTemplateArgs); 6918 6919 if (!Result.isNull()) { 6920 // Specializations of template template parameters are represented as 6921 // TemplateSpecializationTypes, and substitution of type alias templates 6922 // within a dependent context can transform them into 6923 // DependentTemplateSpecializationTypes. 6924 if (isa<DependentTemplateSpecializationType>(Result)) { 6925 DependentTemplateSpecializationTypeLoc NewTL 6926 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6927 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6928 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6929 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6930 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6931 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6932 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6933 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6934 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6935 return Result; 6936 } 6937 6938 TemplateSpecializationTypeLoc NewTL 6939 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6940 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6941 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6942 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6943 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6944 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6945 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6946 } 6947 6948 return Result; 6949 } 6950 6951 template <typename Derived> 6952 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6953 TypeLocBuilder &TLB, 6954 DependentTemplateSpecializationTypeLoc TL, 6955 TemplateName Template, 6956 CXXScopeSpec &SS) { 6957 TemplateArgumentListInfo NewTemplateArgs; 6958 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6959 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6960 typedef TemplateArgumentLocContainerIterator< 6961 DependentTemplateSpecializationTypeLoc> ArgIterator; 6962 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6963 ArgIterator(TL, TL.getNumArgs()), 6964 NewTemplateArgs)) 6965 return QualType(); 6966 6967 // FIXME: maybe don't rebuild if all the template arguments are the same. 6968 6969 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6970 QualType Result = getSema().Context.getDependentTemplateSpecializationType( 6971 TL.getTypePtr()->getKeyword(), DTN->getQualifier(), 6972 DTN->getIdentifier(), NewTemplateArgs.arguments()); 6973 6974 DependentTemplateSpecializationTypeLoc NewTL 6975 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6976 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6977 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6978 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6979 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6980 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6981 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6982 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6983 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6984 return Result; 6985 } 6986 6987 QualType Result 6988 = getDerived().RebuildTemplateSpecializationType(Template, 6989 TL.getTemplateNameLoc(), 6990 NewTemplateArgs); 6991 6992 if (!Result.isNull()) { 6993 /// FIXME: Wrap this in an elaborated-type-specifier? 6994 TemplateSpecializationTypeLoc NewTL 6995 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6996 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6997 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6998 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6999 NewTL.setRAngleLoc(TL.getRAngleLoc()); 7000 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 7001 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 7002 } 7003 7004 return Result; 7005 } 7006 7007 template<typename Derived> 7008 QualType 7009 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 7010 ElaboratedTypeLoc TL) { 7011 const ElaboratedType *T = TL.getTypePtr(); 7012 7013 NestedNameSpecifierLoc QualifierLoc; 7014 // NOTE: the qualifier in an ElaboratedType is optional. 7015 if (TL.getQualifierLoc()) { 7016 QualifierLoc 7017 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 7018 if (!QualifierLoc) 7019 return QualType(); 7020 } 7021 7022 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 7023 if (NamedT.isNull()) 7024 return QualType(); 7025 7026 // C++0x [dcl.type.elab]p2: 7027 // If the identifier resolves to a typedef-name or the simple-template-id 7028 // resolves to an alias template specialization, the 7029 // elaborated-type-specifier is ill-formed. 7030 if (T->getKeyword() != ElaboratedTypeKeyword::None && 7031 T->getKeyword() != ElaboratedTypeKeyword::Typename) { 7032 if (const TemplateSpecializationType *TST = 7033 NamedT->getAs<TemplateSpecializationType>()) { 7034 TemplateName Template = TST->getTemplateName(); 7035 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 7036 Template.getAsTemplateDecl())) { 7037 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 7038 diag::err_tag_reference_non_tag) 7039 << TAT << Sema::NTK_TypeAliasTemplate 7040 << llvm::to_underlying( 7041 ElaboratedType::getTagTypeKindForKeyword(T->getKeyword())); 7042 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 7043 } 7044 } 7045 } 7046 7047 QualType Result = TL.getType(); 7048 if (getDerived().AlwaysRebuild() || 7049 QualifierLoc != TL.getQualifierLoc() || 7050 NamedT != T->getNamedType()) { 7051 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 7052 T->getKeyword(), 7053 QualifierLoc, NamedT); 7054 if (Result.isNull()) 7055 return QualType(); 7056 } 7057 7058 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7059 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7060 NewTL.setQualifierLoc(QualifierLoc); 7061 return Result; 7062 } 7063 7064 template <typename Derived> 7065 template <typename Fn> 7066 QualType TreeTransform<Derived>::TransformAttributedType( 7067 TypeLocBuilder &TLB, AttributedTypeLoc TL, Fn TransformModifiedTypeFn) { 7068 const AttributedType *oldType = TL.getTypePtr(); 7069 QualType modifiedType = TransformModifiedTypeFn(TLB, TL.getModifiedLoc()); 7070 if (modifiedType.isNull()) 7071 return QualType(); 7072 7073 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 7074 const Attr *oldAttr = TL.getAttr(); 7075 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 7076 if (oldAttr && !newAttr) 7077 return QualType(); 7078 7079 QualType result = TL.getType(); 7080 7081 // FIXME: dependent operand expressions? 7082 if (getDerived().AlwaysRebuild() || 7083 modifiedType != oldType->getModifiedType()) { 7084 // TODO: this is really lame; we should really be rebuilding the 7085 // equivalent type from first principles. 7086 QualType equivalentType 7087 = getDerived().TransformType(oldType->getEquivalentType()); 7088 if (equivalentType.isNull()) 7089 return QualType(); 7090 7091 // Check whether we can add nullability; it is only represented as 7092 // type sugar, and therefore cannot be diagnosed in any other way. 7093 if (auto nullability = oldType->getImmediateNullability()) { 7094 if (!modifiedType->canHaveNullability()) { 7095 SemaRef.Diag((TL.getAttr() ? TL.getAttr()->getLocation() 7096 : TL.getModifiedLoc().getBeginLoc()), 7097 diag::err_nullability_nonpointer) 7098 << DiagNullabilityKind(*nullability, false) << modifiedType; 7099 return QualType(); 7100 } 7101 } 7102 7103 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 7104 modifiedType, 7105 equivalentType); 7106 } 7107 7108 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 7109 newTL.setAttr(newAttr); 7110 return result; 7111 } 7112 7113 template <typename Derived> 7114 QualType TreeTransform<Derived>::TransformAttributedType(TypeLocBuilder &TLB, 7115 AttributedTypeLoc TL) { 7116 return getDerived().TransformAttributedType( 7117 TLB, TL, [&](TypeLocBuilder &TLB, TypeLoc ModifiedLoc) -> QualType { 7118 return getDerived().TransformType(TLB, ModifiedLoc); 7119 }); 7120 } 7121 7122 template <typename Derived> 7123 QualType TreeTransform<Derived>::TransformBTFTagAttributedType( 7124 TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) { 7125 // The BTFTagAttributedType is available for C only. 7126 llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType"); 7127 } 7128 7129 template<typename Derived> 7130 QualType 7131 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 7132 ParenTypeLoc TL) { 7133 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 7134 if (Inner.isNull()) 7135 return QualType(); 7136 7137 QualType Result = TL.getType(); 7138 if (getDerived().AlwaysRebuild() || 7139 Inner != TL.getInnerLoc().getType()) { 7140 Result = getDerived().RebuildParenType(Inner); 7141 if (Result.isNull()) 7142 return QualType(); 7143 } 7144 7145 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 7146 NewTL.setLParenLoc(TL.getLParenLoc()); 7147 NewTL.setRParenLoc(TL.getRParenLoc()); 7148 return Result; 7149 } 7150 7151 template <typename Derived> 7152 QualType 7153 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 7154 MacroQualifiedTypeLoc TL) { 7155 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 7156 if (Inner.isNull()) 7157 return QualType(); 7158 7159 QualType Result = TL.getType(); 7160 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 7161 Result = 7162 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 7163 if (Result.isNull()) 7164 return QualType(); 7165 } 7166 7167 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 7168 NewTL.setExpansionLoc(TL.getExpansionLoc()); 7169 return Result; 7170 } 7171 7172 template<typename Derived> 7173 QualType TreeTransform<Derived>::TransformDependentNameType( 7174 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 7175 return TransformDependentNameType(TLB, TL, false); 7176 } 7177 7178 template<typename Derived> 7179 QualType TreeTransform<Derived>::TransformDependentNameType( 7180 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 7181 const DependentNameType *T = TL.getTypePtr(); 7182 7183 NestedNameSpecifierLoc QualifierLoc 7184 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 7185 if (!QualifierLoc) 7186 return QualType(); 7187 7188 QualType Result 7189 = getDerived().RebuildDependentNameType(T->getKeyword(), 7190 TL.getElaboratedKeywordLoc(), 7191 QualifierLoc, 7192 T->getIdentifier(), 7193 TL.getNameLoc(), 7194 DeducedTSTContext); 7195 if (Result.isNull()) 7196 return QualType(); 7197 7198 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 7199 QualType NamedT = ElabT->getNamedType(); 7200 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 7201 7202 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7203 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7204 NewTL.setQualifierLoc(QualifierLoc); 7205 } else { 7206 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 7207 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7208 NewTL.setQualifierLoc(QualifierLoc); 7209 NewTL.setNameLoc(TL.getNameLoc()); 7210 } 7211 return Result; 7212 } 7213 7214 template<typename Derived> 7215 QualType TreeTransform<Derived>:: 7216 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 7217 DependentTemplateSpecializationTypeLoc TL) { 7218 NestedNameSpecifierLoc QualifierLoc; 7219 if (TL.getQualifierLoc()) { 7220 QualifierLoc 7221 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 7222 if (!QualifierLoc) 7223 return QualType(); 7224 } 7225 7226 return getDerived() 7227 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 7228 } 7229 7230 template<typename Derived> 7231 QualType TreeTransform<Derived>:: 7232 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 7233 DependentTemplateSpecializationTypeLoc TL, 7234 NestedNameSpecifierLoc QualifierLoc) { 7235 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 7236 7237 TemplateArgumentListInfo NewTemplateArgs; 7238 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 7239 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 7240 7241 typedef TemplateArgumentLocContainerIterator< 7242 DependentTemplateSpecializationTypeLoc> ArgIterator; 7243 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 7244 ArgIterator(TL, TL.getNumArgs()), 7245 NewTemplateArgs)) 7246 return QualType(); 7247 7248 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 7249 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 7250 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 7251 /*AllowInjectedClassName*/ false); 7252 if (Result.isNull()) 7253 return QualType(); 7254 7255 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 7256 QualType NamedT = ElabT->getNamedType(); 7257 7258 // Copy information relevant to the template specialization. 7259 TemplateSpecializationTypeLoc NamedTL 7260 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 7261 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7262 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7263 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 7264 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 7265 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7266 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7267 7268 // Copy information relevant to the elaborated type. 7269 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7270 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7271 NewTL.setQualifierLoc(QualifierLoc); 7272 } else if (isa<DependentTemplateSpecializationType>(Result)) { 7273 DependentTemplateSpecializationTypeLoc SpecTL 7274 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 7275 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7276 SpecTL.setQualifierLoc(QualifierLoc); 7277 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7278 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7279 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7280 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7281 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7282 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7283 } else { 7284 TemplateSpecializationTypeLoc SpecTL 7285 = TLB.push<TemplateSpecializationTypeLoc>(Result); 7286 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7287 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7288 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7289 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7290 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7291 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7292 } 7293 return Result; 7294 } 7295 7296 template<typename Derived> 7297 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 7298 PackExpansionTypeLoc TL) { 7299 QualType Pattern 7300 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7301 if (Pattern.isNull()) 7302 return QualType(); 7303 7304 QualType Result = TL.getType(); 7305 if (getDerived().AlwaysRebuild() || 7306 Pattern != TL.getPatternLoc().getType()) { 7307 Result = getDerived().RebuildPackExpansionType(Pattern, 7308 TL.getPatternLoc().getSourceRange(), 7309 TL.getEllipsisLoc(), 7310 TL.getTypePtr()->getNumExpansions()); 7311 if (Result.isNull()) 7312 return QualType(); 7313 } 7314 7315 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7316 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7317 return Result; 7318 } 7319 7320 template<typename Derived> 7321 QualType 7322 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7323 ObjCInterfaceTypeLoc TL) { 7324 // ObjCInterfaceType is never dependent. 7325 TLB.pushFullCopy(TL); 7326 return TL.getType(); 7327 } 7328 7329 template<typename Derived> 7330 QualType 7331 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7332 ObjCTypeParamTypeLoc TL) { 7333 const ObjCTypeParamType *T = TL.getTypePtr(); 7334 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7335 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7336 if (!OTP) 7337 return QualType(); 7338 7339 QualType Result = TL.getType(); 7340 if (getDerived().AlwaysRebuild() || 7341 OTP != T->getDecl()) { 7342 Result = getDerived().RebuildObjCTypeParamType( 7343 OTP, TL.getProtocolLAngleLoc(), 7344 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7345 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7346 if (Result.isNull()) 7347 return QualType(); 7348 } 7349 7350 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7351 if (TL.getNumProtocols()) { 7352 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7353 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7354 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7355 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7356 } 7357 return Result; 7358 } 7359 7360 template<typename Derived> 7361 QualType 7362 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7363 ObjCObjectTypeLoc TL) { 7364 // Transform base type. 7365 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7366 if (BaseType.isNull()) 7367 return QualType(); 7368 7369 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7370 7371 // Transform type arguments. 7372 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7373 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7374 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7375 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7376 QualType TypeArg = TypeArgInfo->getType(); 7377 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7378 AnyChanged = true; 7379 7380 // We have a pack expansion. Instantiate it. 7381 const auto *PackExpansion = PackExpansionLoc.getType() 7382 ->castAs<PackExpansionType>(); 7383 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7384 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7385 Unexpanded); 7386 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7387 7388 // Determine whether the set of unexpanded parameter packs can 7389 // and should be expanded. 7390 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7391 bool Expand = false; 7392 bool RetainExpansion = false; 7393 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7394 if (getDerived().TryExpandParameterPacks( 7395 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7396 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7397 return QualType(); 7398 7399 if (!Expand) { 7400 // We can't expand this pack expansion into separate arguments yet; 7401 // just substitute into the pattern and create a new pack expansion 7402 // type. 7403 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7404 7405 TypeLocBuilder TypeArgBuilder; 7406 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7407 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7408 PatternLoc); 7409 if (NewPatternType.isNull()) 7410 return QualType(); 7411 7412 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7413 NewPatternType, NumExpansions); 7414 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7415 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7416 NewTypeArgInfos.push_back( 7417 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7418 continue; 7419 } 7420 7421 // Substitute into the pack expansion pattern for each slice of the 7422 // pack. 7423 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7424 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7425 7426 TypeLocBuilder TypeArgBuilder; 7427 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7428 7429 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7430 PatternLoc); 7431 if (NewTypeArg.isNull()) 7432 return QualType(); 7433 7434 NewTypeArgInfos.push_back( 7435 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7436 } 7437 7438 continue; 7439 } 7440 7441 TypeLocBuilder TypeArgBuilder; 7442 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7443 QualType NewTypeArg = 7444 getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7445 if (NewTypeArg.isNull()) 7446 return QualType(); 7447 7448 // If nothing changed, just keep the old TypeSourceInfo. 7449 if (NewTypeArg == TypeArg) { 7450 NewTypeArgInfos.push_back(TypeArgInfo); 7451 continue; 7452 } 7453 7454 NewTypeArgInfos.push_back( 7455 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7456 AnyChanged = true; 7457 } 7458 7459 QualType Result = TL.getType(); 7460 if (getDerived().AlwaysRebuild() || AnyChanged) { 7461 // Rebuild the type. 7462 Result = getDerived().RebuildObjCObjectType( 7463 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7464 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7465 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7466 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7467 7468 if (Result.isNull()) 7469 return QualType(); 7470 } 7471 7472 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7473 NewT.setHasBaseTypeAsWritten(true); 7474 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7475 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7476 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7477 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7478 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7479 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7480 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7481 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7482 return Result; 7483 } 7484 7485 template<typename Derived> 7486 QualType 7487 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7488 ObjCObjectPointerTypeLoc TL) { 7489 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7490 if (PointeeType.isNull()) 7491 return QualType(); 7492 7493 QualType Result = TL.getType(); 7494 if (getDerived().AlwaysRebuild() || 7495 PointeeType != TL.getPointeeLoc().getType()) { 7496 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7497 TL.getStarLoc()); 7498 if (Result.isNull()) 7499 return QualType(); 7500 } 7501 7502 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7503 NewT.setStarLoc(TL.getStarLoc()); 7504 return Result; 7505 } 7506 7507 //===----------------------------------------------------------------------===// 7508 // Statement transformation 7509 //===----------------------------------------------------------------------===// 7510 template<typename Derived> 7511 StmtResult 7512 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7513 return S; 7514 } 7515 7516 template<typename Derived> 7517 StmtResult 7518 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7519 return getDerived().TransformCompoundStmt(S, false); 7520 } 7521 7522 template<typename Derived> 7523 StmtResult 7524 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7525 bool IsStmtExpr) { 7526 Sema::CompoundScopeRAII CompoundScope(getSema()); 7527 Sema::FPFeaturesStateRAII FPSave(getSema()); 7528 if (S->hasStoredFPFeatures()) 7529 getSema().resetFPOptions( 7530 S->getStoredFPFeatures().applyOverrides(getSema().getLangOpts())); 7531 7532 const Stmt *ExprResult = S->getStmtExprResult(); 7533 bool SubStmtInvalid = false; 7534 bool SubStmtChanged = false; 7535 SmallVector<Stmt*, 8> Statements; 7536 for (auto *B : S->body()) { 7537 StmtResult Result = getDerived().TransformStmt( 7538 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7539 7540 if (Result.isInvalid()) { 7541 // Immediately fail if this was a DeclStmt, since it's very 7542 // likely that this will cause problems for future statements. 7543 if (isa<DeclStmt>(B)) 7544 return StmtError(); 7545 7546 // Otherwise, just keep processing substatements and fail later. 7547 SubStmtInvalid = true; 7548 continue; 7549 } 7550 7551 SubStmtChanged = SubStmtChanged || Result.get() != B; 7552 Statements.push_back(Result.getAs<Stmt>()); 7553 } 7554 7555 if (SubStmtInvalid) 7556 return StmtError(); 7557 7558 if (!getDerived().AlwaysRebuild() && 7559 !SubStmtChanged) 7560 return S; 7561 7562 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7563 Statements, 7564 S->getRBracLoc(), 7565 IsStmtExpr); 7566 } 7567 7568 template<typename Derived> 7569 StmtResult 7570 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7571 ExprResult LHS, RHS; 7572 { 7573 EnterExpressionEvaluationContext Unevaluated( 7574 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7575 7576 // Transform the left-hand case value. 7577 LHS = getDerived().TransformExpr(S->getLHS()); 7578 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7579 if (LHS.isInvalid()) 7580 return StmtError(); 7581 7582 // Transform the right-hand case value (for the GNU case-range extension). 7583 RHS = getDerived().TransformExpr(S->getRHS()); 7584 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7585 if (RHS.isInvalid()) 7586 return StmtError(); 7587 } 7588 7589 // Build the case statement. 7590 // Case statements are always rebuilt so that they will attached to their 7591 // transformed switch statement. 7592 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7593 LHS.get(), 7594 S->getEllipsisLoc(), 7595 RHS.get(), 7596 S->getColonLoc()); 7597 if (Case.isInvalid()) 7598 return StmtError(); 7599 7600 // Transform the statement following the case 7601 StmtResult SubStmt = 7602 getDerived().TransformStmt(S->getSubStmt()); 7603 if (SubStmt.isInvalid()) 7604 return StmtError(); 7605 7606 // Attach the body to the case statement 7607 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7608 } 7609 7610 template <typename Derived> 7611 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7612 // Transform the statement following the default case 7613 StmtResult SubStmt = 7614 getDerived().TransformStmt(S->getSubStmt()); 7615 if (SubStmt.isInvalid()) 7616 return StmtError(); 7617 7618 // Default statements are always rebuilt 7619 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7620 SubStmt.get()); 7621 } 7622 7623 template<typename Derived> 7624 StmtResult 7625 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7626 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7627 if (SubStmt.isInvalid()) 7628 return StmtError(); 7629 7630 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7631 S->getDecl()); 7632 if (!LD) 7633 return StmtError(); 7634 7635 // If we're transforming "in-place" (we're not creating new local 7636 // declarations), assume we're replacing the old label statement 7637 // and clear out the reference to it. 7638 if (LD == S->getDecl()) 7639 S->getDecl()->setStmt(nullptr); 7640 7641 // FIXME: Pass the real colon location in. 7642 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7643 cast<LabelDecl>(LD), SourceLocation(), 7644 SubStmt.get()); 7645 } 7646 7647 template <typename Derived> 7648 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7649 if (!R) 7650 return R; 7651 7652 switch (R->getKind()) { 7653 // Transform attributes by calling TransformXXXAttr. 7654 #define ATTR(X) \ 7655 case attr::X: \ 7656 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7657 #include "clang/Basic/AttrList.inc" 7658 } 7659 return R; 7660 } 7661 7662 template <typename Derived> 7663 const Attr *TreeTransform<Derived>::TransformStmtAttr(const Stmt *OrigS, 7664 const Stmt *InstS, 7665 const Attr *R) { 7666 if (!R) 7667 return R; 7668 7669 switch (R->getKind()) { 7670 // Transform attributes by calling TransformStmtXXXAttr. 7671 #define ATTR(X) \ 7672 case attr::X: \ 7673 return getDerived().TransformStmt##X##Attr(OrigS, InstS, cast<X##Attr>(R)); 7674 #include "clang/Basic/AttrList.inc" 7675 } 7676 return TransformAttr(R); 7677 } 7678 7679 template <typename Derived> 7680 StmtResult 7681 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7682 StmtDiscardKind SDK) { 7683 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7684 if (SubStmt.isInvalid()) 7685 return StmtError(); 7686 7687 bool AttrsChanged = false; 7688 SmallVector<const Attr *, 1> Attrs; 7689 7690 // Visit attributes and keep track if any are transformed. 7691 for (const auto *I : S->getAttrs()) { 7692 const Attr *R = 7693 getDerived().TransformStmtAttr(S->getSubStmt(), SubStmt.get(), I); 7694 AttrsChanged |= (I != R); 7695 if (R) 7696 Attrs.push_back(R); 7697 } 7698 7699 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7700 return S; 7701 7702 // If transforming the attributes failed for all of the attributes in the 7703 // statement, don't make an AttributedStmt without attributes. 7704 if (Attrs.empty()) 7705 return SubStmt; 7706 7707 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7708 SubStmt.get()); 7709 } 7710 7711 template<typename Derived> 7712 StmtResult 7713 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7714 // Transform the initialization statement 7715 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7716 if (Init.isInvalid()) 7717 return StmtError(); 7718 7719 Sema::ConditionResult Cond; 7720 if (!S->isConsteval()) { 7721 // Transform the condition 7722 Cond = getDerived().TransformCondition( 7723 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7724 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7725 : Sema::ConditionKind::Boolean); 7726 if (Cond.isInvalid()) 7727 return StmtError(); 7728 } 7729 7730 // If this is a constexpr if, determine which arm we should instantiate. 7731 std::optional<bool> ConstexprConditionValue; 7732 if (S->isConstexpr()) 7733 ConstexprConditionValue = Cond.getKnownValue(); 7734 7735 // Transform the "then" branch. 7736 StmtResult Then; 7737 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7738 Then = getDerived().TransformStmt(S->getThen()); 7739 if (Then.isInvalid()) 7740 return StmtError(); 7741 } else { 7742 // Discarded branch is replaced with empty CompoundStmt so we can keep 7743 // proper source location for start and end of original branch, so 7744 // subsequent transformations like CoverageMapping work properly 7745 Then = new (getSema().Context) 7746 CompoundStmt(S->getThen()->getBeginLoc(), S->getThen()->getEndLoc()); 7747 } 7748 7749 // Transform the "else" branch. 7750 StmtResult Else; 7751 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7752 Else = getDerived().TransformStmt(S->getElse()); 7753 if (Else.isInvalid()) 7754 return StmtError(); 7755 } else if (S->getElse() && ConstexprConditionValue && 7756 *ConstexprConditionValue) { 7757 // Same thing here as with <then> branch, we are discarding it, we can't 7758 // replace it with NULL nor NullStmt as we need to keep for source location 7759 // range, for CoverageMapping 7760 Else = new (getSema().Context) 7761 CompoundStmt(S->getElse()->getBeginLoc(), S->getElse()->getEndLoc()); 7762 } 7763 7764 if (!getDerived().AlwaysRebuild() && 7765 Init.get() == S->getInit() && 7766 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7767 Then.get() == S->getThen() && 7768 Else.get() == S->getElse()) 7769 return S; 7770 7771 return getDerived().RebuildIfStmt( 7772 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7773 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7774 } 7775 7776 template<typename Derived> 7777 StmtResult 7778 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7779 // Transform the initialization statement 7780 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7781 if (Init.isInvalid()) 7782 return StmtError(); 7783 7784 // Transform the condition. 7785 Sema::ConditionResult Cond = getDerived().TransformCondition( 7786 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7787 Sema::ConditionKind::Switch); 7788 if (Cond.isInvalid()) 7789 return StmtError(); 7790 7791 // Rebuild the switch statement. 7792 StmtResult Switch = 7793 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7794 Init.get(), Cond, S->getRParenLoc()); 7795 if (Switch.isInvalid()) 7796 return StmtError(); 7797 7798 // Transform the body of the switch statement. 7799 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7800 if (Body.isInvalid()) 7801 return StmtError(); 7802 7803 // Complete the switch statement. 7804 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7805 Body.get()); 7806 } 7807 7808 template<typename Derived> 7809 StmtResult 7810 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7811 // Transform the condition 7812 Sema::ConditionResult Cond = getDerived().TransformCondition( 7813 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7814 Sema::ConditionKind::Boolean); 7815 if (Cond.isInvalid()) 7816 return StmtError(); 7817 7818 // Transform the body 7819 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7820 if (Body.isInvalid()) 7821 return StmtError(); 7822 7823 if (!getDerived().AlwaysRebuild() && 7824 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7825 Body.get() == S->getBody()) 7826 return Owned(S); 7827 7828 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7829 Cond, S->getRParenLoc(), Body.get()); 7830 } 7831 7832 template<typename Derived> 7833 StmtResult 7834 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7835 // Transform the body 7836 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7837 if (Body.isInvalid()) 7838 return StmtError(); 7839 7840 // Transform the condition 7841 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7842 if (Cond.isInvalid()) 7843 return StmtError(); 7844 7845 if (!getDerived().AlwaysRebuild() && 7846 Cond.get() == S->getCond() && 7847 Body.get() == S->getBody()) 7848 return S; 7849 7850 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7851 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7852 S->getRParenLoc()); 7853 } 7854 7855 template<typename Derived> 7856 StmtResult 7857 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7858 if (getSema().getLangOpts().OpenMP) 7859 getSema().startOpenMPLoop(); 7860 7861 // Transform the initialization statement 7862 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7863 if (Init.isInvalid()) 7864 return StmtError(); 7865 7866 // In OpenMP loop region loop control variable must be captured and be 7867 // private. Perform analysis of first part (if any). 7868 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7869 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7870 7871 // Transform the condition 7872 Sema::ConditionResult Cond = getDerived().TransformCondition( 7873 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7874 Sema::ConditionKind::Boolean); 7875 if (Cond.isInvalid()) 7876 return StmtError(); 7877 7878 // Transform the increment 7879 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7880 if (Inc.isInvalid()) 7881 return StmtError(); 7882 7883 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7884 if (S->getInc() && !FullInc.get()) 7885 return StmtError(); 7886 7887 // Transform the body 7888 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7889 if (Body.isInvalid()) 7890 return StmtError(); 7891 7892 if (!getDerived().AlwaysRebuild() && 7893 Init.get() == S->getInit() && 7894 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7895 Inc.get() == S->getInc() && 7896 Body.get() == S->getBody()) 7897 return S; 7898 7899 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7900 Init.get(), Cond, FullInc, 7901 S->getRParenLoc(), Body.get()); 7902 } 7903 7904 template<typename Derived> 7905 StmtResult 7906 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7907 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7908 S->getLabel()); 7909 if (!LD) 7910 return StmtError(); 7911 7912 // Goto statements must always be rebuilt, to resolve the label. 7913 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7914 cast<LabelDecl>(LD)); 7915 } 7916 7917 template<typename Derived> 7918 StmtResult 7919 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7920 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7921 if (Target.isInvalid()) 7922 return StmtError(); 7923 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7924 7925 if (!getDerived().AlwaysRebuild() && 7926 Target.get() == S->getTarget()) 7927 return S; 7928 7929 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7930 Target.get()); 7931 } 7932 7933 template<typename Derived> 7934 StmtResult 7935 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7936 return S; 7937 } 7938 7939 template<typename Derived> 7940 StmtResult 7941 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7942 return S; 7943 } 7944 7945 template<typename Derived> 7946 StmtResult 7947 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7948 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7949 /*NotCopyInit*/false); 7950 if (Result.isInvalid()) 7951 return StmtError(); 7952 7953 // FIXME: We always rebuild the return statement because there is no way 7954 // to tell whether the return type of the function has changed. 7955 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7956 } 7957 7958 template<typename Derived> 7959 StmtResult 7960 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7961 bool DeclChanged = false; 7962 SmallVector<Decl *, 4> Decls; 7963 for (auto *D : S->decls()) { 7964 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7965 if (!Transformed) 7966 return StmtError(); 7967 7968 if (Transformed != D) 7969 DeclChanged = true; 7970 7971 Decls.push_back(Transformed); 7972 } 7973 7974 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7975 return S; 7976 7977 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7978 } 7979 7980 template<typename Derived> 7981 StmtResult 7982 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7983 7984 SmallVector<Expr*, 8> Constraints; 7985 SmallVector<Expr*, 8> Exprs; 7986 SmallVector<IdentifierInfo *, 4> Names; 7987 7988 ExprResult AsmString; 7989 SmallVector<Expr*, 8> Clobbers; 7990 7991 bool ExprsChanged = false; 7992 7993 // Go through the outputs. 7994 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7995 Names.push_back(S->getOutputIdentifier(I)); 7996 7997 // No need to transform the constraint literal. 7998 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7999 8000 // Transform the output expr. 8001 Expr *OutputExpr = S->getOutputExpr(I); 8002 ExprResult Result = getDerived().TransformExpr(OutputExpr); 8003 if (Result.isInvalid()) 8004 return StmtError(); 8005 8006 ExprsChanged |= Result.get() != OutputExpr; 8007 8008 Exprs.push_back(Result.get()); 8009 } 8010 8011 // Go through the inputs. 8012 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 8013 Names.push_back(S->getInputIdentifier(I)); 8014 8015 // No need to transform the constraint literal. 8016 Constraints.push_back(S->getInputConstraintLiteral(I)); 8017 8018 // Transform the input expr. 8019 Expr *InputExpr = S->getInputExpr(I); 8020 ExprResult Result = getDerived().TransformExpr(InputExpr); 8021 if (Result.isInvalid()) 8022 return StmtError(); 8023 8024 ExprsChanged |= Result.get() != InputExpr; 8025 8026 Exprs.push_back(Result.get()); 8027 } 8028 8029 // Go through the Labels. 8030 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 8031 Names.push_back(S->getLabelIdentifier(I)); 8032 8033 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 8034 if (Result.isInvalid()) 8035 return StmtError(); 8036 ExprsChanged |= Result.get() != S->getLabelExpr(I); 8037 Exprs.push_back(Result.get()); 8038 } 8039 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 8040 return S; 8041 8042 // Go through the clobbers. 8043 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 8044 Clobbers.push_back(S->getClobberStringLiteral(I)); 8045 8046 // No need to transform the asm string literal. 8047 AsmString = S->getAsmString(); 8048 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 8049 S->isVolatile(), S->getNumOutputs(), 8050 S->getNumInputs(), Names.data(), 8051 Constraints, Exprs, AsmString.get(), 8052 Clobbers, S->getNumLabels(), 8053 S->getRParenLoc()); 8054 } 8055 8056 template<typename Derived> 8057 StmtResult 8058 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 8059 ArrayRef<Token> AsmToks = llvm::ArrayRef(S->getAsmToks(), S->getNumAsmToks()); 8060 8061 bool HadError = false, HadChange = false; 8062 8063 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 8064 SmallVector<Expr*, 8> TransformedExprs; 8065 TransformedExprs.reserve(SrcExprs.size()); 8066 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 8067 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 8068 if (!Result.isUsable()) { 8069 HadError = true; 8070 } else { 8071 HadChange |= (Result.get() != SrcExprs[i]); 8072 TransformedExprs.push_back(Result.get()); 8073 } 8074 } 8075 8076 if (HadError) return StmtError(); 8077 if (!HadChange && !getDerived().AlwaysRebuild()) 8078 return Owned(S); 8079 8080 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 8081 AsmToks, S->getAsmString(), 8082 S->getNumOutputs(), S->getNumInputs(), 8083 S->getAllConstraints(), S->getClobbers(), 8084 TransformedExprs, S->getEndLoc()); 8085 } 8086 8087 // C++ Coroutines 8088 template<typename Derived> 8089 StmtResult 8090 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 8091 auto *ScopeInfo = SemaRef.getCurFunction(); 8092 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 8093 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 8094 ScopeInfo->NeedsCoroutineSuspends && 8095 ScopeInfo->CoroutineSuspends.first == nullptr && 8096 ScopeInfo->CoroutineSuspends.second == nullptr && 8097 "expected clean scope info"); 8098 8099 // Set that we have (possibly-invalid) suspend points before we do anything 8100 // that may fail. 8101 ScopeInfo->setNeedsCoroutineSuspends(false); 8102 8103 // We re-build the coroutine promise object (and the coroutine parameters its 8104 // type and constructor depend on) based on the types used in our current 8105 // function. We must do so, and set it on the current FunctionScopeInfo, 8106 // before attempting to transform the other parts of the coroutine body 8107 // statement, such as the implicit suspend statements (because those 8108 // statements reference the FunctionScopeInfo::CoroutinePromise). 8109 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 8110 return StmtError(); 8111 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 8112 if (!Promise) 8113 return StmtError(); 8114 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 8115 ScopeInfo->CoroutinePromise = Promise; 8116 8117 // Transform the implicit coroutine statements constructed using dependent 8118 // types during the previous parse: initial and final suspensions, the return 8119 // object, and others. We also transform the coroutine function's body. 8120 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 8121 if (InitSuspend.isInvalid()) 8122 return StmtError(); 8123 StmtResult FinalSuspend = 8124 getDerived().TransformStmt(S->getFinalSuspendStmt()); 8125 if (FinalSuspend.isInvalid() || 8126 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 8127 return StmtError(); 8128 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 8129 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 8130 8131 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 8132 if (BodyRes.isInvalid()) 8133 return StmtError(); 8134 8135 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 8136 if (Builder.isInvalid()) 8137 return StmtError(); 8138 8139 Expr *ReturnObject = S->getReturnValueInit(); 8140 assert(ReturnObject && "the return object is expected to be valid"); 8141 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 8142 /*NoCopyInit*/ false); 8143 if (Res.isInvalid()) 8144 return StmtError(); 8145 Builder.ReturnValue = Res.get(); 8146 8147 // If during the previous parse the coroutine still had a dependent promise 8148 // statement, we may need to build some implicit coroutine statements 8149 // (such as exception and fallthrough handlers) for the first time. 8150 if (S->hasDependentPromiseType()) { 8151 // We can only build these statements, however, if the current promise type 8152 // is not dependent. 8153 if (!Promise->getType()->isDependentType()) { 8154 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 8155 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 8156 "these nodes should not have been built yet"); 8157 if (!Builder.buildDependentStatements()) 8158 return StmtError(); 8159 } 8160 } else { 8161 if (auto *OnFallthrough = S->getFallthroughHandler()) { 8162 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 8163 if (Res.isInvalid()) 8164 return StmtError(); 8165 Builder.OnFallthrough = Res.get(); 8166 } 8167 8168 if (auto *OnException = S->getExceptionHandler()) { 8169 StmtResult Res = getDerived().TransformStmt(OnException); 8170 if (Res.isInvalid()) 8171 return StmtError(); 8172 Builder.OnException = Res.get(); 8173 } 8174 8175 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 8176 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 8177 if (Res.isInvalid()) 8178 return StmtError(); 8179 Builder.ReturnStmtOnAllocFailure = Res.get(); 8180 } 8181 8182 // Transform any additional statements we may have already built 8183 assert(S->getAllocate() && S->getDeallocate() && 8184 "allocation and deallocation calls must already be built"); 8185 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 8186 if (AllocRes.isInvalid()) 8187 return StmtError(); 8188 Builder.Allocate = AllocRes.get(); 8189 8190 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 8191 if (DeallocRes.isInvalid()) 8192 return StmtError(); 8193 Builder.Deallocate = DeallocRes.get(); 8194 8195 if (auto *ResultDecl = S->getResultDecl()) { 8196 StmtResult Res = getDerived().TransformStmt(ResultDecl); 8197 if (Res.isInvalid()) 8198 return StmtError(); 8199 Builder.ResultDecl = Res.get(); 8200 } 8201 8202 if (auto *ReturnStmt = S->getReturnStmt()) { 8203 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 8204 if (Res.isInvalid()) 8205 return StmtError(); 8206 Builder.ReturnStmt = Res.get(); 8207 } 8208 } 8209 8210 return getDerived().RebuildCoroutineBodyStmt(Builder); 8211 } 8212 8213 template<typename Derived> 8214 StmtResult 8215 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 8216 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 8217 /*NotCopyInit*/false); 8218 if (Result.isInvalid()) 8219 return StmtError(); 8220 8221 // Always rebuild; we don't know if this needs to be injected into a new 8222 // context or if the promise type has changed. 8223 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 8224 S->isImplicit()); 8225 } 8226 8227 template <typename Derived> 8228 ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 8229 ExprResult Operand = getDerived().TransformInitializer(E->getOperand(), 8230 /*NotCopyInit*/ false); 8231 if (Operand.isInvalid()) 8232 return ExprError(); 8233 8234 // Rebuild the common-expr from the operand rather than transforming it 8235 // separately. 8236 8237 // FIXME: getCurScope() should not be used during template instantiation. 8238 // We should pick up the set of unqualified lookup results for operator 8239 // co_await during the initial parse. 8240 ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr( 8241 getSema().getCurScope(), E->getKeywordLoc()); 8242 8243 // Always rebuild; we don't know if this needs to be injected into a new 8244 // context or if the promise type has changed. 8245 return getDerived().RebuildCoawaitExpr( 8246 E->getKeywordLoc(), Operand.get(), 8247 cast<UnresolvedLookupExpr>(Lookup.get()), E->isImplicit()); 8248 } 8249 8250 template <typename Derived> 8251 ExprResult 8252 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 8253 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 8254 /*NotCopyInit*/ false); 8255 if (OperandResult.isInvalid()) 8256 return ExprError(); 8257 8258 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 8259 E->getOperatorCoawaitLookup()); 8260 8261 if (LookupResult.isInvalid()) 8262 return ExprError(); 8263 8264 // Always rebuild; we don't know if this needs to be injected into a new 8265 // context or if the promise type has changed. 8266 return getDerived().RebuildDependentCoawaitExpr( 8267 E->getKeywordLoc(), OperandResult.get(), 8268 cast<UnresolvedLookupExpr>(LookupResult.get())); 8269 } 8270 8271 template<typename Derived> 8272 ExprResult 8273 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 8274 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 8275 /*NotCopyInit*/false); 8276 if (Result.isInvalid()) 8277 return ExprError(); 8278 8279 // Always rebuild; we don't know if this needs to be injected into a new 8280 // context or if the promise type has changed. 8281 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 8282 } 8283 8284 // Objective-C Statements. 8285 8286 template<typename Derived> 8287 StmtResult 8288 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 8289 // Transform the body of the @try. 8290 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 8291 if (TryBody.isInvalid()) 8292 return StmtError(); 8293 8294 // Transform the @catch statements (if present). 8295 bool AnyCatchChanged = false; 8296 SmallVector<Stmt*, 8> CatchStmts; 8297 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 8298 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 8299 if (Catch.isInvalid()) 8300 return StmtError(); 8301 if (Catch.get() != S->getCatchStmt(I)) 8302 AnyCatchChanged = true; 8303 CatchStmts.push_back(Catch.get()); 8304 } 8305 8306 // Transform the @finally statement (if present). 8307 StmtResult Finally; 8308 if (S->getFinallyStmt()) { 8309 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 8310 if (Finally.isInvalid()) 8311 return StmtError(); 8312 } 8313 8314 // If nothing changed, just retain this statement. 8315 if (!getDerived().AlwaysRebuild() && 8316 TryBody.get() == S->getTryBody() && 8317 !AnyCatchChanged && 8318 Finally.get() == S->getFinallyStmt()) 8319 return S; 8320 8321 // Build a new statement. 8322 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 8323 CatchStmts, Finally.get()); 8324 } 8325 8326 template<typename Derived> 8327 StmtResult 8328 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 8329 // Transform the @catch parameter, if there is one. 8330 VarDecl *Var = nullptr; 8331 if (VarDecl *FromVar = S->getCatchParamDecl()) { 8332 TypeSourceInfo *TSInfo = nullptr; 8333 if (FromVar->getTypeSourceInfo()) { 8334 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 8335 if (!TSInfo) 8336 return StmtError(); 8337 } 8338 8339 QualType T; 8340 if (TSInfo) 8341 T = TSInfo->getType(); 8342 else { 8343 T = getDerived().TransformType(FromVar->getType()); 8344 if (T.isNull()) 8345 return StmtError(); 8346 } 8347 8348 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8349 if (!Var) 8350 return StmtError(); 8351 } 8352 8353 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8354 if (Body.isInvalid()) 8355 return StmtError(); 8356 8357 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8358 S->getRParenLoc(), 8359 Var, Body.get()); 8360 } 8361 8362 template<typename Derived> 8363 StmtResult 8364 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8365 // Transform the body. 8366 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8367 if (Body.isInvalid()) 8368 return StmtError(); 8369 8370 // If nothing changed, just retain this statement. 8371 if (!getDerived().AlwaysRebuild() && 8372 Body.get() == S->getFinallyBody()) 8373 return S; 8374 8375 // Build a new statement. 8376 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8377 Body.get()); 8378 } 8379 8380 template<typename Derived> 8381 StmtResult 8382 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8383 ExprResult Operand; 8384 if (S->getThrowExpr()) { 8385 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8386 if (Operand.isInvalid()) 8387 return StmtError(); 8388 } 8389 8390 if (!getDerived().AlwaysRebuild() && 8391 Operand.get() == S->getThrowExpr()) 8392 return S; 8393 8394 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8395 } 8396 8397 template<typename Derived> 8398 StmtResult 8399 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8400 ObjCAtSynchronizedStmt *S) { 8401 // Transform the object we are locking. 8402 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8403 if (Object.isInvalid()) 8404 return StmtError(); 8405 Object = 8406 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8407 Object.get()); 8408 if (Object.isInvalid()) 8409 return StmtError(); 8410 8411 // Transform the body. 8412 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8413 if (Body.isInvalid()) 8414 return StmtError(); 8415 8416 // If nothing change, just retain the current statement. 8417 if (!getDerived().AlwaysRebuild() && 8418 Object.get() == S->getSynchExpr() && 8419 Body.get() == S->getSynchBody()) 8420 return S; 8421 8422 // Build a new statement. 8423 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8424 Object.get(), Body.get()); 8425 } 8426 8427 template<typename Derived> 8428 StmtResult 8429 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8430 ObjCAutoreleasePoolStmt *S) { 8431 // Transform the body. 8432 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8433 if (Body.isInvalid()) 8434 return StmtError(); 8435 8436 // If nothing changed, just retain this statement. 8437 if (!getDerived().AlwaysRebuild() && 8438 Body.get() == S->getSubStmt()) 8439 return S; 8440 8441 // Build a new statement. 8442 return getDerived().RebuildObjCAutoreleasePoolStmt( 8443 S->getAtLoc(), Body.get()); 8444 } 8445 8446 template<typename Derived> 8447 StmtResult 8448 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8449 ObjCForCollectionStmt *S) { 8450 // Transform the element statement. 8451 StmtResult Element = 8452 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8453 if (Element.isInvalid()) 8454 return StmtError(); 8455 8456 // Transform the collection expression. 8457 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8458 if (Collection.isInvalid()) 8459 return StmtError(); 8460 8461 // Transform the body. 8462 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8463 if (Body.isInvalid()) 8464 return StmtError(); 8465 8466 // If nothing changed, just retain this statement. 8467 if (!getDerived().AlwaysRebuild() && 8468 Element.get() == S->getElement() && 8469 Collection.get() == S->getCollection() && 8470 Body.get() == S->getBody()) 8471 return S; 8472 8473 // Build a new statement. 8474 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8475 Element.get(), 8476 Collection.get(), 8477 S->getRParenLoc(), 8478 Body.get()); 8479 } 8480 8481 template <typename Derived> 8482 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8483 // Transform the exception declaration, if any. 8484 VarDecl *Var = nullptr; 8485 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8486 TypeSourceInfo *T = 8487 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8488 if (!T) 8489 return StmtError(); 8490 8491 Var = getDerived().RebuildExceptionDecl( 8492 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8493 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8494 if (!Var || Var->isInvalidDecl()) 8495 return StmtError(); 8496 } 8497 8498 // Transform the actual exception handler. 8499 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8500 if (Handler.isInvalid()) 8501 return StmtError(); 8502 8503 if (!getDerived().AlwaysRebuild() && !Var && 8504 Handler.get() == S->getHandlerBlock()) 8505 return S; 8506 8507 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8508 } 8509 8510 template <typename Derived> 8511 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8512 // Transform the try block itself. 8513 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8514 if (TryBlock.isInvalid()) 8515 return StmtError(); 8516 8517 // Transform the handlers. 8518 bool HandlerChanged = false; 8519 SmallVector<Stmt *, 8> Handlers; 8520 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8521 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8522 if (Handler.isInvalid()) 8523 return StmtError(); 8524 8525 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8526 Handlers.push_back(Handler.getAs<Stmt>()); 8527 } 8528 8529 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8530 !HandlerChanged) 8531 return S; 8532 8533 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8534 Handlers); 8535 } 8536 8537 template<typename Derived> 8538 StmtResult 8539 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8540 StmtResult Init = 8541 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8542 if (Init.isInvalid()) 8543 return StmtError(); 8544 8545 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8546 if (Range.isInvalid()) 8547 return StmtError(); 8548 8549 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8550 if (Begin.isInvalid()) 8551 return StmtError(); 8552 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8553 if (End.isInvalid()) 8554 return StmtError(); 8555 8556 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8557 if (Cond.isInvalid()) 8558 return StmtError(); 8559 if (Cond.get()) 8560 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8561 if (Cond.isInvalid()) 8562 return StmtError(); 8563 if (Cond.get()) 8564 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8565 8566 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8567 if (Inc.isInvalid()) 8568 return StmtError(); 8569 if (Inc.get()) 8570 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8571 8572 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8573 if (LoopVar.isInvalid()) 8574 return StmtError(); 8575 8576 StmtResult NewStmt = S; 8577 if (getDerived().AlwaysRebuild() || 8578 Init.get() != S->getInit() || 8579 Range.get() != S->getRangeStmt() || 8580 Begin.get() != S->getBeginStmt() || 8581 End.get() != S->getEndStmt() || 8582 Cond.get() != S->getCond() || 8583 Inc.get() != S->getInc() || 8584 LoopVar.get() != S->getLoopVarStmt()) { 8585 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8586 S->getCoawaitLoc(), Init.get(), 8587 S->getColonLoc(), Range.get(), 8588 Begin.get(), End.get(), 8589 Cond.get(), 8590 Inc.get(), LoopVar.get(), 8591 S->getRParenLoc()); 8592 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8593 // Might not have attached any initializer to the loop variable. 8594 getSema().ActOnInitializerError( 8595 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8596 return StmtError(); 8597 } 8598 } 8599 8600 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8601 if (Body.isInvalid()) 8602 return StmtError(); 8603 8604 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8605 // it now so we have a new statement to attach the body to. 8606 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8607 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8608 S->getCoawaitLoc(), Init.get(), 8609 S->getColonLoc(), Range.get(), 8610 Begin.get(), End.get(), 8611 Cond.get(), 8612 Inc.get(), LoopVar.get(), 8613 S->getRParenLoc()); 8614 if (NewStmt.isInvalid()) 8615 return StmtError(); 8616 } 8617 8618 if (NewStmt.get() == S) 8619 return S; 8620 8621 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8622 } 8623 8624 template<typename Derived> 8625 StmtResult 8626 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8627 MSDependentExistsStmt *S) { 8628 // Transform the nested-name-specifier, if any. 8629 NestedNameSpecifierLoc QualifierLoc; 8630 if (S->getQualifierLoc()) { 8631 QualifierLoc 8632 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8633 if (!QualifierLoc) 8634 return StmtError(); 8635 } 8636 8637 // Transform the declaration name. 8638 DeclarationNameInfo NameInfo = S->getNameInfo(); 8639 if (NameInfo.getName()) { 8640 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8641 if (!NameInfo.getName()) 8642 return StmtError(); 8643 } 8644 8645 // Check whether anything changed. 8646 if (!getDerived().AlwaysRebuild() && 8647 QualifierLoc == S->getQualifierLoc() && 8648 NameInfo.getName() == S->getNameInfo().getName()) 8649 return S; 8650 8651 // Determine whether this name exists, if we can. 8652 CXXScopeSpec SS; 8653 SS.Adopt(QualifierLoc); 8654 bool Dependent = false; 8655 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8656 case Sema::IER_Exists: 8657 if (S->isIfExists()) 8658 break; 8659 8660 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8661 8662 case Sema::IER_DoesNotExist: 8663 if (S->isIfNotExists()) 8664 break; 8665 8666 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8667 8668 case Sema::IER_Dependent: 8669 Dependent = true; 8670 break; 8671 8672 case Sema::IER_Error: 8673 return StmtError(); 8674 } 8675 8676 // We need to continue with the instantiation, so do so now. 8677 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8678 if (SubStmt.isInvalid()) 8679 return StmtError(); 8680 8681 // If we have resolved the name, just transform to the substatement. 8682 if (!Dependent) 8683 return SubStmt; 8684 8685 // The name is still dependent, so build a dependent expression again. 8686 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8687 S->isIfExists(), 8688 QualifierLoc, 8689 NameInfo, 8690 SubStmt.get()); 8691 } 8692 8693 template<typename Derived> 8694 ExprResult 8695 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8696 NestedNameSpecifierLoc QualifierLoc; 8697 if (E->getQualifierLoc()) { 8698 QualifierLoc 8699 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8700 if (!QualifierLoc) 8701 return ExprError(); 8702 } 8703 8704 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8705 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8706 if (!PD) 8707 return ExprError(); 8708 8709 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8710 if (Base.isInvalid()) 8711 return ExprError(); 8712 8713 return new (SemaRef.getASTContext()) 8714 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8715 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8716 QualifierLoc, E->getMemberLoc()); 8717 } 8718 8719 template <typename Derived> 8720 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8721 MSPropertySubscriptExpr *E) { 8722 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8723 if (BaseRes.isInvalid()) 8724 return ExprError(); 8725 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8726 if (IdxRes.isInvalid()) 8727 return ExprError(); 8728 8729 if (!getDerived().AlwaysRebuild() && 8730 BaseRes.get() == E->getBase() && 8731 IdxRes.get() == E->getIdx()) 8732 return E; 8733 8734 return getDerived().RebuildArraySubscriptExpr( 8735 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8736 } 8737 8738 template <typename Derived> 8739 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8740 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8741 if (TryBlock.isInvalid()) 8742 return StmtError(); 8743 8744 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8745 if (Handler.isInvalid()) 8746 return StmtError(); 8747 8748 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8749 Handler.get() == S->getHandler()) 8750 return S; 8751 8752 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8753 TryBlock.get(), Handler.get()); 8754 } 8755 8756 template <typename Derived> 8757 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8758 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8759 if (Block.isInvalid()) 8760 return StmtError(); 8761 8762 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8763 } 8764 8765 template <typename Derived> 8766 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8767 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8768 if (FilterExpr.isInvalid()) 8769 return StmtError(); 8770 8771 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8772 if (Block.isInvalid()) 8773 return StmtError(); 8774 8775 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8776 Block.get()); 8777 } 8778 8779 template <typename Derived> 8780 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8781 if (isa<SEHFinallyStmt>(Handler)) 8782 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8783 else 8784 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8785 } 8786 8787 template<typename Derived> 8788 StmtResult 8789 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8790 return S; 8791 } 8792 8793 //===----------------------------------------------------------------------===// 8794 // OpenMP directive transformation 8795 //===----------------------------------------------------------------------===// 8796 8797 template <typename Derived> 8798 StmtResult 8799 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8800 // OMPCanonicalLoops are eliminated during transformation, since they will be 8801 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8802 // after transformation. 8803 return getDerived().TransformStmt(L->getLoopStmt()); 8804 } 8805 8806 template <typename Derived> 8807 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8808 OMPExecutableDirective *D) { 8809 8810 // Transform the clauses 8811 llvm::SmallVector<OMPClause *, 16> TClauses; 8812 ArrayRef<OMPClause *> Clauses = D->clauses(); 8813 TClauses.reserve(Clauses.size()); 8814 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8815 I != E; ++I) { 8816 if (*I) { 8817 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8818 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8819 getDerived().getSema().EndOpenMPClause(); 8820 if (Clause) 8821 TClauses.push_back(Clause); 8822 } else { 8823 TClauses.push_back(nullptr); 8824 } 8825 } 8826 StmtResult AssociatedStmt; 8827 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8828 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8829 /*CurScope=*/nullptr); 8830 StmtResult Body; 8831 { 8832 Sema::CompoundScopeRAII CompoundScope(getSema()); 8833 Stmt *CS; 8834 if (D->getDirectiveKind() == OMPD_atomic || 8835 D->getDirectiveKind() == OMPD_critical || 8836 D->getDirectiveKind() == OMPD_section || 8837 D->getDirectiveKind() == OMPD_master) 8838 CS = D->getAssociatedStmt(); 8839 else 8840 CS = D->getRawStmt(); 8841 Body = getDerived().TransformStmt(CS); 8842 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8843 getSema().getLangOpts().OpenMPIRBuilder) 8844 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8845 } 8846 AssociatedStmt = 8847 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8848 if (AssociatedStmt.isInvalid()) { 8849 return StmtError(); 8850 } 8851 } 8852 if (TClauses.size() != Clauses.size()) { 8853 return StmtError(); 8854 } 8855 8856 // Transform directive name for 'omp critical' directive. 8857 DeclarationNameInfo DirName; 8858 if (D->getDirectiveKind() == OMPD_critical) { 8859 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8860 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8861 } 8862 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8863 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8864 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8865 } else if (D->getDirectiveKind() == OMPD_cancel) { 8866 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8867 } 8868 8869 return getDerived().RebuildOMPExecutableDirective( 8870 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8871 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc(), 8872 D->getMappedDirective()); 8873 } 8874 8875 template <typename Derived> 8876 StmtResult 8877 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8878 // TODO: Fix This 8879 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8880 << getOpenMPDirectiveName(D->getDirectiveKind()); 8881 return StmtError(); 8882 } 8883 8884 template <typename Derived> 8885 StmtResult 8886 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8887 DeclarationNameInfo DirName; 8888 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8889 D->getBeginLoc()); 8890 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8891 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8892 return Res; 8893 } 8894 8895 template <typename Derived> 8896 StmtResult 8897 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8898 DeclarationNameInfo DirName; 8899 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8900 D->getBeginLoc()); 8901 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8902 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8903 return Res; 8904 } 8905 8906 template <typename Derived> 8907 StmtResult 8908 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8909 DeclarationNameInfo DirName; 8910 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8911 nullptr, D->getBeginLoc()); 8912 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8913 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8914 return Res; 8915 } 8916 8917 template <typename Derived> 8918 StmtResult 8919 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8920 DeclarationNameInfo DirName; 8921 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8922 nullptr, D->getBeginLoc()); 8923 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8924 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8925 return Res; 8926 } 8927 8928 template <typename Derived> 8929 StmtResult 8930 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8931 DeclarationNameInfo DirName; 8932 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8933 D->getBeginLoc()); 8934 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8935 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8936 return Res; 8937 } 8938 8939 template <typename Derived> 8940 StmtResult 8941 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8942 DeclarationNameInfo DirName; 8943 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8944 D->getBeginLoc()); 8945 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8946 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8947 return Res; 8948 } 8949 8950 template <typename Derived> 8951 StmtResult 8952 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8953 DeclarationNameInfo DirName; 8954 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8955 D->getBeginLoc()); 8956 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8957 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8958 return Res; 8959 } 8960 8961 template <typename Derived> 8962 StmtResult 8963 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8964 DeclarationNameInfo DirName; 8965 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8966 D->getBeginLoc()); 8967 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8968 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8969 return Res; 8970 } 8971 8972 template <typename Derived> 8973 StmtResult 8974 TreeTransform<Derived>::TransformOMPScopeDirective(OMPScopeDirective *D) { 8975 DeclarationNameInfo DirName; 8976 getDerived().getSema().StartOpenMPDSABlock(OMPD_scope, DirName, nullptr, 8977 D->getBeginLoc()); 8978 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8979 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8980 return Res; 8981 } 8982 8983 template <typename Derived> 8984 StmtResult 8985 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8986 DeclarationNameInfo DirName; 8987 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8988 D->getBeginLoc()); 8989 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8990 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8991 return Res; 8992 } 8993 8994 template <typename Derived> 8995 StmtResult 8996 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8997 DeclarationNameInfo DirName; 8998 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8999 D->getBeginLoc()); 9000 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9001 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9002 return Res; 9003 } 9004 9005 template <typename Derived> 9006 StmtResult 9007 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 9008 getDerived().getSema().StartOpenMPDSABlock( 9009 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 9010 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9011 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9012 return Res; 9013 } 9014 9015 template <typename Derived> 9016 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 9017 OMPParallelForDirective *D) { 9018 DeclarationNameInfo DirName; 9019 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 9020 nullptr, D->getBeginLoc()); 9021 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9022 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9023 return Res; 9024 } 9025 9026 template <typename Derived> 9027 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 9028 OMPParallelForSimdDirective *D) { 9029 DeclarationNameInfo DirName; 9030 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 9031 nullptr, D->getBeginLoc()); 9032 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9033 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9034 return Res; 9035 } 9036 9037 template <typename Derived> 9038 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 9039 OMPParallelMasterDirective *D) { 9040 DeclarationNameInfo DirName; 9041 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 9042 nullptr, D->getBeginLoc()); 9043 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9044 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9045 return Res; 9046 } 9047 9048 template <typename Derived> 9049 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective( 9050 OMPParallelMaskedDirective *D) { 9051 DeclarationNameInfo DirName; 9052 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_masked, DirName, 9053 nullptr, D->getBeginLoc()); 9054 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9055 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9056 return Res; 9057 } 9058 9059 template <typename Derived> 9060 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 9061 OMPParallelSectionsDirective *D) { 9062 DeclarationNameInfo DirName; 9063 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 9064 nullptr, D->getBeginLoc()); 9065 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9066 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9067 return Res; 9068 } 9069 9070 template <typename Derived> 9071 StmtResult 9072 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 9073 DeclarationNameInfo DirName; 9074 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 9075 D->getBeginLoc()); 9076 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9077 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9078 return Res; 9079 } 9080 9081 template <typename Derived> 9082 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 9083 OMPTaskyieldDirective *D) { 9084 DeclarationNameInfo DirName; 9085 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 9086 D->getBeginLoc()); 9087 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9088 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9089 return Res; 9090 } 9091 9092 template <typename Derived> 9093 StmtResult 9094 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 9095 DeclarationNameInfo DirName; 9096 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 9097 D->getBeginLoc()); 9098 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9099 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9100 return Res; 9101 } 9102 9103 template <typename Derived> 9104 StmtResult 9105 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 9106 DeclarationNameInfo DirName; 9107 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 9108 D->getBeginLoc()); 9109 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9110 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9111 return Res; 9112 } 9113 9114 template <typename Derived> 9115 StmtResult 9116 TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *D) { 9117 DeclarationNameInfo DirName; 9118 getDerived().getSema().StartOpenMPDSABlock(OMPD_error, DirName, nullptr, 9119 D->getBeginLoc()); 9120 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9121 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9122 return Res; 9123 } 9124 9125 template <typename Derived> 9126 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 9127 OMPTaskgroupDirective *D) { 9128 DeclarationNameInfo DirName; 9129 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 9130 D->getBeginLoc()); 9131 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9132 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9133 return Res; 9134 } 9135 9136 template <typename Derived> 9137 StmtResult 9138 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 9139 DeclarationNameInfo DirName; 9140 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 9141 D->getBeginLoc()); 9142 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9143 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9144 return Res; 9145 } 9146 9147 template <typename Derived> 9148 StmtResult 9149 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 9150 DeclarationNameInfo DirName; 9151 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 9152 D->getBeginLoc()); 9153 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9154 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9155 return Res; 9156 } 9157 9158 template <typename Derived> 9159 StmtResult 9160 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 9161 DeclarationNameInfo DirName; 9162 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 9163 D->getBeginLoc()); 9164 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9165 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9166 return Res; 9167 } 9168 9169 template <typename Derived> 9170 StmtResult 9171 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 9172 DeclarationNameInfo DirName; 9173 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 9174 D->getBeginLoc()); 9175 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9176 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9177 return Res; 9178 } 9179 9180 template <typename Derived> 9181 StmtResult 9182 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 9183 DeclarationNameInfo DirName; 9184 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 9185 D->getBeginLoc()); 9186 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9187 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9188 return Res; 9189 } 9190 9191 template <typename Derived> 9192 StmtResult 9193 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 9194 DeclarationNameInfo DirName; 9195 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 9196 D->getBeginLoc()); 9197 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9198 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9199 return Res; 9200 } 9201 9202 template <typename Derived> 9203 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 9204 OMPTargetDataDirective *D) { 9205 DeclarationNameInfo DirName; 9206 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 9207 D->getBeginLoc()); 9208 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9209 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9210 return Res; 9211 } 9212 9213 template <typename Derived> 9214 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 9215 OMPTargetEnterDataDirective *D) { 9216 DeclarationNameInfo DirName; 9217 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 9218 nullptr, D->getBeginLoc()); 9219 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9220 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9221 return Res; 9222 } 9223 9224 template <typename Derived> 9225 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 9226 OMPTargetExitDataDirective *D) { 9227 DeclarationNameInfo DirName; 9228 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 9229 nullptr, D->getBeginLoc()); 9230 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9231 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9232 return Res; 9233 } 9234 9235 template <typename Derived> 9236 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 9237 OMPTargetParallelDirective *D) { 9238 DeclarationNameInfo DirName; 9239 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 9240 nullptr, D->getBeginLoc()); 9241 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9242 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9243 return Res; 9244 } 9245 9246 template <typename Derived> 9247 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 9248 OMPTargetParallelForDirective *D) { 9249 DeclarationNameInfo DirName; 9250 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 9251 nullptr, D->getBeginLoc()); 9252 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9253 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9254 return Res; 9255 } 9256 9257 template <typename Derived> 9258 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 9259 OMPTargetUpdateDirective *D) { 9260 DeclarationNameInfo DirName; 9261 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 9262 nullptr, D->getBeginLoc()); 9263 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9264 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9265 return Res; 9266 } 9267 9268 template <typename Derived> 9269 StmtResult 9270 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 9271 DeclarationNameInfo DirName; 9272 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 9273 D->getBeginLoc()); 9274 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9275 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9276 return Res; 9277 } 9278 9279 template <typename Derived> 9280 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 9281 OMPCancellationPointDirective *D) { 9282 DeclarationNameInfo DirName; 9283 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 9284 nullptr, D->getBeginLoc()); 9285 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9286 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9287 return Res; 9288 } 9289 9290 template <typename Derived> 9291 StmtResult 9292 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 9293 DeclarationNameInfo DirName; 9294 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 9295 D->getBeginLoc()); 9296 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9297 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9298 return Res; 9299 } 9300 9301 template <typename Derived> 9302 StmtResult 9303 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 9304 DeclarationNameInfo DirName; 9305 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 9306 D->getBeginLoc()); 9307 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9308 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9309 return Res; 9310 } 9311 9312 template <typename Derived> 9313 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 9314 OMPTaskLoopSimdDirective *D) { 9315 DeclarationNameInfo DirName; 9316 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 9317 nullptr, D->getBeginLoc()); 9318 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9319 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9320 return Res; 9321 } 9322 9323 template <typename Derived> 9324 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 9325 OMPMasterTaskLoopDirective *D) { 9326 DeclarationNameInfo DirName; 9327 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 9328 nullptr, D->getBeginLoc()); 9329 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9330 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9331 return Res; 9332 } 9333 9334 template <typename Derived> 9335 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective( 9336 OMPMaskedTaskLoopDirective *D) { 9337 DeclarationNameInfo DirName; 9338 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop, DirName, 9339 nullptr, D->getBeginLoc()); 9340 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9341 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9342 return Res; 9343 } 9344 9345 template <typename Derived> 9346 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 9347 OMPMasterTaskLoopSimdDirective *D) { 9348 DeclarationNameInfo DirName; 9349 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 9350 nullptr, D->getBeginLoc()); 9351 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9352 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9353 return Res; 9354 } 9355 9356 template <typename Derived> 9357 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective( 9358 OMPMaskedTaskLoopSimdDirective *D) { 9359 DeclarationNameInfo DirName; 9360 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop_simd, DirName, 9361 nullptr, D->getBeginLoc()); 9362 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9363 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9364 return Res; 9365 } 9366 9367 template <typename Derived> 9368 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 9369 OMPParallelMasterTaskLoopDirective *D) { 9370 DeclarationNameInfo DirName; 9371 getDerived().getSema().StartOpenMPDSABlock( 9372 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 9373 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9374 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9375 return Res; 9376 } 9377 9378 template <typename Derived> 9379 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective( 9380 OMPParallelMaskedTaskLoopDirective *D) { 9381 DeclarationNameInfo DirName; 9382 getDerived().getSema().StartOpenMPDSABlock( 9383 OMPD_parallel_masked_taskloop, DirName, nullptr, D->getBeginLoc()); 9384 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9385 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9386 return Res; 9387 } 9388 9389 template <typename Derived> 9390 StmtResult 9391 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 9392 OMPParallelMasterTaskLoopSimdDirective *D) { 9393 DeclarationNameInfo DirName; 9394 getDerived().getSema().StartOpenMPDSABlock( 9395 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9396 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9397 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9398 return Res; 9399 } 9400 9401 template <typename Derived> 9402 StmtResult 9403 TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective( 9404 OMPParallelMaskedTaskLoopSimdDirective *D) { 9405 DeclarationNameInfo DirName; 9406 getDerived().getSema().StartOpenMPDSABlock( 9407 OMPD_parallel_masked_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9408 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9409 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9410 return Res; 9411 } 9412 9413 template <typename Derived> 9414 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 9415 OMPDistributeDirective *D) { 9416 DeclarationNameInfo DirName; 9417 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9418 D->getBeginLoc()); 9419 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9420 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9421 return Res; 9422 } 9423 9424 template <typename Derived> 9425 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 9426 OMPDistributeParallelForDirective *D) { 9427 DeclarationNameInfo DirName; 9428 getDerived().getSema().StartOpenMPDSABlock( 9429 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9430 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9431 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9432 return Res; 9433 } 9434 9435 template <typename Derived> 9436 StmtResult 9437 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9438 OMPDistributeParallelForSimdDirective *D) { 9439 DeclarationNameInfo DirName; 9440 getDerived().getSema().StartOpenMPDSABlock( 9441 OMPD_distribute_parallel_for_simd, DirName, nullptr, 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 TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9449 OMPDistributeSimdDirective *D) { 9450 DeclarationNameInfo DirName; 9451 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9452 nullptr, 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>::TransformOMPTargetParallelForSimdDirective( 9460 OMPTargetParallelForSimdDirective *D) { 9461 DeclarationNameInfo DirName; 9462 getDerived().getSema().StartOpenMPDSABlock( 9463 OMPD_target_parallel_for_simd, DirName, nullptr, 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>::TransformOMPTargetSimdDirective( 9471 OMPTargetSimdDirective *D) { 9472 DeclarationNameInfo DirName; 9473 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, 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>::TransformOMPTeamsDistributeDirective( 9482 OMPTeamsDistributeDirective *D) { 9483 DeclarationNameInfo DirName; 9484 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, 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>::TransformOMPTeamsDistributeSimdDirective( 9493 OMPTeamsDistributeSimdDirective *D) { 9494 DeclarationNameInfo DirName; 9495 getDerived().getSema().StartOpenMPDSABlock( 9496 OMPD_teams_distribute_simd, DirName, 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 TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9504 OMPTeamsDistributeParallelForSimdDirective *D) { 9505 DeclarationNameInfo DirName; 9506 getDerived().getSema().StartOpenMPDSABlock( 9507 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9508 D->getBeginLoc()); 9509 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9510 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9511 return Res; 9512 } 9513 9514 template <typename Derived> 9515 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9516 OMPTeamsDistributeParallelForDirective *D) { 9517 DeclarationNameInfo DirName; 9518 getDerived().getSema().StartOpenMPDSABlock( 9519 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9520 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9521 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9522 return Res; 9523 } 9524 9525 template <typename Derived> 9526 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9527 OMPTargetTeamsDirective *D) { 9528 DeclarationNameInfo DirName; 9529 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9530 nullptr, D->getBeginLoc()); 9531 auto Res = getDerived().TransformOMPExecutableDirective(D); 9532 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9533 return Res; 9534 } 9535 9536 template <typename Derived> 9537 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9538 OMPTargetTeamsDistributeDirective *D) { 9539 DeclarationNameInfo DirName; 9540 getDerived().getSema().StartOpenMPDSABlock( 9541 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9542 auto Res = getDerived().TransformOMPExecutableDirective(D); 9543 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9544 return Res; 9545 } 9546 9547 template <typename Derived> 9548 StmtResult 9549 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9550 OMPTargetTeamsDistributeParallelForDirective *D) { 9551 DeclarationNameInfo DirName; 9552 getDerived().getSema().StartOpenMPDSABlock( 9553 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9554 D->getBeginLoc()); 9555 auto Res = getDerived().TransformOMPExecutableDirective(D); 9556 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9557 return Res; 9558 } 9559 9560 template <typename Derived> 9561 StmtResult TreeTransform<Derived>:: 9562 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9563 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9564 DeclarationNameInfo DirName; 9565 getDerived().getSema().StartOpenMPDSABlock( 9566 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9567 D->getBeginLoc()); 9568 auto Res = getDerived().TransformOMPExecutableDirective(D); 9569 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9570 return Res; 9571 } 9572 9573 template <typename Derived> 9574 StmtResult 9575 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9576 OMPTargetTeamsDistributeSimdDirective *D) { 9577 DeclarationNameInfo DirName; 9578 getDerived().getSema().StartOpenMPDSABlock( 9579 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9580 auto Res = getDerived().TransformOMPExecutableDirective(D); 9581 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9582 return Res; 9583 } 9584 9585 template <typename Derived> 9586 StmtResult 9587 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9588 DeclarationNameInfo DirName; 9589 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9590 D->getBeginLoc()); 9591 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9592 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9593 return Res; 9594 } 9595 9596 template <typename Derived> 9597 StmtResult 9598 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9599 DeclarationNameInfo DirName; 9600 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9601 D->getBeginLoc()); 9602 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9603 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9604 return Res; 9605 } 9606 9607 template <typename Derived> 9608 StmtResult 9609 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9610 DeclarationNameInfo DirName; 9611 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9612 D->getBeginLoc()); 9613 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9614 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9615 return Res; 9616 } 9617 9618 template <typename Derived> 9619 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9620 OMPGenericLoopDirective *D) { 9621 DeclarationNameInfo DirName; 9622 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9623 D->getBeginLoc()); 9624 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9625 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9626 return Res; 9627 } 9628 9629 template <typename Derived> 9630 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective( 9631 OMPTeamsGenericLoopDirective *D) { 9632 DeclarationNameInfo DirName; 9633 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr, 9634 D->getBeginLoc()); 9635 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9636 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9637 return Res; 9638 } 9639 9640 template <typename Derived> 9641 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective( 9642 OMPTargetTeamsGenericLoopDirective *D) { 9643 DeclarationNameInfo DirName; 9644 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName, 9645 nullptr, D->getBeginLoc()); 9646 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9647 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9648 return Res; 9649 } 9650 9651 template <typename Derived> 9652 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective( 9653 OMPParallelGenericLoopDirective *D) { 9654 DeclarationNameInfo DirName; 9655 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName, 9656 nullptr, D->getBeginLoc()); 9657 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9658 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9659 return Res; 9660 } 9661 9662 template <typename Derived> 9663 StmtResult 9664 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective( 9665 OMPTargetParallelGenericLoopDirective *D) { 9666 DeclarationNameInfo DirName; 9667 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName, 9668 nullptr, D->getBeginLoc()); 9669 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9670 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9671 return Res; 9672 } 9673 9674 //===----------------------------------------------------------------------===// 9675 // OpenMP clause transformation 9676 //===----------------------------------------------------------------------===// 9677 template <typename Derived> 9678 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9679 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9680 if (Cond.isInvalid()) 9681 return nullptr; 9682 return getDerived().RebuildOMPIfClause( 9683 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9684 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9685 } 9686 9687 template <typename Derived> 9688 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9689 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9690 if (Cond.isInvalid()) 9691 return nullptr; 9692 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9693 C->getLParenLoc(), C->getEndLoc()); 9694 } 9695 9696 template <typename Derived> 9697 OMPClause * 9698 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9699 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9700 if (NumThreads.isInvalid()) 9701 return nullptr; 9702 return getDerived().RebuildOMPNumThreadsClause( 9703 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9704 } 9705 9706 template <typename Derived> 9707 OMPClause * 9708 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9709 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9710 if (E.isInvalid()) 9711 return nullptr; 9712 return getDerived().RebuildOMPSafelenClause( 9713 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9714 } 9715 9716 template <typename Derived> 9717 OMPClause * 9718 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9719 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9720 if (E.isInvalid()) 9721 return nullptr; 9722 return getDerived().RebuildOMPAllocatorClause( 9723 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9724 } 9725 9726 template <typename Derived> 9727 OMPClause * 9728 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9729 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9730 if (E.isInvalid()) 9731 return nullptr; 9732 return getDerived().RebuildOMPSimdlenClause( 9733 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9734 } 9735 9736 template <typename Derived> 9737 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9738 SmallVector<Expr *, 4> TransformedSizes; 9739 TransformedSizes.reserve(C->getNumSizes()); 9740 bool Changed = false; 9741 for (Expr *E : C->getSizesRefs()) { 9742 if (!E) { 9743 TransformedSizes.push_back(nullptr); 9744 continue; 9745 } 9746 9747 ExprResult T = getDerived().TransformExpr(E); 9748 if (T.isInvalid()) 9749 return nullptr; 9750 if (E != T.get()) 9751 Changed = true; 9752 TransformedSizes.push_back(T.get()); 9753 } 9754 9755 if (!Changed && !getDerived().AlwaysRebuild()) 9756 return C; 9757 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9758 C->getLParenLoc(), C->getEndLoc()); 9759 } 9760 9761 template <typename Derived> 9762 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9763 if (!getDerived().AlwaysRebuild()) 9764 return C; 9765 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9766 } 9767 9768 template <typename Derived> 9769 OMPClause * 9770 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9771 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9772 if (T.isInvalid()) 9773 return nullptr; 9774 Expr *Factor = T.get(); 9775 bool Changed = Factor != C->getFactor(); 9776 9777 if (!Changed && !getDerived().AlwaysRebuild()) 9778 return C; 9779 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9780 C->getEndLoc()); 9781 } 9782 9783 template <typename Derived> 9784 OMPClause * 9785 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9786 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9787 if (E.isInvalid()) 9788 return nullptr; 9789 return getDerived().RebuildOMPCollapseClause( 9790 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9791 } 9792 9793 template <typename Derived> 9794 OMPClause * 9795 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9796 return getDerived().RebuildOMPDefaultClause( 9797 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9798 C->getLParenLoc(), C->getEndLoc()); 9799 } 9800 9801 template <typename Derived> 9802 OMPClause * 9803 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9804 return getDerived().RebuildOMPProcBindClause( 9805 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9806 C->getLParenLoc(), C->getEndLoc()); 9807 } 9808 9809 template <typename Derived> 9810 OMPClause * 9811 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9812 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9813 if (E.isInvalid()) 9814 return nullptr; 9815 return getDerived().RebuildOMPScheduleClause( 9816 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9817 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9818 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9819 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9820 } 9821 9822 template <typename Derived> 9823 OMPClause * 9824 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9825 ExprResult E; 9826 if (auto *Num = C->getNumForLoops()) { 9827 E = getDerived().TransformExpr(Num); 9828 if (E.isInvalid()) 9829 return nullptr; 9830 } 9831 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9832 C->getLParenLoc(), E.get()); 9833 } 9834 9835 template <typename Derived> 9836 OMPClause * 9837 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9838 ExprResult E; 9839 if (Expr *Evt = C->getEventHandler()) { 9840 E = getDerived().TransformExpr(Evt); 9841 if (E.isInvalid()) 9842 return nullptr; 9843 } 9844 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9845 C->getLParenLoc(), C->getEndLoc()); 9846 } 9847 9848 template <typename Derived> 9849 OMPClause * 9850 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9851 // No need to rebuild this clause, no template-dependent parameters. 9852 return C; 9853 } 9854 9855 template <typename Derived> 9856 OMPClause * 9857 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9858 // No need to rebuild this clause, no template-dependent parameters. 9859 return C; 9860 } 9861 9862 template <typename Derived> 9863 OMPClause * 9864 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9865 // No need to rebuild this clause, no template-dependent parameters. 9866 return C; 9867 } 9868 9869 template <typename Derived> 9870 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9871 // No need to rebuild this clause, no template-dependent parameters. 9872 return C; 9873 } 9874 9875 template <typename Derived> 9876 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9877 // No need to rebuild this clause, no template-dependent parameters. 9878 return C; 9879 } 9880 9881 template <typename Derived> 9882 OMPClause * 9883 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9884 // No need to rebuild this clause, no template-dependent parameters. 9885 return C; 9886 } 9887 9888 template <typename Derived> 9889 OMPClause * 9890 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9891 // No need to rebuild this clause, no template-dependent parameters. 9892 return C; 9893 } 9894 9895 template <typename Derived> 9896 OMPClause * 9897 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) { 9898 // No need to rebuild this clause, no template-dependent parameters. 9899 return C; 9900 } 9901 9902 template <typename Derived> 9903 OMPClause *TreeTransform<Derived>::TransformOMPFailClause(OMPFailClause *C) { 9904 // No need to rebuild this clause, no template-dependent parameters. 9905 return C; 9906 } 9907 9908 template <typename Derived> 9909 OMPClause * 9910 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9911 // No need to rebuild this clause, no template-dependent parameters. 9912 return C; 9913 } 9914 9915 template <typename Derived> 9916 OMPClause * 9917 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9918 // No need to rebuild this clause, no template-dependent parameters. 9919 return C; 9920 } 9921 9922 template <typename Derived> 9923 OMPClause * 9924 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9925 // No need to rebuild this clause, no template-dependent parameters. 9926 return C; 9927 } 9928 9929 template <typename Derived> 9930 OMPClause * 9931 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9932 // No need to rebuild this clause, no template-dependent parameters. 9933 return C; 9934 } 9935 9936 template <typename Derived> 9937 OMPClause * 9938 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9939 // No need to rebuild this clause, no template-dependent parameters. 9940 return C; 9941 } 9942 9943 template <typename Derived> 9944 OMPClause * 9945 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9946 // No need to rebuild this clause, no template-dependent parameters. 9947 return C; 9948 } 9949 9950 template <typename Derived> 9951 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9952 // No need to rebuild this clause, no template-dependent parameters. 9953 return C; 9954 } 9955 9956 template <typename Derived> 9957 OMPClause * 9958 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9959 // No need to rebuild this clause, no template-dependent parameters. 9960 return C; 9961 } 9962 9963 template <typename Derived> 9964 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9965 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9966 if (IVR.isInvalid()) 9967 return nullptr; 9968 9969 OMPInteropInfo InteropInfo(C->getIsTarget(), C->getIsTargetSync()); 9970 InteropInfo.PreferTypes.reserve(C->varlist_size() - 1); 9971 for (Expr *E : llvm::drop_begin(C->varlists())) { 9972 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9973 if (ER.isInvalid()) 9974 return nullptr; 9975 InteropInfo.PreferTypes.push_back(ER.get()); 9976 } 9977 return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo, 9978 C->getBeginLoc(), C->getLParenLoc(), 9979 C->getVarLoc(), C->getEndLoc()); 9980 } 9981 9982 template <typename Derived> 9983 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9984 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9985 if (ER.isInvalid()) 9986 return nullptr; 9987 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9988 C->getLParenLoc(), C->getVarLoc(), 9989 C->getEndLoc()); 9990 } 9991 9992 template <typename Derived> 9993 OMPClause * 9994 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9995 ExprResult ER; 9996 if (Expr *IV = C->getInteropVar()) { 9997 ER = getDerived().TransformExpr(IV); 9998 if (ER.isInvalid()) 9999 return nullptr; 10000 } 10001 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 10002 C->getLParenLoc(), C->getVarLoc(), 10003 C->getEndLoc()); 10004 } 10005 10006 template <typename Derived> 10007 OMPClause * 10008 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 10009 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 10010 if (Cond.isInvalid()) 10011 return nullptr; 10012 return getDerived().RebuildOMPNovariantsClause( 10013 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10014 } 10015 10016 template <typename Derived> 10017 OMPClause * 10018 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 10019 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 10020 if (Cond.isInvalid()) 10021 return nullptr; 10022 return getDerived().RebuildOMPNocontextClause( 10023 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10024 } 10025 10026 template <typename Derived> 10027 OMPClause * 10028 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 10029 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 10030 if (ThreadID.isInvalid()) 10031 return nullptr; 10032 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 10033 C->getLParenLoc(), C->getEndLoc()); 10034 } 10035 10036 template <typename Derived> 10037 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 10038 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 10039 if (E.isInvalid()) 10040 return nullptr; 10041 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 10042 C->getLParenLoc(), C->getEndLoc()); 10043 } 10044 10045 template <typename Derived> 10046 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 10047 OMPUnifiedAddressClause *C) { 10048 llvm_unreachable("unified_address clause cannot appear in dependent context"); 10049 } 10050 10051 template <typename Derived> 10052 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 10053 OMPUnifiedSharedMemoryClause *C) { 10054 llvm_unreachable( 10055 "unified_shared_memory clause cannot appear in dependent context"); 10056 } 10057 10058 template <typename Derived> 10059 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 10060 OMPReverseOffloadClause *C) { 10061 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 10062 } 10063 10064 template <typename Derived> 10065 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 10066 OMPDynamicAllocatorsClause *C) { 10067 llvm_unreachable( 10068 "dynamic_allocators clause cannot appear in dependent context"); 10069 } 10070 10071 template <typename Derived> 10072 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 10073 OMPAtomicDefaultMemOrderClause *C) { 10074 llvm_unreachable( 10075 "atomic_default_mem_order clause cannot appear in dependent context"); 10076 } 10077 10078 template <typename Derived> 10079 OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *C) { 10080 return getDerived().RebuildOMPAtClause(C->getAtKind(), C->getAtKindKwLoc(), 10081 C->getBeginLoc(), C->getLParenLoc(), 10082 C->getEndLoc()); 10083 } 10084 10085 template <typename Derived> 10086 OMPClause * 10087 TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *C) { 10088 return getDerived().RebuildOMPSeverityClause( 10089 C->getSeverityKind(), C->getSeverityKindKwLoc(), C->getBeginLoc(), 10090 C->getLParenLoc(), C->getEndLoc()); 10091 } 10092 10093 template <typename Derived> 10094 OMPClause * 10095 TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *C) { 10096 ExprResult E = getDerived().TransformExpr(C->getMessageString()); 10097 if (E.isInvalid()) 10098 return nullptr; 10099 return getDerived().RebuildOMPMessageClause( 10100 C->getMessageString(), C->getBeginLoc(), C->getLParenLoc(), 10101 C->getEndLoc()); 10102 } 10103 10104 template <typename Derived> 10105 OMPClause * 10106 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 10107 llvm::SmallVector<Expr *, 16> Vars; 10108 Vars.reserve(C->varlist_size()); 10109 for (auto *VE : C->varlists()) { 10110 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10111 if (EVar.isInvalid()) 10112 return nullptr; 10113 Vars.push_back(EVar.get()); 10114 } 10115 return getDerived().RebuildOMPPrivateClause( 10116 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10117 } 10118 10119 template <typename Derived> 10120 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 10121 OMPFirstprivateClause *C) { 10122 llvm::SmallVector<Expr *, 16> Vars; 10123 Vars.reserve(C->varlist_size()); 10124 for (auto *VE : C->varlists()) { 10125 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10126 if (EVar.isInvalid()) 10127 return nullptr; 10128 Vars.push_back(EVar.get()); 10129 } 10130 return getDerived().RebuildOMPFirstprivateClause( 10131 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10132 } 10133 10134 template <typename Derived> 10135 OMPClause * 10136 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 10137 llvm::SmallVector<Expr *, 16> Vars; 10138 Vars.reserve(C->varlist_size()); 10139 for (auto *VE : C->varlists()) { 10140 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10141 if (EVar.isInvalid()) 10142 return nullptr; 10143 Vars.push_back(EVar.get()); 10144 } 10145 return getDerived().RebuildOMPLastprivateClause( 10146 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 10147 C->getLParenLoc(), C->getEndLoc()); 10148 } 10149 10150 template <typename Derived> 10151 OMPClause * 10152 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 10153 llvm::SmallVector<Expr *, 16> Vars; 10154 Vars.reserve(C->varlist_size()); 10155 for (auto *VE : C->varlists()) { 10156 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10157 if (EVar.isInvalid()) 10158 return nullptr; 10159 Vars.push_back(EVar.get()); 10160 } 10161 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 10162 C->getLParenLoc(), C->getEndLoc()); 10163 } 10164 10165 template <typename Derived> 10166 OMPClause * 10167 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 10168 llvm::SmallVector<Expr *, 16> Vars; 10169 Vars.reserve(C->varlist_size()); 10170 for (auto *VE : C->varlists()) { 10171 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10172 if (EVar.isInvalid()) 10173 return nullptr; 10174 Vars.push_back(EVar.get()); 10175 } 10176 CXXScopeSpec ReductionIdScopeSpec; 10177 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10178 10179 DeclarationNameInfo NameInfo = C->getNameInfo(); 10180 if (NameInfo.getName()) { 10181 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10182 if (!NameInfo.getName()) 10183 return nullptr; 10184 } 10185 // Build a list of all UDR decls with the same names ranged by the Scopes. 10186 // The Scope boundary is a duplication of the previous decl. 10187 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10188 for (auto *E : C->reduction_ops()) { 10189 // Transform all the decls. 10190 if (E) { 10191 auto *ULE = cast<UnresolvedLookupExpr>(E); 10192 UnresolvedSet<8> Decls; 10193 for (auto *D : ULE->decls()) { 10194 NamedDecl *InstD = 10195 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10196 Decls.addDecl(InstD, InstD->getAccess()); 10197 } 10198 UnresolvedReductions.push_back( 10199 UnresolvedLookupExpr::Create( 10200 SemaRef.Context, /*NamingClass=*/nullptr, 10201 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 10202 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 10203 Decls.begin(), Decls.end())); 10204 } else 10205 UnresolvedReductions.push_back(nullptr); 10206 } 10207 return getDerived().RebuildOMPReductionClause( 10208 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 10209 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 10210 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10211 } 10212 10213 template <typename Derived> 10214 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 10215 OMPTaskReductionClause *C) { 10216 llvm::SmallVector<Expr *, 16> Vars; 10217 Vars.reserve(C->varlist_size()); 10218 for (auto *VE : C->varlists()) { 10219 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10220 if (EVar.isInvalid()) 10221 return nullptr; 10222 Vars.push_back(EVar.get()); 10223 } 10224 CXXScopeSpec ReductionIdScopeSpec; 10225 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10226 10227 DeclarationNameInfo NameInfo = C->getNameInfo(); 10228 if (NameInfo.getName()) { 10229 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10230 if (!NameInfo.getName()) 10231 return nullptr; 10232 } 10233 // Build a list of all UDR decls with the same names ranged by the Scopes. 10234 // The Scope boundary is a duplication of the previous decl. 10235 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10236 for (auto *E : C->reduction_ops()) { 10237 // Transform all the decls. 10238 if (E) { 10239 auto *ULE = cast<UnresolvedLookupExpr>(E); 10240 UnresolvedSet<8> Decls; 10241 for (auto *D : ULE->decls()) { 10242 NamedDecl *InstD = 10243 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10244 Decls.addDecl(InstD, InstD->getAccess()); 10245 } 10246 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 10247 SemaRef.Context, /*NamingClass=*/nullptr, 10248 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 10249 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 10250 } else 10251 UnresolvedReductions.push_back(nullptr); 10252 } 10253 return getDerived().RebuildOMPTaskReductionClause( 10254 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10255 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10256 } 10257 10258 template <typename Derived> 10259 OMPClause * 10260 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 10261 llvm::SmallVector<Expr *, 16> Vars; 10262 Vars.reserve(C->varlist_size()); 10263 for (auto *VE : C->varlists()) { 10264 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10265 if (EVar.isInvalid()) 10266 return nullptr; 10267 Vars.push_back(EVar.get()); 10268 } 10269 CXXScopeSpec ReductionIdScopeSpec; 10270 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10271 10272 DeclarationNameInfo NameInfo = C->getNameInfo(); 10273 if (NameInfo.getName()) { 10274 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10275 if (!NameInfo.getName()) 10276 return nullptr; 10277 } 10278 // Build a list of all UDR decls with the same names ranged by the Scopes. 10279 // The Scope boundary is a duplication of the previous decl. 10280 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10281 for (auto *E : C->reduction_ops()) { 10282 // Transform all the decls. 10283 if (E) { 10284 auto *ULE = cast<UnresolvedLookupExpr>(E); 10285 UnresolvedSet<8> Decls; 10286 for (auto *D : ULE->decls()) { 10287 NamedDecl *InstD = 10288 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10289 Decls.addDecl(InstD, InstD->getAccess()); 10290 } 10291 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 10292 SemaRef.Context, /*NamingClass=*/nullptr, 10293 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 10294 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 10295 } else 10296 UnresolvedReductions.push_back(nullptr); 10297 } 10298 return getDerived().RebuildOMPInReductionClause( 10299 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10300 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10301 } 10302 10303 template <typename Derived> 10304 OMPClause * 10305 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 10306 llvm::SmallVector<Expr *, 16> Vars; 10307 Vars.reserve(C->varlist_size()); 10308 for (auto *VE : C->varlists()) { 10309 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10310 if (EVar.isInvalid()) 10311 return nullptr; 10312 Vars.push_back(EVar.get()); 10313 } 10314 ExprResult Step = getDerived().TransformExpr(C->getStep()); 10315 if (Step.isInvalid()) 10316 return nullptr; 10317 return getDerived().RebuildOMPLinearClause( 10318 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 10319 C->getModifierLoc(), C->getColonLoc(), C->getStepModifierLoc(), 10320 C->getEndLoc()); 10321 } 10322 10323 template <typename Derived> 10324 OMPClause * 10325 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 10326 llvm::SmallVector<Expr *, 16> Vars; 10327 Vars.reserve(C->varlist_size()); 10328 for (auto *VE : C->varlists()) { 10329 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10330 if (EVar.isInvalid()) 10331 return nullptr; 10332 Vars.push_back(EVar.get()); 10333 } 10334 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 10335 if (Alignment.isInvalid()) 10336 return nullptr; 10337 return getDerived().RebuildOMPAlignedClause( 10338 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 10339 C->getColonLoc(), C->getEndLoc()); 10340 } 10341 10342 template <typename Derived> 10343 OMPClause * 10344 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 10345 llvm::SmallVector<Expr *, 16> Vars; 10346 Vars.reserve(C->varlist_size()); 10347 for (auto *VE : C->varlists()) { 10348 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10349 if (EVar.isInvalid()) 10350 return nullptr; 10351 Vars.push_back(EVar.get()); 10352 } 10353 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 10354 C->getLParenLoc(), C->getEndLoc()); 10355 } 10356 10357 template <typename Derived> 10358 OMPClause * 10359 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 10360 llvm::SmallVector<Expr *, 16> Vars; 10361 Vars.reserve(C->varlist_size()); 10362 for (auto *VE : C->varlists()) { 10363 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10364 if (EVar.isInvalid()) 10365 return nullptr; 10366 Vars.push_back(EVar.get()); 10367 } 10368 return getDerived().RebuildOMPCopyprivateClause( 10369 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10370 } 10371 10372 template <typename Derived> 10373 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 10374 llvm::SmallVector<Expr *, 16> Vars; 10375 Vars.reserve(C->varlist_size()); 10376 for (auto *VE : C->varlists()) { 10377 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10378 if (EVar.isInvalid()) 10379 return nullptr; 10380 Vars.push_back(EVar.get()); 10381 } 10382 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 10383 C->getLParenLoc(), C->getEndLoc()); 10384 } 10385 10386 template <typename Derived> 10387 OMPClause * 10388 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 10389 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 10390 if (E.isInvalid()) 10391 return nullptr; 10392 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 10393 C->getLParenLoc(), C->getEndLoc()); 10394 } 10395 10396 template <typename Derived> 10397 OMPClause * 10398 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 10399 llvm::SmallVector<Expr *, 16> Vars; 10400 Expr *DepModifier = C->getModifier(); 10401 if (DepModifier) { 10402 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 10403 if (DepModRes.isInvalid()) 10404 return nullptr; 10405 DepModifier = DepModRes.get(); 10406 } 10407 Vars.reserve(C->varlist_size()); 10408 for (auto *VE : C->varlists()) { 10409 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10410 if (EVar.isInvalid()) 10411 return nullptr; 10412 Vars.push_back(EVar.get()); 10413 } 10414 return getDerived().RebuildOMPDependClause( 10415 {C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), 10416 C->getOmpAllMemoryLoc()}, 10417 DepModifier, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10418 } 10419 10420 template <typename Derived> 10421 OMPClause * 10422 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 10423 ExprResult E = getDerived().TransformExpr(C->getDevice()); 10424 if (E.isInvalid()) 10425 return nullptr; 10426 return getDerived().RebuildOMPDeviceClause( 10427 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10428 C->getModifierLoc(), C->getEndLoc()); 10429 } 10430 10431 template <typename Derived, class T> 10432 bool transformOMPMappableExprListClause( 10433 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 10434 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 10435 DeclarationNameInfo &MapperIdInfo, 10436 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 10437 // Transform expressions in the list. 10438 Vars.reserve(C->varlist_size()); 10439 for (auto *VE : C->varlists()) { 10440 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 10441 if (EVar.isInvalid()) 10442 return true; 10443 Vars.push_back(EVar.get()); 10444 } 10445 // Transform mapper scope specifier and identifier. 10446 NestedNameSpecifierLoc QualifierLoc; 10447 if (C->getMapperQualifierLoc()) { 10448 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 10449 C->getMapperQualifierLoc()); 10450 if (!QualifierLoc) 10451 return true; 10452 } 10453 MapperIdScopeSpec.Adopt(QualifierLoc); 10454 MapperIdInfo = C->getMapperIdInfo(); 10455 if (MapperIdInfo.getName()) { 10456 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 10457 if (!MapperIdInfo.getName()) 10458 return true; 10459 } 10460 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 10461 // the previous user-defined mapper lookup in dependent environment. 10462 for (auto *E : C->mapperlists()) { 10463 // Transform all the decls. 10464 if (E) { 10465 auto *ULE = cast<UnresolvedLookupExpr>(E); 10466 UnresolvedSet<8> Decls; 10467 for (auto *D : ULE->decls()) { 10468 NamedDecl *InstD = 10469 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 10470 Decls.addDecl(InstD, InstD->getAccess()); 10471 } 10472 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 10473 TT.getSema().Context, /*NamingClass=*/nullptr, 10474 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 10475 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 10476 Decls.end())); 10477 } else { 10478 UnresolvedMappers.push_back(nullptr); 10479 } 10480 } 10481 return false; 10482 } 10483 10484 template <typename Derived> 10485 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 10486 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10487 llvm::SmallVector<Expr *, 16> Vars; 10488 Expr *IteratorModifier = C->getIteratorModifier(); 10489 if (IteratorModifier) { 10490 ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier); 10491 if (MapModRes.isInvalid()) 10492 return nullptr; 10493 IteratorModifier = MapModRes.get(); 10494 } 10495 CXXScopeSpec MapperIdScopeSpec; 10496 DeclarationNameInfo MapperIdInfo; 10497 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10498 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 10499 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10500 return nullptr; 10501 return getDerived().RebuildOMPMapClause( 10502 IteratorModifier, C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), 10503 MapperIdScopeSpec, MapperIdInfo, C->getMapType(), C->isImplicitMapType(), 10504 C->getMapLoc(), C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10505 } 10506 10507 template <typename Derived> 10508 OMPClause * 10509 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10510 Expr *Allocator = C->getAllocator(); 10511 if (Allocator) { 10512 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10513 if (AllocatorRes.isInvalid()) 10514 return nullptr; 10515 Allocator = AllocatorRes.get(); 10516 } 10517 llvm::SmallVector<Expr *, 16> Vars; 10518 Vars.reserve(C->varlist_size()); 10519 for (auto *VE : C->varlists()) { 10520 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10521 if (EVar.isInvalid()) 10522 return nullptr; 10523 Vars.push_back(EVar.get()); 10524 } 10525 return getDerived().RebuildOMPAllocateClause( 10526 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10527 C->getEndLoc()); 10528 } 10529 10530 template <typename Derived> 10531 OMPClause * 10532 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10533 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10534 if (E.isInvalid()) 10535 return nullptr; 10536 return getDerived().RebuildOMPNumTeamsClause( 10537 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10538 } 10539 10540 template <typename Derived> 10541 OMPClause * 10542 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10543 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10544 if (E.isInvalid()) 10545 return nullptr; 10546 return getDerived().RebuildOMPThreadLimitClause( 10547 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10548 } 10549 10550 template <typename Derived> 10551 OMPClause * 10552 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10553 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10554 if (E.isInvalid()) 10555 return nullptr; 10556 return getDerived().RebuildOMPPriorityClause( 10557 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10558 } 10559 10560 template <typename Derived> 10561 OMPClause * 10562 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10563 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10564 if (E.isInvalid()) 10565 return nullptr; 10566 return getDerived().RebuildOMPGrainsizeClause( 10567 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10568 C->getModifierLoc(), C->getEndLoc()); 10569 } 10570 10571 template <typename Derived> 10572 OMPClause * 10573 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10574 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10575 if (E.isInvalid()) 10576 return nullptr; 10577 return getDerived().RebuildOMPNumTasksClause( 10578 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10579 C->getModifierLoc(), C->getEndLoc()); 10580 } 10581 10582 template <typename Derived> 10583 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10584 ExprResult E = getDerived().TransformExpr(C->getHint()); 10585 if (E.isInvalid()) 10586 return nullptr; 10587 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10588 C->getLParenLoc(), C->getEndLoc()); 10589 } 10590 10591 template <typename Derived> 10592 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10593 OMPDistScheduleClause *C) { 10594 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10595 if (E.isInvalid()) 10596 return nullptr; 10597 return getDerived().RebuildOMPDistScheduleClause( 10598 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10599 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10600 } 10601 10602 template <typename Derived> 10603 OMPClause * 10604 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10605 // Rebuild Defaultmap Clause since we need to invoke the checking of 10606 // defaultmap(none:variable-category) after template initialization. 10607 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10608 C->getDefaultmapKind(), 10609 C->getBeginLoc(), 10610 C->getLParenLoc(), 10611 C->getDefaultmapModifierLoc(), 10612 C->getDefaultmapKindLoc(), 10613 C->getEndLoc()); 10614 } 10615 10616 template <typename Derived> 10617 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10618 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10619 llvm::SmallVector<Expr *, 16> Vars; 10620 CXXScopeSpec MapperIdScopeSpec; 10621 DeclarationNameInfo MapperIdInfo; 10622 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10623 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10624 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10625 return nullptr; 10626 return getDerived().RebuildOMPToClause( 10627 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10628 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10629 } 10630 10631 template <typename Derived> 10632 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10633 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10634 llvm::SmallVector<Expr *, 16> Vars; 10635 CXXScopeSpec MapperIdScopeSpec; 10636 DeclarationNameInfo MapperIdInfo; 10637 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10638 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10639 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10640 return nullptr; 10641 return getDerived().RebuildOMPFromClause( 10642 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10643 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10644 } 10645 10646 template <typename Derived> 10647 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10648 OMPUseDevicePtrClause *C) { 10649 llvm::SmallVector<Expr *, 16> Vars; 10650 Vars.reserve(C->varlist_size()); 10651 for (auto *VE : C->varlists()) { 10652 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10653 if (EVar.isInvalid()) 10654 return nullptr; 10655 Vars.push_back(EVar.get()); 10656 } 10657 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10658 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10659 } 10660 10661 template <typename Derived> 10662 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10663 OMPUseDeviceAddrClause *C) { 10664 llvm::SmallVector<Expr *, 16> Vars; 10665 Vars.reserve(C->varlist_size()); 10666 for (auto *VE : C->varlists()) { 10667 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10668 if (EVar.isInvalid()) 10669 return nullptr; 10670 Vars.push_back(EVar.get()); 10671 } 10672 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10673 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10674 } 10675 10676 template <typename Derived> 10677 OMPClause * 10678 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10679 llvm::SmallVector<Expr *, 16> Vars; 10680 Vars.reserve(C->varlist_size()); 10681 for (auto *VE : C->varlists()) { 10682 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10683 if (EVar.isInvalid()) 10684 return nullptr; 10685 Vars.push_back(EVar.get()); 10686 } 10687 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10688 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10689 } 10690 10691 template <typename Derived> 10692 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause( 10693 OMPHasDeviceAddrClause *C) { 10694 llvm::SmallVector<Expr *, 16> Vars; 10695 Vars.reserve(C->varlist_size()); 10696 for (auto *VE : C->varlists()) { 10697 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10698 if (EVar.isInvalid()) 10699 return nullptr; 10700 Vars.push_back(EVar.get()); 10701 } 10702 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10703 return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs); 10704 } 10705 10706 template <typename Derived> 10707 OMPClause * 10708 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10709 llvm::SmallVector<Expr *, 16> Vars; 10710 Vars.reserve(C->varlist_size()); 10711 for (auto *VE : C->varlists()) { 10712 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10713 if (EVar.isInvalid()) 10714 return nullptr; 10715 Vars.push_back(EVar.get()); 10716 } 10717 return getDerived().RebuildOMPNontemporalClause( 10718 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10719 } 10720 10721 template <typename Derived> 10722 OMPClause * 10723 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10724 llvm::SmallVector<Expr *, 16> Vars; 10725 Vars.reserve(C->varlist_size()); 10726 for (auto *VE : C->varlists()) { 10727 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10728 if (EVar.isInvalid()) 10729 return nullptr; 10730 Vars.push_back(EVar.get()); 10731 } 10732 return getDerived().RebuildOMPInclusiveClause( 10733 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10734 } 10735 10736 template <typename Derived> 10737 OMPClause * 10738 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10739 llvm::SmallVector<Expr *, 16> Vars; 10740 Vars.reserve(C->varlist_size()); 10741 for (auto *VE : C->varlists()) { 10742 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10743 if (EVar.isInvalid()) 10744 return nullptr; 10745 Vars.push_back(EVar.get()); 10746 } 10747 return getDerived().RebuildOMPExclusiveClause( 10748 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10749 } 10750 10751 template <typename Derived> 10752 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10753 OMPUsesAllocatorsClause *C) { 10754 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10755 Data.reserve(C->getNumberOfAllocators()); 10756 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10757 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10758 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10759 if (Allocator.isInvalid()) 10760 continue; 10761 ExprResult AllocatorTraits; 10762 if (Expr *AT = D.AllocatorTraits) { 10763 AllocatorTraits = getDerived().TransformExpr(AT); 10764 if (AllocatorTraits.isInvalid()) 10765 continue; 10766 } 10767 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10768 NewD.Allocator = Allocator.get(); 10769 NewD.AllocatorTraits = AllocatorTraits.get(); 10770 NewD.LParenLoc = D.LParenLoc; 10771 NewD.RParenLoc = D.RParenLoc; 10772 } 10773 return getDerived().RebuildOMPUsesAllocatorsClause( 10774 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10775 } 10776 10777 template <typename Derived> 10778 OMPClause * 10779 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10780 SmallVector<Expr *, 4> Locators; 10781 Locators.reserve(C->varlist_size()); 10782 ExprResult ModifierRes; 10783 if (Expr *Modifier = C->getModifier()) { 10784 ModifierRes = getDerived().TransformExpr(Modifier); 10785 if (ModifierRes.isInvalid()) 10786 return nullptr; 10787 } 10788 for (Expr *E : C->varlists()) { 10789 ExprResult Locator = getDerived().TransformExpr(E); 10790 if (Locator.isInvalid()) 10791 continue; 10792 Locators.push_back(Locator.get()); 10793 } 10794 return getDerived().RebuildOMPAffinityClause( 10795 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10796 ModifierRes.get(), Locators); 10797 } 10798 10799 template <typename Derived> 10800 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10801 return getDerived().RebuildOMPOrderClause( 10802 C->getKind(), C->getKindKwLoc(), C->getBeginLoc(), C->getLParenLoc(), 10803 C->getEndLoc(), C->getModifier(), C->getModifierKwLoc()); 10804 } 10805 10806 template <typename Derived> 10807 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10808 return getDerived().RebuildOMPBindClause( 10809 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10810 C->getLParenLoc(), C->getEndLoc()); 10811 } 10812 10813 template <typename Derived> 10814 OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause( 10815 OMPXDynCGroupMemClause *C) { 10816 ExprResult Size = getDerived().TransformExpr(C->getSize()); 10817 if (Size.isInvalid()) 10818 return nullptr; 10819 return getDerived().RebuildOMPXDynCGroupMemClause( 10820 Size.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10821 } 10822 10823 template <typename Derived> 10824 OMPClause * 10825 TreeTransform<Derived>::TransformOMPDoacrossClause(OMPDoacrossClause *C) { 10826 llvm::SmallVector<Expr *, 16> Vars; 10827 Vars.reserve(C->varlist_size()); 10828 for (auto *VE : C->varlists()) { 10829 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10830 if (EVar.isInvalid()) 10831 return nullptr; 10832 Vars.push_back(EVar.get()); 10833 } 10834 return getDerived().RebuildOMPDoacrossClause( 10835 C->getDependenceType(), C->getDependenceLoc(), C->getColonLoc(), Vars, 10836 C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10837 } 10838 10839 template <typename Derived> 10840 OMPClause * 10841 TreeTransform<Derived>::TransformOMPXAttributeClause(OMPXAttributeClause *C) { 10842 SmallVector<const Attr *> NewAttrs; 10843 for (auto *A : C->getAttrs()) 10844 NewAttrs.push_back(getDerived().TransformAttr(A)); 10845 return getDerived().RebuildOMPXAttributeClause( 10846 NewAttrs, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10847 } 10848 10849 template <typename Derived> 10850 OMPClause *TreeTransform<Derived>::TransformOMPXBareClause(OMPXBareClause *C) { 10851 return getDerived().RebuildOMPXBareClause(C->getBeginLoc(), C->getEndLoc()); 10852 } 10853 10854 //===----------------------------------------------------------------------===// 10855 // Expression transformation 10856 //===----------------------------------------------------------------------===// 10857 template<typename Derived> 10858 ExprResult 10859 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10860 return TransformExpr(E->getSubExpr()); 10861 } 10862 10863 template <typename Derived> 10864 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10865 SYCLUniqueStableNameExpr *E) { 10866 if (!E->isTypeDependent()) 10867 return E; 10868 10869 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10870 10871 if (!NewT) 10872 return ExprError(); 10873 10874 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10875 return E; 10876 10877 return getDerived().RebuildSYCLUniqueStableNameExpr( 10878 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10879 } 10880 10881 template<typename Derived> 10882 ExprResult 10883 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10884 if (!E->isTypeDependent()) 10885 return E; 10886 10887 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10888 E->getIdentKind()); 10889 } 10890 10891 template<typename Derived> 10892 ExprResult 10893 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10894 NestedNameSpecifierLoc QualifierLoc; 10895 if (E->getQualifierLoc()) { 10896 QualifierLoc 10897 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10898 if (!QualifierLoc) 10899 return ExprError(); 10900 } 10901 10902 ValueDecl *ND 10903 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10904 E->getDecl())); 10905 if (!ND) 10906 return ExprError(); 10907 10908 NamedDecl *Found = ND; 10909 if (E->getFoundDecl() != E->getDecl()) { 10910 Found = cast_or_null<NamedDecl>( 10911 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10912 if (!Found) 10913 return ExprError(); 10914 } 10915 10916 DeclarationNameInfo NameInfo = E->getNameInfo(); 10917 if (NameInfo.getName()) { 10918 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10919 if (!NameInfo.getName()) 10920 return ExprError(); 10921 } 10922 10923 if (!getDerived().AlwaysRebuild() && 10924 QualifierLoc == E->getQualifierLoc() && 10925 ND == E->getDecl() && 10926 Found == E->getFoundDecl() && 10927 NameInfo.getName() == E->getDecl()->getDeclName() && 10928 !E->hasExplicitTemplateArgs()) { 10929 10930 // Mark it referenced in the new context regardless. 10931 // FIXME: this is a bit instantiation-specific. 10932 SemaRef.MarkDeclRefReferenced(E); 10933 10934 return E; 10935 } 10936 10937 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10938 if (E->hasExplicitTemplateArgs()) { 10939 TemplateArgs = &TransArgs; 10940 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10941 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10942 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10943 E->getNumTemplateArgs(), 10944 TransArgs)) 10945 return ExprError(); 10946 } 10947 10948 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10949 Found, TemplateArgs); 10950 } 10951 10952 template<typename Derived> 10953 ExprResult 10954 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10955 return E; 10956 } 10957 10958 template <typename Derived> 10959 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10960 FixedPointLiteral *E) { 10961 return E; 10962 } 10963 10964 template<typename Derived> 10965 ExprResult 10966 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10967 return E; 10968 } 10969 10970 template<typename Derived> 10971 ExprResult 10972 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10973 return E; 10974 } 10975 10976 template<typename Derived> 10977 ExprResult 10978 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10979 return E; 10980 } 10981 10982 template<typename Derived> 10983 ExprResult 10984 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10985 return E; 10986 } 10987 10988 template<typename Derived> 10989 ExprResult 10990 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10991 return getDerived().TransformCallExpr(E); 10992 } 10993 10994 template<typename Derived> 10995 ExprResult 10996 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10997 ExprResult ControllingExpr; 10998 TypeSourceInfo *ControllingType = nullptr; 10999 if (E->isExprPredicate()) 11000 ControllingExpr = getDerived().TransformExpr(E->getControllingExpr()); 11001 else 11002 ControllingType = getDerived().TransformType(E->getControllingType()); 11003 11004 if (ControllingExpr.isInvalid() && !ControllingType) 11005 return ExprError(); 11006 11007 SmallVector<Expr *, 4> AssocExprs; 11008 SmallVector<TypeSourceInfo *, 4> AssocTypes; 11009 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 11010 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 11011 if (TSI) { 11012 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 11013 if (!AssocType) 11014 return ExprError(); 11015 AssocTypes.push_back(AssocType); 11016 } else { 11017 AssocTypes.push_back(nullptr); 11018 } 11019 11020 ExprResult AssocExpr = 11021 getDerived().TransformExpr(Assoc.getAssociationExpr()); 11022 if (AssocExpr.isInvalid()) 11023 return ExprError(); 11024 AssocExprs.push_back(AssocExpr.get()); 11025 } 11026 11027 if (!ControllingType) 11028 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 11029 E->getDefaultLoc(), 11030 E->getRParenLoc(), 11031 ControllingExpr.get(), 11032 AssocTypes, 11033 AssocExprs); 11034 return getDerived().RebuildGenericSelectionExpr( 11035 E->getGenericLoc(), E->getDefaultLoc(), E->getRParenLoc(), 11036 ControllingType, AssocTypes, AssocExprs); 11037 } 11038 11039 template<typename Derived> 11040 ExprResult 11041 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 11042 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11043 if (SubExpr.isInvalid()) 11044 return ExprError(); 11045 11046 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 11047 return E; 11048 11049 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 11050 E->getRParen()); 11051 } 11052 11053 /// The operand of a unary address-of operator has special rules: it's 11054 /// allowed to refer to a non-static member of a class even if there's no 'this' 11055 /// object available. 11056 template<typename Derived> 11057 ExprResult 11058 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 11059 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 11060 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 11061 else 11062 return getDerived().TransformExpr(E); 11063 } 11064 11065 template<typename Derived> 11066 ExprResult 11067 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 11068 ExprResult SubExpr; 11069 if (E->getOpcode() == UO_AddrOf) 11070 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 11071 else 11072 SubExpr = TransformExpr(E->getSubExpr()); 11073 if (SubExpr.isInvalid()) 11074 return ExprError(); 11075 11076 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 11077 return E; 11078 11079 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 11080 E->getOpcode(), 11081 SubExpr.get()); 11082 } 11083 11084 template<typename Derived> 11085 ExprResult 11086 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 11087 // Transform the type. 11088 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 11089 if (!Type) 11090 return ExprError(); 11091 11092 // Transform all of the components into components similar to what the 11093 // parser uses. 11094 // FIXME: It would be slightly more efficient in the non-dependent case to 11095 // just map FieldDecls, rather than requiring the rebuilder to look for 11096 // the fields again. However, __builtin_offsetof is rare enough in 11097 // template code that we don't care. 11098 bool ExprChanged = false; 11099 typedef Sema::OffsetOfComponent Component; 11100 SmallVector<Component, 4> Components; 11101 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 11102 const OffsetOfNode &ON = E->getComponent(I); 11103 Component Comp; 11104 Comp.isBrackets = true; 11105 Comp.LocStart = ON.getSourceRange().getBegin(); 11106 Comp.LocEnd = ON.getSourceRange().getEnd(); 11107 switch (ON.getKind()) { 11108 case OffsetOfNode::Array: { 11109 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 11110 ExprResult Index = getDerived().TransformExpr(FromIndex); 11111 if (Index.isInvalid()) 11112 return ExprError(); 11113 11114 ExprChanged = ExprChanged || Index.get() != FromIndex; 11115 Comp.isBrackets = true; 11116 Comp.U.E = Index.get(); 11117 break; 11118 } 11119 11120 case OffsetOfNode::Field: 11121 case OffsetOfNode::Identifier: 11122 Comp.isBrackets = false; 11123 Comp.U.IdentInfo = ON.getFieldName(); 11124 if (!Comp.U.IdentInfo) 11125 continue; 11126 11127 break; 11128 11129 case OffsetOfNode::Base: 11130 // Will be recomputed during the rebuild. 11131 continue; 11132 } 11133 11134 Components.push_back(Comp); 11135 } 11136 11137 // If nothing changed, retain the existing expression. 11138 if (!getDerived().AlwaysRebuild() && 11139 Type == E->getTypeSourceInfo() && 11140 !ExprChanged) 11141 return E; 11142 11143 // Build a new offsetof expression. 11144 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 11145 Components, E->getRParenLoc()); 11146 } 11147 11148 template<typename Derived> 11149 ExprResult 11150 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 11151 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 11152 "opaque value expression requires transformation"); 11153 return E; 11154 } 11155 11156 template<typename Derived> 11157 ExprResult 11158 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 11159 return E; 11160 } 11161 11162 template <typename Derived> 11163 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 11164 llvm::SmallVector<Expr *, 8> Children; 11165 bool Changed = false; 11166 for (Expr *C : E->subExpressions()) { 11167 ExprResult NewC = getDerived().TransformExpr(C); 11168 if (NewC.isInvalid()) 11169 return ExprError(); 11170 Children.push_back(NewC.get()); 11171 11172 Changed |= NewC.get() != C; 11173 } 11174 if (!getDerived().AlwaysRebuild() && !Changed) 11175 return E; 11176 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 11177 Children, E->getType()); 11178 } 11179 11180 template<typename Derived> 11181 ExprResult 11182 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 11183 // Rebuild the syntactic form. The original syntactic form has 11184 // opaque-value expressions in it, so strip those away and rebuild 11185 // the result. This is a really awful way of doing this, but the 11186 // better solution (rebuilding the semantic expressions and 11187 // rebinding OVEs as necessary) doesn't work; we'd need 11188 // TreeTransform to not strip away implicit conversions. 11189 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 11190 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 11191 if (result.isInvalid()) return ExprError(); 11192 11193 // If that gives us a pseudo-object result back, the pseudo-object 11194 // expression must have been an lvalue-to-rvalue conversion which we 11195 // should reapply. 11196 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 11197 result = SemaRef.checkPseudoObjectRValue(result.get()); 11198 11199 return result; 11200 } 11201 11202 template<typename Derived> 11203 ExprResult 11204 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 11205 UnaryExprOrTypeTraitExpr *E) { 11206 if (E->isArgumentType()) { 11207 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 11208 11209 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11210 if (!NewT) 11211 return ExprError(); 11212 11213 if (!getDerived().AlwaysRebuild() && OldT == NewT) 11214 return E; 11215 11216 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 11217 E->getKind(), 11218 E->getSourceRange()); 11219 } 11220 11221 // C++0x [expr.sizeof]p1: 11222 // The operand is either an expression, which is an unevaluated operand 11223 // [...] 11224 EnterExpressionEvaluationContext Unevaluated( 11225 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11226 Sema::ReuseLambdaContextDecl); 11227 11228 // Try to recover if we have something like sizeof(T::X) where X is a type. 11229 // Notably, there must be *exactly* one set of parens if X is a type. 11230 TypeSourceInfo *RecoveryTSI = nullptr; 11231 ExprResult SubExpr; 11232 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 11233 if (auto *DRE = 11234 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 11235 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 11236 PE, DRE, false, &RecoveryTSI); 11237 else 11238 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 11239 11240 if (RecoveryTSI) { 11241 return getDerived().RebuildUnaryExprOrTypeTrait( 11242 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 11243 } else if (SubExpr.isInvalid()) 11244 return ExprError(); 11245 11246 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 11247 return E; 11248 11249 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 11250 E->getOperatorLoc(), 11251 E->getKind(), 11252 E->getSourceRange()); 11253 } 11254 11255 template<typename Derived> 11256 ExprResult 11257 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 11258 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11259 if (LHS.isInvalid()) 11260 return ExprError(); 11261 11262 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11263 if (RHS.isInvalid()) 11264 return ExprError(); 11265 11266 11267 if (!getDerived().AlwaysRebuild() && 11268 LHS.get() == E->getLHS() && 11269 RHS.get() == E->getRHS()) 11270 return E; 11271 11272 return getDerived().RebuildArraySubscriptExpr( 11273 LHS.get(), 11274 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 11275 } 11276 11277 template <typename Derived> 11278 ExprResult 11279 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 11280 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11281 if (Base.isInvalid()) 11282 return ExprError(); 11283 11284 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 11285 if (RowIdx.isInvalid()) 11286 return ExprError(); 11287 11288 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 11289 if (ColumnIdx.isInvalid()) 11290 return ExprError(); 11291 11292 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 11293 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 11294 return E; 11295 11296 return getDerived().RebuildMatrixSubscriptExpr( 11297 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 11298 } 11299 11300 template <typename Derived> 11301 ExprResult 11302 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 11303 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11304 if (Base.isInvalid()) 11305 return ExprError(); 11306 11307 ExprResult LowerBound; 11308 if (E->getLowerBound()) { 11309 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 11310 if (LowerBound.isInvalid()) 11311 return ExprError(); 11312 } 11313 11314 ExprResult Length; 11315 if (E->getLength()) { 11316 Length = getDerived().TransformExpr(E->getLength()); 11317 if (Length.isInvalid()) 11318 return ExprError(); 11319 } 11320 11321 ExprResult Stride; 11322 if (Expr *Str = E->getStride()) { 11323 Stride = getDerived().TransformExpr(Str); 11324 if (Stride.isInvalid()) 11325 return ExprError(); 11326 } 11327 11328 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 11329 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 11330 return E; 11331 11332 return getDerived().RebuildOMPArraySectionExpr( 11333 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 11334 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 11335 E->getRBracketLoc()); 11336 } 11337 11338 template <typename Derived> 11339 ExprResult 11340 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 11341 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11342 if (Base.isInvalid()) 11343 return ExprError(); 11344 11345 SmallVector<Expr *, 4> Dims; 11346 bool ErrorFound = false; 11347 for (Expr *Dim : E->getDimensions()) { 11348 ExprResult DimRes = getDerived().TransformExpr(Dim); 11349 if (DimRes.isInvalid()) { 11350 ErrorFound = true; 11351 continue; 11352 } 11353 Dims.push_back(DimRes.get()); 11354 } 11355 11356 if (ErrorFound) 11357 return ExprError(); 11358 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 11359 E->getRParenLoc(), Dims, 11360 E->getBracketsRanges()); 11361 } 11362 11363 template <typename Derived> 11364 ExprResult 11365 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 11366 unsigned NumIterators = E->numOfIterators(); 11367 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 11368 11369 bool ErrorFound = false; 11370 bool NeedToRebuild = getDerived().AlwaysRebuild(); 11371 for (unsigned I = 0; I < NumIterators; ++I) { 11372 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 11373 Data[I].DeclIdent = D->getIdentifier(); 11374 Data[I].DeclIdentLoc = D->getLocation(); 11375 if (D->getLocation() == D->getBeginLoc()) { 11376 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 11377 "Implicit type must be int."); 11378 } else { 11379 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 11380 QualType DeclTy = getDerived().TransformType(D->getType()); 11381 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 11382 } 11383 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 11384 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 11385 ExprResult End = getDerived().TransformExpr(Range.End); 11386 ExprResult Step = getDerived().TransformExpr(Range.Step); 11387 ErrorFound = ErrorFound || 11388 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 11389 !Data[I].Type.get().isNull())) || 11390 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 11391 if (ErrorFound) 11392 continue; 11393 Data[I].Range.Begin = Begin.get(); 11394 Data[I].Range.End = End.get(); 11395 Data[I].Range.Step = Step.get(); 11396 Data[I].AssignLoc = E->getAssignLoc(I); 11397 Data[I].ColonLoc = E->getColonLoc(I); 11398 Data[I].SecColonLoc = E->getSecondColonLoc(I); 11399 NeedToRebuild = 11400 NeedToRebuild || 11401 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 11402 D->getType().getTypePtrOrNull()) || 11403 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 11404 Range.Step != Data[I].Range.Step; 11405 } 11406 if (ErrorFound) 11407 return ExprError(); 11408 if (!NeedToRebuild) 11409 return E; 11410 11411 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 11412 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 11413 if (!Res.isUsable()) 11414 return Res; 11415 auto *IE = cast<OMPIteratorExpr>(Res.get()); 11416 for (unsigned I = 0; I < NumIterators; ++I) 11417 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 11418 IE->getIteratorDecl(I)); 11419 return Res; 11420 } 11421 11422 template<typename Derived> 11423 ExprResult 11424 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 11425 // Transform the callee. 11426 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11427 if (Callee.isInvalid()) 11428 return ExprError(); 11429 11430 // Transform arguments. 11431 bool ArgChanged = false; 11432 SmallVector<Expr*, 8> Args; 11433 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11434 &ArgChanged)) 11435 return ExprError(); 11436 11437 if (!getDerived().AlwaysRebuild() && 11438 Callee.get() == E->getCallee() && 11439 !ArgChanged) 11440 return SemaRef.MaybeBindToTemporary(E); 11441 11442 // FIXME: Wrong source location information for the '('. 11443 SourceLocation FakeLParenLoc 11444 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11445 11446 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11447 if (E->hasStoredFPFeatures()) { 11448 FPOptionsOverride NewOverrides = E->getFPFeatures(); 11449 getSema().CurFPFeatures = 11450 NewOverrides.applyOverrides(getSema().getLangOpts()); 11451 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11452 } 11453 11454 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11455 Args, 11456 E->getRParenLoc()); 11457 } 11458 11459 template<typename Derived> 11460 ExprResult 11461 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 11462 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11463 if (Base.isInvalid()) 11464 return ExprError(); 11465 11466 NestedNameSpecifierLoc QualifierLoc; 11467 if (E->hasQualifier()) { 11468 QualifierLoc 11469 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 11470 11471 if (!QualifierLoc) 11472 return ExprError(); 11473 } 11474 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11475 11476 ValueDecl *Member 11477 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 11478 E->getMemberDecl())); 11479 if (!Member) 11480 return ExprError(); 11481 11482 NamedDecl *FoundDecl = E->getFoundDecl(); 11483 if (FoundDecl == E->getMemberDecl()) { 11484 FoundDecl = Member; 11485 } else { 11486 FoundDecl = cast_or_null<NamedDecl>( 11487 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 11488 if (!FoundDecl) 11489 return ExprError(); 11490 } 11491 11492 if (!getDerived().AlwaysRebuild() && 11493 Base.get() == E->getBase() && 11494 QualifierLoc == E->getQualifierLoc() && 11495 Member == E->getMemberDecl() && 11496 FoundDecl == E->getFoundDecl() && 11497 !E->hasExplicitTemplateArgs()) { 11498 11499 // Skip for member expression of (this->f), rebuilt thisi->f is needed 11500 // for Openmp where the field need to be privatizized in the case. 11501 if (!(isa<CXXThisExpr>(E->getBase()) && 11502 getSema().isOpenMPRebuildMemberExpr(cast<ValueDecl>(Member)))) { 11503 // Mark it referenced in the new context regardless. 11504 // FIXME: this is a bit instantiation-specific. 11505 SemaRef.MarkMemberReferenced(E); 11506 return E; 11507 } 11508 } 11509 11510 TemplateArgumentListInfo TransArgs; 11511 if (E->hasExplicitTemplateArgs()) { 11512 TransArgs.setLAngleLoc(E->getLAngleLoc()); 11513 TransArgs.setRAngleLoc(E->getRAngleLoc()); 11514 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11515 E->getNumTemplateArgs(), 11516 TransArgs)) 11517 return ExprError(); 11518 } 11519 11520 // FIXME: Bogus source location for the operator 11521 SourceLocation FakeOperatorLoc = 11522 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 11523 11524 // FIXME: to do this check properly, we will need to preserve the 11525 // first-qualifier-in-scope here, just in case we had a dependent 11526 // base (and therefore couldn't do the check) and a 11527 // nested-name-qualifier (and therefore could do the lookup). 11528 NamedDecl *FirstQualifierInScope = nullptr; 11529 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 11530 if (MemberNameInfo.getName()) { 11531 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 11532 if (!MemberNameInfo.getName()) 11533 return ExprError(); 11534 } 11535 11536 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 11537 E->isArrow(), 11538 QualifierLoc, 11539 TemplateKWLoc, 11540 MemberNameInfo, 11541 Member, 11542 FoundDecl, 11543 (E->hasExplicitTemplateArgs() 11544 ? &TransArgs : nullptr), 11545 FirstQualifierInScope); 11546 } 11547 11548 template<typename Derived> 11549 ExprResult 11550 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 11551 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11552 if (LHS.isInvalid()) 11553 return ExprError(); 11554 11555 ExprResult RHS = 11556 getDerived().TransformInitializer(E->getRHS(), /*NotCopyInit=*/false); 11557 if (RHS.isInvalid()) 11558 return ExprError(); 11559 11560 if (!getDerived().AlwaysRebuild() && 11561 LHS.get() == E->getLHS() && 11562 RHS.get() == E->getRHS()) 11563 return E; 11564 11565 if (E->isCompoundAssignmentOp()) 11566 // FPFeatures has already been established from trailing storage 11567 return getDerived().RebuildBinaryOperator( 11568 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 11569 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11570 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11571 getSema().CurFPFeatures = 11572 NewOverrides.applyOverrides(getSema().getLangOpts()); 11573 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11574 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 11575 LHS.get(), RHS.get()); 11576 } 11577 11578 template <typename Derived> 11579 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11580 CXXRewrittenBinaryOperator *E) { 11581 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11582 11583 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11584 if (LHS.isInvalid()) 11585 return ExprError(); 11586 11587 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11588 if (RHS.isInvalid()) 11589 return ExprError(); 11590 11591 // Extract the already-resolved callee declarations so that we can restrict 11592 // ourselves to using them as the unqualified lookup results when rebuilding. 11593 UnresolvedSet<2> UnqualLookups; 11594 bool ChangedAnyLookups = false; 11595 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11596 const_cast<Expr *>(Decomp.InnerBinOp)}; 11597 for (Expr *PossibleBinOp : PossibleBinOps) { 11598 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11599 if (!Op) 11600 continue; 11601 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11602 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11603 continue; 11604 11605 // Transform the callee in case we built a call to a local extern 11606 // declaration. 11607 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11608 E->getOperatorLoc(), Callee->getFoundDecl())); 11609 if (!Found) 11610 return ExprError(); 11611 if (Found != Callee->getFoundDecl()) 11612 ChangedAnyLookups = true; 11613 UnqualLookups.addDecl(Found); 11614 } 11615 11616 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11617 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11618 // Mark all functions used in the rewrite as referenced. Note that when 11619 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11620 // function calls, and/or there might be a user-defined conversion sequence 11621 // applied to the operands of the <. 11622 // FIXME: this is a bit instantiation-specific. 11623 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11624 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11625 return E; 11626 } 11627 11628 return getDerived().RebuildCXXRewrittenBinaryOperator( 11629 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11630 } 11631 11632 template<typename Derived> 11633 ExprResult 11634 TreeTransform<Derived>::TransformCompoundAssignOperator( 11635 CompoundAssignOperator *E) { 11636 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11637 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11638 getSema().CurFPFeatures = 11639 NewOverrides.applyOverrides(getSema().getLangOpts()); 11640 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11641 return getDerived().TransformBinaryOperator(E); 11642 } 11643 11644 template<typename Derived> 11645 ExprResult TreeTransform<Derived>:: 11646 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11647 // Just rebuild the common and RHS expressions and see whether we 11648 // get any changes. 11649 11650 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11651 if (commonExpr.isInvalid()) 11652 return ExprError(); 11653 11654 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11655 if (rhs.isInvalid()) 11656 return ExprError(); 11657 11658 if (!getDerived().AlwaysRebuild() && 11659 commonExpr.get() == e->getCommon() && 11660 rhs.get() == e->getFalseExpr()) 11661 return e; 11662 11663 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11664 e->getQuestionLoc(), 11665 nullptr, 11666 e->getColonLoc(), 11667 rhs.get()); 11668 } 11669 11670 template<typename Derived> 11671 ExprResult 11672 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11673 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11674 if (Cond.isInvalid()) 11675 return ExprError(); 11676 11677 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11678 if (LHS.isInvalid()) 11679 return ExprError(); 11680 11681 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11682 if (RHS.isInvalid()) 11683 return ExprError(); 11684 11685 if (!getDerived().AlwaysRebuild() && 11686 Cond.get() == E->getCond() && 11687 LHS.get() == E->getLHS() && 11688 RHS.get() == E->getRHS()) 11689 return E; 11690 11691 return getDerived().RebuildConditionalOperator(Cond.get(), 11692 E->getQuestionLoc(), 11693 LHS.get(), 11694 E->getColonLoc(), 11695 RHS.get()); 11696 } 11697 11698 template<typename Derived> 11699 ExprResult 11700 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11701 // Implicit casts are eliminated during transformation, since they 11702 // will be recomputed by semantic analysis after transformation. 11703 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11704 } 11705 11706 template<typename Derived> 11707 ExprResult 11708 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11709 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11710 if (!Type) 11711 return ExprError(); 11712 11713 ExprResult SubExpr 11714 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11715 if (SubExpr.isInvalid()) 11716 return ExprError(); 11717 11718 if (!getDerived().AlwaysRebuild() && 11719 Type == E->getTypeInfoAsWritten() && 11720 SubExpr.get() == E->getSubExpr()) 11721 return E; 11722 11723 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11724 Type, 11725 E->getRParenLoc(), 11726 SubExpr.get()); 11727 } 11728 11729 template<typename Derived> 11730 ExprResult 11731 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11732 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11733 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11734 if (!NewT) 11735 return ExprError(); 11736 11737 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11738 if (Init.isInvalid()) 11739 return ExprError(); 11740 11741 if (!getDerived().AlwaysRebuild() && 11742 OldT == NewT && 11743 Init.get() == E->getInitializer()) 11744 return SemaRef.MaybeBindToTemporary(E); 11745 11746 // Note: the expression type doesn't necessarily match the 11747 // type-as-written, but that's okay, because it should always be 11748 // derivable from the initializer. 11749 11750 return getDerived().RebuildCompoundLiteralExpr( 11751 E->getLParenLoc(), NewT, 11752 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11753 } 11754 11755 template<typename Derived> 11756 ExprResult 11757 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11758 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11759 if (Base.isInvalid()) 11760 return ExprError(); 11761 11762 if (!getDerived().AlwaysRebuild() && 11763 Base.get() == E->getBase()) 11764 return E; 11765 11766 // FIXME: Bad source location 11767 SourceLocation FakeOperatorLoc = 11768 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11769 return getDerived().RebuildExtVectorElementExpr( 11770 Base.get(), FakeOperatorLoc, E->isArrow(), E->getAccessorLoc(), 11771 E->getAccessor()); 11772 } 11773 11774 template<typename Derived> 11775 ExprResult 11776 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11777 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11778 E = Syntactic; 11779 11780 bool InitChanged = false; 11781 11782 EnterExpressionEvaluationContext Context( 11783 getSema(), EnterExpressionEvaluationContext::InitList); 11784 11785 SmallVector<Expr*, 4> Inits; 11786 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11787 Inits, &InitChanged)) 11788 return ExprError(); 11789 11790 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11791 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11792 // in some cases. We can't reuse it in general, because the syntactic and 11793 // semantic forms are linked, and we can't know that semantic form will 11794 // match even if the syntactic form does. 11795 } 11796 11797 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11798 E->getRBraceLoc()); 11799 } 11800 11801 template<typename Derived> 11802 ExprResult 11803 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11804 Designation Desig; 11805 11806 // transform the initializer value 11807 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11808 if (Init.isInvalid()) 11809 return ExprError(); 11810 11811 // transform the designators. 11812 SmallVector<Expr*, 4> ArrayExprs; 11813 bool ExprChanged = false; 11814 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11815 if (D.isFieldDesignator()) { 11816 if (D.getFieldDecl()) { 11817 FieldDecl *Field = cast_or_null<FieldDecl>( 11818 getDerived().TransformDecl(D.getFieldLoc(), D.getFieldDecl())); 11819 if (Field != D.getFieldDecl()) 11820 // Rebuild the expression when the transformed FieldDecl is 11821 // different to the already assigned FieldDecl. 11822 ExprChanged = true; 11823 if (Field->isAnonymousStructOrUnion()) 11824 continue; 11825 } else { 11826 // Ensure that the designator expression is rebuilt when there isn't 11827 // a resolved FieldDecl in the designator as we don't want to assign 11828 // a FieldDecl to a pattern designator that will be instantiated again. 11829 ExprChanged = true; 11830 } 11831 Desig.AddDesignator(Designator::CreateFieldDesignator( 11832 D.getFieldName(), D.getDotLoc(), D.getFieldLoc())); 11833 continue; 11834 } 11835 11836 if (D.isArrayDesignator()) { 11837 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11838 if (Index.isInvalid()) 11839 return ExprError(); 11840 11841 Desig.AddDesignator( 11842 Designator::CreateArrayDesignator(Index.get(), D.getLBracketLoc())); 11843 11844 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11845 ArrayExprs.push_back(Index.get()); 11846 continue; 11847 } 11848 11849 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11850 ExprResult Start 11851 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11852 if (Start.isInvalid()) 11853 return ExprError(); 11854 11855 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11856 if (End.isInvalid()) 11857 return ExprError(); 11858 11859 Desig.AddDesignator(Designator::CreateArrayRangeDesignator( 11860 Start.get(), End.get(), D.getLBracketLoc(), D.getEllipsisLoc())); 11861 11862 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11863 End.get() != E->getArrayRangeEnd(D); 11864 11865 ArrayExprs.push_back(Start.get()); 11866 ArrayExprs.push_back(End.get()); 11867 } 11868 11869 if (!getDerived().AlwaysRebuild() && 11870 Init.get() == E->getInit() && 11871 !ExprChanged) 11872 return E; 11873 11874 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11875 E->getEqualOrColonLoc(), 11876 E->usesGNUSyntax(), Init.get()); 11877 } 11878 11879 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11880 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11881 template<typename Derived> 11882 ExprResult 11883 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11884 DesignatedInitUpdateExpr *E) { 11885 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11886 "initializer"); 11887 return ExprError(); 11888 } 11889 11890 template<typename Derived> 11891 ExprResult 11892 TreeTransform<Derived>::TransformNoInitExpr( 11893 NoInitExpr *E) { 11894 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11895 return ExprError(); 11896 } 11897 11898 template<typename Derived> 11899 ExprResult 11900 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11901 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11902 return ExprError(); 11903 } 11904 11905 template<typename Derived> 11906 ExprResult 11907 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11908 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11909 return ExprError(); 11910 } 11911 11912 template<typename Derived> 11913 ExprResult 11914 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11915 ImplicitValueInitExpr *E) { 11916 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11917 11918 // FIXME: Will we ever have proper type location here? Will we actually 11919 // need to transform the type? 11920 QualType T = getDerived().TransformType(E->getType()); 11921 if (T.isNull()) 11922 return ExprError(); 11923 11924 if (!getDerived().AlwaysRebuild() && 11925 T == E->getType()) 11926 return E; 11927 11928 return getDerived().RebuildImplicitValueInitExpr(T); 11929 } 11930 11931 template<typename Derived> 11932 ExprResult 11933 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11934 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11935 if (!TInfo) 11936 return ExprError(); 11937 11938 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11939 if (SubExpr.isInvalid()) 11940 return ExprError(); 11941 11942 if (!getDerived().AlwaysRebuild() && 11943 TInfo == E->getWrittenTypeInfo() && 11944 SubExpr.get() == E->getSubExpr()) 11945 return E; 11946 11947 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11948 TInfo, E->getRParenLoc()); 11949 } 11950 11951 template<typename Derived> 11952 ExprResult 11953 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11954 bool ArgumentChanged = false; 11955 SmallVector<Expr*, 4> Inits; 11956 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11957 &ArgumentChanged)) 11958 return ExprError(); 11959 11960 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11961 Inits, 11962 E->getRParenLoc()); 11963 } 11964 11965 /// Transform an address-of-label expression. 11966 /// 11967 /// By default, the transformation of an address-of-label expression always 11968 /// rebuilds the expression, so that the label identifier can be resolved to 11969 /// the corresponding label statement by semantic analysis. 11970 template<typename Derived> 11971 ExprResult 11972 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11973 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11974 E->getLabel()); 11975 if (!LD) 11976 return ExprError(); 11977 11978 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11979 cast<LabelDecl>(LD)); 11980 } 11981 11982 template<typename Derived> 11983 ExprResult 11984 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11985 SemaRef.ActOnStartStmtExpr(); 11986 StmtResult SubStmt 11987 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11988 if (SubStmt.isInvalid()) { 11989 SemaRef.ActOnStmtExprError(); 11990 return ExprError(); 11991 } 11992 11993 unsigned OldDepth = E->getTemplateDepth(); 11994 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11995 11996 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11997 SubStmt.get() == E->getSubStmt()) { 11998 // Calling this an 'error' is unintuitive, but it does the right thing. 11999 SemaRef.ActOnStmtExprError(); 12000 return SemaRef.MaybeBindToTemporary(E); 12001 } 12002 12003 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 12004 E->getRParenLoc(), NewDepth); 12005 } 12006 12007 template<typename Derived> 12008 ExprResult 12009 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 12010 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 12011 if (Cond.isInvalid()) 12012 return ExprError(); 12013 12014 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 12015 if (LHS.isInvalid()) 12016 return ExprError(); 12017 12018 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 12019 if (RHS.isInvalid()) 12020 return ExprError(); 12021 12022 if (!getDerived().AlwaysRebuild() && 12023 Cond.get() == E->getCond() && 12024 LHS.get() == E->getLHS() && 12025 RHS.get() == E->getRHS()) 12026 return E; 12027 12028 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 12029 Cond.get(), LHS.get(), RHS.get(), 12030 E->getRParenLoc()); 12031 } 12032 12033 template<typename Derived> 12034 ExprResult 12035 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 12036 return E; 12037 } 12038 12039 template<typename Derived> 12040 ExprResult 12041 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 12042 switch (E->getOperator()) { 12043 case OO_New: 12044 case OO_Delete: 12045 case OO_Array_New: 12046 case OO_Array_Delete: 12047 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 12048 12049 case OO_Subscript: 12050 case OO_Call: { 12051 // This is a call to an object's operator(). 12052 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 12053 12054 // Transform the object itself. 12055 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 12056 if (Object.isInvalid()) 12057 return ExprError(); 12058 12059 // FIXME: Poor location information 12060 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 12061 static_cast<Expr *>(Object.get())->getEndLoc()); 12062 12063 // Transform the call arguments. 12064 SmallVector<Expr*, 8> Args; 12065 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 12066 Args)) 12067 return ExprError(); 12068 12069 if (E->getOperator() == OO_Subscript) 12070 return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc, 12071 Args, E->getEndLoc()); 12072 12073 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 12074 E->getEndLoc()); 12075 } 12076 12077 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 12078 case OO_##Name: \ 12079 break; 12080 12081 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 12082 #include "clang/Basic/OperatorKinds.def" 12083 12084 case OO_Conditional: 12085 llvm_unreachable("conditional operator is not actually overloadable"); 12086 12087 case OO_None: 12088 case NUM_OVERLOADED_OPERATORS: 12089 llvm_unreachable("not an overloaded operator?"); 12090 } 12091 12092 ExprResult First; 12093 if (E->getOperator() == OO_Amp) 12094 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 12095 else 12096 First = getDerived().TransformExpr(E->getArg(0)); 12097 if (First.isInvalid()) 12098 return ExprError(); 12099 12100 ExprResult Second; 12101 if (E->getNumArgs() == 2) { 12102 Second = 12103 getDerived().TransformInitializer(E->getArg(1), /*NotCopyInit=*/false); 12104 if (Second.isInvalid()) 12105 return ExprError(); 12106 } 12107 12108 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 12109 FPOptionsOverride NewOverrides(E->getFPFeatures()); 12110 getSema().CurFPFeatures = 12111 NewOverrides.applyOverrides(getSema().getLangOpts()); 12112 getSema().FpPragmaStack.CurrentValue = NewOverrides; 12113 12114 Expr *Callee = E->getCallee(); 12115 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12116 LookupResult R(SemaRef, ULE->getName(), ULE->getNameLoc(), 12117 Sema::LookupOrdinaryName); 12118 if (getDerived().TransformOverloadExprDecls(ULE, ULE->requiresADL(), R)) 12119 return ExprError(); 12120 12121 return getDerived().RebuildCXXOperatorCallExpr( 12122 E->getOperator(), E->getOperatorLoc(), Callee->getBeginLoc(), 12123 ULE->requiresADL(), R.asUnresolvedSet(), First.get(), Second.get()); 12124 } 12125 12126 UnresolvedSet<1> Functions; 12127 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee)) 12128 Callee = ICE->getSubExprAsWritten(); 12129 NamedDecl *DR = cast<DeclRefExpr>(Callee)->getDecl(); 12130 ValueDecl *VD = cast_or_null<ValueDecl>( 12131 getDerived().TransformDecl(DR->getLocation(), DR)); 12132 if (!VD) 12133 return ExprError(); 12134 12135 if (!isa<CXXMethodDecl>(VD)) 12136 Functions.addDecl(VD); 12137 12138 return getDerived().RebuildCXXOperatorCallExpr( 12139 E->getOperator(), E->getOperatorLoc(), Callee->getBeginLoc(), 12140 /*RequiresADL=*/false, Functions, First.get(), Second.get()); 12141 } 12142 12143 template<typename Derived> 12144 ExprResult 12145 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 12146 return getDerived().TransformCallExpr(E); 12147 } 12148 12149 template <typename Derived> 12150 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 12151 bool NeedRebuildFunc = E->getIdentKind() == SourceLocIdentKind::Function && 12152 getSema().CurContext != E->getParentContext(); 12153 12154 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 12155 return E; 12156 12157 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(), 12158 E->getBeginLoc(), E->getEndLoc(), 12159 getSema().CurContext); 12160 } 12161 12162 template<typename Derived> 12163 ExprResult 12164 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 12165 // Transform the callee. 12166 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 12167 if (Callee.isInvalid()) 12168 return ExprError(); 12169 12170 // Transform exec config. 12171 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 12172 if (EC.isInvalid()) 12173 return ExprError(); 12174 12175 // Transform arguments. 12176 bool ArgChanged = false; 12177 SmallVector<Expr*, 8> Args; 12178 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12179 &ArgChanged)) 12180 return ExprError(); 12181 12182 if (!getDerived().AlwaysRebuild() && 12183 Callee.get() == E->getCallee() && 12184 !ArgChanged) 12185 return SemaRef.MaybeBindToTemporary(E); 12186 12187 // FIXME: Wrong source location information for the '('. 12188 SourceLocation FakeLParenLoc 12189 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 12190 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 12191 Args, 12192 E->getRParenLoc(), EC.get()); 12193 } 12194 12195 template<typename Derived> 12196 ExprResult 12197 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 12198 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 12199 if (!Type) 12200 return ExprError(); 12201 12202 ExprResult SubExpr 12203 = getDerived().TransformExpr(E->getSubExprAsWritten()); 12204 if (SubExpr.isInvalid()) 12205 return ExprError(); 12206 12207 if (!getDerived().AlwaysRebuild() && 12208 Type == E->getTypeInfoAsWritten() && 12209 SubExpr.get() == E->getSubExpr()) 12210 return E; 12211 return getDerived().RebuildCXXNamedCastExpr( 12212 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 12213 Type, E->getAngleBrackets().getEnd(), 12214 // FIXME. this should be '(' location 12215 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 12216 } 12217 12218 template<typename Derived> 12219 ExprResult 12220 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 12221 TypeSourceInfo *TSI = 12222 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 12223 if (!TSI) 12224 return ExprError(); 12225 12226 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 12227 if (Sub.isInvalid()) 12228 return ExprError(); 12229 12230 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 12231 Sub.get(), BCE->getEndLoc()); 12232 } 12233 12234 template<typename Derived> 12235 ExprResult 12236 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 12237 return getDerived().TransformCXXNamedCastExpr(E); 12238 } 12239 12240 template<typename Derived> 12241 ExprResult 12242 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 12243 return getDerived().TransformCXXNamedCastExpr(E); 12244 } 12245 12246 template<typename Derived> 12247 ExprResult 12248 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 12249 CXXReinterpretCastExpr *E) { 12250 return getDerived().TransformCXXNamedCastExpr(E); 12251 } 12252 12253 template<typename Derived> 12254 ExprResult 12255 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 12256 return getDerived().TransformCXXNamedCastExpr(E); 12257 } 12258 12259 template<typename Derived> 12260 ExprResult 12261 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 12262 return getDerived().TransformCXXNamedCastExpr(E); 12263 } 12264 12265 template<typename Derived> 12266 ExprResult 12267 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 12268 CXXFunctionalCastExpr *E) { 12269 TypeSourceInfo *Type = 12270 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 12271 if (!Type) 12272 return ExprError(); 12273 12274 ExprResult SubExpr 12275 = getDerived().TransformExpr(E->getSubExprAsWritten()); 12276 if (SubExpr.isInvalid()) 12277 return ExprError(); 12278 12279 if (!getDerived().AlwaysRebuild() && 12280 Type == E->getTypeInfoAsWritten() && 12281 SubExpr.get() == E->getSubExpr()) 12282 return E; 12283 12284 return getDerived().RebuildCXXFunctionalCastExpr(Type, 12285 E->getLParenLoc(), 12286 SubExpr.get(), 12287 E->getRParenLoc(), 12288 E->isListInitialization()); 12289 } 12290 12291 template<typename Derived> 12292 ExprResult 12293 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 12294 if (E->isTypeOperand()) { 12295 TypeSourceInfo *TInfo 12296 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 12297 if (!TInfo) 12298 return ExprError(); 12299 12300 if (!getDerived().AlwaysRebuild() && 12301 TInfo == E->getTypeOperandSourceInfo()) 12302 return E; 12303 12304 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 12305 TInfo, E->getEndLoc()); 12306 } 12307 12308 // Typeid's operand is an unevaluated context, unless it's a polymorphic 12309 // type. We must not unilaterally enter unevaluated context here, as then 12310 // semantic processing can re-transform an already transformed operand. 12311 Expr *Op = E->getExprOperand(); 12312 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 12313 if (E->isGLValue()) 12314 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 12315 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 12316 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 12317 12318 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 12319 Sema::ReuseLambdaContextDecl); 12320 12321 ExprResult SubExpr = getDerived().TransformExpr(Op); 12322 if (SubExpr.isInvalid()) 12323 return ExprError(); 12324 12325 if (!getDerived().AlwaysRebuild() && 12326 SubExpr.get() == E->getExprOperand()) 12327 return E; 12328 12329 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 12330 SubExpr.get(), E->getEndLoc()); 12331 } 12332 12333 template<typename Derived> 12334 ExprResult 12335 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 12336 if (E->isTypeOperand()) { 12337 TypeSourceInfo *TInfo 12338 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 12339 if (!TInfo) 12340 return ExprError(); 12341 12342 if (!getDerived().AlwaysRebuild() && 12343 TInfo == E->getTypeOperandSourceInfo()) 12344 return E; 12345 12346 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 12347 TInfo, E->getEndLoc()); 12348 } 12349 12350 EnterExpressionEvaluationContext Unevaluated( 12351 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12352 12353 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 12354 if (SubExpr.isInvalid()) 12355 return ExprError(); 12356 12357 if (!getDerived().AlwaysRebuild() && 12358 SubExpr.get() == E->getExprOperand()) 12359 return E; 12360 12361 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 12362 SubExpr.get(), E->getEndLoc()); 12363 } 12364 12365 template<typename Derived> 12366 ExprResult 12367 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 12368 return E; 12369 } 12370 12371 template<typename Derived> 12372 ExprResult 12373 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 12374 CXXNullPtrLiteralExpr *E) { 12375 return E; 12376 } 12377 12378 template<typename Derived> 12379 ExprResult 12380 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 12381 12382 // In lambdas, the qualifiers of the type depends of where in 12383 // the call operator `this` appear, and we do not have a good way to 12384 // rebuild this information, so we transform the type. 12385 // 12386 // In other contexts, the type of `this` may be overrided 12387 // for type deduction, so we need to recompute it. 12388 QualType T = getSema().getCurLambda() ? 12389 getDerived().TransformType(E->getType()) 12390 : getSema().getCurrentThisType(); 12391 12392 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 12393 // Mark it referenced in the new context regardless. 12394 // FIXME: this is a bit instantiation-specific. 12395 getSema().MarkThisReferenced(E); 12396 return E; 12397 } 12398 12399 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 12400 } 12401 12402 template<typename Derived> 12403 ExprResult 12404 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 12405 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 12406 if (SubExpr.isInvalid()) 12407 return ExprError(); 12408 12409 if (!getDerived().AlwaysRebuild() && 12410 SubExpr.get() == E->getSubExpr()) 12411 return E; 12412 12413 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 12414 E->isThrownVariableInScope()); 12415 } 12416 12417 template<typename Derived> 12418 ExprResult 12419 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 12420 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 12421 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 12422 if (!Param) 12423 return ExprError(); 12424 12425 ExprResult InitRes; 12426 if (E->hasRewrittenInit()) { 12427 InitRes = getDerived().TransformExpr(E->getRewrittenExpr()); 12428 if (InitRes.isInvalid()) 12429 return ExprError(); 12430 } 12431 12432 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 12433 E->getUsedContext() == SemaRef.CurContext && 12434 InitRes.get() == E->getRewrittenExpr()) 12435 return E; 12436 12437 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param, 12438 InitRes.get()); 12439 } 12440 12441 template<typename Derived> 12442 ExprResult 12443 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 12444 FieldDecl *Field = cast_or_null<FieldDecl>( 12445 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 12446 if (!Field) 12447 return ExprError(); 12448 12449 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 12450 E->getUsedContext() == SemaRef.CurContext) 12451 return E; 12452 12453 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 12454 } 12455 12456 template<typename Derived> 12457 ExprResult 12458 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 12459 CXXScalarValueInitExpr *E) { 12460 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 12461 if (!T) 12462 return ExprError(); 12463 12464 if (!getDerived().AlwaysRebuild() && 12465 T == E->getTypeSourceInfo()) 12466 return E; 12467 12468 return getDerived().RebuildCXXScalarValueInitExpr(T, 12469 /*FIXME:*/T->getTypeLoc().getEndLoc(), 12470 E->getRParenLoc()); 12471 } 12472 12473 template<typename Derived> 12474 ExprResult 12475 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 12476 // Transform the type that we're allocating 12477 TypeSourceInfo *AllocTypeInfo = 12478 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 12479 if (!AllocTypeInfo) 12480 return ExprError(); 12481 12482 // Transform the size of the array we're allocating (if any). 12483 std::optional<Expr *> ArraySize; 12484 if (E->isArray()) { 12485 ExprResult NewArraySize; 12486 if (std::optional<Expr *> OldArraySize = E->getArraySize()) { 12487 NewArraySize = getDerived().TransformExpr(*OldArraySize); 12488 if (NewArraySize.isInvalid()) 12489 return ExprError(); 12490 } 12491 ArraySize = NewArraySize.get(); 12492 } 12493 12494 // Transform the placement arguments (if any). 12495 bool ArgumentChanged = false; 12496 SmallVector<Expr*, 8> PlacementArgs; 12497 if (getDerived().TransformExprs(E->getPlacementArgs(), 12498 E->getNumPlacementArgs(), true, 12499 PlacementArgs, &ArgumentChanged)) 12500 return ExprError(); 12501 12502 // Transform the initializer (if any). 12503 Expr *OldInit = E->getInitializer(); 12504 ExprResult NewInit; 12505 if (OldInit) 12506 NewInit = getDerived().TransformInitializer(OldInit, true); 12507 if (NewInit.isInvalid()) 12508 return ExprError(); 12509 12510 // Transform new operator and delete operator. 12511 FunctionDecl *OperatorNew = nullptr; 12512 if (E->getOperatorNew()) { 12513 OperatorNew = cast_or_null<FunctionDecl>( 12514 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 12515 if (!OperatorNew) 12516 return ExprError(); 12517 } 12518 12519 FunctionDecl *OperatorDelete = nullptr; 12520 if (E->getOperatorDelete()) { 12521 OperatorDelete = cast_or_null<FunctionDecl>( 12522 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12523 if (!OperatorDelete) 12524 return ExprError(); 12525 } 12526 12527 if (!getDerived().AlwaysRebuild() && 12528 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 12529 ArraySize == E->getArraySize() && 12530 NewInit.get() == OldInit && 12531 OperatorNew == E->getOperatorNew() && 12532 OperatorDelete == E->getOperatorDelete() && 12533 !ArgumentChanged) { 12534 // Mark any declarations we need as referenced. 12535 // FIXME: instantiation-specific. 12536 if (OperatorNew) 12537 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 12538 if (OperatorDelete) 12539 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12540 12541 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 12542 QualType ElementType 12543 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 12544 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 12545 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 12546 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 12547 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 12548 } 12549 } 12550 } 12551 12552 return E; 12553 } 12554 12555 QualType AllocType = AllocTypeInfo->getType(); 12556 if (!ArraySize) { 12557 // If no array size was specified, but the new expression was 12558 // instantiated with an array type (e.g., "new T" where T is 12559 // instantiated with "int[4]"), extract the outer bound from the 12560 // array type as our array size. We do this with constant and 12561 // dependently-sized array types. 12562 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 12563 if (!ArrayT) { 12564 // Do nothing 12565 } else if (const ConstantArrayType *ConsArrayT 12566 = dyn_cast<ConstantArrayType>(ArrayT)) { 12567 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 12568 SemaRef.Context.getSizeType(), 12569 /*FIXME:*/ E->getBeginLoc()); 12570 AllocType = ConsArrayT->getElementType(); 12571 } else if (const DependentSizedArrayType *DepArrayT 12572 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 12573 if (DepArrayT->getSizeExpr()) { 12574 ArraySize = DepArrayT->getSizeExpr(); 12575 AllocType = DepArrayT->getElementType(); 12576 } 12577 } 12578 } 12579 12580 return getDerived().RebuildCXXNewExpr( 12581 E->getBeginLoc(), E->isGlobalNew(), 12582 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 12583 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 12584 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 12585 } 12586 12587 template<typename Derived> 12588 ExprResult 12589 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 12590 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 12591 if (Operand.isInvalid()) 12592 return ExprError(); 12593 12594 // Transform the delete operator, if known. 12595 FunctionDecl *OperatorDelete = nullptr; 12596 if (E->getOperatorDelete()) { 12597 OperatorDelete = cast_or_null<FunctionDecl>( 12598 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12599 if (!OperatorDelete) 12600 return ExprError(); 12601 } 12602 12603 if (!getDerived().AlwaysRebuild() && 12604 Operand.get() == E->getArgument() && 12605 OperatorDelete == E->getOperatorDelete()) { 12606 // Mark any declarations we need as referenced. 12607 // FIXME: instantiation-specific. 12608 if (OperatorDelete) 12609 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12610 12611 if (!E->getArgument()->isTypeDependent()) { 12612 QualType Destroyed = SemaRef.Context.getBaseElementType( 12613 E->getDestroyedType()); 12614 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12615 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12616 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12617 SemaRef.LookupDestructor(Record)); 12618 } 12619 } 12620 12621 return E; 12622 } 12623 12624 return getDerived().RebuildCXXDeleteExpr( 12625 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12626 } 12627 12628 template<typename Derived> 12629 ExprResult 12630 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12631 CXXPseudoDestructorExpr *E) { 12632 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12633 if (Base.isInvalid()) 12634 return ExprError(); 12635 12636 ParsedType ObjectTypePtr; 12637 bool MayBePseudoDestructor = false; 12638 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12639 E->getOperatorLoc(), 12640 E->isArrow()? tok::arrow : tok::period, 12641 ObjectTypePtr, 12642 MayBePseudoDestructor); 12643 if (Base.isInvalid()) 12644 return ExprError(); 12645 12646 QualType ObjectType = ObjectTypePtr.get(); 12647 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12648 if (QualifierLoc) { 12649 QualifierLoc 12650 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12651 if (!QualifierLoc) 12652 return ExprError(); 12653 } 12654 CXXScopeSpec SS; 12655 SS.Adopt(QualifierLoc); 12656 12657 PseudoDestructorTypeStorage Destroyed; 12658 if (E->getDestroyedTypeInfo()) { 12659 TypeSourceInfo *DestroyedTypeInfo 12660 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12661 ObjectType, nullptr, SS); 12662 if (!DestroyedTypeInfo) 12663 return ExprError(); 12664 Destroyed = DestroyedTypeInfo; 12665 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12666 // We aren't likely to be able to resolve the identifier down to a type 12667 // now anyway, so just retain the identifier. 12668 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12669 E->getDestroyedTypeLoc()); 12670 } else { 12671 // Look for a destructor known with the given name. 12672 ParsedType T = SemaRef.getDestructorName( 12673 *E->getDestroyedTypeIdentifier(), E->getDestroyedTypeLoc(), 12674 /*Scope=*/nullptr, SS, ObjectTypePtr, false); 12675 if (!T) 12676 return ExprError(); 12677 12678 Destroyed 12679 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12680 E->getDestroyedTypeLoc()); 12681 } 12682 12683 TypeSourceInfo *ScopeTypeInfo = nullptr; 12684 if (E->getScopeTypeInfo()) { 12685 CXXScopeSpec EmptySS; 12686 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12687 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12688 if (!ScopeTypeInfo) 12689 return ExprError(); 12690 } 12691 12692 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12693 E->getOperatorLoc(), 12694 E->isArrow(), 12695 SS, 12696 ScopeTypeInfo, 12697 E->getColonColonLoc(), 12698 E->getTildeLoc(), 12699 Destroyed); 12700 } 12701 12702 template <typename Derived> 12703 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12704 bool RequiresADL, 12705 LookupResult &R) { 12706 // Transform all the decls. 12707 bool AllEmptyPacks = true; 12708 for (auto *OldD : Old->decls()) { 12709 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12710 if (!InstD) { 12711 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12712 // This can happen because of dependent hiding. 12713 if (isa<UsingShadowDecl>(OldD)) 12714 continue; 12715 else { 12716 R.clear(); 12717 return true; 12718 } 12719 } 12720 12721 // Expand using pack declarations. 12722 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12723 ArrayRef<NamedDecl*> Decls = SingleDecl; 12724 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12725 Decls = UPD->expansions(); 12726 12727 // Expand using declarations. 12728 for (auto *D : Decls) { 12729 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12730 for (auto *SD : UD->shadows()) 12731 R.addDecl(SD); 12732 } else { 12733 R.addDecl(D); 12734 } 12735 } 12736 12737 AllEmptyPacks &= Decls.empty(); 12738 }; 12739 12740 // C++ [temp.res]/8.4.2: 12741 // The program is ill-formed, no diagnostic required, if [...] lookup for 12742 // a name in the template definition found a using-declaration, but the 12743 // lookup in the corresponding scope in the instantiation odoes not find 12744 // any declarations because the using-declaration was a pack expansion and 12745 // the corresponding pack is empty 12746 if (AllEmptyPacks && !RequiresADL) { 12747 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12748 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12749 return true; 12750 } 12751 12752 // Resolve a kind, but don't do any further analysis. If it's 12753 // ambiguous, the callee needs to deal with it. 12754 R.resolveKind(); 12755 return false; 12756 } 12757 12758 template<typename Derived> 12759 ExprResult 12760 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12761 UnresolvedLookupExpr *Old) { 12762 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12763 Sema::LookupOrdinaryName); 12764 12765 // Transform the declaration set. 12766 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12767 return ExprError(); 12768 12769 // Rebuild the nested-name qualifier, if present. 12770 CXXScopeSpec SS; 12771 if (Old->getQualifierLoc()) { 12772 NestedNameSpecifierLoc QualifierLoc 12773 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12774 if (!QualifierLoc) 12775 return ExprError(); 12776 12777 SS.Adopt(QualifierLoc); 12778 } 12779 12780 if (Old->getNamingClass()) { 12781 CXXRecordDecl *NamingClass 12782 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12783 Old->getNameLoc(), 12784 Old->getNamingClass())); 12785 if (!NamingClass) { 12786 R.clear(); 12787 return ExprError(); 12788 } 12789 12790 R.setNamingClass(NamingClass); 12791 } 12792 12793 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12794 12795 // If we have neither explicit template arguments, nor the template keyword, 12796 // it's a normal declaration name or member reference. 12797 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12798 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12799 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12800 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12801 // give a good diagnostic. 12802 if (D && D->isCXXInstanceMember()) { 12803 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12804 /*TemplateArgs=*/nullptr, 12805 /*Scope=*/nullptr); 12806 } 12807 12808 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12809 } 12810 12811 // If we have template arguments, rebuild them, then rebuild the 12812 // templateid expression. 12813 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12814 if (Old->hasExplicitTemplateArgs() && 12815 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12816 Old->getNumTemplateArgs(), 12817 TransArgs)) { 12818 R.clear(); 12819 return ExprError(); 12820 } 12821 12822 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12823 Old->requiresADL(), &TransArgs); 12824 } 12825 12826 template<typename Derived> 12827 ExprResult 12828 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12829 bool ArgChanged = false; 12830 SmallVector<TypeSourceInfo *, 4> Args; 12831 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12832 TypeSourceInfo *From = E->getArg(I); 12833 TypeLoc FromTL = From->getTypeLoc(); 12834 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12835 TypeLocBuilder TLB; 12836 TLB.reserve(FromTL.getFullDataSize()); 12837 QualType To = getDerived().TransformType(TLB, FromTL); 12838 if (To.isNull()) 12839 return ExprError(); 12840 12841 if (To == From->getType()) 12842 Args.push_back(From); 12843 else { 12844 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12845 ArgChanged = true; 12846 } 12847 continue; 12848 } 12849 12850 ArgChanged = true; 12851 12852 // We have a pack expansion. Instantiate it. 12853 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12854 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12855 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12856 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12857 12858 // Determine whether the set of unexpanded parameter packs can and should 12859 // be expanded. 12860 bool Expand = true; 12861 bool RetainExpansion = false; 12862 std::optional<unsigned> OrigNumExpansions = 12863 ExpansionTL.getTypePtr()->getNumExpansions(); 12864 std::optional<unsigned> NumExpansions = OrigNumExpansions; 12865 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12866 PatternTL.getSourceRange(), 12867 Unexpanded, 12868 Expand, RetainExpansion, 12869 NumExpansions)) 12870 return ExprError(); 12871 12872 if (!Expand) { 12873 // The transform has determined that we should perform a simple 12874 // transformation on the pack expansion, producing another pack 12875 // expansion. 12876 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12877 12878 TypeLocBuilder TLB; 12879 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12880 12881 QualType To = getDerived().TransformType(TLB, PatternTL); 12882 if (To.isNull()) 12883 return ExprError(); 12884 12885 To = getDerived().RebuildPackExpansionType(To, 12886 PatternTL.getSourceRange(), 12887 ExpansionTL.getEllipsisLoc(), 12888 NumExpansions); 12889 if (To.isNull()) 12890 return ExprError(); 12891 12892 PackExpansionTypeLoc ToExpansionTL 12893 = TLB.push<PackExpansionTypeLoc>(To); 12894 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12895 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12896 continue; 12897 } 12898 12899 // Expand the pack expansion by substituting for each argument in the 12900 // pack(s). 12901 for (unsigned I = 0; I != *NumExpansions; ++I) { 12902 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12903 TypeLocBuilder TLB; 12904 TLB.reserve(PatternTL.getFullDataSize()); 12905 QualType To = getDerived().TransformType(TLB, PatternTL); 12906 if (To.isNull()) 12907 return ExprError(); 12908 12909 if (To->containsUnexpandedParameterPack()) { 12910 To = getDerived().RebuildPackExpansionType(To, 12911 PatternTL.getSourceRange(), 12912 ExpansionTL.getEllipsisLoc(), 12913 NumExpansions); 12914 if (To.isNull()) 12915 return ExprError(); 12916 12917 PackExpansionTypeLoc ToExpansionTL 12918 = TLB.push<PackExpansionTypeLoc>(To); 12919 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12920 } 12921 12922 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12923 } 12924 12925 if (!RetainExpansion) 12926 continue; 12927 12928 // If we're supposed to retain a pack expansion, do so by temporarily 12929 // forgetting the partially-substituted parameter pack. 12930 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12931 12932 TypeLocBuilder TLB; 12933 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12934 12935 QualType To = getDerived().TransformType(TLB, PatternTL); 12936 if (To.isNull()) 12937 return ExprError(); 12938 12939 To = getDerived().RebuildPackExpansionType(To, 12940 PatternTL.getSourceRange(), 12941 ExpansionTL.getEllipsisLoc(), 12942 NumExpansions); 12943 if (To.isNull()) 12944 return ExprError(); 12945 12946 PackExpansionTypeLoc ToExpansionTL 12947 = TLB.push<PackExpansionTypeLoc>(To); 12948 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12949 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12950 } 12951 12952 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12953 return E; 12954 12955 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12956 E->getEndLoc()); 12957 } 12958 12959 template<typename Derived> 12960 ExprResult 12961 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12962 ConceptSpecializationExpr *E) { 12963 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12964 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12965 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12966 Old->NumTemplateArgs, TransArgs)) 12967 return ExprError(); 12968 12969 return getDerived().RebuildConceptSpecializationExpr( 12970 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12971 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12972 &TransArgs); 12973 } 12974 12975 template<typename Derived> 12976 ExprResult 12977 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12978 SmallVector<ParmVarDecl*, 4> TransParams; 12979 SmallVector<QualType, 4> TransParamTypes; 12980 Sema::ExtParameterInfoBuilder ExtParamInfos; 12981 12982 // C++2a [expr.prim.req]p2 12983 // Expressions appearing within a requirement-body are unevaluated operands. 12984 EnterExpressionEvaluationContext Ctx( 12985 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 12986 Sema::ReuseLambdaContextDecl); 12987 12988 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12989 getSema().Context, getSema().CurContext, 12990 E->getBody()->getBeginLoc()); 12991 12992 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12993 12994 ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams( 12995 E->getRequiresKWLoc(), E->getRBraceLoc(), E, Body, 12996 E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos); 12997 12998 for (ParmVarDecl *Param : TransParams) 12999 if (Param) 13000 Param->setDeclContext(Body); 13001 13002 // On failure to transform, TransformRequiresTypeParams returns an expression 13003 // in the event that the transformation of the type params failed in some way. 13004 // It is expected that this will result in a 'not satisfied' Requires clause 13005 // when instantiating. 13006 if (!TypeParamResult.isUnset()) 13007 return TypeParamResult; 13008 13009 SmallVector<concepts::Requirement *, 4> TransReqs; 13010 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 13011 TransReqs)) 13012 return ExprError(); 13013 13014 for (concepts::Requirement *Req : TransReqs) { 13015 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 13016 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 13017 ER->getReturnTypeRequirement() 13018 .getTypeConstraintTemplateParameterList()->getParam(0) 13019 ->setDeclContext(Body); 13020 } 13021 } 13022 } 13023 13024 return getDerived().RebuildRequiresExpr( 13025 E->getRequiresKWLoc(), Body, E->getLParenLoc(), TransParams, 13026 E->getRParenLoc(), TransReqs, E->getRBraceLoc()); 13027 } 13028 13029 template<typename Derived> 13030 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 13031 ArrayRef<concepts::Requirement *> Reqs, 13032 SmallVectorImpl<concepts::Requirement *> &Transformed) { 13033 for (concepts::Requirement *Req : Reqs) { 13034 concepts::Requirement *TransReq = nullptr; 13035 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 13036 TransReq = getDerived().TransformTypeRequirement(TypeReq); 13037 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 13038 TransReq = getDerived().TransformExprRequirement(ExprReq); 13039 else 13040 TransReq = getDerived().TransformNestedRequirement( 13041 cast<concepts::NestedRequirement>(Req)); 13042 if (!TransReq) 13043 return true; 13044 Transformed.push_back(TransReq); 13045 } 13046 return false; 13047 } 13048 13049 template<typename Derived> 13050 concepts::TypeRequirement * 13051 TreeTransform<Derived>::TransformTypeRequirement( 13052 concepts::TypeRequirement *Req) { 13053 if (Req->isSubstitutionFailure()) { 13054 if (getDerived().AlwaysRebuild()) 13055 return getDerived().RebuildTypeRequirement( 13056 Req->getSubstitutionDiagnostic()); 13057 return Req; 13058 } 13059 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 13060 if (!TransType) 13061 return nullptr; 13062 return getDerived().RebuildTypeRequirement(TransType); 13063 } 13064 13065 template<typename Derived> 13066 concepts::ExprRequirement * 13067 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 13068 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 13069 if (Req->isExprSubstitutionFailure()) 13070 TransExpr = Req->getExprSubstitutionDiagnostic(); 13071 else { 13072 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 13073 if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType()) 13074 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get()); 13075 if (TransExprRes.isInvalid()) 13076 return nullptr; 13077 TransExpr = TransExprRes.get(); 13078 } 13079 13080 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 13081 const auto &RetReq = Req->getReturnTypeRequirement(); 13082 if (RetReq.isEmpty()) 13083 TransRetReq.emplace(); 13084 else if (RetReq.isSubstitutionFailure()) 13085 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 13086 else if (RetReq.isTypeConstraint()) { 13087 TemplateParameterList *OrigTPL = 13088 RetReq.getTypeConstraintTemplateParameterList(); 13089 TemplateParameterList *TPL = 13090 getDerived().TransformTemplateParameterList(OrigTPL); 13091 if (!TPL) 13092 return nullptr; 13093 TransRetReq.emplace(TPL); 13094 } 13095 assert(TransRetReq && "All code paths leading here must set TransRetReq"); 13096 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 13097 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 13098 Req->getNoexceptLoc(), 13099 std::move(*TransRetReq)); 13100 return getDerived().RebuildExprRequirement( 13101 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 13102 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 13103 } 13104 13105 template<typename Derived> 13106 concepts::NestedRequirement * 13107 TreeTransform<Derived>::TransformNestedRequirement( 13108 concepts::NestedRequirement *Req) { 13109 if (Req->hasInvalidConstraint()) { 13110 if (getDerived().AlwaysRebuild()) 13111 return getDerived().RebuildNestedRequirement( 13112 Req->getInvalidConstraintEntity(), Req->getConstraintSatisfaction()); 13113 return Req; 13114 } 13115 ExprResult TransConstraint = 13116 getDerived().TransformExpr(Req->getConstraintExpr()); 13117 if (TransConstraint.isInvalid()) 13118 return nullptr; 13119 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 13120 } 13121 13122 template<typename Derived> 13123 ExprResult 13124 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 13125 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 13126 if (!T) 13127 return ExprError(); 13128 13129 if (!getDerived().AlwaysRebuild() && 13130 T == E->getQueriedTypeSourceInfo()) 13131 return E; 13132 13133 ExprResult SubExpr; 13134 { 13135 EnterExpressionEvaluationContext Unevaluated( 13136 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13137 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 13138 if (SubExpr.isInvalid()) 13139 return ExprError(); 13140 13141 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 13142 return E; 13143 } 13144 13145 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 13146 SubExpr.get(), E->getEndLoc()); 13147 } 13148 13149 template<typename Derived> 13150 ExprResult 13151 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 13152 ExprResult SubExpr; 13153 { 13154 EnterExpressionEvaluationContext Unevaluated( 13155 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13156 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 13157 if (SubExpr.isInvalid()) 13158 return ExprError(); 13159 13160 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 13161 return E; 13162 } 13163 13164 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 13165 SubExpr.get(), E->getEndLoc()); 13166 } 13167 13168 template <typename Derived> 13169 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 13170 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 13171 TypeSourceInfo **RecoveryTSI) { 13172 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 13173 DRE, AddrTaken, RecoveryTSI); 13174 13175 // Propagate both errors and recovered types, which return ExprEmpty. 13176 if (!NewDRE.isUsable()) 13177 return NewDRE; 13178 13179 // We got an expr, wrap it up in parens. 13180 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 13181 return PE; 13182 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 13183 PE->getRParen()); 13184 } 13185 13186 template <typename Derived> 13187 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 13188 DependentScopeDeclRefExpr *E) { 13189 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 13190 nullptr); 13191 } 13192 13193 template <typename Derived> 13194 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 13195 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 13196 TypeSourceInfo **RecoveryTSI) { 13197 assert(E->getQualifierLoc()); 13198 NestedNameSpecifierLoc QualifierLoc = 13199 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 13200 if (!QualifierLoc) 13201 return ExprError(); 13202 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13203 13204 // TODO: If this is a conversion-function-id, verify that the 13205 // destination type name (if present) resolves the same way after 13206 // instantiation as it did in the local scope. 13207 13208 DeclarationNameInfo NameInfo = 13209 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 13210 if (!NameInfo.getName()) 13211 return ExprError(); 13212 13213 if (!E->hasExplicitTemplateArgs()) { 13214 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 13215 // Note: it is sufficient to compare the Name component of NameInfo: 13216 // if name has not changed, DNLoc has not changed either. 13217 NameInfo.getName() == E->getDeclName()) 13218 return E; 13219 13220 return getDerived().RebuildDependentScopeDeclRefExpr( 13221 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 13222 IsAddressOfOperand, RecoveryTSI); 13223 } 13224 13225 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13226 if (getDerived().TransformTemplateArguments( 13227 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 13228 return ExprError(); 13229 13230 return getDerived().RebuildDependentScopeDeclRefExpr( 13231 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 13232 RecoveryTSI); 13233 } 13234 13235 template<typename Derived> 13236 ExprResult 13237 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 13238 // CXXConstructExprs other than for list-initialization and 13239 // CXXTemporaryObjectExpr are always implicit, so when we have 13240 // a 1-argument construction we just transform that argument. 13241 if (getDerived().AllowSkippingCXXConstructExpr() && 13242 ((E->getNumArgs() == 1 || 13243 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 13244 (!getDerived().DropCallArgument(E->getArg(0))) && 13245 !E->isListInitialization())) 13246 return getDerived().TransformInitializer(E->getArg(0), 13247 /*DirectInit*/ false); 13248 13249 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 13250 13251 QualType T = getDerived().TransformType(E->getType()); 13252 if (T.isNull()) 13253 return ExprError(); 13254 13255 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13256 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13257 if (!Constructor) 13258 return ExprError(); 13259 13260 bool ArgumentChanged = false; 13261 SmallVector<Expr*, 8> Args; 13262 { 13263 EnterExpressionEvaluationContext Context( 13264 getSema(), EnterExpressionEvaluationContext::InitList, 13265 E->isListInitialization()); 13266 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 13267 &ArgumentChanged)) 13268 return ExprError(); 13269 } 13270 13271 if (!getDerived().AlwaysRebuild() && 13272 T == E->getType() && 13273 Constructor == E->getConstructor() && 13274 !ArgumentChanged) { 13275 // Mark the constructor as referenced. 13276 // FIXME: Instantiation-specific 13277 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13278 return E; 13279 } 13280 13281 return getDerived().RebuildCXXConstructExpr( 13282 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 13283 E->hadMultipleCandidates(), E->isListInitialization(), 13284 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 13285 E->getConstructionKind(), E->getParenOrBraceRange()); 13286 } 13287 13288 template<typename Derived> 13289 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 13290 CXXInheritedCtorInitExpr *E) { 13291 QualType T = getDerived().TransformType(E->getType()); 13292 if (T.isNull()) 13293 return ExprError(); 13294 13295 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13296 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13297 if (!Constructor) 13298 return ExprError(); 13299 13300 if (!getDerived().AlwaysRebuild() && 13301 T == E->getType() && 13302 Constructor == E->getConstructor()) { 13303 // Mark the constructor as referenced. 13304 // FIXME: Instantiation-specific 13305 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13306 return E; 13307 } 13308 13309 return getDerived().RebuildCXXInheritedCtorInitExpr( 13310 T, E->getLocation(), Constructor, 13311 E->constructsVBase(), E->inheritedFromVBase()); 13312 } 13313 13314 /// Transform a C++ temporary-binding expression. 13315 /// 13316 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 13317 /// transform the subexpression and return that. 13318 template<typename Derived> 13319 ExprResult 13320 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 13321 if (auto *Dtor = E->getTemporary()->getDestructor()) 13322 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 13323 const_cast<CXXDestructorDecl *>(Dtor)); 13324 return getDerived().TransformExpr(E->getSubExpr()); 13325 } 13326 13327 /// Transform a C++ expression that contains cleanups that should 13328 /// be run after the expression is evaluated. 13329 /// 13330 /// Since ExprWithCleanups nodes are implicitly generated, we 13331 /// just transform the subexpression and return that. 13332 template<typename Derived> 13333 ExprResult 13334 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 13335 return getDerived().TransformExpr(E->getSubExpr()); 13336 } 13337 13338 template<typename Derived> 13339 ExprResult 13340 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 13341 CXXTemporaryObjectExpr *E) { 13342 TypeSourceInfo *T = 13343 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13344 if (!T) 13345 return ExprError(); 13346 13347 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13348 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13349 if (!Constructor) 13350 return ExprError(); 13351 13352 bool ArgumentChanged = false; 13353 SmallVector<Expr*, 8> Args; 13354 Args.reserve(E->getNumArgs()); 13355 { 13356 EnterExpressionEvaluationContext Context( 13357 getSema(), EnterExpressionEvaluationContext::InitList, 13358 E->isListInitialization()); 13359 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 13360 &ArgumentChanged)) 13361 return ExprError(); 13362 } 13363 13364 if (!getDerived().AlwaysRebuild() && 13365 T == E->getTypeSourceInfo() && 13366 Constructor == E->getConstructor() && 13367 !ArgumentChanged) { 13368 // FIXME: Instantiation-specific 13369 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13370 return SemaRef.MaybeBindToTemporary(E); 13371 } 13372 13373 // FIXME: We should just pass E->isListInitialization(), but we're not 13374 // prepared to handle list-initialization without a child InitListExpr. 13375 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 13376 return getDerived().RebuildCXXTemporaryObjectExpr( 13377 T, LParenLoc, Args, E->getEndLoc(), 13378 /*ListInitialization=*/LParenLoc.isInvalid()); 13379 } 13380 13381 template<typename Derived> 13382 ExprResult 13383 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 13384 // Transform any init-capture expressions before entering the scope of the 13385 // lambda body, because they are not semantically within that scope. 13386 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 13387 struct TransformedInitCapture { 13388 // The location of the ... if the result is retaining a pack expansion. 13389 SourceLocation EllipsisLoc; 13390 // Zero or more expansions of the init-capture. 13391 SmallVector<InitCaptureInfoTy, 4> Expansions; 13392 }; 13393 SmallVector<TransformedInitCapture, 4> InitCaptures; 13394 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 13395 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13396 CEnd = E->capture_end(); 13397 C != CEnd; ++C) { 13398 if (!E->isInitCapture(C)) 13399 continue; 13400 13401 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 13402 auto *OldVD = cast<VarDecl>(C->getCapturedVar()); 13403 13404 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 13405 std::optional<unsigned> NumExpansions) { 13406 ExprResult NewExprInitResult = getDerived().TransformInitializer( 13407 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 13408 13409 if (NewExprInitResult.isInvalid()) { 13410 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 13411 return; 13412 } 13413 Expr *NewExprInit = NewExprInitResult.get(); 13414 13415 QualType NewInitCaptureType = 13416 getSema().buildLambdaInitCaptureInitialization( 13417 C->getLocation(), C->getCaptureKind() == LCK_ByRef, 13418 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 13419 cast<VarDecl>(C->getCapturedVar())->getInitStyle() != 13420 VarDecl::CInit, 13421 NewExprInit); 13422 Result.Expansions.push_back( 13423 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 13424 }; 13425 13426 // If this is an init-capture pack, consider expanding the pack now. 13427 if (OldVD->isParameterPack()) { 13428 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 13429 ->getTypeLoc() 13430 .castAs<PackExpansionTypeLoc>(); 13431 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13432 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 13433 13434 // Determine whether the set of unexpanded parameter packs can and should 13435 // be expanded. 13436 bool Expand = true; 13437 bool RetainExpansion = false; 13438 std::optional<unsigned> OrigNumExpansions = 13439 ExpansionTL.getTypePtr()->getNumExpansions(); 13440 std::optional<unsigned> NumExpansions = OrigNumExpansions; 13441 if (getDerived().TryExpandParameterPacks( 13442 ExpansionTL.getEllipsisLoc(), 13443 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 13444 RetainExpansion, NumExpansions)) 13445 return ExprError(); 13446 if (Expand) { 13447 for (unsigned I = 0; I != *NumExpansions; ++I) { 13448 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13449 SubstInitCapture(SourceLocation(), std::nullopt); 13450 } 13451 } 13452 if (!Expand || RetainExpansion) { 13453 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13454 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 13455 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 13456 } 13457 } else { 13458 SubstInitCapture(SourceLocation(), std::nullopt); 13459 } 13460 } 13461 13462 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 13463 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 13464 13465 // Create the local class that will describe the lambda. 13466 13467 // FIXME: DependencyKind below is wrong when substituting inside a templated 13468 // context that isn't a DeclContext (such as a variable template), or when 13469 // substituting an unevaluated lambda inside of a function's parameter's type 13470 // - as parameter types are not instantiated from within a function's DC. We 13471 // use evaluation contexts to distinguish the function parameter case. 13472 CXXRecordDecl::LambdaDependencyKind DependencyKind = 13473 CXXRecordDecl::LDK_Unknown; 13474 if ((getSema().isUnevaluatedContext() || 13475 getSema().isConstantEvaluatedContext()) && 13476 (getSema().CurContext->isFileContext() || 13477 !getSema().CurContext->getParent()->isDependentContext())) 13478 DependencyKind = CXXRecordDecl::LDK_NeverDependent; 13479 13480 CXXRecordDecl *OldClass = E->getLambdaClass(); 13481 CXXRecordDecl *Class = getSema().createLambdaClosureType( 13482 E->getIntroducerRange(), /*Info=*/nullptr, DependencyKind, 13483 E->getCaptureDefault()); 13484 getDerived().transformedLocalDecl(OldClass, {Class}); 13485 13486 CXXMethodDecl *NewCallOperator = 13487 getSema().CreateLambdaCallOperator(E->getIntroducerRange(), Class); 13488 NewCallOperator->setLexicalDeclContext(getSema().CurContext); 13489 13490 // Enter the scope of the lambda. 13491 getSema().buildLambdaScope(LSI, NewCallOperator, E->getIntroducerRange(), 13492 E->getCaptureDefault(), E->getCaptureDefaultLoc(), 13493 E->hasExplicitParameters(), E->isMutable()); 13494 13495 // Introduce the context of the call operator. 13496 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 13497 /*NewThisContext*/false); 13498 13499 bool Invalid = false; 13500 13501 // Transform captures. 13502 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13503 CEnd = E->capture_end(); 13504 C != CEnd; ++C) { 13505 // When we hit the first implicit capture, tell Sema that we've finished 13506 // the list of explicit captures. 13507 if (C->isImplicit()) 13508 break; 13509 13510 // Capturing 'this' is trivial. 13511 if (C->capturesThis()) { 13512 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13513 /*BuildAndDiagnose*/ true, nullptr, 13514 C->getCaptureKind() == LCK_StarThis); 13515 continue; 13516 } 13517 // Captured expression will be recaptured during captured variables 13518 // rebuilding. 13519 if (C->capturesVLAType()) 13520 continue; 13521 13522 // Rebuild init-captures, including the implied field declaration. 13523 if (E->isInitCapture(C)) { 13524 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 13525 13526 auto *OldVD = cast<VarDecl>(C->getCapturedVar()); 13527 llvm::SmallVector<Decl*, 4> NewVDs; 13528 13529 for (InitCaptureInfoTy &Info : NewC.Expansions) { 13530 ExprResult Init = Info.first; 13531 QualType InitQualType = Info.second; 13532 if (Init.isInvalid() || InitQualType.isNull()) { 13533 Invalid = true; 13534 break; 13535 } 13536 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 13537 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 13538 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get(), 13539 getSema().CurContext); 13540 if (!NewVD) { 13541 Invalid = true; 13542 break; 13543 } 13544 NewVDs.push_back(NewVD); 13545 getSema().addInitCapture(LSI, NewVD, C->getCaptureKind() == LCK_ByRef); 13546 } 13547 13548 if (Invalid) 13549 break; 13550 13551 getDerived().transformedLocalDecl(OldVD, NewVDs); 13552 continue; 13553 } 13554 13555 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13556 13557 // Determine the capture kind for Sema. 13558 Sema::TryCaptureKind Kind 13559 = C->isImplicit()? Sema::TryCapture_Implicit 13560 : C->getCaptureKind() == LCK_ByCopy 13561 ? Sema::TryCapture_ExplicitByVal 13562 : Sema::TryCapture_ExplicitByRef; 13563 SourceLocation EllipsisLoc; 13564 if (C->isPackExpansion()) { 13565 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 13566 bool ShouldExpand = false; 13567 bool RetainExpansion = false; 13568 std::optional<unsigned> NumExpansions; 13569 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 13570 C->getLocation(), 13571 Unexpanded, 13572 ShouldExpand, RetainExpansion, 13573 NumExpansions)) { 13574 Invalid = true; 13575 continue; 13576 } 13577 13578 if (ShouldExpand) { 13579 // The transform has determined that we should perform an expansion; 13580 // transform and capture each of the arguments. 13581 // expansion of the pattern. Do so. 13582 auto *Pack = cast<VarDecl>(C->getCapturedVar()); 13583 for (unsigned I = 0; I != *NumExpansions; ++I) { 13584 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13585 VarDecl *CapturedVar 13586 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13587 Pack)); 13588 if (!CapturedVar) { 13589 Invalid = true; 13590 continue; 13591 } 13592 13593 // Capture the transformed variable. 13594 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13595 } 13596 13597 // FIXME: Retain a pack expansion if RetainExpansion is true. 13598 13599 continue; 13600 } 13601 13602 EllipsisLoc = C->getEllipsisLoc(); 13603 } 13604 13605 // Transform the captured variable. 13606 auto *CapturedVar = cast_or_null<ValueDecl>( 13607 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13608 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13609 Invalid = true; 13610 continue; 13611 } 13612 13613 // Capture the transformed variable. 13614 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13615 EllipsisLoc); 13616 } 13617 getSema().finishLambdaExplicitCaptures(LSI); 13618 13619 // Transform the template parameters, and add them to the current 13620 // instantiation scope. The null case is handled correctly. 13621 auto TPL = getDerived().TransformTemplateParameterList( 13622 E->getTemplateParameterList()); 13623 LSI->GLTemplateParameterList = TPL; 13624 if (TPL) 13625 getSema().AddTemplateParametersToLambdaCallOperator(NewCallOperator, Class, 13626 TPL); 13627 13628 // Transform the type of the original lambda's call operator. 13629 // The transformation MUST be done in the CurrentInstantiationScope since 13630 // it introduces a mapping of the original to the newly created 13631 // transformed parameters. 13632 TypeSourceInfo *NewCallOpTSI = nullptr; 13633 { 13634 auto OldCallOpTypeLoc = 13635 E->getCallOperator()->getTypeSourceInfo()->getTypeLoc(); 13636 13637 auto TransformFunctionProtoTypeLoc = 13638 [this](TypeLocBuilder &TLB, FunctionProtoTypeLoc FPTL) -> QualType { 13639 SmallVector<QualType, 4> ExceptionStorage; 13640 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 13641 return this->TransformFunctionProtoType( 13642 TLB, FPTL, nullptr, Qualifiers(), 13643 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 13644 return This->TransformExceptionSpec(FPTL.getBeginLoc(), ESI, 13645 ExceptionStorage, Changed); 13646 }); 13647 }; 13648 13649 QualType NewCallOpType; 13650 TypeLocBuilder NewCallOpTLBuilder; 13651 13652 if (auto ATL = OldCallOpTypeLoc.getAs<AttributedTypeLoc>()) { 13653 NewCallOpType = this->TransformAttributedType( 13654 NewCallOpTLBuilder, ATL, 13655 [&](TypeLocBuilder &TLB, TypeLoc TL) -> QualType { 13656 return TransformFunctionProtoTypeLoc( 13657 TLB, TL.castAs<FunctionProtoTypeLoc>()); 13658 }); 13659 } else { 13660 auto FPTL = OldCallOpTypeLoc.castAs<FunctionProtoTypeLoc>(); 13661 NewCallOpType = TransformFunctionProtoTypeLoc(NewCallOpTLBuilder, FPTL); 13662 } 13663 13664 if (NewCallOpType.isNull()) 13665 return ExprError(); 13666 NewCallOpTSI = 13667 NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType); 13668 } 13669 13670 ArrayRef<ParmVarDecl *> Params; 13671 if (auto ATL = NewCallOpTSI->getTypeLoc().getAs<AttributedTypeLoc>()) { 13672 Params = ATL.getModifiedLoc().castAs<FunctionProtoTypeLoc>().getParams(); 13673 } else { 13674 auto FPTL = NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>(); 13675 Params = FPTL.getParams(); 13676 } 13677 13678 getSema().CompleteLambdaCallOperator( 13679 NewCallOperator, E->getCallOperator()->getLocation(), 13680 E->getCallOperator()->getInnerLocStart(), 13681 E->getCallOperator()->getTrailingRequiresClause(), NewCallOpTSI, 13682 E->getCallOperator()->getConstexprKind(), 13683 E->getCallOperator()->getStorageClass(), Params, 13684 E->hasExplicitResultType()); 13685 13686 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 13687 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 13688 13689 { 13690 // Number the lambda for linkage purposes if necessary. 13691 Sema::ContextRAII ManglingContext(getSema(), Class->getDeclContext()); 13692 13693 std::optional<CXXRecordDecl::LambdaNumbering> Numbering; 13694 if (getDerived().ReplacingOriginal()) { 13695 Numbering = OldClass->getLambdaNumbering(); 13696 } 13697 13698 getSema().handleLambdaNumbering(Class, NewCallOperator, Numbering); 13699 } 13700 13701 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13702 // evaluation context even if we're not transforming the function body. 13703 getSema().PushExpressionEvaluationContext( 13704 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13705 13706 Sema::CodeSynthesisContext C; 13707 C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution; 13708 C.PointOfInstantiation = E->getBody()->getBeginLoc(); 13709 getSema().pushCodeSynthesisContext(C); 13710 13711 // Instantiate the body of the lambda expression. 13712 StmtResult Body = 13713 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13714 13715 getSema().popCodeSynthesisContext(); 13716 13717 // ActOnLambda* will pop the function scope for us. 13718 FuncScopeCleanup.disable(); 13719 13720 if (Body.isInvalid()) { 13721 SavedContext.pop(); 13722 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13723 /*IsInstantiation=*/true); 13724 return ExprError(); 13725 } 13726 13727 // Copy the LSI before ActOnFinishFunctionBody removes it. 13728 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13729 // the call operator. 13730 auto LSICopy = *LSI; 13731 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13732 /*IsInstantiation*/ true); 13733 SavedContext.pop(); 13734 13735 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13736 &LSICopy); 13737 } 13738 13739 template<typename Derived> 13740 StmtResult 13741 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13742 return TransformStmt(S); 13743 } 13744 13745 template<typename Derived> 13746 StmtResult 13747 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13748 // Transform captures. 13749 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13750 CEnd = E->capture_end(); 13751 C != CEnd; ++C) { 13752 // When we hit the first implicit capture, tell Sema that we've finished 13753 // the list of explicit captures. 13754 if (!C->isImplicit()) 13755 continue; 13756 13757 // Capturing 'this' is trivial. 13758 if (C->capturesThis()) { 13759 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13760 /*BuildAndDiagnose*/ true, nullptr, 13761 C->getCaptureKind() == LCK_StarThis); 13762 continue; 13763 } 13764 // Captured expression will be recaptured during captured variables 13765 // rebuilding. 13766 if (C->capturesVLAType()) 13767 continue; 13768 13769 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13770 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13771 13772 // Transform the captured variable. 13773 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13774 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13775 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13776 return StmtError(); 13777 13778 // Capture the transformed variable. 13779 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13780 } 13781 13782 return S; 13783 } 13784 13785 template<typename Derived> 13786 ExprResult 13787 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13788 CXXUnresolvedConstructExpr *E) { 13789 TypeSourceInfo *T = 13790 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13791 if (!T) 13792 return ExprError(); 13793 13794 bool ArgumentChanged = false; 13795 SmallVector<Expr*, 8> Args; 13796 Args.reserve(E->getNumArgs()); 13797 { 13798 EnterExpressionEvaluationContext Context( 13799 getSema(), EnterExpressionEvaluationContext::InitList, 13800 E->isListInitialization()); 13801 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13802 &ArgumentChanged)) 13803 return ExprError(); 13804 } 13805 13806 if (!getDerived().AlwaysRebuild() && 13807 T == E->getTypeSourceInfo() && 13808 !ArgumentChanged) 13809 return E; 13810 13811 // FIXME: we're faking the locations of the commas 13812 return getDerived().RebuildCXXUnresolvedConstructExpr( 13813 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13814 } 13815 13816 template<typename Derived> 13817 ExprResult 13818 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13819 CXXDependentScopeMemberExpr *E) { 13820 // Transform the base of the expression. 13821 ExprResult Base((Expr*) nullptr); 13822 Expr *OldBase; 13823 QualType BaseType; 13824 QualType ObjectType; 13825 if (!E->isImplicitAccess()) { 13826 OldBase = E->getBase(); 13827 Base = getDerived().TransformExpr(OldBase); 13828 if (Base.isInvalid()) 13829 return ExprError(); 13830 13831 // Start the member reference and compute the object's type. 13832 ParsedType ObjectTy; 13833 bool MayBePseudoDestructor = false; 13834 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13835 E->getOperatorLoc(), 13836 E->isArrow()? tok::arrow : tok::period, 13837 ObjectTy, 13838 MayBePseudoDestructor); 13839 if (Base.isInvalid()) 13840 return ExprError(); 13841 13842 ObjectType = ObjectTy.get(); 13843 BaseType = ((Expr*) Base.get())->getType(); 13844 } else { 13845 OldBase = nullptr; 13846 BaseType = getDerived().TransformType(E->getBaseType()); 13847 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13848 } 13849 13850 // Transform the first part of the nested-name-specifier that qualifies 13851 // the member name. 13852 NamedDecl *FirstQualifierInScope 13853 = getDerived().TransformFirstQualifierInScope( 13854 E->getFirstQualifierFoundInScope(), 13855 E->getQualifierLoc().getBeginLoc()); 13856 13857 NestedNameSpecifierLoc QualifierLoc; 13858 if (E->getQualifier()) { 13859 QualifierLoc 13860 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13861 ObjectType, 13862 FirstQualifierInScope); 13863 if (!QualifierLoc) 13864 return ExprError(); 13865 } 13866 13867 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13868 13869 // TODO: If this is a conversion-function-id, verify that the 13870 // destination type name (if present) resolves the same way after 13871 // instantiation as it did in the local scope. 13872 13873 DeclarationNameInfo NameInfo 13874 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13875 if (!NameInfo.getName()) 13876 return ExprError(); 13877 13878 if (!E->hasExplicitTemplateArgs()) { 13879 // This is a reference to a member without an explicitly-specified 13880 // template argument list. Optimize for this common case. 13881 if (!getDerived().AlwaysRebuild() && 13882 Base.get() == OldBase && 13883 BaseType == E->getBaseType() && 13884 QualifierLoc == E->getQualifierLoc() && 13885 NameInfo.getName() == E->getMember() && 13886 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13887 return E; 13888 13889 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13890 BaseType, 13891 E->isArrow(), 13892 E->getOperatorLoc(), 13893 QualifierLoc, 13894 TemplateKWLoc, 13895 FirstQualifierInScope, 13896 NameInfo, 13897 /*TemplateArgs*/nullptr); 13898 } 13899 13900 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13901 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13902 E->getNumTemplateArgs(), 13903 TransArgs)) 13904 return ExprError(); 13905 13906 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13907 BaseType, 13908 E->isArrow(), 13909 E->getOperatorLoc(), 13910 QualifierLoc, 13911 TemplateKWLoc, 13912 FirstQualifierInScope, 13913 NameInfo, 13914 &TransArgs); 13915 } 13916 13917 template <typename Derived> 13918 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13919 UnresolvedMemberExpr *Old) { 13920 // Transform the base of the expression. 13921 ExprResult Base((Expr *)nullptr); 13922 QualType BaseType; 13923 if (!Old->isImplicitAccess()) { 13924 Base = getDerived().TransformExpr(Old->getBase()); 13925 if (Base.isInvalid()) 13926 return ExprError(); 13927 Base = 13928 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13929 if (Base.isInvalid()) 13930 return ExprError(); 13931 BaseType = Base.get()->getType(); 13932 } else { 13933 BaseType = getDerived().TransformType(Old->getBaseType()); 13934 } 13935 13936 NestedNameSpecifierLoc QualifierLoc; 13937 if (Old->getQualifierLoc()) { 13938 QualifierLoc = 13939 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13940 if (!QualifierLoc) 13941 return ExprError(); 13942 } 13943 13944 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13945 13946 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13947 13948 // Transform the declaration set. 13949 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13950 return ExprError(); 13951 13952 // Determine the naming class. 13953 if (Old->getNamingClass()) { 13954 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13955 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13956 if (!NamingClass) 13957 return ExprError(); 13958 13959 R.setNamingClass(NamingClass); 13960 } 13961 13962 TemplateArgumentListInfo TransArgs; 13963 if (Old->hasExplicitTemplateArgs()) { 13964 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13965 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13966 if (getDerived().TransformTemplateArguments( 13967 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13968 return ExprError(); 13969 } 13970 13971 // FIXME: to do this check properly, we will need to preserve the 13972 // first-qualifier-in-scope here, just in case we had a dependent 13973 // base (and therefore couldn't do the check) and a 13974 // nested-name-qualifier (and therefore could do the lookup). 13975 NamedDecl *FirstQualifierInScope = nullptr; 13976 13977 return getDerived().RebuildUnresolvedMemberExpr( 13978 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13979 TemplateKWLoc, FirstQualifierInScope, R, 13980 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13981 } 13982 13983 template<typename Derived> 13984 ExprResult 13985 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13986 EnterExpressionEvaluationContext Unevaluated( 13987 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13988 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13989 if (SubExpr.isInvalid()) 13990 return ExprError(); 13991 13992 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13993 return E; 13994 13995 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13996 } 13997 13998 template<typename Derived> 13999 ExprResult 14000 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 14001 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 14002 if (Pattern.isInvalid()) 14003 return ExprError(); 14004 14005 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 14006 return E; 14007 14008 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 14009 E->getNumExpansions()); 14010 } 14011 14012 template<typename Derived> 14013 ExprResult 14014 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 14015 // If E is not value-dependent, then nothing will change when we transform it. 14016 // Note: This is an instantiation-centric view. 14017 if (!E->isValueDependent()) 14018 return E; 14019 14020 EnterExpressionEvaluationContext Unevaluated( 14021 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 14022 14023 ArrayRef<TemplateArgument> PackArgs; 14024 TemplateArgument ArgStorage; 14025 14026 // Find the argument list to transform. 14027 if (E->isPartiallySubstituted()) { 14028 PackArgs = E->getPartialArguments(); 14029 } else if (E->isValueDependent()) { 14030 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 14031 bool ShouldExpand = false; 14032 bool RetainExpansion = false; 14033 std::optional<unsigned> NumExpansions; 14034 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 14035 Unexpanded, 14036 ShouldExpand, RetainExpansion, 14037 NumExpansions)) 14038 return ExprError(); 14039 14040 // If we need to expand the pack, build a template argument from it and 14041 // expand that. 14042 if (ShouldExpand) { 14043 auto *Pack = E->getPack(); 14044 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 14045 ArgStorage = getSema().Context.getPackExpansionType( 14046 getSema().Context.getTypeDeclType(TTPD), std::nullopt); 14047 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 14048 ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt); 14049 } else { 14050 auto *VD = cast<ValueDecl>(Pack); 14051 ExprResult DRE = getSema().BuildDeclRefExpr( 14052 VD, VD->getType().getNonLValueExprType(getSema().Context), 14053 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 14054 E->getPackLoc()); 14055 if (DRE.isInvalid()) 14056 return ExprError(); 14057 ArgStorage = new (getSema().Context) 14058 PackExpansionExpr(getSema().Context.DependentTy, DRE.get(), 14059 E->getPackLoc(), std::nullopt); 14060 } 14061 PackArgs = ArgStorage; 14062 } 14063 } 14064 14065 // If we're not expanding the pack, just transform the decl. 14066 if (!PackArgs.size()) { 14067 auto *Pack = cast_or_null<NamedDecl>( 14068 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 14069 if (!Pack) 14070 return ExprError(); 14071 return getDerived().RebuildSizeOfPackExpr( 14072 E->getOperatorLoc(), Pack, E->getPackLoc(), E->getRParenLoc(), 14073 std::nullopt, std::nullopt); 14074 } 14075 14076 // Try to compute the result without performing a partial substitution. 14077 std::optional<unsigned> Result = 0; 14078 for (const TemplateArgument &Arg : PackArgs) { 14079 if (!Arg.isPackExpansion()) { 14080 Result = *Result + 1; 14081 continue; 14082 } 14083 14084 TemplateArgumentLoc ArgLoc; 14085 InventTemplateArgumentLoc(Arg, ArgLoc); 14086 14087 // Find the pattern of the pack expansion. 14088 SourceLocation Ellipsis; 14089 std::optional<unsigned> OrigNumExpansions; 14090 TemplateArgumentLoc Pattern = 14091 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 14092 OrigNumExpansions); 14093 14094 // Substitute under the pack expansion. Do not expand the pack (yet). 14095 TemplateArgumentLoc OutPattern; 14096 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 14097 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 14098 /*Uneval*/ true)) 14099 return true; 14100 14101 // See if we can determine the number of arguments from the result. 14102 std::optional<unsigned> NumExpansions = 14103 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 14104 if (!NumExpansions) { 14105 // No: we must be in an alias template expansion, and we're going to need 14106 // to actually expand the packs. 14107 Result = std::nullopt; 14108 break; 14109 } 14110 14111 Result = *Result + *NumExpansions; 14112 } 14113 14114 // Common case: we could determine the number of expansions without 14115 // substituting. 14116 if (Result) 14117 return getDerived().RebuildSizeOfPackExpr( 14118 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(), 14119 *Result, std::nullopt); 14120 14121 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 14122 E->getPackLoc()); 14123 { 14124 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 14125 typedef TemplateArgumentLocInventIterator< 14126 Derived, const TemplateArgument*> PackLocIterator; 14127 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 14128 PackLocIterator(*this, PackArgs.end()), 14129 TransformedPackArgs, /*Uneval*/true)) 14130 return ExprError(); 14131 } 14132 14133 // Check whether we managed to fully-expand the pack. 14134 // FIXME: Is it possible for us to do so and not hit the early exit path? 14135 SmallVector<TemplateArgument, 8> Args; 14136 bool PartialSubstitution = false; 14137 for (auto &Loc : TransformedPackArgs.arguments()) { 14138 Args.push_back(Loc.getArgument()); 14139 if (Loc.getArgument().isPackExpansion()) 14140 PartialSubstitution = true; 14141 } 14142 14143 if (PartialSubstitution) 14144 return getDerived().RebuildSizeOfPackExpr( 14145 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(), 14146 std::nullopt, Args); 14147 14148 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 14149 E->getPackLoc(), E->getRParenLoc(), 14150 Args.size(), std::nullopt); 14151 } 14152 14153 template<typename Derived> 14154 ExprResult 14155 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 14156 SubstNonTypeTemplateParmPackExpr *E) { 14157 // Default behavior is to do nothing with this transformation. 14158 return E; 14159 } 14160 14161 template<typename Derived> 14162 ExprResult 14163 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 14164 SubstNonTypeTemplateParmExpr *E) { 14165 // Default behavior is to do nothing with this transformation. 14166 return E; 14167 } 14168 14169 template<typename Derived> 14170 ExprResult 14171 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 14172 // Default behavior is to do nothing with this transformation. 14173 return E; 14174 } 14175 14176 template<typename Derived> 14177 ExprResult 14178 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 14179 MaterializeTemporaryExpr *E) { 14180 return getDerived().TransformExpr(E->getSubExpr()); 14181 } 14182 14183 template<typename Derived> 14184 ExprResult 14185 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 14186 UnresolvedLookupExpr *Callee = nullptr; 14187 if (Expr *OldCallee = E->getCallee()) { 14188 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 14189 if (CalleeResult.isInvalid()) 14190 return ExprError(); 14191 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 14192 } 14193 14194 Expr *Pattern = E->getPattern(); 14195 14196 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 14197 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 14198 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 14199 14200 // Determine whether the set of unexpanded parameter packs can and should 14201 // be expanded. 14202 bool Expand = true; 14203 bool RetainExpansion = false; 14204 std::optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 14205 NumExpansions = OrigNumExpansions; 14206 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 14207 Pattern->getSourceRange(), 14208 Unexpanded, 14209 Expand, RetainExpansion, 14210 NumExpansions)) 14211 return true; 14212 14213 if (!Expand) { 14214 // Do not expand any packs here, just transform and rebuild a fold 14215 // expression. 14216 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 14217 14218 ExprResult LHS = 14219 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 14220 if (LHS.isInvalid()) 14221 return true; 14222 14223 ExprResult RHS = 14224 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 14225 if (RHS.isInvalid()) 14226 return true; 14227 14228 if (!getDerived().AlwaysRebuild() && 14229 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 14230 return E; 14231 14232 return getDerived().RebuildCXXFoldExpr( 14233 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 14234 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 14235 } 14236 14237 // Formally a fold expression expands to nested parenthesized expressions. 14238 // Enforce this limit to avoid creating trees so deep we can't safely traverse 14239 // them. 14240 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 14241 SemaRef.Diag(E->getEllipsisLoc(), 14242 clang::diag::err_fold_expression_limit_exceeded) 14243 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 14244 << E->getSourceRange(); 14245 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 14246 return ExprError(); 14247 } 14248 14249 // The transform has determined that we should perform an elementwise 14250 // expansion of the pattern. Do so. 14251 ExprResult Result = getDerived().TransformExpr(E->getInit()); 14252 if (Result.isInvalid()) 14253 return true; 14254 bool LeftFold = E->isLeftFold(); 14255 14256 // If we're retaining an expansion for a right fold, it is the innermost 14257 // component and takes the init (if any). 14258 if (!LeftFold && RetainExpansion) { 14259 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 14260 14261 ExprResult Out = getDerived().TransformExpr(Pattern); 14262 if (Out.isInvalid()) 14263 return true; 14264 14265 Result = getDerived().RebuildCXXFoldExpr( 14266 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 14267 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 14268 if (Result.isInvalid()) 14269 return true; 14270 } 14271 14272 for (unsigned I = 0; I != *NumExpansions; ++I) { 14273 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 14274 getSema(), LeftFold ? I : *NumExpansions - I - 1); 14275 ExprResult Out = getDerived().TransformExpr(Pattern); 14276 if (Out.isInvalid()) 14277 return true; 14278 14279 if (Out.get()->containsUnexpandedParameterPack()) { 14280 // We still have a pack; retain a pack expansion for this slice. 14281 Result = getDerived().RebuildCXXFoldExpr( 14282 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 14283 E->getOperator(), E->getEllipsisLoc(), 14284 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 14285 OrigNumExpansions); 14286 } else if (Result.isUsable()) { 14287 // We've got down to a single element; build a binary operator. 14288 Expr *LHS = LeftFold ? Result.get() : Out.get(); 14289 Expr *RHS = LeftFold ? Out.get() : Result.get(); 14290 if (Callee) { 14291 UnresolvedSet<16> Functions; 14292 Functions.append(Callee->decls_begin(), Callee->decls_end()); 14293 Result = getDerived().RebuildCXXOperatorCallExpr( 14294 BinaryOperator::getOverloadedOperator(E->getOperator()), 14295 E->getEllipsisLoc(), Callee->getBeginLoc(), Callee->requiresADL(), 14296 Functions, LHS, RHS); 14297 } else { 14298 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 14299 E->getOperator(), LHS, RHS); 14300 } 14301 } else 14302 Result = Out; 14303 14304 if (Result.isInvalid()) 14305 return true; 14306 } 14307 14308 // If we're retaining an expansion for a left fold, it is the outermost 14309 // component and takes the complete expansion so far as its init (if any). 14310 if (LeftFold && RetainExpansion) { 14311 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 14312 14313 ExprResult Out = getDerived().TransformExpr(Pattern); 14314 if (Out.isInvalid()) 14315 return true; 14316 14317 Result = getDerived().RebuildCXXFoldExpr( 14318 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 14319 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 14320 if (Result.isInvalid()) 14321 return true; 14322 } 14323 14324 // If we had no init and an empty pack, and we're not retaining an expansion, 14325 // then produce a fallback value or error. 14326 if (Result.isUnset()) 14327 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 14328 E->getOperator()); 14329 14330 return Result; 14331 } 14332 14333 template <typename Derived> 14334 ExprResult 14335 TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *E) { 14336 SmallVector<Expr *, 4> TransformedInits; 14337 ArrayRef<Expr *> InitExprs = E->getInitExprs(); 14338 if (TransformExprs(InitExprs.data(), InitExprs.size(), true, 14339 TransformedInits)) 14340 return ExprError(); 14341 14342 return getDerived().RebuildParenListExpr(E->getBeginLoc(), TransformedInits, 14343 E->getEndLoc()); 14344 } 14345 14346 template<typename Derived> 14347 ExprResult 14348 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 14349 CXXStdInitializerListExpr *E) { 14350 return getDerived().TransformExpr(E->getSubExpr()); 14351 } 14352 14353 template<typename Derived> 14354 ExprResult 14355 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 14356 return SemaRef.MaybeBindToTemporary(E); 14357 } 14358 14359 template<typename Derived> 14360 ExprResult 14361 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 14362 return E; 14363 } 14364 14365 template<typename Derived> 14366 ExprResult 14367 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 14368 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 14369 if (SubExpr.isInvalid()) 14370 return ExprError(); 14371 14372 if (!getDerived().AlwaysRebuild() && 14373 SubExpr.get() == E->getSubExpr()) 14374 return E; 14375 14376 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 14377 } 14378 14379 template<typename Derived> 14380 ExprResult 14381 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 14382 // Transform each of the elements. 14383 SmallVector<Expr *, 8> Elements; 14384 bool ArgChanged = false; 14385 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 14386 /*IsCall=*/false, Elements, &ArgChanged)) 14387 return ExprError(); 14388 14389 if (!getDerived().AlwaysRebuild() && !ArgChanged) 14390 return SemaRef.MaybeBindToTemporary(E); 14391 14392 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 14393 Elements.data(), 14394 Elements.size()); 14395 } 14396 14397 template<typename Derived> 14398 ExprResult 14399 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 14400 ObjCDictionaryLiteral *E) { 14401 // Transform each of the elements. 14402 SmallVector<ObjCDictionaryElement, 8> Elements; 14403 bool ArgChanged = false; 14404 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 14405 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 14406 14407 if (OrigElement.isPackExpansion()) { 14408 // This key/value element is a pack expansion. 14409 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 14410 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 14411 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 14412 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 14413 14414 // Determine whether the set of unexpanded parameter packs can 14415 // and should be expanded. 14416 bool Expand = true; 14417 bool RetainExpansion = false; 14418 std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 14419 std::optional<unsigned> NumExpansions = OrigNumExpansions; 14420 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 14421 OrigElement.Value->getEndLoc()); 14422 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 14423 PatternRange, Unexpanded, Expand, 14424 RetainExpansion, NumExpansions)) 14425 return ExprError(); 14426 14427 if (!Expand) { 14428 // The transform has determined that we should perform a simple 14429 // transformation on the pack expansion, producing another pack 14430 // expansion. 14431 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 14432 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14433 if (Key.isInvalid()) 14434 return ExprError(); 14435 14436 if (Key.get() != OrigElement.Key) 14437 ArgChanged = true; 14438 14439 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 14440 if (Value.isInvalid()) 14441 return ExprError(); 14442 14443 if (Value.get() != OrigElement.Value) 14444 ArgChanged = true; 14445 14446 ObjCDictionaryElement Expansion = { 14447 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 14448 }; 14449 Elements.push_back(Expansion); 14450 continue; 14451 } 14452 14453 // Record right away that the argument was changed. This needs 14454 // to happen even if the array expands to nothing. 14455 ArgChanged = true; 14456 14457 // The transform has determined that we should perform an elementwise 14458 // expansion of the pattern. Do so. 14459 for (unsigned I = 0; I != *NumExpansions; ++I) { 14460 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 14461 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14462 if (Key.isInvalid()) 14463 return ExprError(); 14464 14465 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 14466 if (Value.isInvalid()) 14467 return ExprError(); 14468 14469 ObjCDictionaryElement Element = { 14470 Key.get(), Value.get(), SourceLocation(), NumExpansions 14471 }; 14472 14473 // If any unexpanded parameter packs remain, we still have a 14474 // pack expansion. 14475 // FIXME: Can this really happen? 14476 if (Key.get()->containsUnexpandedParameterPack() || 14477 Value.get()->containsUnexpandedParameterPack()) 14478 Element.EllipsisLoc = OrigElement.EllipsisLoc; 14479 14480 Elements.push_back(Element); 14481 } 14482 14483 // FIXME: Retain a pack expansion if RetainExpansion is true. 14484 14485 // We've finished with this pack expansion. 14486 continue; 14487 } 14488 14489 // Transform and check key. 14490 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14491 if (Key.isInvalid()) 14492 return ExprError(); 14493 14494 if (Key.get() != OrigElement.Key) 14495 ArgChanged = true; 14496 14497 // Transform and check value. 14498 ExprResult Value 14499 = getDerived().TransformExpr(OrigElement.Value); 14500 if (Value.isInvalid()) 14501 return ExprError(); 14502 14503 if (Value.get() != OrigElement.Value) 14504 ArgChanged = true; 14505 14506 ObjCDictionaryElement Element = {Key.get(), Value.get(), SourceLocation(), 14507 std::nullopt}; 14508 Elements.push_back(Element); 14509 } 14510 14511 if (!getDerived().AlwaysRebuild() && !ArgChanged) 14512 return SemaRef.MaybeBindToTemporary(E); 14513 14514 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 14515 Elements); 14516 } 14517 14518 template<typename Derived> 14519 ExprResult 14520 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 14521 TypeSourceInfo *EncodedTypeInfo 14522 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 14523 if (!EncodedTypeInfo) 14524 return ExprError(); 14525 14526 if (!getDerived().AlwaysRebuild() && 14527 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 14528 return E; 14529 14530 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 14531 EncodedTypeInfo, 14532 E->getRParenLoc()); 14533 } 14534 14535 template<typename Derived> 14536 ExprResult TreeTransform<Derived>:: 14537 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 14538 // This is a kind of implicit conversion, and it needs to get dropped 14539 // and recomputed for the same general reasons that ImplicitCastExprs 14540 // do, as well a more specific one: this expression is only valid when 14541 // it appears *immediately* as an argument expression. 14542 return getDerived().TransformExpr(E->getSubExpr()); 14543 } 14544 14545 template<typename Derived> 14546 ExprResult TreeTransform<Derived>:: 14547 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 14548 TypeSourceInfo *TSInfo 14549 = getDerived().TransformType(E->getTypeInfoAsWritten()); 14550 if (!TSInfo) 14551 return ExprError(); 14552 14553 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 14554 if (Result.isInvalid()) 14555 return ExprError(); 14556 14557 if (!getDerived().AlwaysRebuild() && 14558 TSInfo == E->getTypeInfoAsWritten() && 14559 Result.get() == E->getSubExpr()) 14560 return E; 14561 14562 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 14563 E->getBridgeKeywordLoc(), TSInfo, 14564 Result.get()); 14565 } 14566 14567 template <typename Derived> 14568 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 14569 ObjCAvailabilityCheckExpr *E) { 14570 return E; 14571 } 14572 14573 template<typename Derived> 14574 ExprResult 14575 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 14576 // Transform arguments. 14577 bool ArgChanged = false; 14578 SmallVector<Expr*, 8> Args; 14579 Args.reserve(E->getNumArgs()); 14580 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 14581 &ArgChanged)) 14582 return ExprError(); 14583 14584 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 14585 // Class message: transform the receiver type. 14586 TypeSourceInfo *ReceiverTypeInfo 14587 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 14588 if (!ReceiverTypeInfo) 14589 return ExprError(); 14590 14591 // If nothing changed, just retain the existing message send. 14592 if (!getDerived().AlwaysRebuild() && 14593 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 14594 return SemaRef.MaybeBindToTemporary(E); 14595 14596 // Build a new class message send. 14597 SmallVector<SourceLocation, 16> SelLocs; 14598 E->getSelectorLocs(SelLocs); 14599 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 14600 E->getSelector(), 14601 SelLocs, 14602 E->getMethodDecl(), 14603 E->getLeftLoc(), 14604 Args, 14605 E->getRightLoc()); 14606 } 14607 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 14608 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 14609 if (!E->getMethodDecl()) 14610 return ExprError(); 14611 14612 // Build a new class message send to 'super'. 14613 SmallVector<SourceLocation, 16> SelLocs; 14614 E->getSelectorLocs(SelLocs); 14615 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 14616 E->getSelector(), 14617 SelLocs, 14618 E->getReceiverType(), 14619 E->getMethodDecl(), 14620 E->getLeftLoc(), 14621 Args, 14622 E->getRightLoc()); 14623 } 14624 14625 // Instance message: transform the receiver 14626 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 14627 "Only class and instance messages may be instantiated"); 14628 ExprResult Receiver 14629 = getDerived().TransformExpr(E->getInstanceReceiver()); 14630 if (Receiver.isInvalid()) 14631 return ExprError(); 14632 14633 // If nothing changed, just retain the existing message send. 14634 if (!getDerived().AlwaysRebuild() && 14635 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 14636 return SemaRef.MaybeBindToTemporary(E); 14637 14638 // Build a new instance message send. 14639 SmallVector<SourceLocation, 16> SelLocs; 14640 E->getSelectorLocs(SelLocs); 14641 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 14642 E->getSelector(), 14643 SelLocs, 14644 E->getMethodDecl(), 14645 E->getLeftLoc(), 14646 Args, 14647 E->getRightLoc()); 14648 } 14649 14650 template<typename Derived> 14651 ExprResult 14652 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 14653 return E; 14654 } 14655 14656 template<typename Derived> 14657 ExprResult 14658 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 14659 return E; 14660 } 14661 14662 template<typename Derived> 14663 ExprResult 14664 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 14665 // Transform the base expression. 14666 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14667 if (Base.isInvalid()) 14668 return ExprError(); 14669 14670 // We don't need to transform the ivar; it will never change. 14671 14672 // If nothing changed, just retain the existing expression. 14673 if (!getDerived().AlwaysRebuild() && 14674 Base.get() == E->getBase()) 14675 return E; 14676 14677 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14678 E->getLocation(), 14679 E->isArrow(), E->isFreeIvar()); 14680 } 14681 14682 template<typename Derived> 14683 ExprResult 14684 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14685 // 'super' and types never change. Property never changes. Just 14686 // retain the existing expression. 14687 if (!E->isObjectReceiver()) 14688 return E; 14689 14690 // Transform the base expression. 14691 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14692 if (Base.isInvalid()) 14693 return ExprError(); 14694 14695 // We don't need to transform the property; it will never change. 14696 14697 // If nothing changed, just retain the existing expression. 14698 if (!getDerived().AlwaysRebuild() && 14699 Base.get() == E->getBase()) 14700 return E; 14701 14702 if (E->isExplicitProperty()) 14703 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14704 E->getExplicitProperty(), 14705 E->getLocation()); 14706 14707 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14708 SemaRef.Context.PseudoObjectTy, 14709 E->getImplicitPropertyGetter(), 14710 E->getImplicitPropertySetter(), 14711 E->getLocation()); 14712 } 14713 14714 template<typename Derived> 14715 ExprResult 14716 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14717 // Transform the base expression. 14718 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14719 if (Base.isInvalid()) 14720 return ExprError(); 14721 14722 // Transform the key expression. 14723 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14724 if (Key.isInvalid()) 14725 return ExprError(); 14726 14727 // If nothing changed, just retain the existing expression. 14728 if (!getDerived().AlwaysRebuild() && 14729 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14730 return E; 14731 14732 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14733 Base.get(), Key.get(), 14734 E->getAtIndexMethodDecl(), 14735 E->setAtIndexMethodDecl()); 14736 } 14737 14738 template<typename Derived> 14739 ExprResult 14740 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14741 // Transform the base expression. 14742 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14743 if (Base.isInvalid()) 14744 return ExprError(); 14745 14746 // If nothing changed, just retain the existing expression. 14747 if (!getDerived().AlwaysRebuild() && 14748 Base.get() == E->getBase()) 14749 return E; 14750 14751 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14752 E->getOpLoc(), 14753 E->isArrow()); 14754 } 14755 14756 template<typename Derived> 14757 ExprResult 14758 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14759 bool ArgumentChanged = false; 14760 SmallVector<Expr*, 8> SubExprs; 14761 SubExprs.reserve(E->getNumSubExprs()); 14762 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14763 SubExprs, &ArgumentChanged)) 14764 return ExprError(); 14765 14766 if (!getDerived().AlwaysRebuild() && 14767 !ArgumentChanged) 14768 return E; 14769 14770 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14771 SubExprs, 14772 E->getRParenLoc()); 14773 } 14774 14775 template<typename Derived> 14776 ExprResult 14777 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14778 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14779 if (SrcExpr.isInvalid()) 14780 return ExprError(); 14781 14782 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14783 if (!Type) 14784 return ExprError(); 14785 14786 if (!getDerived().AlwaysRebuild() && 14787 Type == E->getTypeSourceInfo() && 14788 SrcExpr.get() == E->getSrcExpr()) 14789 return E; 14790 14791 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14792 SrcExpr.get(), Type, 14793 E->getRParenLoc()); 14794 } 14795 14796 template<typename Derived> 14797 ExprResult 14798 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14799 BlockDecl *oldBlock = E->getBlockDecl(); 14800 14801 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14802 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14803 14804 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14805 blockScope->TheDecl->setBlockMissingReturnType( 14806 oldBlock->blockMissingReturnType()); 14807 14808 SmallVector<ParmVarDecl*, 4> params; 14809 SmallVector<QualType, 4> paramTypes; 14810 14811 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14812 14813 // Parameter substitution. 14814 Sema::ExtParameterInfoBuilder extParamInfos; 14815 if (getDerived().TransformFunctionTypeParams( 14816 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14817 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14818 extParamInfos)) { 14819 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14820 return ExprError(); 14821 } 14822 14823 QualType exprResultType = 14824 getDerived().TransformType(exprFunctionType->getReturnType()); 14825 14826 auto epi = exprFunctionType->getExtProtoInfo(); 14827 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14828 14829 QualType functionType = 14830 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14831 blockScope->FunctionType = functionType; 14832 14833 // Set the parameters on the block decl. 14834 if (!params.empty()) 14835 blockScope->TheDecl->setParams(params); 14836 14837 if (!oldBlock->blockMissingReturnType()) { 14838 blockScope->HasImplicitReturnType = false; 14839 blockScope->ReturnType = exprResultType; 14840 } 14841 14842 // Transform the body 14843 StmtResult body = getDerived().TransformStmt(E->getBody()); 14844 if (body.isInvalid()) { 14845 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14846 return ExprError(); 14847 } 14848 14849 #ifndef NDEBUG 14850 // In builds with assertions, make sure that we captured everything we 14851 // captured before. 14852 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14853 for (const auto &I : oldBlock->captures()) { 14854 VarDecl *oldCapture = I.getVariable(); 14855 14856 // Ignore parameter packs. 14857 if (oldCapture->isParameterPack()) 14858 continue; 14859 14860 VarDecl *newCapture = 14861 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14862 oldCapture)); 14863 assert(blockScope->CaptureMap.count(newCapture)); 14864 } 14865 14866 // The this pointer may not be captured by the instantiated block, even when 14867 // it's captured by the original block, if the expression causing the 14868 // capture is in the discarded branch of a constexpr if statement. 14869 assert((!blockScope->isCXXThisCaptured() || oldBlock->capturesCXXThis()) && 14870 "this pointer isn't captured in the old block"); 14871 } 14872 #endif 14873 14874 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14875 /*Scope=*/nullptr); 14876 } 14877 14878 template<typename Derived> 14879 ExprResult 14880 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14881 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14882 if (SrcExpr.isInvalid()) 14883 return ExprError(); 14884 14885 QualType Type = getDerived().TransformType(E->getType()); 14886 14887 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14888 E->getRParenLoc()); 14889 } 14890 14891 template<typename Derived> 14892 ExprResult 14893 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14894 bool ArgumentChanged = false; 14895 SmallVector<Expr*, 8> SubExprs; 14896 SubExprs.reserve(E->getNumSubExprs()); 14897 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14898 SubExprs, &ArgumentChanged)) 14899 return ExprError(); 14900 14901 if (!getDerived().AlwaysRebuild() && 14902 !ArgumentChanged) 14903 return E; 14904 14905 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14906 E->getOp(), E->getRParenLoc()); 14907 } 14908 14909 //===----------------------------------------------------------------------===// 14910 // Type reconstruction 14911 //===----------------------------------------------------------------------===// 14912 14913 template<typename Derived> 14914 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14915 SourceLocation Star) { 14916 return SemaRef.BuildPointerType(PointeeType, Star, 14917 getDerived().getBaseEntity()); 14918 } 14919 14920 template<typename Derived> 14921 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14922 SourceLocation Star) { 14923 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14924 getDerived().getBaseEntity()); 14925 } 14926 14927 template<typename Derived> 14928 QualType 14929 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14930 bool WrittenAsLValue, 14931 SourceLocation Sigil) { 14932 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14933 Sigil, getDerived().getBaseEntity()); 14934 } 14935 14936 template<typename Derived> 14937 QualType 14938 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14939 QualType ClassType, 14940 SourceLocation Sigil) { 14941 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14942 getDerived().getBaseEntity()); 14943 } 14944 14945 template<typename Derived> 14946 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14947 const ObjCTypeParamDecl *Decl, 14948 SourceLocation ProtocolLAngleLoc, 14949 ArrayRef<ObjCProtocolDecl *> Protocols, 14950 ArrayRef<SourceLocation> ProtocolLocs, 14951 SourceLocation ProtocolRAngleLoc) { 14952 return SemaRef.BuildObjCTypeParamType(Decl, 14953 ProtocolLAngleLoc, Protocols, 14954 ProtocolLocs, ProtocolRAngleLoc, 14955 /*FailOnError=*/true); 14956 } 14957 14958 template<typename Derived> 14959 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14960 QualType BaseType, 14961 SourceLocation Loc, 14962 SourceLocation TypeArgsLAngleLoc, 14963 ArrayRef<TypeSourceInfo *> TypeArgs, 14964 SourceLocation TypeArgsRAngleLoc, 14965 SourceLocation ProtocolLAngleLoc, 14966 ArrayRef<ObjCProtocolDecl *> Protocols, 14967 ArrayRef<SourceLocation> ProtocolLocs, 14968 SourceLocation ProtocolRAngleLoc) { 14969 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, TypeArgs, 14970 TypeArgsRAngleLoc, ProtocolLAngleLoc, 14971 Protocols, ProtocolLocs, ProtocolRAngleLoc, 14972 /*FailOnError=*/true, 14973 /*Rebuilding=*/true); 14974 } 14975 14976 template<typename Derived> 14977 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14978 QualType PointeeType, 14979 SourceLocation Star) { 14980 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14981 } 14982 14983 template <typename Derived> 14984 QualType TreeTransform<Derived>::RebuildArrayType( 14985 QualType ElementType, ArraySizeModifier SizeMod, const llvm::APInt *Size, 14986 Expr *SizeExpr, unsigned IndexTypeQuals, SourceRange BracketsRange) { 14987 if (SizeExpr || !Size) 14988 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14989 IndexTypeQuals, BracketsRange, 14990 getDerived().getBaseEntity()); 14991 14992 QualType Types[] = { 14993 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14994 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14995 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14996 }; 14997 QualType SizeType; 14998 for (const auto &T : Types) 14999 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(T)) { 15000 SizeType = T; 15001 break; 15002 } 15003 15004 // Note that we can return a VariableArrayType here in the case where 15005 // the element type was a dependent VariableArrayType. 15006 IntegerLiteral *ArraySize 15007 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 15008 /*FIXME*/BracketsRange.getBegin()); 15009 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 15010 IndexTypeQuals, BracketsRange, 15011 getDerived().getBaseEntity()); 15012 } 15013 15014 template <typename Derived> 15015 QualType TreeTransform<Derived>::RebuildConstantArrayType( 15016 QualType ElementType, ArraySizeModifier SizeMod, const llvm::APInt &Size, 15017 Expr *SizeExpr, unsigned IndexTypeQuals, SourceRange BracketsRange) { 15018 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 15019 IndexTypeQuals, BracketsRange); 15020 } 15021 15022 template <typename Derived> 15023 QualType TreeTransform<Derived>::RebuildIncompleteArrayType( 15024 QualType ElementType, ArraySizeModifier SizeMod, unsigned IndexTypeQuals, 15025 SourceRange BracketsRange) { 15026 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 15027 IndexTypeQuals, BracketsRange); 15028 } 15029 15030 template <typename Derived> 15031 QualType TreeTransform<Derived>::RebuildVariableArrayType( 15032 QualType ElementType, ArraySizeModifier SizeMod, Expr *SizeExpr, 15033 unsigned IndexTypeQuals, SourceRange BracketsRange) { 15034 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 15035 SizeExpr, 15036 IndexTypeQuals, BracketsRange); 15037 } 15038 15039 template <typename Derived> 15040 QualType TreeTransform<Derived>::RebuildDependentSizedArrayType( 15041 QualType ElementType, ArraySizeModifier SizeMod, Expr *SizeExpr, 15042 unsigned IndexTypeQuals, SourceRange BracketsRange) { 15043 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 15044 SizeExpr, 15045 IndexTypeQuals, BracketsRange); 15046 } 15047 15048 template <typename Derived> 15049 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 15050 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 15051 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 15052 AttributeLoc); 15053 } 15054 15055 template <typename Derived> 15056 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 15057 unsigned NumElements, 15058 VectorKind VecKind) { 15059 // FIXME: semantic checking! 15060 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 15061 } 15062 15063 template <typename Derived> 15064 QualType TreeTransform<Derived>::RebuildDependentVectorType( 15065 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 15066 VectorKind VecKind) { 15067 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 15068 } 15069 15070 template<typename Derived> 15071 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 15072 unsigned NumElements, 15073 SourceLocation AttributeLoc) { 15074 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 15075 NumElements, true); 15076 IntegerLiteral *VectorSize 15077 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 15078 AttributeLoc); 15079 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 15080 } 15081 15082 template<typename Derived> 15083 QualType 15084 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 15085 Expr *SizeExpr, 15086 SourceLocation AttributeLoc) { 15087 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 15088 } 15089 15090 template <typename Derived> 15091 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 15092 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 15093 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 15094 NumColumns); 15095 } 15096 15097 template <typename Derived> 15098 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 15099 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 15100 SourceLocation AttributeLoc) { 15101 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 15102 AttributeLoc); 15103 } 15104 15105 template<typename Derived> 15106 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 15107 QualType T, 15108 MutableArrayRef<QualType> ParamTypes, 15109 const FunctionProtoType::ExtProtoInfo &EPI) { 15110 return SemaRef.BuildFunctionType(T, ParamTypes, 15111 getDerived().getBaseLocation(), 15112 getDerived().getBaseEntity(), 15113 EPI); 15114 } 15115 15116 template<typename Derived> 15117 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 15118 return SemaRef.Context.getFunctionNoProtoType(T); 15119 } 15120 15121 template<typename Derived> 15122 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 15123 Decl *D) { 15124 assert(D && "no decl found"); 15125 if (D->isInvalidDecl()) return QualType(); 15126 15127 // FIXME: Doesn't account for ObjCInterfaceDecl! 15128 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 15129 // A valid resolved using typename pack expansion decl can have multiple 15130 // UsingDecls, but they must each have exactly one type, and it must be 15131 // the same type in every case. But we must have at least one expansion! 15132 if (UPD->expansions().empty()) { 15133 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 15134 << UPD->isCXXClassMember() << UPD; 15135 return QualType(); 15136 } 15137 15138 // We might still have some unresolved types. Try to pick a resolved type 15139 // if we can. The final instantiation will check that the remaining 15140 // unresolved types instantiate to the type we pick. 15141 QualType FallbackT; 15142 QualType T; 15143 for (auto *E : UPD->expansions()) { 15144 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 15145 if (ThisT.isNull()) 15146 continue; 15147 else if (ThisT->getAs<UnresolvedUsingType>()) 15148 FallbackT = ThisT; 15149 else if (T.isNull()) 15150 T = ThisT; 15151 else 15152 assert(getSema().Context.hasSameType(ThisT, T) && 15153 "mismatched resolved types in using pack expansion"); 15154 } 15155 return T.isNull() ? FallbackT : T; 15156 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 15157 assert(Using->hasTypename() && 15158 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 15159 15160 // A valid resolved using typename decl points to exactly one type decl. 15161 assert(++Using->shadow_begin() == Using->shadow_end()); 15162 15163 UsingShadowDecl *Shadow = *Using->shadow_begin(); 15164 if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc)) 15165 return QualType(); 15166 return SemaRef.Context.getUsingType( 15167 Shadow, SemaRef.Context.getTypeDeclType( 15168 cast<TypeDecl>(Shadow->getTargetDecl()))); 15169 } else { 15170 assert(isa<UnresolvedUsingTypenameDecl>(D) && 15171 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 15172 return SemaRef.Context.getTypeDeclType( 15173 cast<UnresolvedUsingTypenameDecl>(D)); 15174 } 15175 } 15176 15177 template <typename Derived> 15178 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, SourceLocation, 15179 TypeOfKind Kind) { 15180 return SemaRef.BuildTypeofExprType(E, Kind); 15181 } 15182 15183 template<typename Derived> 15184 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying, 15185 TypeOfKind Kind) { 15186 return SemaRef.Context.getTypeOfType(Underlying, Kind); 15187 } 15188 15189 template <typename Derived> 15190 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 15191 return SemaRef.BuildDecltypeType(E); 15192 } 15193 15194 template<typename Derived> 15195 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 15196 UnaryTransformType::UTTKind UKind, 15197 SourceLocation Loc) { 15198 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 15199 } 15200 15201 template<typename Derived> 15202 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 15203 TemplateName Template, 15204 SourceLocation TemplateNameLoc, 15205 TemplateArgumentListInfo &TemplateArgs) { 15206 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 15207 } 15208 15209 template<typename Derived> 15210 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 15211 SourceLocation KWLoc) { 15212 return SemaRef.BuildAtomicType(ValueType, KWLoc); 15213 } 15214 15215 template<typename Derived> 15216 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 15217 SourceLocation KWLoc, 15218 bool isReadPipe) { 15219 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 15220 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 15221 } 15222 15223 template <typename Derived> 15224 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned, 15225 unsigned NumBits, 15226 SourceLocation Loc) { 15227 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 15228 NumBits, true); 15229 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 15230 SemaRef.Context.IntTy, Loc); 15231 return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc); 15232 } 15233 15234 template <typename Derived> 15235 QualType TreeTransform<Derived>::RebuildDependentBitIntType( 15236 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 15237 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc); 15238 } 15239 15240 template<typename Derived> 15241 TemplateName 15242 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 15243 bool TemplateKW, 15244 TemplateDecl *Template) { 15245 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 15246 TemplateName(Template)); 15247 } 15248 15249 template<typename Derived> 15250 TemplateName 15251 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 15252 SourceLocation TemplateKWLoc, 15253 const IdentifierInfo &Name, 15254 SourceLocation NameLoc, 15255 QualType ObjectType, 15256 NamedDecl *FirstQualifierInScope, 15257 bool AllowInjectedClassName) { 15258 UnqualifiedId TemplateName; 15259 TemplateName.setIdentifier(&Name, NameLoc); 15260 Sema::TemplateTy Template; 15261 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 15262 TemplateName, ParsedType::make(ObjectType), 15263 /*EnteringContext=*/false, Template, 15264 AllowInjectedClassName); 15265 return Template.get(); 15266 } 15267 15268 template<typename Derived> 15269 TemplateName 15270 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 15271 SourceLocation TemplateKWLoc, 15272 OverloadedOperatorKind Operator, 15273 SourceLocation NameLoc, 15274 QualType ObjectType, 15275 bool AllowInjectedClassName) { 15276 UnqualifiedId Name; 15277 // FIXME: Bogus location information. 15278 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 15279 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 15280 Sema::TemplateTy Template; 15281 getSema().ActOnTemplateName( 15282 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 15283 /*EnteringContext=*/false, Template, AllowInjectedClassName); 15284 return Template.get(); 15285 } 15286 15287 template <typename Derived> 15288 ExprResult TreeTransform<Derived>::RebuildCXXOperatorCallExpr( 15289 OverloadedOperatorKind Op, SourceLocation OpLoc, SourceLocation CalleeLoc, 15290 bool RequiresADL, const UnresolvedSetImpl &Functions, Expr *First, 15291 Expr *Second) { 15292 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 15293 15294 if (First->getObjectKind() == OK_ObjCProperty) { 15295 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15296 if (BinaryOperator::isAssignmentOp(Opc)) 15297 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 15298 First, Second); 15299 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 15300 if (Result.isInvalid()) 15301 return ExprError(); 15302 First = Result.get(); 15303 } 15304 15305 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 15306 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 15307 if (Result.isInvalid()) 15308 return ExprError(); 15309 Second = Result.get(); 15310 } 15311 15312 // Determine whether this should be a builtin operation. 15313 if (Op == OO_Subscript) { 15314 if (!First->getType()->isOverloadableType() && 15315 !Second->getType()->isOverloadableType()) 15316 return getSema().CreateBuiltinArraySubscriptExpr(First, CalleeLoc, Second, 15317 OpLoc); 15318 } else if (Op == OO_Arrow) { 15319 // It is possible that the type refers to a RecoveryExpr created earlier 15320 // in the tree transformation. 15321 if (First->getType()->isDependentType()) 15322 return ExprError(); 15323 // -> is never a builtin operation. 15324 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 15325 } else if (Second == nullptr || isPostIncDec) { 15326 if (!First->getType()->isOverloadableType() || 15327 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 15328 // The argument is not of overloadable type, or this is an expression 15329 // of the form &Class::member, so try to create a built-in unary 15330 // operation. 15331 UnaryOperatorKind Opc 15332 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 15333 15334 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 15335 } 15336 } else { 15337 if (!First->getType()->isOverloadableType() && 15338 !Second->getType()->isOverloadableType()) { 15339 // Neither of the arguments is an overloadable type, so try to 15340 // create a built-in binary operation. 15341 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15342 ExprResult Result 15343 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 15344 if (Result.isInvalid()) 15345 return ExprError(); 15346 15347 return Result; 15348 } 15349 } 15350 15351 // Add any functions found via argument-dependent lookup. 15352 Expr *Args[2] = { First, Second }; 15353 unsigned NumArgs = 1 + (Second != nullptr); 15354 15355 // Create the overloaded operator invocation for unary operators. 15356 if (NumArgs == 1 || isPostIncDec) { 15357 UnaryOperatorKind Opc 15358 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 15359 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 15360 RequiresADL); 15361 } 15362 15363 // Create the overloaded operator invocation for binary operators. 15364 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15365 ExprResult Result = SemaRef.CreateOverloadedBinOp( 15366 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 15367 if (Result.isInvalid()) 15368 return ExprError(); 15369 15370 return Result; 15371 } 15372 15373 template<typename Derived> 15374 ExprResult 15375 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 15376 SourceLocation OperatorLoc, 15377 bool isArrow, 15378 CXXScopeSpec &SS, 15379 TypeSourceInfo *ScopeType, 15380 SourceLocation CCLoc, 15381 SourceLocation TildeLoc, 15382 PseudoDestructorTypeStorage Destroyed) { 15383 QualType BaseType = Base->getType(); 15384 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 15385 (!isArrow && !BaseType->getAs<RecordType>()) || 15386 (isArrow && BaseType->getAs<PointerType>() && 15387 !BaseType->castAs<PointerType>()->getPointeeType() 15388 ->template getAs<RecordType>())){ 15389 // This pseudo-destructor expression is still a pseudo-destructor. 15390 return SemaRef.BuildPseudoDestructorExpr( 15391 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 15392 CCLoc, TildeLoc, Destroyed); 15393 } 15394 15395 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 15396 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 15397 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 15398 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 15399 NameInfo.setNamedTypeInfo(DestroyedType); 15400 15401 // The scope type is now known to be a valid nested name specifier 15402 // component. Tack it on to the end of the nested name specifier. 15403 if (ScopeType) { 15404 if (!ScopeType->getType()->getAs<TagType>()) { 15405 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 15406 diag::err_expected_class_or_namespace) 15407 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 15408 return ExprError(); 15409 } 15410 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 15411 CCLoc); 15412 } 15413 15414 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 15415 return getSema().BuildMemberReferenceExpr(Base, BaseType, 15416 OperatorLoc, isArrow, 15417 SS, TemplateKWLoc, 15418 /*FIXME: FirstQualifier*/ nullptr, 15419 NameInfo, 15420 /*TemplateArgs*/ nullptr, 15421 /*S*/nullptr); 15422 } 15423 15424 template<typename Derived> 15425 StmtResult 15426 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 15427 SourceLocation Loc = S->getBeginLoc(); 15428 CapturedDecl *CD = S->getCapturedDecl(); 15429 unsigned NumParams = CD->getNumParams(); 15430 unsigned ContextParamPos = CD->getContextParamPosition(); 15431 SmallVector<Sema::CapturedParamNameType, 4> Params; 15432 for (unsigned I = 0; I < NumParams; ++I) { 15433 if (I != ContextParamPos) { 15434 Params.push_back( 15435 std::make_pair( 15436 CD->getParam(I)->getName(), 15437 getDerived().TransformType(CD->getParam(I)->getType()))); 15438 } else { 15439 Params.push_back(std::make_pair(StringRef(), QualType())); 15440 } 15441 } 15442 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 15443 S->getCapturedRegionKind(), Params); 15444 StmtResult Body; 15445 { 15446 Sema::CompoundScopeRAII CompoundScope(getSema()); 15447 Body = getDerived().TransformStmt(S->getCapturedStmt()); 15448 } 15449 15450 if (Body.isInvalid()) { 15451 getSema().ActOnCapturedRegionError(); 15452 return StmtError(); 15453 } 15454 15455 return getSema().ActOnCapturedRegionEnd(Body.get()); 15456 } 15457 15458 } // end namespace clang 15459 15460 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15461