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::StructuralValue: 3912 case TemplateArgument::Pack: 3913 case TemplateArgument::TemplateExpansion: 3914 case TemplateArgument::NullPtr: 3915 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3916 3917 case TemplateArgument::Type: 3918 if (TypeSourceInfo *Expansion 3919 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3920 EllipsisLoc, 3921 NumExpansions)) 3922 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3923 Expansion); 3924 break; 3925 } 3926 3927 return TemplateArgumentLoc(); 3928 } 3929 3930 /// Build a new expression pack expansion. 3931 /// 3932 /// By default, performs semantic analysis to build a new pack expansion 3933 /// for an expression. Subclasses may override this routine to provide 3934 /// different behavior. 3935 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3936 std::optional<unsigned> NumExpansions) { 3937 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3938 } 3939 3940 /// Build a new C++1z fold-expression. 3941 /// 3942 /// By default, performs semantic analysis in order to build a new fold 3943 /// expression. 3944 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3945 SourceLocation LParenLoc, Expr *LHS, 3946 BinaryOperatorKind Operator, 3947 SourceLocation EllipsisLoc, Expr *RHS, 3948 SourceLocation RParenLoc, 3949 std::optional<unsigned> NumExpansions) { 3950 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3951 EllipsisLoc, RHS, RParenLoc, 3952 NumExpansions); 3953 } 3954 3955 /// Build an empty C++1z fold-expression with the given operator. 3956 /// 3957 /// By default, produces the fallback value for the fold-expression, or 3958 /// produce an error if there is no fallback value. 3959 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3960 BinaryOperatorKind Operator) { 3961 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3962 } 3963 3964 /// Build a new atomic operation expression. 3965 /// 3966 /// By default, performs semantic analysis to build the new expression. 3967 /// Subclasses may override this routine to provide different behavior. 3968 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3969 AtomicExpr::AtomicOp Op, 3970 SourceLocation RParenLoc) { 3971 // Use this for all of the locations, since we don't know the difference 3972 // between the call and the expr at this point. 3973 SourceRange Range{BuiltinLoc, RParenLoc}; 3974 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3975 Sema::AtomicArgumentOrder::AST); 3976 } 3977 3978 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3979 ArrayRef<Expr *> SubExprs, QualType Type) { 3980 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3981 } 3982 3983 private: 3984 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3985 QualType ObjectType, 3986 NamedDecl *FirstQualifierInScope, 3987 CXXScopeSpec &SS); 3988 3989 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3990 QualType ObjectType, 3991 NamedDecl *FirstQualifierInScope, 3992 CXXScopeSpec &SS); 3993 3994 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3995 NamedDecl *FirstQualifierInScope, 3996 CXXScopeSpec &SS); 3997 3998 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3999 DependentNameTypeLoc TL, 4000 bool DeducibleTSTContext); 4001 }; 4002 4003 template <typename Derived> 4004 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 4005 if (!S) 4006 return S; 4007 4008 switch (S->getStmtClass()) { 4009 case Stmt::NoStmtClass: break; 4010 4011 // Transform individual statement nodes 4012 // Pass SDK into statements that can produce a value 4013 #define STMT(Node, Parent) \ 4014 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 4015 #define VALUESTMT(Node, Parent) \ 4016 case Stmt::Node##Class: \ 4017 return getDerived().Transform##Node(cast<Node>(S), SDK); 4018 #define ABSTRACT_STMT(Node) 4019 #define EXPR(Node, Parent) 4020 #include "clang/AST/StmtNodes.inc" 4021 4022 // Transform expressions by calling TransformExpr. 4023 #define STMT(Node, Parent) 4024 #define ABSTRACT_STMT(Stmt) 4025 #define EXPR(Node, Parent) case Stmt::Node##Class: 4026 #include "clang/AST/StmtNodes.inc" 4027 { 4028 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 4029 4030 if (SDK == SDK_StmtExprResult) 4031 E = getSema().ActOnStmtExprResult(E); 4032 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 4033 } 4034 } 4035 4036 return S; 4037 } 4038 4039 template<typename Derived> 4040 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 4041 if (!S) 4042 return S; 4043 4044 switch (S->getClauseKind()) { 4045 default: break; 4046 // Transform individual clause nodes 4047 #define GEN_CLANG_CLAUSE_CLASS 4048 #define CLAUSE_CLASS(Enum, Str, Class) \ 4049 case Enum: \ 4050 return getDerived().Transform##Class(cast<Class>(S)); 4051 #include "llvm/Frontend/OpenMP/OMP.inc" 4052 } 4053 4054 return S; 4055 } 4056 4057 4058 template<typename Derived> 4059 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 4060 if (!E) 4061 return E; 4062 4063 switch (E->getStmtClass()) { 4064 case Stmt::NoStmtClass: break; 4065 #define STMT(Node, Parent) case Stmt::Node##Class: break; 4066 #define ABSTRACT_STMT(Stmt) 4067 #define EXPR(Node, Parent) \ 4068 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 4069 #include "clang/AST/StmtNodes.inc" 4070 } 4071 4072 return E; 4073 } 4074 4075 template<typename Derived> 4076 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 4077 bool NotCopyInit) { 4078 // Initializers are instantiated like expressions, except that various outer 4079 // layers are stripped. 4080 if (!Init) 4081 return Init; 4082 4083 if (auto *FE = dyn_cast<FullExpr>(Init)) 4084 Init = FE->getSubExpr(); 4085 4086 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 4087 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 4088 Init = OVE->getSourceExpr(); 4089 } 4090 4091 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 4092 Init = MTE->getSubExpr(); 4093 4094 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 4095 Init = Binder->getSubExpr(); 4096 4097 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 4098 Init = ICE->getSubExprAsWritten(); 4099 4100 if (CXXStdInitializerListExpr *ILE = 4101 dyn_cast<CXXStdInitializerListExpr>(Init)) 4102 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 4103 4104 // If this is copy-initialization, we only need to reconstruct 4105 // InitListExprs. Other forms of copy-initialization will be a no-op if 4106 // the initializer is already the right type. 4107 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 4108 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 4109 return getDerived().TransformExpr(Init); 4110 4111 // Revert value-initialization back to empty parens. 4112 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 4113 SourceRange Parens = VIE->getSourceRange(); 4114 return getDerived().RebuildParenListExpr(Parens.getBegin(), std::nullopt, 4115 Parens.getEnd()); 4116 } 4117 4118 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 4119 if (isa<ImplicitValueInitExpr>(Init)) 4120 return getDerived().RebuildParenListExpr(SourceLocation(), std::nullopt, 4121 SourceLocation()); 4122 4123 // Revert initialization by constructor back to a parenthesized or braced list 4124 // of expressions. Any other form of initializer can just be reused directly. 4125 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 4126 return getDerived().TransformExpr(Init); 4127 4128 // If the initialization implicitly converted an initializer list to a 4129 // std::initializer_list object, unwrap the std::initializer_list too. 4130 if (Construct && Construct->isStdInitListInitialization()) 4131 return TransformInitializer(Construct->getArg(0), NotCopyInit); 4132 4133 // Enter a list-init context if this was list initialization. 4134 EnterExpressionEvaluationContext Context( 4135 getSema(), EnterExpressionEvaluationContext::InitList, 4136 Construct->isListInitialization()); 4137 4138 SmallVector<Expr*, 8> NewArgs; 4139 bool ArgChanged = false; 4140 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 4141 /*IsCall*/true, NewArgs, &ArgChanged)) 4142 return ExprError(); 4143 4144 // If this was list initialization, revert to syntactic list form. 4145 if (Construct->isListInitialization()) 4146 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 4147 Construct->getEndLoc()); 4148 4149 // Build a ParenListExpr to represent anything else. 4150 SourceRange Parens = Construct->getParenOrBraceRange(); 4151 if (Parens.isInvalid()) { 4152 // This was a variable declaration's initialization for which no initializer 4153 // was specified. 4154 assert(NewArgs.empty() && 4155 "no parens or braces but have direct init with arguments?"); 4156 return ExprEmpty(); 4157 } 4158 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 4159 Parens.getEnd()); 4160 } 4161 4162 template<typename Derived> 4163 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 4164 unsigned NumInputs, 4165 bool IsCall, 4166 SmallVectorImpl<Expr *> &Outputs, 4167 bool *ArgChanged) { 4168 for (unsigned I = 0; I != NumInputs; ++I) { 4169 // If requested, drop call arguments that need to be dropped. 4170 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 4171 if (ArgChanged) 4172 *ArgChanged = true; 4173 4174 break; 4175 } 4176 4177 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 4178 Expr *Pattern = Expansion->getPattern(); 4179 4180 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4181 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4182 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4183 4184 // Determine whether the set of unexpanded parameter packs can and should 4185 // be expanded. 4186 bool Expand = true; 4187 bool RetainExpansion = false; 4188 std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 4189 std::optional<unsigned> NumExpansions = OrigNumExpansions; 4190 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 4191 Pattern->getSourceRange(), 4192 Unexpanded, 4193 Expand, RetainExpansion, 4194 NumExpansions)) 4195 return true; 4196 4197 if (!Expand) { 4198 // The transform has determined that we should perform a simple 4199 // transformation on the pack expansion, producing another pack 4200 // expansion. 4201 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4202 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 4203 if (OutPattern.isInvalid()) 4204 return true; 4205 4206 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 4207 Expansion->getEllipsisLoc(), 4208 NumExpansions); 4209 if (Out.isInvalid()) 4210 return true; 4211 4212 if (ArgChanged) 4213 *ArgChanged = true; 4214 Outputs.push_back(Out.get()); 4215 continue; 4216 } 4217 4218 // Record right away that the argument was changed. This needs 4219 // to happen even if the array expands to nothing. 4220 if (ArgChanged) *ArgChanged = true; 4221 4222 // The transform has determined that we should perform an elementwise 4223 // expansion of the pattern. Do so. 4224 for (unsigned I = 0; I != *NumExpansions; ++I) { 4225 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4226 ExprResult Out = getDerived().TransformExpr(Pattern); 4227 if (Out.isInvalid()) 4228 return true; 4229 4230 if (Out.get()->containsUnexpandedParameterPack()) { 4231 Out = getDerived().RebuildPackExpansion( 4232 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4233 if (Out.isInvalid()) 4234 return true; 4235 } 4236 4237 Outputs.push_back(Out.get()); 4238 } 4239 4240 // If we're supposed to retain a pack expansion, do so by temporarily 4241 // forgetting the partially-substituted parameter pack. 4242 if (RetainExpansion) { 4243 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4244 4245 ExprResult Out = getDerived().TransformExpr(Pattern); 4246 if (Out.isInvalid()) 4247 return true; 4248 4249 Out = getDerived().RebuildPackExpansion( 4250 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4251 if (Out.isInvalid()) 4252 return true; 4253 4254 Outputs.push_back(Out.get()); 4255 } 4256 4257 continue; 4258 } 4259 4260 ExprResult Result = 4261 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4262 : getDerived().TransformExpr(Inputs[I]); 4263 if (Result.isInvalid()) 4264 return true; 4265 4266 if (Result.get() != Inputs[I] && ArgChanged) 4267 *ArgChanged = true; 4268 4269 Outputs.push_back(Result.get()); 4270 } 4271 4272 return false; 4273 } 4274 4275 template <typename Derived> 4276 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4277 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4278 if (Var) { 4279 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4280 getDerived().TransformDefinition(Var->getLocation(), Var)); 4281 4282 if (!ConditionVar) 4283 return Sema::ConditionError(); 4284 4285 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4286 } 4287 4288 if (Expr) { 4289 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4290 4291 if (CondExpr.isInvalid()) 4292 return Sema::ConditionError(); 4293 4294 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind, 4295 /*MissingOK=*/true); 4296 } 4297 4298 return Sema::ConditionResult(); 4299 } 4300 4301 template <typename Derived> 4302 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4303 NestedNameSpecifierLoc NNS, QualType ObjectType, 4304 NamedDecl *FirstQualifierInScope) { 4305 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4306 4307 auto insertNNS = [&Qualifiers](NestedNameSpecifierLoc NNS) { 4308 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4309 Qualifier = Qualifier.getPrefix()) 4310 Qualifiers.push_back(Qualifier); 4311 }; 4312 insertNNS(NNS); 4313 4314 CXXScopeSpec SS; 4315 while (!Qualifiers.empty()) { 4316 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4317 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4318 4319 switch (QNNS->getKind()) { 4320 case NestedNameSpecifier::Identifier: { 4321 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4322 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4323 ObjectType); 4324 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4325 SS, FirstQualifierInScope, false)) 4326 return NestedNameSpecifierLoc(); 4327 break; 4328 } 4329 4330 case NestedNameSpecifier::Namespace: { 4331 NamespaceDecl *NS = 4332 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4333 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4334 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4335 break; 4336 } 4337 4338 case NestedNameSpecifier::NamespaceAlias: { 4339 NamespaceAliasDecl *Alias = 4340 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4341 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4342 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4343 Q.getLocalEndLoc()); 4344 break; 4345 } 4346 4347 case NestedNameSpecifier::Global: 4348 // There is no meaningful transformation that one could perform on the 4349 // global scope. 4350 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4351 break; 4352 4353 case NestedNameSpecifier::Super: { 4354 CXXRecordDecl *RD = 4355 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4356 SourceLocation(), QNNS->getAsRecordDecl())); 4357 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4358 break; 4359 } 4360 4361 case NestedNameSpecifier::TypeSpecWithTemplate: 4362 case NestedNameSpecifier::TypeSpec: { 4363 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4364 FirstQualifierInScope, SS); 4365 4366 if (!TL) 4367 return NestedNameSpecifierLoc(); 4368 4369 QualType T = TL.getType(); 4370 if (T->isDependentType() || T->isRecordType() || 4371 (SemaRef.getLangOpts().CPlusPlus11 && T->isEnumeralType())) { 4372 if (T->isEnumeralType()) 4373 SemaRef.Diag(TL.getBeginLoc(), 4374 diag::warn_cxx98_compat_enum_nested_name_spec); 4375 4376 if (const auto ETL = TL.getAs<ElaboratedTypeLoc>()) { 4377 SS.Adopt(ETL.getQualifierLoc()); 4378 TL = ETL.getNamedTypeLoc(); 4379 } 4380 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4381 Q.getLocalEndLoc()); 4382 break; 4383 } 4384 // If the nested-name-specifier is an invalid type def, don't emit an 4385 // error because a previous error should have already been emitted. 4386 TypedefTypeLoc TTL = TL.getAsAdjusted<TypedefTypeLoc>(); 4387 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4388 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4389 << T << SS.getRange(); 4390 } 4391 return NestedNameSpecifierLoc(); 4392 } 4393 } 4394 4395 // The qualifier-in-scope and object type only apply to the leftmost entity. 4396 FirstQualifierInScope = nullptr; 4397 ObjectType = QualType(); 4398 } 4399 4400 // Don't rebuild the nested-name-specifier if we don't have to. 4401 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4402 !getDerived().AlwaysRebuild()) 4403 return NNS; 4404 4405 // If we can re-use the source-location data from the original 4406 // nested-name-specifier, do so. 4407 if (SS.location_size() == NNS.getDataLength() && 4408 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4409 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4410 4411 // Allocate new nested-name-specifier location information. 4412 return SS.getWithLocInContext(SemaRef.Context); 4413 } 4414 4415 template<typename Derived> 4416 DeclarationNameInfo 4417 TreeTransform<Derived> 4418 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4419 DeclarationName Name = NameInfo.getName(); 4420 if (!Name) 4421 return DeclarationNameInfo(); 4422 4423 switch (Name.getNameKind()) { 4424 case DeclarationName::Identifier: 4425 case DeclarationName::ObjCZeroArgSelector: 4426 case DeclarationName::ObjCOneArgSelector: 4427 case DeclarationName::ObjCMultiArgSelector: 4428 case DeclarationName::CXXOperatorName: 4429 case DeclarationName::CXXLiteralOperatorName: 4430 case DeclarationName::CXXUsingDirective: 4431 return NameInfo; 4432 4433 case DeclarationName::CXXDeductionGuideName: { 4434 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4435 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4436 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4437 if (!NewTemplate) 4438 return DeclarationNameInfo(); 4439 4440 DeclarationNameInfo NewNameInfo(NameInfo); 4441 NewNameInfo.setName( 4442 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4443 return NewNameInfo; 4444 } 4445 4446 case DeclarationName::CXXConstructorName: 4447 case DeclarationName::CXXDestructorName: 4448 case DeclarationName::CXXConversionFunctionName: { 4449 TypeSourceInfo *NewTInfo; 4450 CanQualType NewCanTy; 4451 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4452 NewTInfo = getDerived().TransformType(OldTInfo); 4453 if (!NewTInfo) 4454 return DeclarationNameInfo(); 4455 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4456 } 4457 else { 4458 NewTInfo = nullptr; 4459 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4460 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4461 if (NewT.isNull()) 4462 return DeclarationNameInfo(); 4463 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4464 } 4465 4466 DeclarationName NewName 4467 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4468 NewCanTy); 4469 DeclarationNameInfo NewNameInfo(NameInfo); 4470 NewNameInfo.setName(NewName); 4471 NewNameInfo.setNamedTypeInfo(NewTInfo); 4472 return NewNameInfo; 4473 } 4474 } 4475 4476 llvm_unreachable("Unknown name kind."); 4477 } 4478 4479 template<typename Derived> 4480 TemplateName 4481 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4482 TemplateName Name, 4483 SourceLocation NameLoc, 4484 QualType ObjectType, 4485 NamedDecl *FirstQualifierInScope, 4486 bool AllowInjectedClassName) { 4487 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4488 TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl(); 4489 assert(Template && "qualified template name must refer to a template"); 4490 4491 TemplateDecl *TransTemplate 4492 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4493 Template)); 4494 if (!TransTemplate) 4495 return TemplateName(); 4496 4497 if (!getDerived().AlwaysRebuild() && 4498 SS.getScopeRep() == QTN->getQualifier() && 4499 TransTemplate == Template) 4500 return Name; 4501 4502 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4503 TransTemplate); 4504 } 4505 4506 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4507 if (SS.getScopeRep()) { 4508 // These apply to the scope specifier, not the template. 4509 ObjectType = QualType(); 4510 FirstQualifierInScope = nullptr; 4511 } 4512 4513 if (!getDerived().AlwaysRebuild() && 4514 SS.getScopeRep() == DTN->getQualifier() && 4515 ObjectType.isNull()) 4516 return Name; 4517 4518 // FIXME: Preserve the location of the "template" keyword. 4519 SourceLocation TemplateKWLoc = NameLoc; 4520 4521 if (DTN->isIdentifier()) { 4522 return getDerived().RebuildTemplateName(SS, 4523 TemplateKWLoc, 4524 *DTN->getIdentifier(), 4525 NameLoc, 4526 ObjectType, 4527 FirstQualifierInScope, 4528 AllowInjectedClassName); 4529 } 4530 4531 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4532 DTN->getOperator(), NameLoc, 4533 ObjectType, AllowInjectedClassName); 4534 } 4535 4536 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4537 TemplateDecl *TransTemplate 4538 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4539 Template)); 4540 if (!TransTemplate) 4541 return TemplateName(); 4542 4543 if (!getDerived().AlwaysRebuild() && 4544 TransTemplate == Template) 4545 return Name; 4546 4547 return TemplateName(TransTemplate); 4548 } 4549 4550 if (SubstTemplateTemplateParmPackStorage *SubstPack 4551 = Name.getAsSubstTemplateTemplateParmPack()) { 4552 return getDerived().RebuildTemplateName( 4553 SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(), 4554 SubstPack->getIndex(), SubstPack->getFinal()); 4555 } 4556 4557 // These should be getting filtered out before they reach the AST. 4558 llvm_unreachable("overloaded function decl survived to here"); 4559 } 4560 4561 template<typename Derived> 4562 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4563 const TemplateArgument &Arg, 4564 TemplateArgumentLoc &Output) { 4565 Output = getSema().getTrivialTemplateArgumentLoc( 4566 Arg, QualType(), getDerived().getBaseLocation()); 4567 } 4568 4569 template <typename Derived> 4570 bool TreeTransform<Derived>::TransformTemplateArgument( 4571 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4572 bool Uneval) { 4573 const TemplateArgument &Arg = Input.getArgument(); 4574 switch (Arg.getKind()) { 4575 case TemplateArgument::Null: 4576 case TemplateArgument::Pack: 4577 llvm_unreachable("Unexpected TemplateArgument"); 4578 4579 case TemplateArgument::Integral: 4580 case TemplateArgument::NullPtr: 4581 case TemplateArgument::Declaration: 4582 case TemplateArgument::StructuralValue: { 4583 // Transform a resolved template argument straight to a resolved template 4584 // argument. We get here when substituting into an already-substituted 4585 // template type argument during concept satisfaction checking. 4586 QualType T = Arg.getNonTypeTemplateArgumentType(); 4587 QualType NewT = getDerived().TransformType(T); 4588 if (NewT.isNull()) 4589 return true; 4590 4591 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4592 ? Arg.getAsDecl() 4593 : nullptr; 4594 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4595 getDerived().getBaseLocation(), D)) 4596 : nullptr; 4597 if (D && !NewD) 4598 return true; 4599 4600 if (NewT == T && D == NewD) 4601 Output = Input; 4602 else if (Arg.getKind() == TemplateArgument::Integral) 4603 Output = TemplateArgumentLoc( 4604 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4605 TemplateArgumentLocInfo()); 4606 else if (Arg.getKind() == TemplateArgument::NullPtr) 4607 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4608 TemplateArgumentLocInfo()); 4609 else if (Arg.getKind() == TemplateArgument::Declaration) 4610 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4611 TemplateArgumentLocInfo()); 4612 else if (Arg.getKind() == TemplateArgument::StructuralValue) 4613 Output = TemplateArgumentLoc( 4614 TemplateArgument(getSema().Context, NewT, Arg.getAsStructuralValue()), 4615 TemplateArgumentLocInfo()); 4616 else 4617 llvm_unreachable("unexpected template argument kind"); 4618 4619 return false; 4620 } 4621 4622 case TemplateArgument::Type: { 4623 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4624 if (!DI) 4625 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4626 4627 DI = getDerived().TransformType(DI); 4628 if (!DI) 4629 return true; 4630 4631 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4632 return false; 4633 } 4634 4635 case TemplateArgument::Template: { 4636 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4637 if (QualifierLoc) { 4638 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4639 if (!QualifierLoc) 4640 return true; 4641 } 4642 4643 CXXScopeSpec SS; 4644 SS.Adopt(QualifierLoc); 4645 TemplateName Template = getDerived().TransformTemplateName( 4646 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4647 if (Template.isNull()) 4648 return true; 4649 4650 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4651 QualifierLoc, Input.getTemplateNameLoc()); 4652 return false; 4653 } 4654 4655 case TemplateArgument::TemplateExpansion: 4656 llvm_unreachable("Caller should expand pack expansions"); 4657 4658 case TemplateArgument::Expression: { 4659 // Template argument expressions are constant expressions. 4660 EnterExpressionEvaluationContext Unevaluated( 4661 getSema(), 4662 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4663 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4664 Sema::ReuseLambdaContextDecl, /*ExprContext=*/ 4665 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4666 4667 Expr *InputExpr = Input.getSourceExpression(); 4668 if (!InputExpr) 4669 InputExpr = Input.getArgument().getAsExpr(); 4670 4671 ExprResult E = getDerived().TransformExpr(InputExpr); 4672 E = SemaRef.ActOnConstantExpression(E); 4673 if (E.isInvalid()) 4674 return true; 4675 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4676 return false; 4677 } 4678 } 4679 4680 // Work around bogus GCC warning 4681 return true; 4682 } 4683 4684 /// Iterator adaptor that invents template argument location information 4685 /// for each of the template arguments in its underlying iterator. 4686 template<typename Derived, typename InputIterator> 4687 class TemplateArgumentLocInventIterator { 4688 TreeTransform<Derived> &Self; 4689 InputIterator Iter; 4690 4691 public: 4692 typedef TemplateArgumentLoc value_type; 4693 typedef TemplateArgumentLoc reference; 4694 typedef typename std::iterator_traits<InputIterator>::difference_type 4695 difference_type; 4696 typedef std::input_iterator_tag iterator_category; 4697 4698 class pointer { 4699 TemplateArgumentLoc Arg; 4700 4701 public: 4702 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4703 4704 const TemplateArgumentLoc *operator->() const { return &Arg; } 4705 }; 4706 4707 TemplateArgumentLocInventIterator() { } 4708 4709 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4710 InputIterator Iter) 4711 : Self(Self), Iter(Iter) { } 4712 4713 TemplateArgumentLocInventIterator &operator++() { 4714 ++Iter; 4715 return *this; 4716 } 4717 4718 TemplateArgumentLocInventIterator operator++(int) { 4719 TemplateArgumentLocInventIterator Old(*this); 4720 ++(*this); 4721 return Old; 4722 } 4723 4724 reference operator*() const { 4725 TemplateArgumentLoc Result; 4726 Self.InventTemplateArgumentLoc(*Iter, Result); 4727 return Result; 4728 } 4729 4730 pointer operator->() const { return pointer(**this); } 4731 4732 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4733 const TemplateArgumentLocInventIterator &Y) { 4734 return X.Iter == Y.Iter; 4735 } 4736 4737 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4738 const TemplateArgumentLocInventIterator &Y) { 4739 return X.Iter != Y.Iter; 4740 } 4741 }; 4742 4743 template<typename Derived> 4744 template<typename InputIterator> 4745 bool TreeTransform<Derived>::TransformTemplateArguments( 4746 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4747 bool Uneval) { 4748 for (; First != Last; ++First) { 4749 TemplateArgumentLoc Out; 4750 TemplateArgumentLoc In = *First; 4751 4752 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4753 // Unpack argument packs, which we translate them into separate 4754 // arguments. 4755 // FIXME: We could do much better if we could guarantee that the 4756 // TemplateArgumentLocInfo for the pack expansion would be usable for 4757 // all of the template arguments in the argument pack. 4758 typedef TemplateArgumentLocInventIterator<Derived, 4759 TemplateArgument::pack_iterator> 4760 PackLocIterator; 4761 if (TransformTemplateArguments(PackLocIterator(*this, 4762 In.getArgument().pack_begin()), 4763 PackLocIterator(*this, 4764 In.getArgument().pack_end()), 4765 Outputs, Uneval)) 4766 return true; 4767 4768 continue; 4769 } 4770 4771 if (In.getArgument().isPackExpansion()) { 4772 // We have a pack expansion, for which we will be substituting into 4773 // the pattern. 4774 SourceLocation Ellipsis; 4775 std::optional<unsigned> OrigNumExpansions; 4776 TemplateArgumentLoc Pattern 4777 = getSema().getTemplateArgumentPackExpansionPattern( 4778 In, Ellipsis, OrigNumExpansions); 4779 4780 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4781 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4782 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4783 4784 // Determine whether the set of unexpanded parameter packs can and should 4785 // be expanded. 4786 bool Expand = true; 4787 bool RetainExpansion = false; 4788 std::optional<unsigned> NumExpansions = OrigNumExpansions; 4789 if (getDerived().TryExpandParameterPacks(Ellipsis, 4790 Pattern.getSourceRange(), 4791 Unexpanded, 4792 Expand, 4793 RetainExpansion, 4794 NumExpansions)) 4795 return true; 4796 4797 if (!Expand) { 4798 // The transform has determined that we should perform a simple 4799 // transformation on the pack expansion, producing another pack 4800 // expansion. 4801 TemplateArgumentLoc OutPattern; 4802 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4803 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4804 return true; 4805 4806 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4807 NumExpansions); 4808 if (Out.getArgument().isNull()) 4809 return true; 4810 4811 Outputs.addArgument(Out); 4812 continue; 4813 } 4814 4815 // The transform has determined that we should perform an elementwise 4816 // expansion of the pattern. Do so. 4817 for (unsigned I = 0; I != *NumExpansions; ++I) { 4818 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4819 4820 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4821 return true; 4822 4823 if (Out.getArgument().containsUnexpandedParameterPack()) { 4824 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4825 OrigNumExpansions); 4826 if (Out.getArgument().isNull()) 4827 return true; 4828 } 4829 4830 Outputs.addArgument(Out); 4831 } 4832 4833 // If we're supposed to retain a pack expansion, do so by temporarily 4834 // forgetting the partially-substituted parameter pack. 4835 if (RetainExpansion) { 4836 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4837 4838 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4839 return true; 4840 4841 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4842 OrigNumExpansions); 4843 if (Out.getArgument().isNull()) 4844 return true; 4845 4846 Outputs.addArgument(Out); 4847 } 4848 4849 continue; 4850 } 4851 4852 // The simple case: 4853 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4854 return true; 4855 4856 Outputs.addArgument(Out); 4857 } 4858 4859 return false; 4860 4861 } 4862 4863 //===----------------------------------------------------------------------===// 4864 // Type transformation 4865 //===----------------------------------------------------------------------===// 4866 4867 template<typename Derived> 4868 QualType TreeTransform<Derived>::TransformType(QualType T) { 4869 if (getDerived().AlreadyTransformed(T)) 4870 return T; 4871 4872 // Temporary workaround. All of these transformations should 4873 // eventually turn into transformations on TypeLocs. 4874 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4875 getDerived().getBaseLocation()); 4876 4877 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4878 4879 if (!NewDI) 4880 return QualType(); 4881 4882 return NewDI->getType(); 4883 } 4884 4885 template<typename Derived> 4886 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4887 // Refine the base location to the type's location. 4888 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4889 getDerived().getBaseEntity()); 4890 if (getDerived().AlreadyTransformed(DI->getType())) 4891 return DI; 4892 4893 TypeLocBuilder TLB; 4894 4895 TypeLoc TL = DI->getTypeLoc(); 4896 TLB.reserve(TL.getFullDataSize()); 4897 4898 QualType Result = getDerived().TransformType(TLB, TL); 4899 if (Result.isNull()) 4900 return nullptr; 4901 4902 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4903 } 4904 4905 template<typename Derived> 4906 QualType 4907 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4908 switch (T.getTypeLocClass()) { 4909 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4910 #define TYPELOC(CLASS, PARENT) \ 4911 case TypeLoc::CLASS: \ 4912 return getDerived().Transform##CLASS##Type(TLB, \ 4913 T.castAs<CLASS##TypeLoc>()); 4914 #include "clang/AST/TypeLocNodes.def" 4915 } 4916 4917 llvm_unreachable("unhandled type loc!"); 4918 } 4919 4920 template<typename Derived> 4921 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4922 if (!isa<DependentNameType>(T)) 4923 return TransformType(T); 4924 4925 if (getDerived().AlreadyTransformed(T)) 4926 return T; 4927 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4928 getDerived().getBaseLocation()); 4929 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4930 return NewDI ? NewDI->getType() : QualType(); 4931 } 4932 4933 template<typename Derived> 4934 TypeSourceInfo * 4935 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4936 if (!isa<DependentNameType>(DI->getType())) 4937 return TransformType(DI); 4938 4939 // Refine the base location to the type's location. 4940 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4941 getDerived().getBaseEntity()); 4942 if (getDerived().AlreadyTransformed(DI->getType())) 4943 return DI; 4944 4945 TypeLocBuilder TLB; 4946 4947 TypeLoc TL = DI->getTypeLoc(); 4948 TLB.reserve(TL.getFullDataSize()); 4949 4950 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4951 if (QTL) 4952 TL = QTL.getUnqualifiedLoc(); 4953 4954 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4955 4956 QualType Result = getDerived().TransformDependentNameType( 4957 TLB, DNTL, /*DeducedTSTContext*/true); 4958 if (Result.isNull()) 4959 return nullptr; 4960 4961 if (QTL) { 4962 Result = getDerived().RebuildQualifiedType(Result, QTL); 4963 if (Result.isNull()) 4964 return nullptr; 4965 TLB.TypeWasModifiedSafely(Result); 4966 } 4967 4968 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4969 } 4970 4971 template<typename Derived> 4972 QualType 4973 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4974 QualifiedTypeLoc T) { 4975 QualType Result; 4976 TypeLoc UnqualTL = T.getUnqualifiedLoc(); 4977 auto SuppressObjCLifetime = 4978 T.getType().getLocalQualifiers().hasObjCLifetime(); 4979 if (auto TTP = UnqualTL.getAs<TemplateTypeParmTypeLoc>()) { 4980 Result = getDerived().TransformTemplateTypeParmType(TLB, TTP, 4981 SuppressObjCLifetime); 4982 } else if (auto STTP = UnqualTL.getAs<SubstTemplateTypeParmPackTypeLoc>()) { 4983 Result = getDerived().TransformSubstTemplateTypeParmPackType( 4984 TLB, STTP, SuppressObjCLifetime); 4985 } else { 4986 Result = getDerived().TransformType(TLB, UnqualTL); 4987 } 4988 4989 if (Result.isNull()) 4990 return QualType(); 4991 4992 Result = getDerived().RebuildQualifiedType(Result, T); 4993 4994 if (Result.isNull()) 4995 return QualType(); 4996 4997 // RebuildQualifiedType might have updated the type, but not in a way 4998 // that invalidates the TypeLoc. (There's no location information for 4999 // qualifiers.) 5000 TLB.TypeWasModifiedSafely(Result); 5001 5002 return Result; 5003 } 5004 5005 template <typename Derived> 5006 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 5007 QualifiedTypeLoc TL) { 5008 5009 SourceLocation Loc = TL.getBeginLoc(); 5010 Qualifiers Quals = TL.getType().getLocalQualifiers(); 5011 5012 if ((T.getAddressSpace() != LangAS::Default && 5013 Quals.getAddressSpace() != LangAS::Default) && 5014 T.getAddressSpace() != Quals.getAddressSpace()) { 5015 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 5016 << TL.getType() << T; 5017 return QualType(); 5018 } 5019 5020 // C++ [dcl.fct]p7: 5021 // [When] adding cv-qualifications on top of the function type [...] the 5022 // cv-qualifiers are ignored. 5023 if (T->isFunctionType()) { 5024 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 5025 Quals.getAddressSpace()); 5026 return T; 5027 } 5028 5029 // C++ [dcl.ref]p1: 5030 // when the cv-qualifiers are introduced through the use of a typedef-name 5031 // or decltype-specifier [...] the cv-qualifiers are ignored. 5032 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 5033 // applied to a reference type. 5034 if (T->isReferenceType()) { 5035 // The only qualifier that applies to a reference type is restrict. 5036 if (!Quals.hasRestrict()) 5037 return T; 5038 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 5039 } 5040 5041 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 5042 // resulting type. 5043 if (Quals.hasObjCLifetime()) { 5044 if (!T->isObjCLifetimeType() && !T->isDependentType()) 5045 Quals.removeObjCLifetime(); 5046 else if (T.getObjCLifetime()) { 5047 // Objective-C ARC: 5048 // A lifetime qualifier applied to a substituted template parameter 5049 // overrides the lifetime qualifier from the template argument. 5050 const AutoType *AutoTy; 5051 if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 5052 // 'auto' types behave the same way as template parameters. 5053 QualType Deduced = AutoTy->getDeducedType(); 5054 Qualifiers Qs = Deduced.getQualifiers(); 5055 Qs.removeObjCLifetime(); 5056 Deduced = 5057 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 5058 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 5059 AutoTy->isDependentType(), 5060 /*isPack=*/false, 5061 AutoTy->getTypeConstraintConcept(), 5062 AutoTy->getTypeConstraintArguments()); 5063 } else { 5064 // Otherwise, complain about the addition of a qualifier to an 5065 // already-qualified type. 5066 // FIXME: Why is this check not in Sema::BuildQualifiedType? 5067 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 5068 Quals.removeObjCLifetime(); 5069 } 5070 } 5071 } 5072 5073 return SemaRef.BuildQualifiedType(T, Loc, Quals); 5074 } 5075 5076 template<typename Derived> 5077 TypeLoc 5078 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 5079 QualType ObjectType, 5080 NamedDecl *UnqualLookup, 5081 CXXScopeSpec &SS) { 5082 if (getDerived().AlreadyTransformed(TL.getType())) 5083 return TL; 5084 5085 TypeSourceInfo *TSI = 5086 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 5087 if (TSI) 5088 return TSI->getTypeLoc(); 5089 return TypeLoc(); 5090 } 5091 5092 template<typename Derived> 5093 TypeSourceInfo * 5094 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 5095 QualType ObjectType, 5096 NamedDecl *UnqualLookup, 5097 CXXScopeSpec &SS) { 5098 if (getDerived().AlreadyTransformed(TSInfo->getType())) 5099 return TSInfo; 5100 5101 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 5102 UnqualLookup, SS); 5103 } 5104 5105 template <typename Derived> 5106 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 5107 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 5108 CXXScopeSpec &SS) { 5109 QualType T = TL.getType(); 5110 assert(!getDerived().AlreadyTransformed(T)); 5111 5112 TypeLocBuilder TLB; 5113 QualType Result; 5114 5115 if (isa<TemplateSpecializationType>(T)) { 5116 TemplateSpecializationTypeLoc SpecTL = 5117 TL.castAs<TemplateSpecializationTypeLoc>(); 5118 5119 TemplateName Template = getDerived().TransformTemplateName( 5120 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 5121 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 5122 if (Template.isNull()) 5123 return nullptr; 5124 5125 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 5126 Template); 5127 } else if (isa<DependentTemplateSpecializationType>(T)) { 5128 DependentTemplateSpecializationTypeLoc SpecTL = 5129 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 5130 5131 TemplateName Template 5132 = getDerived().RebuildTemplateName(SS, 5133 SpecTL.getTemplateKeywordLoc(), 5134 *SpecTL.getTypePtr()->getIdentifier(), 5135 SpecTL.getTemplateNameLoc(), 5136 ObjectType, UnqualLookup, 5137 /*AllowInjectedClassName*/true); 5138 if (Template.isNull()) 5139 return nullptr; 5140 5141 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 5142 SpecTL, 5143 Template, 5144 SS); 5145 } else { 5146 // Nothing special needs to be done for these. 5147 Result = getDerived().TransformType(TLB, TL); 5148 } 5149 5150 if (Result.isNull()) 5151 return nullptr; 5152 5153 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 5154 } 5155 5156 template <class TyLoc> static inline 5157 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 5158 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 5159 NewT.setNameLoc(T.getNameLoc()); 5160 return T.getType(); 5161 } 5162 5163 template<typename Derived> 5164 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 5165 BuiltinTypeLoc T) { 5166 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 5167 NewT.setBuiltinLoc(T.getBuiltinLoc()); 5168 if (T.needsExtraLocalData()) 5169 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 5170 return T.getType(); 5171 } 5172 5173 template<typename Derived> 5174 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 5175 ComplexTypeLoc T) { 5176 // FIXME: recurse? 5177 return TransformTypeSpecType(TLB, T); 5178 } 5179 5180 template <typename Derived> 5181 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 5182 AdjustedTypeLoc TL) { 5183 // Adjustments applied during transformation are handled elsewhere. 5184 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 5185 } 5186 5187 template<typename Derived> 5188 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 5189 DecayedTypeLoc TL) { 5190 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 5191 if (OriginalType.isNull()) 5192 return QualType(); 5193 5194 QualType Result = TL.getType(); 5195 if (getDerived().AlwaysRebuild() || 5196 OriginalType != TL.getOriginalLoc().getType()) 5197 Result = SemaRef.Context.getDecayedType(OriginalType); 5198 TLB.push<DecayedTypeLoc>(Result); 5199 // Nothing to set for DecayedTypeLoc. 5200 return Result; 5201 } 5202 5203 template<typename Derived> 5204 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 5205 PointerTypeLoc TL) { 5206 QualType PointeeType 5207 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5208 if (PointeeType.isNull()) 5209 return QualType(); 5210 5211 QualType Result = TL.getType(); 5212 if (PointeeType->getAs<ObjCObjectType>()) { 5213 // A dependent pointer type 'T *' has is being transformed such 5214 // that an Objective-C class type is being replaced for 'T'. The 5215 // resulting pointer type is an ObjCObjectPointerType, not a 5216 // PointerType. 5217 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 5218 5219 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 5220 NewT.setStarLoc(TL.getStarLoc()); 5221 return Result; 5222 } 5223 5224 if (getDerived().AlwaysRebuild() || 5225 PointeeType != TL.getPointeeLoc().getType()) { 5226 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 5227 if (Result.isNull()) 5228 return QualType(); 5229 } 5230 5231 // Objective-C ARC can add lifetime qualifiers to the type that we're 5232 // pointing to. 5233 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5234 5235 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5236 NewT.setSigilLoc(TL.getSigilLoc()); 5237 return Result; 5238 } 5239 5240 template<typename Derived> 5241 QualType 5242 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5243 BlockPointerTypeLoc TL) { 5244 QualType PointeeType 5245 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5246 if (PointeeType.isNull()) 5247 return QualType(); 5248 5249 QualType Result = TL.getType(); 5250 if (getDerived().AlwaysRebuild() || 5251 PointeeType != TL.getPointeeLoc().getType()) { 5252 Result = getDerived().RebuildBlockPointerType(PointeeType, 5253 TL.getSigilLoc()); 5254 if (Result.isNull()) 5255 return QualType(); 5256 } 5257 5258 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5259 NewT.setSigilLoc(TL.getSigilLoc()); 5260 return Result; 5261 } 5262 5263 /// Transforms a reference type. Note that somewhat paradoxically we 5264 /// don't care whether the type itself is an l-value type or an r-value 5265 /// type; we only care if the type was *written* as an l-value type 5266 /// or an r-value type. 5267 template<typename Derived> 5268 QualType 5269 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5270 ReferenceTypeLoc TL) { 5271 const ReferenceType *T = TL.getTypePtr(); 5272 5273 // Note that this works with the pointee-as-written. 5274 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5275 if (PointeeType.isNull()) 5276 return QualType(); 5277 5278 QualType Result = TL.getType(); 5279 if (getDerived().AlwaysRebuild() || 5280 PointeeType != T->getPointeeTypeAsWritten()) { 5281 Result = getDerived().RebuildReferenceType(PointeeType, 5282 T->isSpelledAsLValue(), 5283 TL.getSigilLoc()); 5284 if (Result.isNull()) 5285 return QualType(); 5286 } 5287 5288 // Objective-C ARC can add lifetime qualifiers to the type that we're 5289 // referring to. 5290 TLB.TypeWasModifiedSafely( 5291 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5292 5293 // r-value references can be rebuilt as l-value references. 5294 ReferenceTypeLoc NewTL; 5295 if (isa<LValueReferenceType>(Result)) 5296 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5297 else 5298 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5299 NewTL.setSigilLoc(TL.getSigilLoc()); 5300 5301 return Result; 5302 } 5303 5304 template<typename Derived> 5305 QualType 5306 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5307 LValueReferenceTypeLoc TL) { 5308 return TransformReferenceType(TLB, TL); 5309 } 5310 5311 template<typename Derived> 5312 QualType 5313 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5314 RValueReferenceTypeLoc TL) { 5315 return TransformReferenceType(TLB, TL); 5316 } 5317 5318 template<typename Derived> 5319 QualType 5320 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5321 MemberPointerTypeLoc TL) { 5322 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5323 if (PointeeType.isNull()) 5324 return QualType(); 5325 5326 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5327 TypeSourceInfo *NewClsTInfo = nullptr; 5328 if (OldClsTInfo) { 5329 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5330 if (!NewClsTInfo) 5331 return QualType(); 5332 } 5333 5334 const MemberPointerType *T = TL.getTypePtr(); 5335 QualType OldClsType = QualType(T->getClass(), 0); 5336 QualType NewClsType; 5337 if (NewClsTInfo) 5338 NewClsType = NewClsTInfo->getType(); 5339 else { 5340 NewClsType = getDerived().TransformType(OldClsType); 5341 if (NewClsType.isNull()) 5342 return QualType(); 5343 } 5344 5345 QualType Result = TL.getType(); 5346 if (getDerived().AlwaysRebuild() || 5347 PointeeType != T->getPointeeType() || 5348 NewClsType != OldClsType) { 5349 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5350 TL.getStarLoc()); 5351 if (Result.isNull()) 5352 return QualType(); 5353 } 5354 5355 // If we had to adjust the pointee type when building a member pointer, make 5356 // sure to push TypeLoc info for it. 5357 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5358 if (MPT && PointeeType != MPT->getPointeeType()) { 5359 assert(isa<AdjustedType>(MPT->getPointeeType())); 5360 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5361 } 5362 5363 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5364 NewTL.setSigilLoc(TL.getSigilLoc()); 5365 NewTL.setClassTInfo(NewClsTInfo); 5366 5367 return Result; 5368 } 5369 5370 template<typename Derived> 5371 QualType 5372 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5373 ConstantArrayTypeLoc TL) { 5374 const ConstantArrayType *T = TL.getTypePtr(); 5375 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5376 if (ElementType.isNull()) 5377 return QualType(); 5378 5379 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5380 Expr *OldSize = TL.getSizeExpr(); 5381 if (!OldSize) 5382 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5383 Expr *NewSize = nullptr; 5384 if (OldSize) { 5385 EnterExpressionEvaluationContext Unevaluated( 5386 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5387 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5388 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5389 } 5390 5391 QualType Result = TL.getType(); 5392 if (getDerived().AlwaysRebuild() || 5393 ElementType != T->getElementType() || 5394 (T->getSizeExpr() && NewSize != OldSize)) { 5395 Result = getDerived().RebuildConstantArrayType(ElementType, 5396 T->getSizeModifier(), 5397 T->getSize(), NewSize, 5398 T->getIndexTypeCVRQualifiers(), 5399 TL.getBracketsRange()); 5400 if (Result.isNull()) 5401 return QualType(); 5402 } 5403 5404 // We might have either a ConstantArrayType or a VariableArrayType now: 5405 // a ConstantArrayType is allowed to have an element type which is a 5406 // VariableArrayType if the type is dependent. Fortunately, all array 5407 // types have the same location layout. 5408 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5409 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5410 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5411 NewTL.setSizeExpr(NewSize); 5412 5413 return Result; 5414 } 5415 5416 template<typename Derived> 5417 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5418 TypeLocBuilder &TLB, 5419 IncompleteArrayTypeLoc TL) { 5420 const IncompleteArrayType *T = TL.getTypePtr(); 5421 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5422 if (ElementType.isNull()) 5423 return QualType(); 5424 5425 QualType Result = TL.getType(); 5426 if (getDerived().AlwaysRebuild() || 5427 ElementType != T->getElementType()) { 5428 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5429 T->getSizeModifier(), 5430 T->getIndexTypeCVRQualifiers(), 5431 TL.getBracketsRange()); 5432 if (Result.isNull()) 5433 return QualType(); 5434 } 5435 5436 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5437 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5438 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5439 NewTL.setSizeExpr(nullptr); 5440 5441 return Result; 5442 } 5443 5444 template<typename Derived> 5445 QualType 5446 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5447 VariableArrayTypeLoc TL) { 5448 const VariableArrayType *T = TL.getTypePtr(); 5449 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5450 if (ElementType.isNull()) 5451 return QualType(); 5452 5453 ExprResult SizeResult; 5454 { 5455 EnterExpressionEvaluationContext Context( 5456 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5457 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5458 } 5459 if (SizeResult.isInvalid()) 5460 return QualType(); 5461 SizeResult = 5462 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5463 if (SizeResult.isInvalid()) 5464 return QualType(); 5465 5466 Expr *Size = SizeResult.get(); 5467 5468 QualType Result = TL.getType(); 5469 if (getDerived().AlwaysRebuild() || 5470 ElementType != T->getElementType() || 5471 Size != T->getSizeExpr()) { 5472 Result = getDerived().RebuildVariableArrayType(ElementType, 5473 T->getSizeModifier(), 5474 Size, 5475 T->getIndexTypeCVRQualifiers(), 5476 TL.getBracketsRange()); 5477 if (Result.isNull()) 5478 return QualType(); 5479 } 5480 5481 // We might have constant size array now, but fortunately it has the same 5482 // location layout. 5483 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5484 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5485 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5486 NewTL.setSizeExpr(Size); 5487 5488 return Result; 5489 } 5490 5491 template<typename Derived> 5492 QualType 5493 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5494 DependentSizedArrayTypeLoc TL) { 5495 const DependentSizedArrayType *T = TL.getTypePtr(); 5496 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5497 if (ElementType.isNull()) 5498 return QualType(); 5499 5500 // Array bounds are constant expressions. 5501 EnterExpressionEvaluationContext Unevaluated( 5502 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5503 5504 // If we have a VLA then it won't be a constant. 5505 SemaRef.ExprEvalContexts.back().InConditionallyConstantEvaluateContext = true; 5506 5507 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5508 Expr *origSize = TL.getSizeExpr(); 5509 if (!origSize) origSize = T->getSizeExpr(); 5510 5511 ExprResult sizeResult 5512 = getDerived().TransformExpr(origSize); 5513 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5514 if (sizeResult.isInvalid()) 5515 return QualType(); 5516 5517 Expr *size = sizeResult.get(); 5518 5519 QualType Result = TL.getType(); 5520 if (getDerived().AlwaysRebuild() || 5521 ElementType != T->getElementType() || 5522 size != origSize) { 5523 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5524 T->getSizeModifier(), 5525 size, 5526 T->getIndexTypeCVRQualifiers(), 5527 TL.getBracketsRange()); 5528 if (Result.isNull()) 5529 return QualType(); 5530 } 5531 5532 // We might have any sort of array type now, but fortunately they 5533 // all have the same location layout. 5534 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5535 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5536 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5537 NewTL.setSizeExpr(size); 5538 5539 return Result; 5540 } 5541 5542 template <typename Derived> 5543 QualType TreeTransform<Derived>::TransformDependentVectorType( 5544 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5545 const DependentVectorType *T = TL.getTypePtr(); 5546 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5547 if (ElementType.isNull()) 5548 return QualType(); 5549 5550 EnterExpressionEvaluationContext Unevaluated( 5551 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5552 5553 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5554 Size = SemaRef.ActOnConstantExpression(Size); 5555 if (Size.isInvalid()) 5556 return QualType(); 5557 5558 QualType Result = TL.getType(); 5559 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5560 Size.get() != T->getSizeExpr()) { 5561 Result = getDerived().RebuildDependentVectorType( 5562 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5563 if (Result.isNull()) 5564 return QualType(); 5565 } 5566 5567 // Result might be dependent or not. 5568 if (isa<DependentVectorType>(Result)) { 5569 DependentVectorTypeLoc NewTL = 5570 TLB.push<DependentVectorTypeLoc>(Result); 5571 NewTL.setNameLoc(TL.getNameLoc()); 5572 } else { 5573 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5574 NewTL.setNameLoc(TL.getNameLoc()); 5575 } 5576 5577 return Result; 5578 } 5579 5580 template<typename Derived> 5581 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5582 TypeLocBuilder &TLB, 5583 DependentSizedExtVectorTypeLoc TL) { 5584 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5585 5586 // FIXME: ext vector locs should be nested 5587 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5588 if (ElementType.isNull()) 5589 return QualType(); 5590 5591 // Vector sizes are constant expressions. 5592 EnterExpressionEvaluationContext Unevaluated( 5593 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5594 5595 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5596 Size = SemaRef.ActOnConstantExpression(Size); 5597 if (Size.isInvalid()) 5598 return QualType(); 5599 5600 QualType Result = TL.getType(); 5601 if (getDerived().AlwaysRebuild() || 5602 ElementType != T->getElementType() || 5603 Size.get() != T->getSizeExpr()) { 5604 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5605 Size.get(), 5606 T->getAttributeLoc()); 5607 if (Result.isNull()) 5608 return QualType(); 5609 } 5610 5611 // Result might be dependent or not. 5612 if (isa<DependentSizedExtVectorType>(Result)) { 5613 DependentSizedExtVectorTypeLoc NewTL 5614 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5615 NewTL.setNameLoc(TL.getNameLoc()); 5616 } else { 5617 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5618 NewTL.setNameLoc(TL.getNameLoc()); 5619 } 5620 5621 return Result; 5622 } 5623 5624 template <typename Derived> 5625 QualType 5626 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5627 ConstantMatrixTypeLoc TL) { 5628 const ConstantMatrixType *T = TL.getTypePtr(); 5629 QualType ElementType = getDerived().TransformType(T->getElementType()); 5630 if (ElementType.isNull()) 5631 return QualType(); 5632 5633 QualType Result = TL.getType(); 5634 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5635 Result = getDerived().RebuildConstantMatrixType( 5636 ElementType, T->getNumRows(), T->getNumColumns()); 5637 if (Result.isNull()) 5638 return QualType(); 5639 } 5640 5641 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5642 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5643 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5644 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5645 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5646 5647 return Result; 5648 } 5649 5650 template <typename Derived> 5651 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5652 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5653 const DependentSizedMatrixType *T = TL.getTypePtr(); 5654 5655 QualType ElementType = getDerived().TransformType(T->getElementType()); 5656 if (ElementType.isNull()) { 5657 return QualType(); 5658 } 5659 5660 // Matrix dimensions are constant expressions. 5661 EnterExpressionEvaluationContext Unevaluated( 5662 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5663 5664 Expr *origRows = TL.getAttrRowOperand(); 5665 if (!origRows) 5666 origRows = T->getRowExpr(); 5667 Expr *origColumns = TL.getAttrColumnOperand(); 5668 if (!origColumns) 5669 origColumns = T->getColumnExpr(); 5670 5671 ExprResult rowResult = getDerived().TransformExpr(origRows); 5672 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5673 if (rowResult.isInvalid()) 5674 return QualType(); 5675 5676 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5677 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5678 if (columnResult.isInvalid()) 5679 return QualType(); 5680 5681 Expr *rows = rowResult.get(); 5682 Expr *columns = columnResult.get(); 5683 5684 QualType Result = TL.getType(); 5685 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5686 rows != origRows || columns != origColumns) { 5687 Result = getDerived().RebuildDependentSizedMatrixType( 5688 ElementType, rows, columns, T->getAttributeLoc()); 5689 5690 if (Result.isNull()) 5691 return QualType(); 5692 } 5693 5694 // We might have any sort of matrix type now, but fortunately they 5695 // all have the same location layout. 5696 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5697 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5698 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5699 NewTL.setAttrRowOperand(rows); 5700 NewTL.setAttrColumnOperand(columns); 5701 return Result; 5702 } 5703 5704 template <typename Derived> 5705 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5706 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5707 const DependentAddressSpaceType *T = TL.getTypePtr(); 5708 5709 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5710 5711 if (pointeeType.isNull()) 5712 return QualType(); 5713 5714 // Address spaces are constant expressions. 5715 EnterExpressionEvaluationContext Unevaluated( 5716 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5717 5718 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5719 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5720 if (AddrSpace.isInvalid()) 5721 return QualType(); 5722 5723 QualType Result = TL.getType(); 5724 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5725 AddrSpace.get() != T->getAddrSpaceExpr()) { 5726 Result = getDerived().RebuildDependentAddressSpaceType( 5727 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5728 if (Result.isNull()) 5729 return QualType(); 5730 } 5731 5732 // Result might be dependent or not. 5733 if (isa<DependentAddressSpaceType>(Result)) { 5734 DependentAddressSpaceTypeLoc NewTL = 5735 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5736 5737 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5738 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5739 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5740 5741 } else { 5742 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5743 Result, getDerived().getBaseLocation()); 5744 TransformType(TLB, DI->getTypeLoc()); 5745 } 5746 5747 return Result; 5748 } 5749 5750 template <typename Derived> 5751 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5752 VectorTypeLoc TL) { 5753 const VectorType *T = TL.getTypePtr(); 5754 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5755 if (ElementType.isNull()) 5756 return QualType(); 5757 5758 QualType Result = TL.getType(); 5759 if (getDerived().AlwaysRebuild() || 5760 ElementType != T->getElementType()) { 5761 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5762 T->getVectorKind()); 5763 if (Result.isNull()) 5764 return QualType(); 5765 } 5766 5767 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5768 NewTL.setNameLoc(TL.getNameLoc()); 5769 5770 return Result; 5771 } 5772 5773 template<typename Derived> 5774 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5775 ExtVectorTypeLoc TL) { 5776 const VectorType *T = TL.getTypePtr(); 5777 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5778 if (ElementType.isNull()) 5779 return QualType(); 5780 5781 QualType Result = TL.getType(); 5782 if (getDerived().AlwaysRebuild() || 5783 ElementType != T->getElementType()) { 5784 Result = getDerived().RebuildExtVectorType(ElementType, 5785 T->getNumElements(), 5786 /*FIXME*/ SourceLocation()); 5787 if (Result.isNull()) 5788 return QualType(); 5789 } 5790 5791 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5792 NewTL.setNameLoc(TL.getNameLoc()); 5793 5794 return Result; 5795 } 5796 5797 template <typename Derived> 5798 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5799 ParmVarDecl *OldParm, int indexAdjustment, 5800 std::optional<unsigned> NumExpansions, bool ExpectParameterPack) { 5801 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5802 TypeSourceInfo *NewDI = nullptr; 5803 5804 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5805 // If we're substituting into a pack expansion type and we know the 5806 // length we want to expand to, just substitute for the pattern. 5807 TypeLoc OldTL = OldDI->getTypeLoc(); 5808 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5809 5810 TypeLocBuilder TLB; 5811 TypeLoc NewTL = OldDI->getTypeLoc(); 5812 TLB.reserve(NewTL.getFullDataSize()); 5813 5814 QualType Result = getDerived().TransformType(TLB, 5815 OldExpansionTL.getPatternLoc()); 5816 if (Result.isNull()) 5817 return nullptr; 5818 5819 Result = RebuildPackExpansionType(Result, 5820 OldExpansionTL.getPatternLoc().getSourceRange(), 5821 OldExpansionTL.getEllipsisLoc(), 5822 NumExpansions); 5823 if (Result.isNull()) 5824 return nullptr; 5825 5826 PackExpansionTypeLoc NewExpansionTL 5827 = TLB.push<PackExpansionTypeLoc>(Result); 5828 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5829 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5830 } else 5831 NewDI = getDerived().TransformType(OldDI); 5832 if (!NewDI) 5833 return nullptr; 5834 5835 if (NewDI == OldDI && indexAdjustment == 0) 5836 return OldParm; 5837 5838 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5839 OldParm->getDeclContext(), 5840 OldParm->getInnerLocStart(), 5841 OldParm->getLocation(), 5842 OldParm->getIdentifier(), 5843 NewDI->getType(), 5844 NewDI, 5845 OldParm->getStorageClass(), 5846 /* DefArg */ nullptr); 5847 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5848 OldParm->getFunctionScopeIndex() + indexAdjustment); 5849 transformedLocalDecl(OldParm, {newParm}); 5850 return newParm; 5851 } 5852 5853 template <typename Derived> 5854 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5855 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5856 const QualType *ParamTypes, 5857 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5858 SmallVectorImpl<QualType> &OutParamTypes, 5859 SmallVectorImpl<ParmVarDecl *> *PVars, 5860 Sema::ExtParameterInfoBuilder &PInfos, 5861 unsigned *LastParamTransformed) { 5862 int indexAdjustment = 0; 5863 5864 unsigned NumParams = Params.size(); 5865 for (unsigned i = 0; i != NumParams; ++i) { 5866 if (LastParamTransformed) 5867 *LastParamTransformed = i; 5868 if (ParmVarDecl *OldParm = Params[i]) { 5869 assert(OldParm->getFunctionScopeIndex() == i); 5870 5871 std::optional<unsigned> NumExpansions; 5872 ParmVarDecl *NewParm = nullptr; 5873 if (OldParm->isParameterPack()) { 5874 // We have a function parameter pack that may need to be expanded. 5875 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5876 5877 // Find the parameter packs that could be expanded. 5878 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5879 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5880 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5881 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5882 5883 // Determine whether we should expand the parameter packs. 5884 bool ShouldExpand = false; 5885 bool RetainExpansion = false; 5886 std::optional<unsigned> OrigNumExpansions; 5887 if (Unexpanded.size() > 0) { 5888 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5889 NumExpansions = OrigNumExpansions; 5890 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5891 Pattern.getSourceRange(), 5892 Unexpanded, 5893 ShouldExpand, 5894 RetainExpansion, 5895 NumExpansions)) { 5896 return true; 5897 } 5898 } else { 5899 #ifndef NDEBUG 5900 const AutoType *AT = 5901 Pattern.getType().getTypePtr()->getContainedAutoType(); 5902 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5903 "Could not find parameter packs or undeduced auto type!"); 5904 #endif 5905 } 5906 5907 if (ShouldExpand) { 5908 // Expand the function parameter pack into multiple, separate 5909 // parameters. 5910 getDerived().ExpandingFunctionParameterPack(OldParm); 5911 for (unsigned I = 0; I != *NumExpansions; ++I) { 5912 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5913 ParmVarDecl *NewParm 5914 = getDerived().TransformFunctionTypeParam(OldParm, 5915 indexAdjustment++, 5916 OrigNumExpansions, 5917 /*ExpectParameterPack=*/false); 5918 if (!NewParm) 5919 return true; 5920 5921 if (ParamInfos) 5922 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5923 OutParamTypes.push_back(NewParm->getType()); 5924 if (PVars) 5925 PVars->push_back(NewParm); 5926 } 5927 5928 // If we're supposed to retain a pack expansion, do so by temporarily 5929 // forgetting the partially-substituted parameter pack. 5930 if (RetainExpansion) { 5931 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5932 ParmVarDecl *NewParm 5933 = getDerived().TransformFunctionTypeParam(OldParm, 5934 indexAdjustment++, 5935 OrigNumExpansions, 5936 /*ExpectParameterPack=*/false); 5937 if (!NewParm) 5938 return true; 5939 5940 if (ParamInfos) 5941 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5942 OutParamTypes.push_back(NewParm->getType()); 5943 if (PVars) 5944 PVars->push_back(NewParm); 5945 } 5946 5947 // The next parameter should have the same adjustment as the 5948 // last thing we pushed, but we post-incremented indexAdjustment 5949 // on every push. Also, if we push nothing, the adjustment should 5950 // go down by one. 5951 indexAdjustment--; 5952 5953 // We're done with the pack expansion. 5954 continue; 5955 } 5956 5957 // We'll substitute the parameter now without expanding the pack 5958 // expansion. 5959 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5960 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5961 indexAdjustment, 5962 NumExpansions, 5963 /*ExpectParameterPack=*/true); 5964 assert(NewParm->isParameterPack() && 5965 "Parameter pack no longer a parameter pack after " 5966 "transformation."); 5967 } else { 5968 NewParm = getDerived().TransformFunctionTypeParam( 5969 OldParm, indexAdjustment, std::nullopt, 5970 /*ExpectParameterPack=*/false); 5971 } 5972 5973 if (!NewParm) 5974 return true; 5975 5976 if (ParamInfos) 5977 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5978 OutParamTypes.push_back(NewParm->getType()); 5979 if (PVars) 5980 PVars->push_back(NewParm); 5981 continue; 5982 } 5983 5984 // Deal with the possibility that we don't have a parameter 5985 // declaration for this parameter. 5986 assert(ParamTypes); 5987 QualType OldType = ParamTypes[i]; 5988 bool IsPackExpansion = false; 5989 std::optional<unsigned> NumExpansions; 5990 QualType NewType; 5991 if (const PackExpansionType *Expansion 5992 = dyn_cast<PackExpansionType>(OldType)) { 5993 // We have a function parameter pack that may need to be expanded. 5994 QualType Pattern = Expansion->getPattern(); 5995 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5996 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5997 5998 // Determine whether we should expand the parameter packs. 5999 bool ShouldExpand = false; 6000 bool RetainExpansion = false; 6001 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 6002 Unexpanded, 6003 ShouldExpand, 6004 RetainExpansion, 6005 NumExpansions)) { 6006 return true; 6007 } 6008 6009 if (ShouldExpand) { 6010 // Expand the function parameter pack into multiple, separate 6011 // parameters. 6012 for (unsigned I = 0; I != *NumExpansions; ++I) { 6013 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 6014 QualType NewType = getDerived().TransformType(Pattern); 6015 if (NewType.isNull()) 6016 return true; 6017 6018 if (NewType->containsUnexpandedParameterPack()) { 6019 NewType = getSema().getASTContext().getPackExpansionType( 6020 NewType, std::nullopt); 6021 6022 if (NewType.isNull()) 6023 return true; 6024 } 6025 6026 if (ParamInfos) 6027 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 6028 OutParamTypes.push_back(NewType); 6029 if (PVars) 6030 PVars->push_back(nullptr); 6031 } 6032 6033 // We're done with the pack expansion. 6034 continue; 6035 } 6036 6037 // If we're supposed to retain a pack expansion, do so by temporarily 6038 // forgetting the partially-substituted parameter pack. 6039 if (RetainExpansion) { 6040 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 6041 QualType NewType = getDerived().TransformType(Pattern); 6042 if (NewType.isNull()) 6043 return true; 6044 6045 if (ParamInfos) 6046 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 6047 OutParamTypes.push_back(NewType); 6048 if (PVars) 6049 PVars->push_back(nullptr); 6050 } 6051 6052 // We'll substitute the parameter now without expanding the pack 6053 // expansion. 6054 OldType = Expansion->getPattern(); 6055 IsPackExpansion = true; 6056 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6057 NewType = getDerived().TransformType(OldType); 6058 } else { 6059 NewType = getDerived().TransformType(OldType); 6060 } 6061 6062 if (NewType.isNull()) 6063 return true; 6064 6065 if (IsPackExpansion) 6066 NewType = getSema().Context.getPackExpansionType(NewType, 6067 NumExpansions); 6068 6069 if (ParamInfos) 6070 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 6071 OutParamTypes.push_back(NewType); 6072 if (PVars) 6073 PVars->push_back(nullptr); 6074 } 6075 6076 #ifndef NDEBUG 6077 if (PVars) { 6078 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 6079 if (ParmVarDecl *parm = (*PVars)[i]) 6080 assert(parm->getFunctionScopeIndex() == i); 6081 } 6082 #endif 6083 6084 return false; 6085 } 6086 6087 template<typename Derived> 6088 QualType 6089 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 6090 FunctionProtoTypeLoc TL) { 6091 SmallVector<QualType, 4> ExceptionStorage; 6092 return getDerived().TransformFunctionProtoType( 6093 TLB, TL, nullptr, Qualifiers(), 6094 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 6095 return getDerived().TransformExceptionSpec(TL.getBeginLoc(), ESI, 6096 ExceptionStorage, Changed); 6097 }); 6098 } 6099 6100 template<typename Derived> template<typename Fn> 6101 QualType TreeTransform<Derived>::TransformFunctionProtoType( 6102 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 6103 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 6104 6105 // Transform the parameters and return type. 6106 // 6107 // We are required to instantiate the params and return type in source order. 6108 // When the function has a trailing return type, we instantiate the 6109 // parameters before the return type, since the return type can then refer 6110 // to the parameters themselves (via decltype, sizeof, etc.). 6111 // 6112 SmallVector<QualType, 4> ParamTypes; 6113 SmallVector<ParmVarDecl*, 4> ParamDecls; 6114 Sema::ExtParameterInfoBuilder ExtParamInfos; 6115 const FunctionProtoType *T = TL.getTypePtr(); 6116 6117 QualType ResultType; 6118 6119 if (T->hasTrailingReturn()) { 6120 if (getDerived().TransformFunctionTypeParams( 6121 TL.getBeginLoc(), TL.getParams(), 6122 TL.getTypePtr()->param_type_begin(), 6123 T->getExtParameterInfosOrNull(), 6124 ParamTypes, &ParamDecls, ExtParamInfos)) 6125 return QualType(); 6126 6127 { 6128 // C++11 [expr.prim.general]p3: 6129 // If a declaration declares a member function or member function 6130 // template of a class X, the expression this is a prvalue of type 6131 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 6132 // and the end of the function-definition, member-declarator, or 6133 // declarator. 6134 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 6135 6136 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6137 if (ResultType.isNull()) 6138 return QualType(); 6139 } 6140 } 6141 else { 6142 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6143 if (ResultType.isNull()) 6144 return QualType(); 6145 6146 if (getDerived().TransformFunctionTypeParams( 6147 TL.getBeginLoc(), TL.getParams(), 6148 TL.getTypePtr()->param_type_begin(), 6149 T->getExtParameterInfosOrNull(), 6150 ParamTypes, &ParamDecls, ExtParamInfos)) 6151 return QualType(); 6152 } 6153 6154 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 6155 6156 bool EPIChanged = false; 6157 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 6158 return QualType(); 6159 6160 // Handle extended parameter information. 6161 if (auto NewExtParamInfos = 6162 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 6163 if (!EPI.ExtParameterInfos || 6164 llvm::ArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) != 6165 llvm::ArrayRef(NewExtParamInfos, ParamTypes.size())) { 6166 EPIChanged = true; 6167 } 6168 EPI.ExtParameterInfos = NewExtParamInfos; 6169 } else if (EPI.ExtParameterInfos) { 6170 EPIChanged = true; 6171 EPI.ExtParameterInfos = nullptr; 6172 } 6173 6174 QualType Result = TL.getType(); 6175 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 6176 T->getParamTypes() != llvm::ArrayRef(ParamTypes) || EPIChanged) { 6177 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 6178 if (Result.isNull()) 6179 return QualType(); 6180 } 6181 6182 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 6183 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6184 NewTL.setLParenLoc(TL.getLParenLoc()); 6185 NewTL.setRParenLoc(TL.getRParenLoc()); 6186 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 6187 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6188 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 6189 NewTL.setParam(i, ParamDecls[i]); 6190 6191 return Result; 6192 } 6193 6194 template<typename Derived> 6195 bool TreeTransform<Derived>::TransformExceptionSpec( 6196 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 6197 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 6198 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 6199 6200 // Instantiate a dynamic noexcept expression, if any. 6201 if (isComputedNoexcept(ESI.Type)) { 6202 // Update this scrope because ContextDecl in Sema will be used in 6203 // TransformExpr. 6204 auto *Method = dyn_cast_if_present<CXXMethodDecl>(ESI.SourceTemplate); 6205 Sema::CXXThisScopeRAII ThisScope( 6206 SemaRef, Method ? Method->getParent() : nullptr, 6207 Method ? Method->getMethodQualifiers() : Qualifiers{}, 6208 Method != nullptr); 6209 EnterExpressionEvaluationContext Unevaluated( 6210 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 6211 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 6212 if (NoexceptExpr.isInvalid()) 6213 return true; 6214 6215 ExceptionSpecificationType EST = ESI.Type; 6216 NoexceptExpr = 6217 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 6218 if (NoexceptExpr.isInvalid()) 6219 return true; 6220 6221 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 6222 Changed = true; 6223 ESI.NoexceptExpr = NoexceptExpr.get(); 6224 ESI.Type = EST; 6225 } 6226 6227 if (ESI.Type != EST_Dynamic) 6228 return false; 6229 6230 // Instantiate a dynamic exception specification's type. 6231 for (QualType T : ESI.Exceptions) { 6232 if (const PackExpansionType *PackExpansion = 6233 T->getAs<PackExpansionType>()) { 6234 Changed = true; 6235 6236 // We have a pack expansion. Instantiate it. 6237 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6238 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6239 Unexpanded); 6240 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6241 6242 // Determine whether the set of unexpanded parameter packs can and 6243 // should 6244 // be expanded. 6245 bool Expand = false; 6246 bool RetainExpansion = false; 6247 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6248 // FIXME: Track the location of the ellipsis (and track source location 6249 // information for the types in the exception specification in general). 6250 if (getDerived().TryExpandParameterPacks( 6251 Loc, SourceRange(), Unexpanded, Expand, 6252 RetainExpansion, NumExpansions)) 6253 return true; 6254 6255 if (!Expand) { 6256 // We can't expand this pack expansion into separate arguments yet; 6257 // just substitute into the pattern and create a new pack expansion 6258 // type. 6259 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6260 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6261 if (U.isNull()) 6262 return true; 6263 6264 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6265 Exceptions.push_back(U); 6266 continue; 6267 } 6268 6269 // Substitute into the pack expansion pattern for each slice of the 6270 // pack. 6271 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6272 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6273 6274 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6275 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6276 return true; 6277 6278 Exceptions.push_back(U); 6279 } 6280 } else { 6281 QualType U = getDerived().TransformType(T); 6282 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6283 return true; 6284 if (T != U) 6285 Changed = true; 6286 6287 Exceptions.push_back(U); 6288 } 6289 } 6290 6291 ESI.Exceptions = Exceptions; 6292 if (ESI.Exceptions.empty()) 6293 ESI.Type = EST_DynamicNone; 6294 return false; 6295 } 6296 6297 template<typename Derived> 6298 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6299 TypeLocBuilder &TLB, 6300 FunctionNoProtoTypeLoc TL) { 6301 const FunctionNoProtoType *T = TL.getTypePtr(); 6302 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6303 if (ResultType.isNull()) 6304 return QualType(); 6305 6306 QualType Result = TL.getType(); 6307 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6308 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6309 6310 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6311 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6312 NewTL.setLParenLoc(TL.getLParenLoc()); 6313 NewTL.setRParenLoc(TL.getRParenLoc()); 6314 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6315 6316 return Result; 6317 } 6318 6319 template <typename Derived> 6320 QualType TreeTransform<Derived>::TransformUnresolvedUsingType( 6321 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) { 6322 const UnresolvedUsingType *T = TL.getTypePtr(); 6323 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6324 if (!D) 6325 return QualType(); 6326 6327 QualType Result = TL.getType(); 6328 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6329 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6330 if (Result.isNull()) 6331 return QualType(); 6332 } 6333 6334 // We might get an arbitrary type spec type back. We should at 6335 // least always get a type spec type, though. 6336 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6337 NewTL.setNameLoc(TL.getNameLoc()); 6338 6339 return Result; 6340 } 6341 6342 template <typename Derived> 6343 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB, 6344 UsingTypeLoc TL) { 6345 const UsingType *T = TL.getTypePtr(); 6346 6347 auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl( 6348 TL.getLocalSourceRange().getBegin(), T->getFoundDecl())); 6349 if (!Found) 6350 return QualType(); 6351 6352 QualType Underlying = getDerived().TransformType(T->desugar()); 6353 if (Underlying.isNull()) 6354 return QualType(); 6355 6356 QualType Result = TL.getType(); 6357 if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() || 6358 Underlying != T->getUnderlyingType()) { 6359 Result = getDerived().RebuildUsingType(Found, Underlying); 6360 if (Result.isNull()) 6361 return QualType(); 6362 } 6363 6364 TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc()); 6365 return Result; 6366 } 6367 6368 template<typename Derived> 6369 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6370 TypedefTypeLoc TL) { 6371 const TypedefType *T = TL.getTypePtr(); 6372 TypedefNameDecl *Typedef 6373 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6374 T->getDecl())); 6375 if (!Typedef) 6376 return QualType(); 6377 6378 QualType Result = TL.getType(); 6379 if (getDerived().AlwaysRebuild() || 6380 Typedef != T->getDecl()) { 6381 Result = getDerived().RebuildTypedefType(Typedef); 6382 if (Result.isNull()) 6383 return QualType(); 6384 } 6385 6386 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6387 NewTL.setNameLoc(TL.getNameLoc()); 6388 6389 return Result; 6390 } 6391 6392 template<typename Derived> 6393 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6394 TypeOfExprTypeLoc TL) { 6395 // typeof expressions are not potentially evaluated contexts 6396 EnterExpressionEvaluationContext Unevaluated( 6397 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6398 Sema::ReuseLambdaContextDecl); 6399 6400 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6401 if (E.isInvalid()) 6402 return QualType(); 6403 6404 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6405 if (E.isInvalid()) 6406 return QualType(); 6407 6408 QualType Result = TL.getType(); 6409 TypeOfKind Kind = Result->getAs<TypeOfExprType>()->getKind(); 6410 if (getDerived().AlwaysRebuild() || E.get() != TL.getUnderlyingExpr()) { 6411 Result = 6412 getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc(), Kind); 6413 if (Result.isNull()) 6414 return QualType(); 6415 } 6416 6417 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6418 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6419 NewTL.setLParenLoc(TL.getLParenLoc()); 6420 NewTL.setRParenLoc(TL.getRParenLoc()); 6421 6422 return Result; 6423 } 6424 6425 template<typename Derived> 6426 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6427 TypeOfTypeLoc TL) { 6428 TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo(); 6429 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6430 if (!New_Under_TI) 6431 return QualType(); 6432 6433 QualType Result = TL.getType(); 6434 TypeOfKind Kind = Result->getAs<TypeOfType>()->getKind(); 6435 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6436 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind); 6437 if (Result.isNull()) 6438 return QualType(); 6439 } 6440 6441 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6442 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6443 NewTL.setLParenLoc(TL.getLParenLoc()); 6444 NewTL.setRParenLoc(TL.getRParenLoc()); 6445 NewTL.setUnmodifiedTInfo(New_Under_TI); 6446 6447 return Result; 6448 } 6449 6450 template<typename Derived> 6451 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6452 DecltypeTypeLoc TL) { 6453 const DecltypeType *T = TL.getTypePtr(); 6454 6455 // decltype expressions are not potentially evaluated contexts 6456 EnterExpressionEvaluationContext Unevaluated( 6457 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6458 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6459 6460 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6461 if (E.isInvalid()) 6462 return QualType(); 6463 6464 E = getSema().ActOnDecltypeExpression(E.get()); 6465 if (E.isInvalid()) 6466 return QualType(); 6467 6468 QualType Result = TL.getType(); 6469 if (getDerived().AlwaysRebuild() || 6470 E.get() != T->getUnderlyingExpr()) { 6471 Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc()); 6472 if (Result.isNull()) 6473 return QualType(); 6474 } 6475 else E.get(); 6476 6477 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6478 NewTL.setDecltypeLoc(TL.getDecltypeLoc()); 6479 NewTL.setRParenLoc(TL.getRParenLoc()); 6480 return Result; 6481 } 6482 6483 template<typename Derived> 6484 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6485 TypeLocBuilder &TLB, 6486 UnaryTransformTypeLoc TL) { 6487 QualType Result = TL.getType(); 6488 if (Result->isDependentType()) { 6489 const UnaryTransformType *T = TL.getTypePtr(); 6490 QualType NewBase = 6491 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6492 Result = getDerived().RebuildUnaryTransformType(NewBase, 6493 T->getUTTKind(), 6494 TL.getKWLoc()); 6495 if (Result.isNull()) 6496 return QualType(); 6497 } 6498 6499 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6500 NewTL.setKWLoc(TL.getKWLoc()); 6501 NewTL.setParensRange(TL.getParensRange()); 6502 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6503 return Result; 6504 } 6505 6506 template<typename Derived> 6507 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6508 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6509 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6510 6511 CXXScopeSpec SS; 6512 TemplateName TemplateName = getDerived().TransformTemplateName( 6513 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6514 if (TemplateName.isNull()) 6515 return QualType(); 6516 6517 QualType OldDeduced = T->getDeducedType(); 6518 QualType NewDeduced; 6519 if (!OldDeduced.isNull()) { 6520 NewDeduced = getDerived().TransformType(OldDeduced); 6521 if (NewDeduced.isNull()) 6522 return QualType(); 6523 } 6524 6525 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6526 TemplateName, NewDeduced); 6527 if (Result.isNull()) 6528 return QualType(); 6529 6530 DeducedTemplateSpecializationTypeLoc NewTL = 6531 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6532 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6533 6534 return Result; 6535 } 6536 6537 template<typename Derived> 6538 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6539 RecordTypeLoc TL) { 6540 const RecordType *T = TL.getTypePtr(); 6541 RecordDecl *Record 6542 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6543 T->getDecl())); 6544 if (!Record) 6545 return QualType(); 6546 6547 QualType Result = TL.getType(); 6548 if (getDerived().AlwaysRebuild() || 6549 Record != T->getDecl()) { 6550 Result = getDerived().RebuildRecordType(Record); 6551 if (Result.isNull()) 6552 return QualType(); 6553 } 6554 6555 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6556 NewTL.setNameLoc(TL.getNameLoc()); 6557 6558 return Result; 6559 } 6560 6561 template<typename Derived> 6562 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6563 EnumTypeLoc TL) { 6564 const EnumType *T = TL.getTypePtr(); 6565 EnumDecl *Enum 6566 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6567 T->getDecl())); 6568 if (!Enum) 6569 return QualType(); 6570 6571 QualType Result = TL.getType(); 6572 if (getDerived().AlwaysRebuild() || 6573 Enum != T->getDecl()) { 6574 Result = getDerived().RebuildEnumType(Enum); 6575 if (Result.isNull()) 6576 return QualType(); 6577 } 6578 6579 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6580 NewTL.setNameLoc(TL.getNameLoc()); 6581 6582 return Result; 6583 } 6584 6585 template<typename Derived> 6586 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6587 TypeLocBuilder &TLB, 6588 InjectedClassNameTypeLoc TL) { 6589 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6590 TL.getTypePtr()->getDecl()); 6591 if (!D) return QualType(); 6592 6593 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6594 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6595 return T; 6596 } 6597 6598 template<typename Derived> 6599 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6600 TypeLocBuilder &TLB, 6601 TemplateTypeParmTypeLoc TL) { 6602 return getDerived().TransformTemplateTypeParmType( 6603 TLB, TL, 6604 /*SuppressObjCLifetime=*/false); 6605 } 6606 6607 template <typename Derived> 6608 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6609 TypeLocBuilder &TLB, TemplateTypeParmTypeLoc TL, bool) { 6610 return TransformTypeSpecType(TLB, TL); 6611 } 6612 6613 template<typename Derived> 6614 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6615 TypeLocBuilder &TLB, 6616 SubstTemplateTypeParmTypeLoc TL) { 6617 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6618 6619 Decl *NewReplaced = 6620 getDerived().TransformDecl(TL.getNameLoc(), T->getAssociatedDecl()); 6621 6622 // Substitute into the replacement type, which itself might involve something 6623 // that needs to be transformed. This only tends to occur with default 6624 // template arguments of template template parameters. 6625 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6626 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6627 if (Replacement.isNull()) 6628 return QualType(); 6629 6630 QualType Result = SemaRef.Context.getSubstTemplateTypeParmType( 6631 Replacement, NewReplaced, T->getIndex(), T->getPackIndex()); 6632 6633 // Propagate type-source information. 6634 SubstTemplateTypeParmTypeLoc NewTL 6635 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6636 NewTL.setNameLoc(TL.getNameLoc()); 6637 return Result; 6638 6639 } 6640 6641 template<typename Derived> 6642 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6643 TypeLocBuilder &TLB, 6644 SubstTemplateTypeParmPackTypeLoc TL) { 6645 return getDerived().TransformSubstTemplateTypeParmPackType( 6646 TLB, TL, /*SuppressObjCLifetime=*/false); 6647 } 6648 6649 template <typename Derived> 6650 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6651 TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL, bool) { 6652 return TransformTypeSpecType(TLB, TL); 6653 } 6654 6655 template<typename Derived> 6656 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6657 TypeLocBuilder &TLB, 6658 TemplateSpecializationTypeLoc TL) { 6659 const TemplateSpecializationType *T = TL.getTypePtr(); 6660 6661 // The nested-name-specifier never matters in a TemplateSpecializationType, 6662 // because we can't have a dependent nested-name-specifier anyway. 6663 CXXScopeSpec SS; 6664 TemplateName Template 6665 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6666 TL.getTemplateNameLoc()); 6667 if (Template.isNull()) 6668 return QualType(); 6669 6670 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6671 } 6672 6673 template<typename Derived> 6674 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6675 AtomicTypeLoc TL) { 6676 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6677 if (ValueType.isNull()) 6678 return QualType(); 6679 6680 QualType Result = TL.getType(); 6681 if (getDerived().AlwaysRebuild() || 6682 ValueType != TL.getValueLoc().getType()) { 6683 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6684 if (Result.isNull()) 6685 return QualType(); 6686 } 6687 6688 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6689 NewTL.setKWLoc(TL.getKWLoc()); 6690 NewTL.setLParenLoc(TL.getLParenLoc()); 6691 NewTL.setRParenLoc(TL.getRParenLoc()); 6692 6693 return Result; 6694 } 6695 6696 template <typename Derived> 6697 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6698 PipeTypeLoc TL) { 6699 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6700 if (ValueType.isNull()) 6701 return QualType(); 6702 6703 QualType Result = TL.getType(); 6704 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6705 const PipeType *PT = Result->castAs<PipeType>(); 6706 bool isReadPipe = PT->isReadOnly(); 6707 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6708 if (Result.isNull()) 6709 return QualType(); 6710 } 6711 6712 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6713 NewTL.setKWLoc(TL.getKWLoc()); 6714 6715 return Result; 6716 } 6717 6718 template <typename Derived> 6719 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB, 6720 BitIntTypeLoc TL) { 6721 const BitIntType *EIT = TL.getTypePtr(); 6722 QualType Result = TL.getType(); 6723 6724 if (getDerived().AlwaysRebuild()) { 6725 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(), 6726 EIT->getNumBits(), TL.getNameLoc()); 6727 if (Result.isNull()) 6728 return QualType(); 6729 } 6730 6731 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6732 NewTL.setNameLoc(TL.getNameLoc()); 6733 return Result; 6734 } 6735 6736 template <typename Derived> 6737 QualType TreeTransform<Derived>::TransformDependentBitIntType( 6738 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) { 6739 const DependentBitIntType *EIT = TL.getTypePtr(); 6740 6741 EnterExpressionEvaluationContext Unevaluated( 6742 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6743 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6744 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6745 6746 if (BitsExpr.isInvalid()) 6747 return QualType(); 6748 6749 QualType Result = TL.getType(); 6750 6751 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6752 Result = getDerived().RebuildDependentBitIntType( 6753 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6754 6755 if (Result.isNull()) 6756 return QualType(); 6757 } 6758 6759 if (isa<DependentBitIntType>(Result)) { 6760 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result); 6761 NewTL.setNameLoc(TL.getNameLoc()); 6762 } else { 6763 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6764 NewTL.setNameLoc(TL.getNameLoc()); 6765 } 6766 return Result; 6767 } 6768 6769 /// Simple iterator that traverses the template arguments in a 6770 /// container that provides a \c getArgLoc() member function. 6771 /// 6772 /// This iterator is intended to be used with the iterator form of 6773 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6774 template<typename ArgLocContainer> 6775 class TemplateArgumentLocContainerIterator { 6776 ArgLocContainer *Container; 6777 unsigned Index; 6778 6779 public: 6780 typedef TemplateArgumentLoc value_type; 6781 typedef TemplateArgumentLoc reference; 6782 typedef int difference_type; 6783 typedef std::input_iterator_tag iterator_category; 6784 6785 class pointer { 6786 TemplateArgumentLoc Arg; 6787 6788 public: 6789 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6790 6791 const TemplateArgumentLoc *operator->() const { 6792 return &Arg; 6793 } 6794 }; 6795 6796 6797 TemplateArgumentLocContainerIterator() {} 6798 6799 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6800 unsigned Index) 6801 : Container(&Container), Index(Index) { } 6802 6803 TemplateArgumentLocContainerIterator &operator++() { 6804 ++Index; 6805 return *this; 6806 } 6807 6808 TemplateArgumentLocContainerIterator operator++(int) { 6809 TemplateArgumentLocContainerIterator Old(*this); 6810 ++(*this); 6811 return Old; 6812 } 6813 6814 TemplateArgumentLoc operator*() const { 6815 return Container->getArgLoc(Index); 6816 } 6817 6818 pointer operator->() const { 6819 return pointer(Container->getArgLoc(Index)); 6820 } 6821 6822 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6823 const TemplateArgumentLocContainerIterator &Y) { 6824 return X.Container == Y.Container && X.Index == Y.Index; 6825 } 6826 6827 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6828 const TemplateArgumentLocContainerIterator &Y) { 6829 return !(X == Y); 6830 } 6831 }; 6832 6833 template<typename Derived> 6834 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6835 AutoTypeLoc TL) { 6836 const AutoType *T = TL.getTypePtr(); 6837 QualType OldDeduced = T->getDeducedType(); 6838 QualType NewDeduced; 6839 if (!OldDeduced.isNull()) { 6840 NewDeduced = getDerived().TransformType(OldDeduced); 6841 if (NewDeduced.isNull()) 6842 return QualType(); 6843 } 6844 6845 ConceptDecl *NewCD = nullptr; 6846 TemplateArgumentListInfo NewTemplateArgs; 6847 NestedNameSpecifierLoc NewNestedNameSpec; 6848 if (T->isConstrained()) { 6849 assert(TL.getConceptReference()); 6850 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6851 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6852 6853 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6854 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6855 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6856 if (getDerived().TransformTemplateArguments( 6857 ArgIterator(TL, 0), ArgIterator(TL, TL.getNumArgs()), 6858 NewTemplateArgs)) 6859 return QualType(); 6860 6861 if (TL.getNestedNameSpecifierLoc()) { 6862 NewNestedNameSpec 6863 = getDerived().TransformNestedNameSpecifierLoc( 6864 TL.getNestedNameSpecifierLoc()); 6865 if (!NewNestedNameSpec) 6866 return QualType(); 6867 } 6868 } 6869 6870 QualType Result = TL.getType(); 6871 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6872 T->isDependentType() || T->isConstrained()) { 6873 // FIXME: Maybe don't rebuild if all template arguments are the same. 6874 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6875 NewArgList.reserve(NewTemplateArgs.size()); 6876 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6877 NewArgList.push_back(ArgLoc.getArgument()); 6878 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6879 NewArgList); 6880 if (Result.isNull()) 6881 return QualType(); 6882 } 6883 6884 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6885 NewTL.setNameLoc(TL.getNameLoc()); 6886 NewTL.setRParenLoc(TL.getRParenLoc()); 6887 NewTL.setConceptReference(nullptr); 6888 6889 if (T->isConstrained()) { 6890 DeclarationNameInfo DNI = DeclarationNameInfo( 6891 TL.getTypePtr()->getTypeConstraintConcept()->getDeclName(), 6892 TL.getConceptNameLoc(), 6893 TL.getTypePtr()->getTypeConstraintConcept()->getDeclName()); 6894 auto *CR = ConceptReference::Create( 6895 SemaRef.Context, NewNestedNameSpec, TL.getTemplateKWLoc(), DNI, 6896 TL.getFoundDecl(), TL.getTypePtr()->getTypeConstraintConcept(), 6897 ASTTemplateArgumentListInfo::Create(SemaRef.Context, NewTemplateArgs)); 6898 NewTL.setConceptReference(CR); 6899 } 6900 6901 return Result; 6902 } 6903 6904 template <typename Derived> 6905 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6906 TypeLocBuilder &TLB, 6907 TemplateSpecializationTypeLoc TL, 6908 TemplateName Template) { 6909 TemplateArgumentListInfo NewTemplateArgs; 6910 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6911 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6912 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6913 ArgIterator; 6914 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6915 ArgIterator(TL, TL.getNumArgs()), 6916 NewTemplateArgs)) 6917 return QualType(); 6918 6919 // FIXME: maybe don't rebuild if all the template arguments are the same. 6920 6921 QualType Result = 6922 getDerived().RebuildTemplateSpecializationType(Template, 6923 TL.getTemplateNameLoc(), 6924 NewTemplateArgs); 6925 6926 if (!Result.isNull()) { 6927 // Specializations of template template parameters are represented as 6928 // TemplateSpecializationTypes, and substitution of type alias templates 6929 // within a dependent context can transform them into 6930 // DependentTemplateSpecializationTypes. 6931 if (isa<DependentTemplateSpecializationType>(Result)) { 6932 DependentTemplateSpecializationTypeLoc NewTL 6933 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6934 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6935 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6936 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6937 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6938 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6939 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6940 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6941 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6942 return Result; 6943 } 6944 6945 TemplateSpecializationTypeLoc NewTL 6946 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6947 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6948 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6949 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6950 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6951 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6952 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6953 } 6954 6955 return Result; 6956 } 6957 6958 template <typename Derived> 6959 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6960 TypeLocBuilder &TLB, 6961 DependentTemplateSpecializationTypeLoc TL, 6962 TemplateName Template, 6963 CXXScopeSpec &SS) { 6964 TemplateArgumentListInfo NewTemplateArgs; 6965 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6966 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6967 typedef TemplateArgumentLocContainerIterator< 6968 DependentTemplateSpecializationTypeLoc> ArgIterator; 6969 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6970 ArgIterator(TL, TL.getNumArgs()), 6971 NewTemplateArgs)) 6972 return QualType(); 6973 6974 // FIXME: maybe don't rebuild if all the template arguments are the same. 6975 6976 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6977 QualType Result = getSema().Context.getDependentTemplateSpecializationType( 6978 TL.getTypePtr()->getKeyword(), DTN->getQualifier(), 6979 DTN->getIdentifier(), NewTemplateArgs.arguments()); 6980 6981 DependentTemplateSpecializationTypeLoc NewTL 6982 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6983 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6984 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6985 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6986 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6987 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6988 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6989 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6990 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6991 return Result; 6992 } 6993 6994 QualType Result 6995 = getDerived().RebuildTemplateSpecializationType(Template, 6996 TL.getTemplateNameLoc(), 6997 NewTemplateArgs); 6998 6999 if (!Result.isNull()) { 7000 /// FIXME: Wrap this in an elaborated-type-specifier? 7001 TemplateSpecializationTypeLoc NewTL 7002 = TLB.push<TemplateSpecializationTypeLoc>(Result); 7003 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7004 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7005 NewTL.setLAngleLoc(TL.getLAngleLoc()); 7006 NewTL.setRAngleLoc(TL.getRAngleLoc()); 7007 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 7008 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 7009 } 7010 7011 return Result; 7012 } 7013 7014 template<typename Derived> 7015 QualType 7016 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 7017 ElaboratedTypeLoc TL) { 7018 const ElaboratedType *T = TL.getTypePtr(); 7019 7020 NestedNameSpecifierLoc QualifierLoc; 7021 // NOTE: the qualifier in an ElaboratedType is optional. 7022 if (TL.getQualifierLoc()) { 7023 QualifierLoc 7024 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 7025 if (!QualifierLoc) 7026 return QualType(); 7027 } 7028 7029 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 7030 if (NamedT.isNull()) 7031 return QualType(); 7032 7033 // C++0x [dcl.type.elab]p2: 7034 // If the identifier resolves to a typedef-name or the simple-template-id 7035 // resolves to an alias template specialization, the 7036 // elaborated-type-specifier is ill-formed. 7037 if (T->getKeyword() != ElaboratedTypeKeyword::None && 7038 T->getKeyword() != ElaboratedTypeKeyword::Typename) { 7039 if (const TemplateSpecializationType *TST = 7040 NamedT->getAs<TemplateSpecializationType>()) { 7041 TemplateName Template = TST->getTemplateName(); 7042 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 7043 Template.getAsTemplateDecl())) { 7044 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 7045 diag::err_tag_reference_non_tag) 7046 << TAT << Sema::NTK_TypeAliasTemplate 7047 << llvm::to_underlying( 7048 ElaboratedType::getTagTypeKindForKeyword(T->getKeyword())); 7049 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 7050 } 7051 } 7052 } 7053 7054 QualType Result = TL.getType(); 7055 if (getDerived().AlwaysRebuild() || 7056 QualifierLoc != TL.getQualifierLoc() || 7057 NamedT != T->getNamedType()) { 7058 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 7059 T->getKeyword(), 7060 QualifierLoc, NamedT); 7061 if (Result.isNull()) 7062 return QualType(); 7063 } 7064 7065 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7066 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7067 NewTL.setQualifierLoc(QualifierLoc); 7068 return Result; 7069 } 7070 7071 template <typename Derived> 7072 template <typename Fn> 7073 QualType TreeTransform<Derived>::TransformAttributedType( 7074 TypeLocBuilder &TLB, AttributedTypeLoc TL, Fn TransformModifiedTypeFn) { 7075 const AttributedType *oldType = TL.getTypePtr(); 7076 QualType modifiedType = TransformModifiedTypeFn(TLB, TL.getModifiedLoc()); 7077 if (modifiedType.isNull()) 7078 return QualType(); 7079 7080 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 7081 const Attr *oldAttr = TL.getAttr(); 7082 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 7083 if (oldAttr && !newAttr) 7084 return QualType(); 7085 7086 QualType result = TL.getType(); 7087 7088 // FIXME: dependent operand expressions? 7089 if (getDerived().AlwaysRebuild() || 7090 modifiedType != oldType->getModifiedType()) { 7091 // TODO: this is really lame; we should really be rebuilding the 7092 // equivalent type from first principles. 7093 QualType equivalentType 7094 = getDerived().TransformType(oldType->getEquivalentType()); 7095 if (equivalentType.isNull()) 7096 return QualType(); 7097 7098 // Check whether we can add nullability; it is only represented as 7099 // type sugar, and therefore cannot be diagnosed in any other way. 7100 if (auto nullability = oldType->getImmediateNullability()) { 7101 if (!modifiedType->canHaveNullability()) { 7102 SemaRef.Diag((TL.getAttr() ? TL.getAttr()->getLocation() 7103 : TL.getModifiedLoc().getBeginLoc()), 7104 diag::err_nullability_nonpointer) 7105 << DiagNullabilityKind(*nullability, false) << modifiedType; 7106 return QualType(); 7107 } 7108 } 7109 7110 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 7111 modifiedType, 7112 equivalentType); 7113 } 7114 7115 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 7116 newTL.setAttr(newAttr); 7117 return result; 7118 } 7119 7120 template <typename Derived> 7121 QualType TreeTransform<Derived>::TransformAttributedType(TypeLocBuilder &TLB, 7122 AttributedTypeLoc TL) { 7123 return getDerived().TransformAttributedType( 7124 TLB, TL, [&](TypeLocBuilder &TLB, TypeLoc ModifiedLoc) -> QualType { 7125 return getDerived().TransformType(TLB, ModifiedLoc); 7126 }); 7127 } 7128 7129 template <typename Derived> 7130 QualType TreeTransform<Derived>::TransformBTFTagAttributedType( 7131 TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) { 7132 // The BTFTagAttributedType is available for C only. 7133 llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType"); 7134 } 7135 7136 template<typename Derived> 7137 QualType 7138 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 7139 ParenTypeLoc TL) { 7140 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 7141 if (Inner.isNull()) 7142 return QualType(); 7143 7144 QualType Result = TL.getType(); 7145 if (getDerived().AlwaysRebuild() || 7146 Inner != TL.getInnerLoc().getType()) { 7147 Result = getDerived().RebuildParenType(Inner); 7148 if (Result.isNull()) 7149 return QualType(); 7150 } 7151 7152 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 7153 NewTL.setLParenLoc(TL.getLParenLoc()); 7154 NewTL.setRParenLoc(TL.getRParenLoc()); 7155 return Result; 7156 } 7157 7158 template <typename Derived> 7159 QualType 7160 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 7161 MacroQualifiedTypeLoc TL) { 7162 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 7163 if (Inner.isNull()) 7164 return QualType(); 7165 7166 QualType Result = TL.getType(); 7167 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 7168 Result = 7169 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 7170 if (Result.isNull()) 7171 return QualType(); 7172 } 7173 7174 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 7175 NewTL.setExpansionLoc(TL.getExpansionLoc()); 7176 return Result; 7177 } 7178 7179 template<typename Derived> 7180 QualType TreeTransform<Derived>::TransformDependentNameType( 7181 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 7182 return TransformDependentNameType(TLB, TL, false); 7183 } 7184 7185 template<typename Derived> 7186 QualType TreeTransform<Derived>::TransformDependentNameType( 7187 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 7188 const DependentNameType *T = TL.getTypePtr(); 7189 7190 NestedNameSpecifierLoc QualifierLoc 7191 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 7192 if (!QualifierLoc) 7193 return QualType(); 7194 7195 QualType Result 7196 = getDerived().RebuildDependentNameType(T->getKeyword(), 7197 TL.getElaboratedKeywordLoc(), 7198 QualifierLoc, 7199 T->getIdentifier(), 7200 TL.getNameLoc(), 7201 DeducedTSTContext); 7202 if (Result.isNull()) 7203 return QualType(); 7204 7205 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 7206 QualType NamedT = ElabT->getNamedType(); 7207 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 7208 7209 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7210 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7211 NewTL.setQualifierLoc(QualifierLoc); 7212 } else { 7213 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 7214 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7215 NewTL.setQualifierLoc(QualifierLoc); 7216 NewTL.setNameLoc(TL.getNameLoc()); 7217 } 7218 return Result; 7219 } 7220 7221 template<typename Derived> 7222 QualType TreeTransform<Derived>:: 7223 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 7224 DependentTemplateSpecializationTypeLoc TL) { 7225 NestedNameSpecifierLoc QualifierLoc; 7226 if (TL.getQualifierLoc()) { 7227 QualifierLoc 7228 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 7229 if (!QualifierLoc) 7230 return QualType(); 7231 } 7232 7233 return getDerived() 7234 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 7235 } 7236 7237 template<typename Derived> 7238 QualType TreeTransform<Derived>:: 7239 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 7240 DependentTemplateSpecializationTypeLoc TL, 7241 NestedNameSpecifierLoc QualifierLoc) { 7242 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 7243 7244 TemplateArgumentListInfo NewTemplateArgs; 7245 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 7246 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 7247 7248 typedef TemplateArgumentLocContainerIterator< 7249 DependentTemplateSpecializationTypeLoc> ArgIterator; 7250 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 7251 ArgIterator(TL, TL.getNumArgs()), 7252 NewTemplateArgs)) 7253 return QualType(); 7254 7255 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 7256 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 7257 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 7258 /*AllowInjectedClassName*/ false); 7259 if (Result.isNull()) 7260 return QualType(); 7261 7262 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 7263 QualType NamedT = ElabT->getNamedType(); 7264 7265 // Copy information relevant to the template specialization. 7266 TemplateSpecializationTypeLoc NamedTL 7267 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 7268 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7269 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7270 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 7271 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 7272 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7273 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7274 7275 // Copy information relevant to the elaborated type. 7276 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7277 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7278 NewTL.setQualifierLoc(QualifierLoc); 7279 } else if (isa<DependentTemplateSpecializationType>(Result)) { 7280 DependentTemplateSpecializationTypeLoc SpecTL 7281 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 7282 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7283 SpecTL.setQualifierLoc(QualifierLoc); 7284 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7285 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7286 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7287 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7288 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7289 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7290 } else { 7291 TemplateSpecializationTypeLoc SpecTL 7292 = TLB.push<TemplateSpecializationTypeLoc>(Result); 7293 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7294 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7295 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7296 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7297 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7298 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7299 } 7300 return Result; 7301 } 7302 7303 template<typename Derived> 7304 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 7305 PackExpansionTypeLoc TL) { 7306 QualType Pattern 7307 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7308 if (Pattern.isNull()) 7309 return QualType(); 7310 7311 QualType Result = TL.getType(); 7312 if (getDerived().AlwaysRebuild() || 7313 Pattern != TL.getPatternLoc().getType()) { 7314 Result = getDerived().RebuildPackExpansionType(Pattern, 7315 TL.getPatternLoc().getSourceRange(), 7316 TL.getEllipsisLoc(), 7317 TL.getTypePtr()->getNumExpansions()); 7318 if (Result.isNull()) 7319 return QualType(); 7320 } 7321 7322 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7323 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7324 return Result; 7325 } 7326 7327 template<typename Derived> 7328 QualType 7329 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7330 ObjCInterfaceTypeLoc TL) { 7331 // ObjCInterfaceType is never dependent. 7332 TLB.pushFullCopy(TL); 7333 return TL.getType(); 7334 } 7335 7336 template<typename Derived> 7337 QualType 7338 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7339 ObjCTypeParamTypeLoc TL) { 7340 const ObjCTypeParamType *T = TL.getTypePtr(); 7341 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7342 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7343 if (!OTP) 7344 return QualType(); 7345 7346 QualType Result = TL.getType(); 7347 if (getDerived().AlwaysRebuild() || 7348 OTP != T->getDecl()) { 7349 Result = getDerived().RebuildObjCTypeParamType( 7350 OTP, TL.getProtocolLAngleLoc(), 7351 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7352 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7353 if (Result.isNull()) 7354 return QualType(); 7355 } 7356 7357 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7358 if (TL.getNumProtocols()) { 7359 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7360 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7361 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7362 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7363 } 7364 return Result; 7365 } 7366 7367 template<typename Derived> 7368 QualType 7369 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7370 ObjCObjectTypeLoc TL) { 7371 // Transform base type. 7372 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7373 if (BaseType.isNull()) 7374 return QualType(); 7375 7376 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7377 7378 // Transform type arguments. 7379 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7380 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7381 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7382 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7383 QualType TypeArg = TypeArgInfo->getType(); 7384 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7385 AnyChanged = true; 7386 7387 // We have a pack expansion. Instantiate it. 7388 const auto *PackExpansion = PackExpansionLoc.getType() 7389 ->castAs<PackExpansionType>(); 7390 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7391 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7392 Unexpanded); 7393 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7394 7395 // Determine whether the set of unexpanded parameter packs can 7396 // and should be expanded. 7397 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7398 bool Expand = false; 7399 bool RetainExpansion = false; 7400 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7401 if (getDerived().TryExpandParameterPacks( 7402 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7403 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7404 return QualType(); 7405 7406 if (!Expand) { 7407 // We can't expand this pack expansion into separate arguments yet; 7408 // just substitute into the pattern and create a new pack expansion 7409 // type. 7410 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7411 7412 TypeLocBuilder TypeArgBuilder; 7413 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7414 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7415 PatternLoc); 7416 if (NewPatternType.isNull()) 7417 return QualType(); 7418 7419 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7420 NewPatternType, NumExpansions); 7421 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7422 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7423 NewTypeArgInfos.push_back( 7424 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7425 continue; 7426 } 7427 7428 // Substitute into the pack expansion pattern for each slice of the 7429 // pack. 7430 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7431 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7432 7433 TypeLocBuilder TypeArgBuilder; 7434 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7435 7436 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7437 PatternLoc); 7438 if (NewTypeArg.isNull()) 7439 return QualType(); 7440 7441 NewTypeArgInfos.push_back( 7442 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7443 } 7444 7445 continue; 7446 } 7447 7448 TypeLocBuilder TypeArgBuilder; 7449 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7450 QualType NewTypeArg = 7451 getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7452 if (NewTypeArg.isNull()) 7453 return QualType(); 7454 7455 // If nothing changed, just keep the old TypeSourceInfo. 7456 if (NewTypeArg == TypeArg) { 7457 NewTypeArgInfos.push_back(TypeArgInfo); 7458 continue; 7459 } 7460 7461 NewTypeArgInfos.push_back( 7462 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7463 AnyChanged = true; 7464 } 7465 7466 QualType Result = TL.getType(); 7467 if (getDerived().AlwaysRebuild() || AnyChanged) { 7468 // Rebuild the type. 7469 Result = getDerived().RebuildObjCObjectType( 7470 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7471 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7472 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7473 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7474 7475 if (Result.isNull()) 7476 return QualType(); 7477 } 7478 7479 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7480 NewT.setHasBaseTypeAsWritten(true); 7481 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7482 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7483 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7484 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7485 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7486 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7487 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7488 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7489 return Result; 7490 } 7491 7492 template<typename Derived> 7493 QualType 7494 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7495 ObjCObjectPointerTypeLoc TL) { 7496 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7497 if (PointeeType.isNull()) 7498 return QualType(); 7499 7500 QualType Result = TL.getType(); 7501 if (getDerived().AlwaysRebuild() || 7502 PointeeType != TL.getPointeeLoc().getType()) { 7503 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7504 TL.getStarLoc()); 7505 if (Result.isNull()) 7506 return QualType(); 7507 } 7508 7509 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7510 NewT.setStarLoc(TL.getStarLoc()); 7511 return Result; 7512 } 7513 7514 //===----------------------------------------------------------------------===// 7515 // Statement transformation 7516 //===----------------------------------------------------------------------===// 7517 template<typename Derived> 7518 StmtResult 7519 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7520 return S; 7521 } 7522 7523 template<typename Derived> 7524 StmtResult 7525 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7526 return getDerived().TransformCompoundStmt(S, false); 7527 } 7528 7529 template<typename Derived> 7530 StmtResult 7531 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7532 bool IsStmtExpr) { 7533 Sema::CompoundScopeRAII CompoundScope(getSema()); 7534 Sema::FPFeaturesStateRAII FPSave(getSema()); 7535 if (S->hasStoredFPFeatures()) 7536 getSema().resetFPOptions( 7537 S->getStoredFPFeatures().applyOverrides(getSema().getLangOpts())); 7538 7539 const Stmt *ExprResult = S->getStmtExprResult(); 7540 bool SubStmtInvalid = false; 7541 bool SubStmtChanged = false; 7542 SmallVector<Stmt*, 8> Statements; 7543 for (auto *B : S->body()) { 7544 StmtResult Result = getDerived().TransformStmt( 7545 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7546 7547 if (Result.isInvalid()) { 7548 // Immediately fail if this was a DeclStmt, since it's very 7549 // likely that this will cause problems for future statements. 7550 if (isa<DeclStmt>(B)) 7551 return StmtError(); 7552 7553 // Otherwise, just keep processing substatements and fail later. 7554 SubStmtInvalid = true; 7555 continue; 7556 } 7557 7558 SubStmtChanged = SubStmtChanged || Result.get() != B; 7559 Statements.push_back(Result.getAs<Stmt>()); 7560 } 7561 7562 if (SubStmtInvalid) 7563 return StmtError(); 7564 7565 if (!getDerived().AlwaysRebuild() && 7566 !SubStmtChanged) 7567 return S; 7568 7569 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7570 Statements, 7571 S->getRBracLoc(), 7572 IsStmtExpr); 7573 } 7574 7575 template<typename Derived> 7576 StmtResult 7577 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7578 ExprResult LHS, RHS; 7579 { 7580 EnterExpressionEvaluationContext Unevaluated( 7581 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7582 7583 // Transform the left-hand case value. 7584 LHS = getDerived().TransformExpr(S->getLHS()); 7585 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7586 if (LHS.isInvalid()) 7587 return StmtError(); 7588 7589 // Transform the right-hand case value (for the GNU case-range extension). 7590 RHS = getDerived().TransformExpr(S->getRHS()); 7591 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7592 if (RHS.isInvalid()) 7593 return StmtError(); 7594 } 7595 7596 // Build the case statement. 7597 // Case statements are always rebuilt so that they will attached to their 7598 // transformed switch statement. 7599 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7600 LHS.get(), 7601 S->getEllipsisLoc(), 7602 RHS.get(), 7603 S->getColonLoc()); 7604 if (Case.isInvalid()) 7605 return StmtError(); 7606 7607 // Transform the statement following the case 7608 StmtResult SubStmt = 7609 getDerived().TransformStmt(S->getSubStmt()); 7610 if (SubStmt.isInvalid()) 7611 return StmtError(); 7612 7613 // Attach the body to the case statement 7614 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7615 } 7616 7617 template <typename Derived> 7618 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7619 // Transform the statement following the default case 7620 StmtResult SubStmt = 7621 getDerived().TransformStmt(S->getSubStmt()); 7622 if (SubStmt.isInvalid()) 7623 return StmtError(); 7624 7625 // Default statements are always rebuilt 7626 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7627 SubStmt.get()); 7628 } 7629 7630 template<typename Derived> 7631 StmtResult 7632 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7633 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7634 if (SubStmt.isInvalid()) 7635 return StmtError(); 7636 7637 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7638 S->getDecl()); 7639 if (!LD) 7640 return StmtError(); 7641 7642 // If we're transforming "in-place" (we're not creating new local 7643 // declarations), assume we're replacing the old label statement 7644 // and clear out the reference to it. 7645 if (LD == S->getDecl()) 7646 S->getDecl()->setStmt(nullptr); 7647 7648 // FIXME: Pass the real colon location in. 7649 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7650 cast<LabelDecl>(LD), SourceLocation(), 7651 SubStmt.get()); 7652 } 7653 7654 template <typename Derived> 7655 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7656 if (!R) 7657 return R; 7658 7659 switch (R->getKind()) { 7660 // Transform attributes by calling TransformXXXAttr. 7661 #define ATTR(X) \ 7662 case attr::X: \ 7663 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7664 #include "clang/Basic/AttrList.inc" 7665 } 7666 return R; 7667 } 7668 7669 template <typename Derived> 7670 const Attr *TreeTransform<Derived>::TransformStmtAttr(const Stmt *OrigS, 7671 const Stmt *InstS, 7672 const Attr *R) { 7673 if (!R) 7674 return R; 7675 7676 switch (R->getKind()) { 7677 // Transform attributes by calling TransformStmtXXXAttr. 7678 #define ATTR(X) \ 7679 case attr::X: \ 7680 return getDerived().TransformStmt##X##Attr(OrigS, InstS, cast<X##Attr>(R)); 7681 #include "clang/Basic/AttrList.inc" 7682 } 7683 return TransformAttr(R); 7684 } 7685 7686 template <typename Derived> 7687 StmtResult 7688 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7689 StmtDiscardKind SDK) { 7690 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7691 if (SubStmt.isInvalid()) 7692 return StmtError(); 7693 7694 bool AttrsChanged = false; 7695 SmallVector<const Attr *, 1> Attrs; 7696 7697 // Visit attributes and keep track if any are transformed. 7698 for (const auto *I : S->getAttrs()) { 7699 const Attr *R = 7700 getDerived().TransformStmtAttr(S->getSubStmt(), SubStmt.get(), I); 7701 AttrsChanged |= (I != R); 7702 if (R) 7703 Attrs.push_back(R); 7704 } 7705 7706 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7707 return S; 7708 7709 // If transforming the attributes failed for all of the attributes in the 7710 // statement, don't make an AttributedStmt without attributes. 7711 if (Attrs.empty()) 7712 return SubStmt; 7713 7714 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7715 SubStmt.get()); 7716 } 7717 7718 template<typename Derived> 7719 StmtResult 7720 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7721 // Transform the initialization statement 7722 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7723 if (Init.isInvalid()) 7724 return StmtError(); 7725 7726 Sema::ConditionResult Cond; 7727 if (!S->isConsteval()) { 7728 // Transform the condition 7729 Cond = getDerived().TransformCondition( 7730 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7731 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7732 : Sema::ConditionKind::Boolean); 7733 if (Cond.isInvalid()) 7734 return StmtError(); 7735 } 7736 7737 // If this is a constexpr if, determine which arm we should instantiate. 7738 std::optional<bool> ConstexprConditionValue; 7739 if (S->isConstexpr()) 7740 ConstexprConditionValue = Cond.getKnownValue(); 7741 7742 // Transform the "then" branch. 7743 StmtResult Then; 7744 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7745 Then = getDerived().TransformStmt(S->getThen()); 7746 if (Then.isInvalid()) 7747 return StmtError(); 7748 } else { 7749 // Discarded branch is replaced with empty CompoundStmt so we can keep 7750 // proper source location for start and end of original branch, so 7751 // subsequent transformations like CoverageMapping work properly 7752 Then = new (getSema().Context) 7753 CompoundStmt(S->getThen()->getBeginLoc(), S->getThen()->getEndLoc()); 7754 } 7755 7756 // Transform the "else" branch. 7757 StmtResult Else; 7758 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7759 Else = getDerived().TransformStmt(S->getElse()); 7760 if (Else.isInvalid()) 7761 return StmtError(); 7762 } else if (S->getElse() && ConstexprConditionValue && 7763 *ConstexprConditionValue) { 7764 // Same thing here as with <then> branch, we are discarding it, we can't 7765 // replace it with NULL nor NullStmt as we need to keep for source location 7766 // range, for CoverageMapping 7767 Else = new (getSema().Context) 7768 CompoundStmt(S->getElse()->getBeginLoc(), S->getElse()->getEndLoc()); 7769 } 7770 7771 if (!getDerived().AlwaysRebuild() && 7772 Init.get() == S->getInit() && 7773 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7774 Then.get() == S->getThen() && 7775 Else.get() == S->getElse()) 7776 return S; 7777 7778 return getDerived().RebuildIfStmt( 7779 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7780 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7781 } 7782 7783 template<typename Derived> 7784 StmtResult 7785 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7786 // Transform the initialization statement 7787 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7788 if (Init.isInvalid()) 7789 return StmtError(); 7790 7791 // Transform the condition. 7792 Sema::ConditionResult Cond = getDerived().TransformCondition( 7793 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7794 Sema::ConditionKind::Switch); 7795 if (Cond.isInvalid()) 7796 return StmtError(); 7797 7798 // Rebuild the switch statement. 7799 StmtResult Switch = 7800 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7801 Init.get(), Cond, S->getRParenLoc()); 7802 if (Switch.isInvalid()) 7803 return StmtError(); 7804 7805 // Transform the body of the switch statement. 7806 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7807 if (Body.isInvalid()) 7808 return StmtError(); 7809 7810 // Complete the switch statement. 7811 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7812 Body.get()); 7813 } 7814 7815 template<typename Derived> 7816 StmtResult 7817 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7818 // Transform the condition 7819 Sema::ConditionResult Cond = getDerived().TransformCondition( 7820 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7821 Sema::ConditionKind::Boolean); 7822 if (Cond.isInvalid()) 7823 return StmtError(); 7824 7825 // Transform the body 7826 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7827 if (Body.isInvalid()) 7828 return StmtError(); 7829 7830 if (!getDerived().AlwaysRebuild() && 7831 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7832 Body.get() == S->getBody()) 7833 return Owned(S); 7834 7835 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7836 Cond, S->getRParenLoc(), Body.get()); 7837 } 7838 7839 template<typename Derived> 7840 StmtResult 7841 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7842 // Transform the body 7843 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7844 if (Body.isInvalid()) 7845 return StmtError(); 7846 7847 // Transform the condition 7848 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7849 if (Cond.isInvalid()) 7850 return StmtError(); 7851 7852 if (!getDerived().AlwaysRebuild() && 7853 Cond.get() == S->getCond() && 7854 Body.get() == S->getBody()) 7855 return S; 7856 7857 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7858 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7859 S->getRParenLoc()); 7860 } 7861 7862 template<typename Derived> 7863 StmtResult 7864 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7865 if (getSema().getLangOpts().OpenMP) 7866 getSema().startOpenMPLoop(); 7867 7868 // Transform the initialization statement 7869 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7870 if (Init.isInvalid()) 7871 return StmtError(); 7872 7873 // In OpenMP loop region loop control variable must be captured and be 7874 // private. Perform analysis of first part (if any). 7875 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7876 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7877 7878 // Transform the condition 7879 Sema::ConditionResult Cond = getDerived().TransformCondition( 7880 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7881 Sema::ConditionKind::Boolean); 7882 if (Cond.isInvalid()) 7883 return StmtError(); 7884 7885 // Transform the increment 7886 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7887 if (Inc.isInvalid()) 7888 return StmtError(); 7889 7890 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7891 if (S->getInc() && !FullInc.get()) 7892 return StmtError(); 7893 7894 // Transform the body 7895 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7896 if (Body.isInvalid()) 7897 return StmtError(); 7898 7899 if (!getDerived().AlwaysRebuild() && 7900 Init.get() == S->getInit() && 7901 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7902 Inc.get() == S->getInc() && 7903 Body.get() == S->getBody()) 7904 return S; 7905 7906 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7907 Init.get(), Cond, FullInc, 7908 S->getRParenLoc(), Body.get()); 7909 } 7910 7911 template<typename Derived> 7912 StmtResult 7913 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7914 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7915 S->getLabel()); 7916 if (!LD) 7917 return StmtError(); 7918 7919 // Goto statements must always be rebuilt, to resolve the label. 7920 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7921 cast<LabelDecl>(LD)); 7922 } 7923 7924 template<typename Derived> 7925 StmtResult 7926 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7927 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7928 if (Target.isInvalid()) 7929 return StmtError(); 7930 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7931 7932 if (!getDerived().AlwaysRebuild() && 7933 Target.get() == S->getTarget()) 7934 return S; 7935 7936 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7937 Target.get()); 7938 } 7939 7940 template<typename Derived> 7941 StmtResult 7942 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7943 return S; 7944 } 7945 7946 template<typename Derived> 7947 StmtResult 7948 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7949 return S; 7950 } 7951 7952 template<typename Derived> 7953 StmtResult 7954 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7955 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7956 /*NotCopyInit*/false); 7957 if (Result.isInvalid()) 7958 return StmtError(); 7959 7960 // FIXME: We always rebuild the return statement because there is no way 7961 // to tell whether the return type of the function has changed. 7962 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7963 } 7964 7965 template<typename Derived> 7966 StmtResult 7967 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7968 bool DeclChanged = false; 7969 SmallVector<Decl *, 4> Decls; 7970 for (auto *D : S->decls()) { 7971 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7972 if (!Transformed) 7973 return StmtError(); 7974 7975 if (Transformed != D) 7976 DeclChanged = true; 7977 7978 Decls.push_back(Transformed); 7979 } 7980 7981 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7982 return S; 7983 7984 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7985 } 7986 7987 template<typename Derived> 7988 StmtResult 7989 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7990 7991 SmallVector<Expr*, 8> Constraints; 7992 SmallVector<Expr*, 8> Exprs; 7993 SmallVector<IdentifierInfo *, 4> Names; 7994 7995 ExprResult AsmString; 7996 SmallVector<Expr*, 8> Clobbers; 7997 7998 bool ExprsChanged = false; 7999 8000 // Go through the outputs. 8001 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 8002 Names.push_back(S->getOutputIdentifier(I)); 8003 8004 // No need to transform the constraint literal. 8005 Constraints.push_back(S->getOutputConstraintLiteral(I)); 8006 8007 // Transform the output expr. 8008 Expr *OutputExpr = S->getOutputExpr(I); 8009 ExprResult Result = getDerived().TransformExpr(OutputExpr); 8010 if (Result.isInvalid()) 8011 return StmtError(); 8012 8013 ExprsChanged |= Result.get() != OutputExpr; 8014 8015 Exprs.push_back(Result.get()); 8016 } 8017 8018 // Go through the inputs. 8019 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 8020 Names.push_back(S->getInputIdentifier(I)); 8021 8022 // No need to transform the constraint literal. 8023 Constraints.push_back(S->getInputConstraintLiteral(I)); 8024 8025 // Transform the input expr. 8026 Expr *InputExpr = S->getInputExpr(I); 8027 ExprResult Result = getDerived().TransformExpr(InputExpr); 8028 if (Result.isInvalid()) 8029 return StmtError(); 8030 8031 ExprsChanged |= Result.get() != InputExpr; 8032 8033 Exprs.push_back(Result.get()); 8034 } 8035 8036 // Go through the Labels. 8037 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 8038 Names.push_back(S->getLabelIdentifier(I)); 8039 8040 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 8041 if (Result.isInvalid()) 8042 return StmtError(); 8043 ExprsChanged |= Result.get() != S->getLabelExpr(I); 8044 Exprs.push_back(Result.get()); 8045 } 8046 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 8047 return S; 8048 8049 // Go through the clobbers. 8050 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 8051 Clobbers.push_back(S->getClobberStringLiteral(I)); 8052 8053 // No need to transform the asm string literal. 8054 AsmString = S->getAsmString(); 8055 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 8056 S->isVolatile(), S->getNumOutputs(), 8057 S->getNumInputs(), Names.data(), 8058 Constraints, Exprs, AsmString.get(), 8059 Clobbers, S->getNumLabels(), 8060 S->getRParenLoc()); 8061 } 8062 8063 template<typename Derived> 8064 StmtResult 8065 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 8066 ArrayRef<Token> AsmToks = llvm::ArrayRef(S->getAsmToks(), S->getNumAsmToks()); 8067 8068 bool HadError = false, HadChange = false; 8069 8070 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 8071 SmallVector<Expr*, 8> TransformedExprs; 8072 TransformedExprs.reserve(SrcExprs.size()); 8073 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 8074 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 8075 if (!Result.isUsable()) { 8076 HadError = true; 8077 } else { 8078 HadChange |= (Result.get() != SrcExprs[i]); 8079 TransformedExprs.push_back(Result.get()); 8080 } 8081 } 8082 8083 if (HadError) return StmtError(); 8084 if (!HadChange && !getDerived().AlwaysRebuild()) 8085 return Owned(S); 8086 8087 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 8088 AsmToks, S->getAsmString(), 8089 S->getNumOutputs(), S->getNumInputs(), 8090 S->getAllConstraints(), S->getClobbers(), 8091 TransformedExprs, S->getEndLoc()); 8092 } 8093 8094 // C++ Coroutines 8095 template<typename Derived> 8096 StmtResult 8097 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 8098 auto *ScopeInfo = SemaRef.getCurFunction(); 8099 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 8100 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 8101 ScopeInfo->NeedsCoroutineSuspends && 8102 ScopeInfo->CoroutineSuspends.first == nullptr && 8103 ScopeInfo->CoroutineSuspends.second == nullptr && 8104 "expected clean scope info"); 8105 8106 // Set that we have (possibly-invalid) suspend points before we do anything 8107 // that may fail. 8108 ScopeInfo->setNeedsCoroutineSuspends(false); 8109 8110 // We re-build the coroutine promise object (and the coroutine parameters its 8111 // type and constructor depend on) based on the types used in our current 8112 // function. We must do so, and set it on the current FunctionScopeInfo, 8113 // before attempting to transform the other parts of the coroutine body 8114 // statement, such as the implicit suspend statements (because those 8115 // statements reference the FunctionScopeInfo::CoroutinePromise). 8116 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 8117 return StmtError(); 8118 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 8119 if (!Promise) 8120 return StmtError(); 8121 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 8122 ScopeInfo->CoroutinePromise = Promise; 8123 8124 // Transform the implicit coroutine statements constructed using dependent 8125 // types during the previous parse: initial and final suspensions, the return 8126 // object, and others. We also transform the coroutine function's body. 8127 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 8128 if (InitSuspend.isInvalid()) 8129 return StmtError(); 8130 StmtResult FinalSuspend = 8131 getDerived().TransformStmt(S->getFinalSuspendStmt()); 8132 if (FinalSuspend.isInvalid() || 8133 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 8134 return StmtError(); 8135 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 8136 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 8137 8138 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 8139 if (BodyRes.isInvalid()) 8140 return StmtError(); 8141 8142 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 8143 if (Builder.isInvalid()) 8144 return StmtError(); 8145 8146 Expr *ReturnObject = S->getReturnValueInit(); 8147 assert(ReturnObject && "the return object is expected to be valid"); 8148 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 8149 /*NoCopyInit*/ false); 8150 if (Res.isInvalid()) 8151 return StmtError(); 8152 Builder.ReturnValue = Res.get(); 8153 8154 // If during the previous parse the coroutine still had a dependent promise 8155 // statement, we may need to build some implicit coroutine statements 8156 // (such as exception and fallthrough handlers) for the first time. 8157 if (S->hasDependentPromiseType()) { 8158 // We can only build these statements, however, if the current promise type 8159 // is not dependent. 8160 if (!Promise->getType()->isDependentType()) { 8161 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 8162 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 8163 "these nodes should not have been built yet"); 8164 if (!Builder.buildDependentStatements()) 8165 return StmtError(); 8166 } 8167 } else { 8168 if (auto *OnFallthrough = S->getFallthroughHandler()) { 8169 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 8170 if (Res.isInvalid()) 8171 return StmtError(); 8172 Builder.OnFallthrough = Res.get(); 8173 } 8174 8175 if (auto *OnException = S->getExceptionHandler()) { 8176 StmtResult Res = getDerived().TransformStmt(OnException); 8177 if (Res.isInvalid()) 8178 return StmtError(); 8179 Builder.OnException = Res.get(); 8180 } 8181 8182 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 8183 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 8184 if (Res.isInvalid()) 8185 return StmtError(); 8186 Builder.ReturnStmtOnAllocFailure = Res.get(); 8187 } 8188 8189 // Transform any additional statements we may have already built 8190 assert(S->getAllocate() && S->getDeallocate() && 8191 "allocation and deallocation calls must already be built"); 8192 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 8193 if (AllocRes.isInvalid()) 8194 return StmtError(); 8195 Builder.Allocate = AllocRes.get(); 8196 8197 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 8198 if (DeallocRes.isInvalid()) 8199 return StmtError(); 8200 Builder.Deallocate = DeallocRes.get(); 8201 8202 if (auto *ResultDecl = S->getResultDecl()) { 8203 StmtResult Res = getDerived().TransformStmt(ResultDecl); 8204 if (Res.isInvalid()) 8205 return StmtError(); 8206 Builder.ResultDecl = Res.get(); 8207 } 8208 8209 if (auto *ReturnStmt = S->getReturnStmt()) { 8210 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 8211 if (Res.isInvalid()) 8212 return StmtError(); 8213 Builder.ReturnStmt = Res.get(); 8214 } 8215 } 8216 8217 return getDerived().RebuildCoroutineBodyStmt(Builder); 8218 } 8219 8220 template<typename Derived> 8221 StmtResult 8222 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 8223 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 8224 /*NotCopyInit*/false); 8225 if (Result.isInvalid()) 8226 return StmtError(); 8227 8228 // Always rebuild; we don't know if this needs to be injected into a new 8229 // context or if the promise type has changed. 8230 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 8231 S->isImplicit()); 8232 } 8233 8234 template <typename Derived> 8235 ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 8236 ExprResult Operand = getDerived().TransformInitializer(E->getOperand(), 8237 /*NotCopyInit*/ false); 8238 if (Operand.isInvalid()) 8239 return ExprError(); 8240 8241 // Rebuild the common-expr from the operand rather than transforming it 8242 // separately. 8243 8244 // FIXME: getCurScope() should not be used during template instantiation. 8245 // We should pick up the set of unqualified lookup results for operator 8246 // co_await during the initial parse. 8247 ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr( 8248 getSema().getCurScope(), E->getKeywordLoc()); 8249 8250 // Always rebuild; we don't know if this needs to be injected into a new 8251 // context or if the promise type has changed. 8252 return getDerived().RebuildCoawaitExpr( 8253 E->getKeywordLoc(), Operand.get(), 8254 cast<UnresolvedLookupExpr>(Lookup.get()), E->isImplicit()); 8255 } 8256 8257 template <typename Derived> 8258 ExprResult 8259 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 8260 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 8261 /*NotCopyInit*/ false); 8262 if (OperandResult.isInvalid()) 8263 return ExprError(); 8264 8265 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 8266 E->getOperatorCoawaitLookup()); 8267 8268 if (LookupResult.isInvalid()) 8269 return ExprError(); 8270 8271 // Always rebuild; we don't know if this needs to be injected into a new 8272 // context or if the promise type has changed. 8273 return getDerived().RebuildDependentCoawaitExpr( 8274 E->getKeywordLoc(), OperandResult.get(), 8275 cast<UnresolvedLookupExpr>(LookupResult.get())); 8276 } 8277 8278 template<typename Derived> 8279 ExprResult 8280 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 8281 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 8282 /*NotCopyInit*/false); 8283 if (Result.isInvalid()) 8284 return ExprError(); 8285 8286 // Always rebuild; we don't know if this needs to be injected into a new 8287 // context or if the promise type has changed. 8288 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 8289 } 8290 8291 // Objective-C Statements. 8292 8293 template<typename Derived> 8294 StmtResult 8295 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 8296 // Transform the body of the @try. 8297 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 8298 if (TryBody.isInvalid()) 8299 return StmtError(); 8300 8301 // Transform the @catch statements (if present). 8302 bool AnyCatchChanged = false; 8303 SmallVector<Stmt*, 8> CatchStmts; 8304 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 8305 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 8306 if (Catch.isInvalid()) 8307 return StmtError(); 8308 if (Catch.get() != S->getCatchStmt(I)) 8309 AnyCatchChanged = true; 8310 CatchStmts.push_back(Catch.get()); 8311 } 8312 8313 // Transform the @finally statement (if present). 8314 StmtResult Finally; 8315 if (S->getFinallyStmt()) { 8316 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 8317 if (Finally.isInvalid()) 8318 return StmtError(); 8319 } 8320 8321 // If nothing changed, just retain this statement. 8322 if (!getDerived().AlwaysRebuild() && 8323 TryBody.get() == S->getTryBody() && 8324 !AnyCatchChanged && 8325 Finally.get() == S->getFinallyStmt()) 8326 return S; 8327 8328 // Build a new statement. 8329 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 8330 CatchStmts, Finally.get()); 8331 } 8332 8333 template<typename Derived> 8334 StmtResult 8335 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 8336 // Transform the @catch parameter, if there is one. 8337 VarDecl *Var = nullptr; 8338 if (VarDecl *FromVar = S->getCatchParamDecl()) { 8339 TypeSourceInfo *TSInfo = nullptr; 8340 if (FromVar->getTypeSourceInfo()) { 8341 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 8342 if (!TSInfo) 8343 return StmtError(); 8344 } 8345 8346 QualType T; 8347 if (TSInfo) 8348 T = TSInfo->getType(); 8349 else { 8350 T = getDerived().TransformType(FromVar->getType()); 8351 if (T.isNull()) 8352 return StmtError(); 8353 } 8354 8355 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8356 if (!Var) 8357 return StmtError(); 8358 } 8359 8360 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8361 if (Body.isInvalid()) 8362 return StmtError(); 8363 8364 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8365 S->getRParenLoc(), 8366 Var, Body.get()); 8367 } 8368 8369 template<typename Derived> 8370 StmtResult 8371 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8372 // Transform the body. 8373 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8374 if (Body.isInvalid()) 8375 return StmtError(); 8376 8377 // If nothing changed, just retain this statement. 8378 if (!getDerived().AlwaysRebuild() && 8379 Body.get() == S->getFinallyBody()) 8380 return S; 8381 8382 // Build a new statement. 8383 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8384 Body.get()); 8385 } 8386 8387 template<typename Derived> 8388 StmtResult 8389 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8390 ExprResult Operand; 8391 if (S->getThrowExpr()) { 8392 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8393 if (Operand.isInvalid()) 8394 return StmtError(); 8395 } 8396 8397 if (!getDerived().AlwaysRebuild() && 8398 Operand.get() == S->getThrowExpr()) 8399 return S; 8400 8401 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8402 } 8403 8404 template<typename Derived> 8405 StmtResult 8406 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8407 ObjCAtSynchronizedStmt *S) { 8408 // Transform the object we are locking. 8409 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8410 if (Object.isInvalid()) 8411 return StmtError(); 8412 Object = 8413 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8414 Object.get()); 8415 if (Object.isInvalid()) 8416 return StmtError(); 8417 8418 // Transform the body. 8419 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8420 if (Body.isInvalid()) 8421 return StmtError(); 8422 8423 // If nothing change, just retain the current statement. 8424 if (!getDerived().AlwaysRebuild() && 8425 Object.get() == S->getSynchExpr() && 8426 Body.get() == S->getSynchBody()) 8427 return S; 8428 8429 // Build a new statement. 8430 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8431 Object.get(), Body.get()); 8432 } 8433 8434 template<typename Derived> 8435 StmtResult 8436 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8437 ObjCAutoreleasePoolStmt *S) { 8438 // Transform the body. 8439 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8440 if (Body.isInvalid()) 8441 return StmtError(); 8442 8443 // If nothing changed, just retain this statement. 8444 if (!getDerived().AlwaysRebuild() && 8445 Body.get() == S->getSubStmt()) 8446 return S; 8447 8448 // Build a new statement. 8449 return getDerived().RebuildObjCAutoreleasePoolStmt( 8450 S->getAtLoc(), Body.get()); 8451 } 8452 8453 template<typename Derived> 8454 StmtResult 8455 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8456 ObjCForCollectionStmt *S) { 8457 // Transform the element statement. 8458 StmtResult Element = 8459 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8460 if (Element.isInvalid()) 8461 return StmtError(); 8462 8463 // Transform the collection expression. 8464 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8465 if (Collection.isInvalid()) 8466 return StmtError(); 8467 8468 // Transform the body. 8469 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8470 if (Body.isInvalid()) 8471 return StmtError(); 8472 8473 // If nothing changed, just retain this statement. 8474 if (!getDerived().AlwaysRebuild() && 8475 Element.get() == S->getElement() && 8476 Collection.get() == S->getCollection() && 8477 Body.get() == S->getBody()) 8478 return S; 8479 8480 // Build a new statement. 8481 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8482 Element.get(), 8483 Collection.get(), 8484 S->getRParenLoc(), 8485 Body.get()); 8486 } 8487 8488 template <typename Derived> 8489 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8490 // Transform the exception declaration, if any. 8491 VarDecl *Var = nullptr; 8492 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8493 TypeSourceInfo *T = 8494 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8495 if (!T) 8496 return StmtError(); 8497 8498 Var = getDerived().RebuildExceptionDecl( 8499 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8500 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8501 if (!Var || Var->isInvalidDecl()) 8502 return StmtError(); 8503 } 8504 8505 // Transform the actual exception handler. 8506 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8507 if (Handler.isInvalid()) 8508 return StmtError(); 8509 8510 if (!getDerived().AlwaysRebuild() && !Var && 8511 Handler.get() == S->getHandlerBlock()) 8512 return S; 8513 8514 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8515 } 8516 8517 template <typename Derived> 8518 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8519 // Transform the try block itself. 8520 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8521 if (TryBlock.isInvalid()) 8522 return StmtError(); 8523 8524 // Transform the handlers. 8525 bool HandlerChanged = false; 8526 SmallVector<Stmt *, 8> Handlers; 8527 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8528 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8529 if (Handler.isInvalid()) 8530 return StmtError(); 8531 8532 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8533 Handlers.push_back(Handler.getAs<Stmt>()); 8534 } 8535 8536 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8537 !HandlerChanged) 8538 return S; 8539 8540 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8541 Handlers); 8542 } 8543 8544 template<typename Derived> 8545 StmtResult 8546 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8547 StmtResult Init = 8548 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8549 if (Init.isInvalid()) 8550 return StmtError(); 8551 8552 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8553 if (Range.isInvalid()) 8554 return StmtError(); 8555 8556 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8557 if (Begin.isInvalid()) 8558 return StmtError(); 8559 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8560 if (End.isInvalid()) 8561 return StmtError(); 8562 8563 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8564 if (Cond.isInvalid()) 8565 return StmtError(); 8566 if (Cond.get()) 8567 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8568 if (Cond.isInvalid()) 8569 return StmtError(); 8570 if (Cond.get()) 8571 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8572 8573 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8574 if (Inc.isInvalid()) 8575 return StmtError(); 8576 if (Inc.get()) 8577 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8578 8579 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8580 if (LoopVar.isInvalid()) 8581 return StmtError(); 8582 8583 StmtResult NewStmt = S; 8584 if (getDerived().AlwaysRebuild() || 8585 Init.get() != S->getInit() || 8586 Range.get() != S->getRangeStmt() || 8587 Begin.get() != S->getBeginStmt() || 8588 End.get() != S->getEndStmt() || 8589 Cond.get() != S->getCond() || 8590 Inc.get() != S->getInc() || 8591 LoopVar.get() != S->getLoopVarStmt()) { 8592 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8593 S->getCoawaitLoc(), Init.get(), 8594 S->getColonLoc(), Range.get(), 8595 Begin.get(), End.get(), 8596 Cond.get(), 8597 Inc.get(), LoopVar.get(), 8598 S->getRParenLoc()); 8599 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8600 // Might not have attached any initializer to the loop variable. 8601 getSema().ActOnInitializerError( 8602 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8603 return StmtError(); 8604 } 8605 } 8606 8607 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8608 if (Body.isInvalid()) 8609 return StmtError(); 8610 8611 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8612 // it now so we have a new statement to attach the body to. 8613 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8614 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8615 S->getCoawaitLoc(), Init.get(), 8616 S->getColonLoc(), Range.get(), 8617 Begin.get(), End.get(), 8618 Cond.get(), 8619 Inc.get(), LoopVar.get(), 8620 S->getRParenLoc()); 8621 if (NewStmt.isInvalid()) 8622 return StmtError(); 8623 } 8624 8625 if (NewStmt.get() == S) 8626 return S; 8627 8628 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8629 } 8630 8631 template<typename Derived> 8632 StmtResult 8633 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8634 MSDependentExistsStmt *S) { 8635 // Transform the nested-name-specifier, if any. 8636 NestedNameSpecifierLoc QualifierLoc; 8637 if (S->getQualifierLoc()) { 8638 QualifierLoc 8639 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8640 if (!QualifierLoc) 8641 return StmtError(); 8642 } 8643 8644 // Transform the declaration name. 8645 DeclarationNameInfo NameInfo = S->getNameInfo(); 8646 if (NameInfo.getName()) { 8647 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8648 if (!NameInfo.getName()) 8649 return StmtError(); 8650 } 8651 8652 // Check whether anything changed. 8653 if (!getDerived().AlwaysRebuild() && 8654 QualifierLoc == S->getQualifierLoc() && 8655 NameInfo.getName() == S->getNameInfo().getName()) 8656 return S; 8657 8658 // Determine whether this name exists, if we can. 8659 CXXScopeSpec SS; 8660 SS.Adopt(QualifierLoc); 8661 bool Dependent = false; 8662 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8663 case Sema::IER_Exists: 8664 if (S->isIfExists()) 8665 break; 8666 8667 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8668 8669 case Sema::IER_DoesNotExist: 8670 if (S->isIfNotExists()) 8671 break; 8672 8673 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8674 8675 case Sema::IER_Dependent: 8676 Dependent = true; 8677 break; 8678 8679 case Sema::IER_Error: 8680 return StmtError(); 8681 } 8682 8683 // We need to continue with the instantiation, so do so now. 8684 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8685 if (SubStmt.isInvalid()) 8686 return StmtError(); 8687 8688 // If we have resolved the name, just transform to the substatement. 8689 if (!Dependent) 8690 return SubStmt; 8691 8692 // The name is still dependent, so build a dependent expression again. 8693 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8694 S->isIfExists(), 8695 QualifierLoc, 8696 NameInfo, 8697 SubStmt.get()); 8698 } 8699 8700 template<typename Derived> 8701 ExprResult 8702 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8703 NestedNameSpecifierLoc QualifierLoc; 8704 if (E->getQualifierLoc()) { 8705 QualifierLoc 8706 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8707 if (!QualifierLoc) 8708 return ExprError(); 8709 } 8710 8711 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8712 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8713 if (!PD) 8714 return ExprError(); 8715 8716 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8717 if (Base.isInvalid()) 8718 return ExprError(); 8719 8720 return new (SemaRef.getASTContext()) 8721 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8722 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8723 QualifierLoc, E->getMemberLoc()); 8724 } 8725 8726 template <typename Derived> 8727 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8728 MSPropertySubscriptExpr *E) { 8729 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8730 if (BaseRes.isInvalid()) 8731 return ExprError(); 8732 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8733 if (IdxRes.isInvalid()) 8734 return ExprError(); 8735 8736 if (!getDerived().AlwaysRebuild() && 8737 BaseRes.get() == E->getBase() && 8738 IdxRes.get() == E->getIdx()) 8739 return E; 8740 8741 return getDerived().RebuildArraySubscriptExpr( 8742 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8743 } 8744 8745 template <typename Derived> 8746 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8747 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8748 if (TryBlock.isInvalid()) 8749 return StmtError(); 8750 8751 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8752 if (Handler.isInvalid()) 8753 return StmtError(); 8754 8755 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8756 Handler.get() == S->getHandler()) 8757 return S; 8758 8759 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8760 TryBlock.get(), Handler.get()); 8761 } 8762 8763 template <typename Derived> 8764 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8765 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8766 if (Block.isInvalid()) 8767 return StmtError(); 8768 8769 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8770 } 8771 8772 template <typename Derived> 8773 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8774 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8775 if (FilterExpr.isInvalid()) 8776 return StmtError(); 8777 8778 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8779 if (Block.isInvalid()) 8780 return StmtError(); 8781 8782 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8783 Block.get()); 8784 } 8785 8786 template <typename Derived> 8787 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8788 if (isa<SEHFinallyStmt>(Handler)) 8789 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8790 else 8791 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8792 } 8793 8794 template<typename Derived> 8795 StmtResult 8796 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8797 return S; 8798 } 8799 8800 //===----------------------------------------------------------------------===// 8801 // OpenMP directive transformation 8802 //===----------------------------------------------------------------------===// 8803 8804 template <typename Derived> 8805 StmtResult 8806 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8807 // OMPCanonicalLoops are eliminated during transformation, since they will be 8808 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8809 // after transformation. 8810 return getDerived().TransformStmt(L->getLoopStmt()); 8811 } 8812 8813 template <typename Derived> 8814 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8815 OMPExecutableDirective *D) { 8816 8817 // Transform the clauses 8818 llvm::SmallVector<OMPClause *, 16> TClauses; 8819 ArrayRef<OMPClause *> Clauses = D->clauses(); 8820 TClauses.reserve(Clauses.size()); 8821 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8822 I != E; ++I) { 8823 if (*I) { 8824 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8825 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8826 getDerived().getSema().EndOpenMPClause(); 8827 if (Clause) 8828 TClauses.push_back(Clause); 8829 } else { 8830 TClauses.push_back(nullptr); 8831 } 8832 } 8833 StmtResult AssociatedStmt; 8834 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8835 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8836 /*CurScope=*/nullptr); 8837 StmtResult Body; 8838 { 8839 Sema::CompoundScopeRAII CompoundScope(getSema()); 8840 Stmt *CS; 8841 if (D->getDirectiveKind() == OMPD_atomic || 8842 D->getDirectiveKind() == OMPD_critical || 8843 D->getDirectiveKind() == OMPD_section || 8844 D->getDirectiveKind() == OMPD_master) 8845 CS = D->getAssociatedStmt(); 8846 else 8847 CS = D->getRawStmt(); 8848 Body = getDerived().TransformStmt(CS); 8849 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8850 getSema().getLangOpts().OpenMPIRBuilder) 8851 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8852 } 8853 AssociatedStmt = 8854 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8855 if (AssociatedStmt.isInvalid()) { 8856 return StmtError(); 8857 } 8858 } 8859 if (TClauses.size() != Clauses.size()) { 8860 return StmtError(); 8861 } 8862 8863 // Transform directive name for 'omp critical' directive. 8864 DeclarationNameInfo DirName; 8865 if (D->getDirectiveKind() == OMPD_critical) { 8866 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8867 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8868 } 8869 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8870 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8871 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8872 } else if (D->getDirectiveKind() == OMPD_cancel) { 8873 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8874 } 8875 8876 return getDerived().RebuildOMPExecutableDirective( 8877 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8878 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc(), 8879 D->getMappedDirective()); 8880 } 8881 8882 template <typename Derived> 8883 StmtResult 8884 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8885 // TODO: Fix This 8886 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8887 << getOpenMPDirectiveName(D->getDirectiveKind()); 8888 return StmtError(); 8889 } 8890 8891 template <typename Derived> 8892 StmtResult 8893 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8894 DeclarationNameInfo DirName; 8895 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8896 D->getBeginLoc()); 8897 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8898 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8899 return Res; 8900 } 8901 8902 template <typename Derived> 8903 StmtResult 8904 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8905 DeclarationNameInfo DirName; 8906 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8907 D->getBeginLoc()); 8908 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8909 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8910 return Res; 8911 } 8912 8913 template <typename Derived> 8914 StmtResult 8915 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8916 DeclarationNameInfo DirName; 8917 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8918 nullptr, D->getBeginLoc()); 8919 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8920 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8921 return Res; 8922 } 8923 8924 template <typename Derived> 8925 StmtResult 8926 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8927 DeclarationNameInfo DirName; 8928 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8929 nullptr, D->getBeginLoc()); 8930 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8931 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8932 return Res; 8933 } 8934 8935 template <typename Derived> 8936 StmtResult 8937 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8938 DeclarationNameInfo DirName; 8939 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8940 D->getBeginLoc()); 8941 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8942 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8943 return Res; 8944 } 8945 8946 template <typename Derived> 8947 StmtResult 8948 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8949 DeclarationNameInfo DirName; 8950 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8951 D->getBeginLoc()); 8952 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8953 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8954 return Res; 8955 } 8956 8957 template <typename Derived> 8958 StmtResult 8959 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8960 DeclarationNameInfo DirName; 8961 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8962 D->getBeginLoc()); 8963 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8964 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8965 return Res; 8966 } 8967 8968 template <typename Derived> 8969 StmtResult 8970 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8971 DeclarationNameInfo DirName; 8972 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8973 D->getBeginLoc()); 8974 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8975 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8976 return Res; 8977 } 8978 8979 template <typename Derived> 8980 StmtResult 8981 TreeTransform<Derived>::TransformOMPScopeDirective(OMPScopeDirective *D) { 8982 DeclarationNameInfo DirName; 8983 getDerived().getSema().StartOpenMPDSABlock(OMPD_scope, DirName, nullptr, 8984 D->getBeginLoc()); 8985 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8986 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8987 return Res; 8988 } 8989 8990 template <typename Derived> 8991 StmtResult 8992 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8993 DeclarationNameInfo DirName; 8994 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8995 D->getBeginLoc()); 8996 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8997 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8998 return Res; 8999 } 9000 9001 template <typename Derived> 9002 StmtResult 9003 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 9004 DeclarationNameInfo DirName; 9005 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 9006 D->getBeginLoc()); 9007 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9008 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9009 return Res; 9010 } 9011 9012 template <typename Derived> 9013 StmtResult 9014 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 9015 getDerived().getSema().StartOpenMPDSABlock( 9016 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 9017 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9018 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9019 return Res; 9020 } 9021 9022 template <typename Derived> 9023 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 9024 OMPParallelForDirective *D) { 9025 DeclarationNameInfo DirName; 9026 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 9027 nullptr, D->getBeginLoc()); 9028 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9029 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9030 return Res; 9031 } 9032 9033 template <typename Derived> 9034 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 9035 OMPParallelForSimdDirective *D) { 9036 DeclarationNameInfo DirName; 9037 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 9038 nullptr, D->getBeginLoc()); 9039 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9040 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9041 return Res; 9042 } 9043 9044 template <typename Derived> 9045 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 9046 OMPParallelMasterDirective *D) { 9047 DeclarationNameInfo DirName; 9048 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 9049 nullptr, D->getBeginLoc()); 9050 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9051 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9052 return Res; 9053 } 9054 9055 template <typename Derived> 9056 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective( 9057 OMPParallelMaskedDirective *D) { 9058 DeclarationNameInfo DirName; 9059 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_masked, DirName, 9060 nullptr, D->getBeginLoc()); 9061 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9062 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9063 return Res; 9064 } 9065 9066 template <typename Derived> 9067 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 9068 OMPParallelSectionsDirective *D) { 9069 DeclarationNameInfo DirName; 9070 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 9071 nullptr, D->getBeginLoc()); 9072 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9073 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9074 return Res; 9075 } 9076 9077 template <typename Derived> 9078 StmtResult 9079 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 9080 DeclarationNameInfo DirName; 9081 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 9082 D->getBeginLoc()); 9083 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9084 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9085 return Res; 9086 } 9087 9088 template <typename Derived> 9089 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 9090 OMPTaskyieldDirective *D) { 9091 DeclarationNameInfo DirName; 9092 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 9093 D->getBeginLoc()); 9094 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9095 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9096 return Res; 9097 } 9098 9099 template <typename Derived> 9100 StmtResult 9101 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 9102 DeclarationNameInfo DirName; 9103 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 9104 D->getBeginLoc()); 9105 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9106 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9107 return Res; 9108 } 9109 9110 template <typename Derived> 9111 StmtResult 9112 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 9113 DeclarationNameInfo DirName; 9114 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 9115 D->getBeginLoc()); 9116 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9117 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9118 return Res; 9119 } 9120 9121 template <typename Derived> 9122 StmtResult 9123 TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *D) { 9124 DeclarationNameInfo DirName; 9125 getDerived().getSema().StartOpenMPDSABlock(OMPD_error, DirName, nullptr, 9126 D->getBeginLoc()); 9127 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9128 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9129 return Res; 9130 } 9131 9132 template <typename Derived> 9133 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 9134 OMPTaskgroupDirective *D) { 9135 DeclarationNameInfo DirName; 9136 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 9137 D->getBeginLoc()); 9138 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9139 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9140 return Res; 9141 } 9142 9143 template <typename Derived> 9144 StmtResult 9145 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 9146 DeclarationNameInfo DirName; 9147 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 9148 D->getBeginLoc()); 9149 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9150 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9151 return Res; 9152 } 9153 9154 template <typename Derived> 9155 StmtResult 9156 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 9157 DeclarationNameInfo DirName; 9158 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 9159 D->getBeginLoc()); 9160 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9161 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9162 return Res; 9163 } 9164 9165 template <typename Derived> 9166 StmtResult 9167 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 9168 DeclarationNameInfo DirName; 9169 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 9170 D->getBeginLoc()); 9171 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9172 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9173 return Res; 9174 } 9175 9176 template <typename Derived> 9177 StmtResult 9178 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 9179 DeclarationNameInfo DirName; 9180 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 9181 D->getBeginLoc()); 9182 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9183 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9184 return Res; 9185 } 9186 9187 template <typename Derived> 9188 StmtResult 9189 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 9190 DeclarationNameInfo DirName; 9191 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 9192 D->getBeginLoc()); 9193 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9194 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9195 return Res; 9196 } 9197 9198 template <typename Derived> 9199 StmtResult 9200 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 9201 DeclarationNameInfo DirName; 9202 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 9203 D->getBeginLoc()); 9204 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9205 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9206 return Res; 9207 } 9208 9209 template <typename Derived> 9210 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 9211 OMPTargetDataDirective *D) { 9212 DeclarationNameInfo DirName; 9213 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 9214 D->getBeginLoc()); 9215 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9216 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9217 return Res; 9218 } 9219 9220 template <typename Derived> 9221 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 9222 OMPTargetEnterDataDirective *D) { 9223 DeclarationNameInfo DirName; 9224 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 9225 nullptr, D->getBeginLoc()); 9226 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9227 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9228 return Res; 9229 } 9230 9231 template <typename Derived> 9232 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 9233 OMPTargetExitDataDirective *D) { 9234 DeclarationNameInfo DirName; 9235 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 9236 nullptr, D->getBeginLoc()); 9237 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9238 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9239 return Res; 9240 } 9241 9242 template <typename Derived> 9243 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 9244 OMPTargetParallelDirective *D) { 9245 DeclarationNameInfo DirName; 9246 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 9247 nullptr, D->getBeginLoc()); 9248 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9249 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9250 return Res; 9251 } 9252 9253 template <typename Derived> 9254 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 9255 OMPTargetParallelForDirective *D) { 9256 DeclarationNameInfo DirName; 9257 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 9258 nullptr, D->getBeginLoc()); 9259 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9260 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9261 return Res; 9262 } 9263 9264 template <typename Derived> 9265 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 9266 OMPTargetUpdateDirective *D) { 9267 DeclarationNameInfo DirName; 9268 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 9269 nullptr, D->getBeginLoc()); 9270 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9271 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9272 return Res; 9273 } 9274 9275 template <typename Derived> 9276 StmtResult 9277 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 9278 DeclarationNameInfo DirName; 9279 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 9280 D->getBeginLoc()); 9281 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9282 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9283 return Res; 9284 } 9285 9286 template <typename Derived> 9287 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 9288 OMPCancellationPointDirective *D) { 9289 DeclarationNameInfo DirName; 9290 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 9291 nullptr, D->getBeginLoc()); 9292 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9293 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9294 return Res; 9295 } 9296 9297 template <typename Derived> 9298 StmtResult 9299 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 9300 DeclarationNameInfo DirName; 9301 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 9302 D->getBeginLoc()); 9303 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9304 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9305 return Res; 9306 } 9307 9308 template <typename Derived> 9309 StmtResult 9310 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 9311 DeclarationNameInfo DirName; 9312 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 9313 D->getBeginLoc()); 9314 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9315 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9316 return Res; 9317 } 9318 9319 template <typename Derived> 9320 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 9321 OMPTaskLoopSimdDirective *D) { 9322 DeclarationNameInfo DirName; 9323 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 9324 nullptr, D->getBeginLoc()); 9325 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9326 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9327 return Res; 9328 } 9329 9330 template <typename Derived> 9331 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 9332 OMPMasterTaskLoopDirective *D) { 9333 DeclarationNameInfo DirName; 9334 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 9335 nullptr, D->getBeginLoc()); 9336 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9337 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9338 return Res; 9339 } 9340 9341 template <typename Derived> 9342 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective( 9343 OMPMaskedTaskLoopDirective *D) { 9344 DeclarationNameInfo DirName; 9345 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop, DirName, 9346 nullptr, D->getBeginLoc()); 9347 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9348 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9349 return Res; 9350 } 9351 9352 template <typename Derived> 9353 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 9354 OMPMasterTaskLoopSimdDirective *D) { 9355 DeclarationNameInfo DirName; 9356 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 9357 nullptr, D->getBeginLoc()); 9358 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9359 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9360 return Res; 9361 } 9362 9363 template <typename Derived> 9364 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective( 9365 OMPMaskedTaskLoopSimdDirective *D) { 9366 DeclarationNameInfo DirName; 9367 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop_simd, DirName, 9368 nullptr, D->getBeginLoc()); 9369 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9370 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9371 return Res; 9372 } 9373 9374 template <typename Derived> 9375 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 9376 OMPParallelMasterTaskLoopDirective *D) { 9377 DeclarationNameInfo DirName; 9378 getDerived().getSema().StartOpenMPDSABlock( 9379 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 9380 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9381 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9382 return Res; 9383 } 9384 9385 template <typename Derived> 9386 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective( 9387 OMPParallelMaskedTaskLoopDirective *D) { 9388 DeclarationNameInfo DirName; 9389 getDerived().getSema().StartOpenMPDSABlock( 9390 OMPD_parallel_masked_taskloop, DirName, nullptr, D->getBeginLoc()); 9391 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9392 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9393 return Res; 9394 } 9395 9396 template <typename Derived> 9397 StmtResult 9398 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 9399 OMPParallelMasterTaskLoopSimdDirective *D) { 9400 DeclarationNameInfo DirName; 9401 getDerived().getSema().StartOpenMPDSABlock( 9402 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9403 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9404 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9405 return Res; 9406 } 9407 9408 template <typename Derived> 9409 StmtResult 9410 TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective( 9411 OMPParallelMaskedTaskLoopSimdDirective *D) { 9412 DeclarationNameInfo DirName; 9413 getDerived().getSema().StartOpenMPDSABlock( 9414 OMPD_parallel_masked_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9415 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9416 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9417 return Res; 9418 } 9419 9420 template <typename Derived> 9421 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 9422 OMPDistributeDirective *D) { 9423 DeclarationNameInfo DirName; 9424 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9425 D->getBeginLoc()); 9426 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9427 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9428 return Res; 9429 } 9430 9431 template <typename Derived> 9432 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 9433 OMPDistributeParallelForDirective *D) { 9434 DeclarationNameInfo DirName; 9435 getDerived().getSema().StartOpenMPDSABlock( 9436 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9437 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9438 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9439 return Res; 9440 } 9441 9442 template <typename Derived> 9443 StmtResult 9444 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9445 OMPDistributeParallelForSimdDirective *D) { 9446 DeclarationNameInfo DirName; 9447 getDerived().getSema().StartOpenMPDSABlock( 9448 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9449 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9450 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9451 return Res; 9452 } 9453 9454 template <typename Derived> 9455 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9456 OMPDistributeSimdDirective *D) { 9457 DeclarationNameInfo DirName; 9458 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9459 nullptr, D->getBeginLoc()); 9460 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9461 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9462 return Res; 9463 } 9464 9465 template <typename Derived> 9466 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9467 OMPTargetParallelForSimdDirective *D) { 9468 DeclarationNameInfo DirName; 9469 getDerived().getSema().StartOpenMPDSABlock( 9470 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9471 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9472 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9473 return Res; 9474 } 9475 9476 template <typename Derived> 9477 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9478 OMPTargetSimdDirective *D) { 9479 DeclarationNameInfo DirName; 9480 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 9481 D->getBeginLoc()); 9482 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9483 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9484 return Res; 9485 } 9486 9487 template <typename Derived> 9488 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9489 OMPTeamsDistributeDirective *D) { 9490 DeclarationNameInfo DirName; 9491 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9492 nullptr, D->getBeginLoc()); 9493 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9494 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9495 return Res; 9496 } 9497 9498 template <typename Derived> 9499 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9500 OMPTeamsDistributeSimdDirective *D) { 9501 DeclarationNameInfo DirName; 9502 getDerived().getSema().StartOpenMPDSABlock( 9503 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9504 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9505 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9506 return Res; 9507 } 9508 9509 template <typename Derived> 9510 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9511 OMPTeamsDistributeParallelForSimdDirective *D) { 9512 DeclarationNameInfo DirName; 9513 getDerived().getSema().StartOpenMPDSABlock( 9514 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9515 D->getBeginLoc()); 9516 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9517 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9518 return Res; 9519 } 9520 9521 template <typename Derived> 9522 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9523 OMPTeamsDistributeParallelForDirective *D) { 9524 DeclarationNameInfo DirName; 9525 getDerived().getSema().StartOpenMPDSABlock( 9526 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9527 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9528 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9529 return Res; 9530 } 9531 9532 template <typename Derived> 9533 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9534 OMPTargetTeamsDirective *D) { 9535 DeclarationNameInfo DirName; 9536 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9537 nullptr, D->getBeginLoc()); 9538 auto Res = getDerived().TransformOMPExecutableDirective(D); 9539 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9540 return Res; 9541 } 9542 9543 template <typename Derived> 9544 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9545 OMPTargetTeamsDistributeDirective *D) { 9546 DeclarationNameInfo DirName; 9547 getDerived().getSema().StartOpenMPDSABlock( 9548 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9549 auto Res = getDerived().TransformOMPExecutableDirective(D); 9550 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9551 return Res; 9552 } 9553 9554 template <typename Derived> 9555 StmtResult 9556 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9557 OMPTargetTeamsDistributeParallelForDirective *D) { 9558 DeclarationNameInfo DirName; 9559 getDerived().getSema().StartOpenMPDSABlock( 9560 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9561 D->getBeginLoc()); 9562 auto Res = getDerived().TransformOMPExecutableDirective(D); 9563 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9564 return Res; 9565 } 9566 9567 template <typename Derived> 9568 StmtResult TreeTransform<Derived>:: 9569 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9570 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9571 DeclarationNameInfo DirName; 9572 getDerived().getSema().StartOpenMPDSABlock( 9573 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9574 D->getBeginLoc()); 9575 auto Res = getDerived().TransformOMPExecutableDirective(D); 9576 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9577 return Res; 9578 } 9579 9580 template <typename Derived> 9581 StmtResult 9582 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9583 OMPTargetTeamsDistributeSimdDirective *D) { 9584 DeclarationNameInfo DirName; 9585 getDerived().getSema().StartOpenMPDSABlock( 9586 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9587 auto Res = getDerived().TransformOMPExecutableDirective(D); 9588 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9589 return Res; 9590 } 9591 9592 template <typename Derived> 9593 StmtResult 9594 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9595 DeclarationNameInfo DirName; 9596 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9597 D->getBeginLoc()); 9598 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9599 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9600 return Res; 9601 } 9602 9603 template <typename Derived> 9604 StmtResult 9605 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9606 DeclarationNameInfo DirName; 9607 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9608 D->getBeginLoc()); 9609 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9610 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9611 return Res; 9612 } 9613 9614 template <typename Derived> 9615 StmtResult 9616 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9617 DeclarationNameInfo DirName; 9618 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9619 D->getBeginLoc()); 9620 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9621 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9622 return Res; 9623 } 9624 9625 template <typename Derived> 9626 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9627 OMPGenericLoopDirective *D) { 9628 DeclarationNameInfo DirName; 9629 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9630 D->getBeginLoc()); 9631 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9632 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9633 return Res; 9634 } 9635 9636 template <typename Derived> 9637 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective( 9638 OMPTeamsGenericLoopDirective *D) { 9639 DeclarationNameInfo DirName; 9640 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr, 9641 D->getBeginLoc()); 9642 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9643 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9644 return Res; 9645 } 9646 9647 template <typename Derived> 9648 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective( 9649 OMPTargetTeamsGenericLoopDirective *D) { 9650 DeclarationNameInfo DirName; 9651 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName, 9652 nullptr, D->getBeginLoc()); 9653 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9654 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9655 return Res; 9656 } 9657 9658 template <typename Derived> 9659 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective( 9660 OMPParallelGenericLoopDirective *D) { 9661 DeclarationNameInfo DirName; 9662 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName, 9663 nullptr, D->getBeginLoc()); 9664 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9665 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9666 return Res; 9667 } 9668 9669 template <typename Derived> 9670 StmtResult 9671 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective( 9672 OMPTargetParallelGenericLoopDirective *D) { 9673 DeclarationNameInfo DirName; 9674 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName, 9675 nullptr, D->getBeginLoc()); 9676 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9677 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9678 return Res; 9679 } 9680 9681 //===----------------------------------------------------------------------===// 9682 // OpenMP clause transformation 9683 //===----------------------------------------------------------------------===// 9684 template <typename Derived> 9685 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9686 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9687 if (Cond.isInvalid()) 9688 return nullptr; 9689 return getDerived().RebuildOMPIfClause( 9690 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9691 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9692 } 9693 9694 template <typename Derived> 9695 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9696 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9697 if (Cond.isInvalid()) 9698 return nullptr; 9699 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9700 C->getLParenLoc(), C->getEndLoc()); 9701 } 9702 9703 template <typename Derived> 9704 OMPClause * 9705 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9706 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9707 if (NumThreads.isInvalid()) 9708 return nullptr; 9709 return getDerived().RebuildOMPNumThreadsClause( 9710 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9711 } 9712 9713 template <typename Derived> 9714 OMPClause * 9715 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9716 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9717 if (E.isInvalid()) 9718 return nullptr; 9719 return getDerived().RebuildOMPSafelenClause( 9720 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9721 } 9722 9723 template <typename Derived> 9724 OMPClause * 9725 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9726 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9727 if (E.isInvalid()) 9728 return nullptr; 9729 return getDerived().RebuildOMPAllocatorClause( 9730 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9731 } 9732 9733 template <typename Derived> 9734 OMPClause * 9735 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9736 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9737 if (E.isInvalid()) 9738 return nullptr; 9739 return getDerived().RebuildOMPSimdlenClause( 9740 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9741 } 9742 9743 template <typename Derived> 9744 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9745 SmallVector<Expr *, 4> TransformedSizes; 9746 TransformedSizes.reserve(C->getNumSizes()); 9747 bool Changed = false; 9748 for (Expr *E : C->getSizesRefs()) { 9749 if (!E) { 9750 TransformedSizes.push_back(nullptr); 9751 continue; 9752 } 9753 9754 ExprResult T = getDerived().TransformExpr(E); 9755 if (T.isInvalid()) 9756 return nullptr; 9757 if (E != T.get()) 9758 Changed = true; 9759 TransformedSizes.push_back(T.get()); 9760 } 9761 9762 if (!Changed && !getDerived().AlwaysRebuild()) 9763 return C; 9764 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9765 C->getLParenLoc(), C->getEndLoc()); 9766 } 9767 9768 template <typename Derived> 9769 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9770 if (!getDerived().AlwaysRebuild()) 9771 return C; 9772 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9773 } 9774 9775 template <typename Derived> 9776 OMPClause * 9777 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9778 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9779 if (T.isInvalid()) 9780 return nullptr; 9781 Expr *Factor = T.get(); 9782 bool Changed = Factor != C->getFactor(); 9783 9784 if (!Changed && !getDerived().AlwaysRebuild()) 9785 return C; 9786 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9787 C->getEndLoc()); 9788 } 9789 9790 template <typename Derived> 9791 OMPClause * 9792 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9793 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9794 if (E.isInvalid()) 9795 return nullptr; 9796 return getDerived().RebuildOMPCollapseClause( 9797 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9798 } 9799 9800 template <typename Derived> 9801 OMPClause * 9802 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9803 return getDerived().RebuildOMPDefaultClause( 9804 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9805 C->getLParenLoc(), C->getEndLoc()); 9806 } 9807 9808 template <typename Derived> 9809 OMPClause * 9810 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9811 return getDerived().RebuildOMPProcBindClause( 9812 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9813 C->getLParenLoc(), C->getEndLoc()); 9814 } 9815 9816 template <typename Derived> 9817 OMPClause * 9818 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9819 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9820 if (E.isInvalid()) 9821 return nullptr; 9822 return getDerived().RebuildOMPScheduleClause( 9823 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9824 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9825 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9826 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9827 } 9828 9829 template <typename Derived> 9830 OMPClause * 9831 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9832 ExprResult E; 9833 if (auto *Num = C->getNumForLoops()) { 9834 E = getDerived().TransformExpr(Num); 9835 if (E.isInvalid()) 9836 return nullptr; 9837 } 9838 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9839 C->getLParenLoc(), E.get()); 9840 } 9841 9842 template <typename Derived> 9843 OMPClause * 9844 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9845 ExprResult E; 9846 if (Expr *Evt = C->getEventHandler()) { 9847 E = getDerived().TransformExpr(Evt); 9848 if (E.isInvalid()) 9849 return nullptr; 9850 } 9851 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9852 C->getLParenLoc(), C->getEndLoc()); 9853 } 9854 9855 template <typename Derived> 9856 OMPClause * 9857 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *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>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9865 // No need to rebuild this clause, no template-dependent parameters. 9866 return C; 9867 } 9868 9869 template <typename Derived> 9870 OMPClause * 9871 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9872 // No need to rebuild this clause, no template-dependent parameters. 9873 return C; 9874 } 9875 9876 template <typename Derived> 9877 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9878 // No need to rebuild this clause, no template-dependent parameters. 9879 return C; 9880 } 9881 9882 template <typename Derived> 9883 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *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>::TransformOMPUpdateClause(OMPUpdateClause *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>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9898 // No need to rebuild this clause, no template-dependent parameters. 9899 return C; 9900 } 9901 9902 template <typename Derived> 9903 OMPClause * 9904 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) { 9905 // No need to rebuild this clause, no template-dependent parameters. 9906 return C; 9907 } 9908 9909 template <typename Derived> 9910 OMPClause *TreeTransform<Derived>::TransformOMPFailClause(OMPFailClause *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>::TransformOMPSeqCstClause(OMPSeqCstClause *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>::TransformOMPAcqRelClause(OMPAcqRelClause *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>::TransformOMPAcquireClause(OMPAcquireClause *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>::TransformOMPReleaseClause(OMPReleaseClause *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>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9946 // No need to rebuild this clause, no template-dependent parameters. 9947 return C; 9948 } 9949 9950 template <typename Derived> 9951 OMPClause * 9952 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9953 // No need to rebuild this clause, no template-dependent parameters. 9954 return C; 9955 } 9956 9957 template <typename Derived> 9958 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9959 // No need to rebuild this clause, no template-dependent parameters. 9960 return C; 9961 } 9962 9963 template <typename Derived> 9964 OMPClause * 9965 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9966 // No need to rebuild this clause, no template-dependent parameters. 9967 return C; 9968 } 9969 9970 template <typename Derived> 9971 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9972 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9973 if (IVR.isInvalid()) 9974 return nullptr; 9975 9976 OMPInteropInfo InteropInfo(C->getIsTarget(), C->getIsTargetSync()); 9977 InteropInfo.PreferTypes.reserve(C->varlist_size() - 1); 9978 for (Expr *E : llvm::drop_begin(C->varlists())) { 9979 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9980 if (ER.isInvalid()) 9981 return nullptr; 9982 InteropInfo.PreferTypes.push_back(ER.get()); 9983 } 9984 return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo, 9985 C->getBeginLoc(), C->getLParenLoc(), 9986 C->getVarLoc(), C->getEndLoc()); 9987 } 9988 9989 template <typename Derived> 9990 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9991 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9992 if (ER.isInvalid()) 9993 return nullptr; 9994 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9995 C->getLParenLoc(), C->getVarLoc(), 9996 C->getEndLoc()); 9997 } 9998 9999 template <typename Derived> 10000 OMPClause * 10001 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 10002 ExprResult ER; 10003 if (Expr *IV = C->getInteropVar()) { 10004 ER = getDerived().TransformExpr(IV); 10005 if (ER.isInvalid()) 10006 return nullptr; 10007 } 10008 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 10009 C->getLParenLoc(), C->getVarLoc(), 10010 C->getEndLoc()); 10011 } 10012 10013 template <typename Derived> 10014 OMPClause * 10015 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 10016 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 10017 if (Cond.isInvalid()) 10018 return nullptr; 10019 return getDerived().RebuildOMPNovariantsClause( 10020 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10021 } 10022 10023 template <typename Derived> 10024 OMPClause * 10025 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 10026 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 10027 if (Cond.isInvalid()) 10028 return nullptr; 10029 return getDerived().RebuildOMPNocontextClause( 10030 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10031 } 10032 10033 template <typename Derived> 10034 OMPClause * 10035 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 10036 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 10037 if (ThreadID.isInvalid()) 10038 return nullptr; 10039 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 10040 C->getLParenLoc(), C->getEndLoc()); 10041 } 10042 10043 template <typename Derived> 10044 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 10045 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 10046 if (E.isInvalid()) 10047 return nullptr; 10048 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 10049 C->getLParenLoc(), C->getEndLoc()); 10050 } 10051 10052 template <typename Derived> 10053 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 10054 OMPUnifiedAddressClause *C) { 10055 llvm_unreachable("unified_address clause cannot appear in dependent context"); 10056 } 10057 10058 template <typename Derived> 10059 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 10060 OMPUnifiedSharedMemoryClause *C) { 10061 llvm_unreachable( 10062 "unified_shared_memory clause cannot appear in dependent context"); 10063 } 10064 10065 template <typename Derived> 10066 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 10067 OMPReverseOffloadClause *C) { 10068 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 10069 } 10070 10071 template <typename Derived> 10072 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 10073 OMPDynamicAllocatorsClause *C) { 10074 llvm_unreachable( 10075 "dynamic_allocators clause cannot appear in dependent context"); 10076 } 10077 10078 template <typename Derived> 10079 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 10080 OMPAtomicDefaultMemOrderClause *C) { 10081 llvm_unreachable( 10082 "atomic_default_mem_order clause cannot appear in dependent context"); 10083 } 10084 10085 template <typename Derived> 10086 OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *C) { 10087 return getDerived().RebuildOMPAtClause(C->getAtKind(), C->getAtKindKwLoc(), 10088 C->getBeginLoc(), C->getLParenLoc(), 10089 C->getEndLoc()); 10090 } 10091 10092 template <typename Derived> 10093 OMPClause * 10094 TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *C) { 10095 return getDerived().RebuildOMPSeverityClause( 10096 C->getSeverityKind(), C->getSeverityKindKwLoc(), C->getBeginLoc(), 10097 C->getLParenLoc(), C->getEndLoc()); 10098 } 10099 10100 template <typename Derived> 10101 OMPClause * 10102 TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *C) { 10103 ExprResult E = getDerived().TransformExpr(C->getMessageString()); 10104 if (E.isInvalid()) 10105 return nullptr; 10106 return getDerived().RebuildOMPMessageClause( 10107 C->getMessageString(), C->getBeginLoc(), C->getLParenLoc(), 10108 C->getEndLoc()); 10109 } 10110 10111 template <typename Derived> 10112 OMPClause * 10113 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 10114 llvm::SmallVector<Expr *, 16> Vars; 10115 Vars.reserve(C->varlist_size()); 10116 for (auto *VE : C->varlists()) { 10117 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10118 if (EVar.isInvalid()) 10119 return nullptr; 10120 Vars.push_back(EVar.get()); 10121 } 10122 return getDerived().RebuildOMPPrivateClause( 10123 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10124 } 10125 10126 template <typename Derived> 10127 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 10128 OMPFirstprivateClause *C) { 10129 llvm::SmallVector<Expr *, 16> Vars; 10130 Vars.reserve(C->varlist_size()); 10131 for (auto *VE : C->varlists()) { 10132 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10133 if (EVar.isInvalid()) 10134 return nullptr; 10135 Vars.push_back(EVar.get()); 10136 } 10137 return getDerived().RebuildOMPFirstprivateClause( 10138 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10139 } 10140 10141 template <typename Derived> 10142 OMPClause * 10143 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 10144 llvm::SmallVector<Expr *, 16> Vars; 10145 Vars.reserve(C->varlist_size()); 10146 for (auto *VE : C->varlists()) { 10147 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10148 if (EVar.isInvalid()) 10149 return nullptr; 10150 Vars.push_back(EVar.get()); 10151 } 10152 return getDerived().RebuildOMPLastprivateClause( 10153 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 10154 C->getLParenLoc(), C->getEndLoc()); 10155 } 10156 10157 template <typename Derived> 10158 OMPClause * 10159 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 10160 llvm::SmallVector<Expr *, 16> Vars; 10161 Vars.reserve(C->varlist_size()); 10162 for (auto *VE : C->varlists()) { 10163 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10164 if (EVar.isInvalid()) 10165 return nullptr; 10166 Vars.push_back(EVar.get()); 10167 } 10168 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 10169 C->getLParenLoc(), C->getEndLoc()); 10170 } 10171 10172 template <typename Derived> 10173 OMPClause * 10174 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 10175 llvm::SmallVector<Expr *, 16> Vars; 10176 Vars.reserve(C->varlist_size()); 10177 for (auto *VE : C->varlists()) { 10178 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10179 if (EVar.isInvalid()) 10180 return nullptr; 10181 Vars.push_back(EVar.get()); 10182 } 10183 CXXScopeSpec ReductionIdScopeSpec; 10184 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10185 10186 DeclarationNameInfo NameInfo = C->getNameInfo(); 10187 if (NameInfo.getName()) { 10188 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10189 if (!NameInfo.getName()) 10190 return nullptr; 10191 } 10192 // Build a list of all UDR decls with the same names ranged by the Scopes. 10193 // The Scope boundary is a duplication of the previous decl. 10194 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10195 for (auto *E : C->reduction_ops()) { 10196 // Transform all the decls. 10197 if (E) { 10198 auto *ULE = cast<UnresolvedLookupExpr>(E); 10199 UnresolvedSet<8> Decls; 10200 for (auto *D : ULE->decls()) { 10201 NamedDecl *InstD = 10202 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10203 Decls.addDecl(InstD, InstD->getAccess()); 10204 } 10205 UnresolvedReductions.push_back( 10206 UnresolvedLookupExpr::Create( 10207 SemaRef.Context, /*NamingClass=*/nullptr, 10208 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 10209 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 10210 Decls.begin(), Decls.end())); 10211 } else 10212 UnresolvedReductions.push_back(nullptr); 10213 } 10214 return getDerived().RebuildOMPReductionClause( 10215 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 10216 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 10217 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10218 } 10219 10220 template <typename Derived> 10221 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 10222 OMPTaskReductionClause *C) { 10223 llvm::SmallVector<Expr *, 16> Vars; 10224 Vars.reserve(C->varlist_size()); 10225 for (auto *VE : C->varlists()) { 10226 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10227 if (EVar.isInvalid()) 10228 return nullptr; 10229 Vars.push_back(EVar.get()); 10230 } 10231 CXXScopeSpec ReductionIdScopeSpec; 10232 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10233 10234 DeclarationNameInfo NameInfo = C->getNameInfo(); 10235 if (NameInfo.getName()) { 10236 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10237 if (!NameInfo.getName()) 10238 return nullptr; 10239 } 10240 // Build a list of all UDR decls with the same names ranged by the Scopes. 10241 // The Scope boundary is a duplication of the previous decl. 10242 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10243 for (auto *E : C->reduction_ops()) { 10244 // Transform all the decls. 10245 if (E) { 10246 auto *ULE = cast<UnresolvedLookupExpr>(E); 10247 UnresolvedSet<8> Decls; 10248 for (auto *D : ULE->decls()) { 10249 NamedDecl *InstD = 10250 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10251 Decls.addDecl(InstD, InstD->getAccess()); 10252 } 10253 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 10254 SemaRef.Context, /*NamingClass=*/nullptr, 10255 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 10256 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 10257 } else 10258 UnresolvedReductions.push_back(nullptr); 10259 } 10260 return getDerived().RebuildOMPTaskReductionClause( 10261 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10262 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10263 } 10264 10265 template <typename Derived> 10266 OMPClause * 10267 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 10268 llvm::SmallVector<Expr *, 16> Vars; 10269 Vars.reserve(C->varlist_size()); 10270 for (auto *VE : C->varlists()) { 10271 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10272 if (EVar.isInvalid()) 10273 return nullptr; 10274 Vars.push_back(EVar.get()); 10275 } 10276 CXXScopeSpec ReductionIdScopeSpec; 10277 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10278 10279 DeclarationNameInfo NameInfo = C->getNameInfo(); 10280 if (NameInfo.getName()) { 10281 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10282 if (!NameInfo.getName()) 10283 return nullptr; 10284 } 10285 // Build a list of all UDR decls with the same names ranged by the Scopes. 10286 // The Scope boundary is a duplication of the previous decl. 10287 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10288 for (auto *E : C->reduction_ops()) { 10289 // Transform all the decls. 10290 if (E) { 10291 auto *ULE = cast<UnresolvedLookupExpr>(E); 10292 UnresolvedSet<8> Decls; 10293 for (auto *D : ULE->decls()) { 10294 NamedDecl *InstD = 10295 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10296 Decls.addDecl(InstD, InstD->getAccess()); 10297 } 10298 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 10299 SemaRef.Context, /*NamingClass=*/nullptr, 10300 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 10301 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 10302 } else 10303 UnresolvedReductions.push_back(nullptr); 10304 } 10305 return getDerived().RebuildOMPInReductionClause( 10306 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10307 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10308 } 10309 10310 template <typename Derived> 10311 OMPClause * 10312 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 10313 llvm::SmallVector<Expr *, 16> Vars; 10314 Vars.reserve(C->varlist_size()); 10315 for (auto *VE : C->varlists()) { 10316 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10317 if (EVar.isInvalid()) 10318 return nullptr; 10319 Vars.push_back(EVar.get()); 10320 } 10321 ExprResult Step = getDerived().TransformExpr(C->getStep()); 10322 if (Step.isInvalid()) 10323 return nullptr; 10324 return getDerived().RebuildOMPLinearClause( 10325 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 10326 C->getModifierLoc(), C->getColonLoc(), C->getStepModifierLoc(), 10327 C->getEndLoc()); 10328 } 10329 10330 template <typename Derived> 10331 OMPClause * 10332 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 10333 llvm::SmallVector<Expr *, 16> Vars; 10334 Vars.reserve(C->varlist_size()); 10335 for (auto *VE : C->varlists()) { 10336 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10337 if (EVar.isInvalid()) 10338 return nullptr; 10339 Vars.push_back(EVar.get()); 10340 } 10341 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 10342 if (Alignment.isInvalid()) 10343 return nullptr; 10344 return getDerived().RebuildOMPAlignedClause( 10345 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 10346 C->getColonLoc(), C->getEndLoc()); 10347 } 10348 10349 template <typename Derived> 10350 OMPClause * 10351 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 10352 llvm::SmallVector<Expr *, 16> Vars; 10353 Vars.reserve(C->varlist_size()); 10354 for (auto *VE : C->varlists()) { 10355 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10356 if (EVar.isInvalid()) 10357 return nullptr; 10358 Vars.push_back(EVar.get()); 10359 } 10360 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 10361 C->getLParenLoc(), C->getEndLoc()); 10362 } 10363 10364 template <typename Derived> 10365 OMPClause * 10366 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 10367 llvm::SmallVector<Expr *, 16> Vars; 10368 Vars.reserve(C->varlist_size()); 10369 for (auto *VE : C->varlists()) { 10370 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10371 if (EVar.isInvalid()) 10372 return nullptr; 10373 Vars.push_back(EVar.get()); 10374 } 10375 return getDerived().RebuildOMPCopyprivateClause( 10376 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10377 } 10378 10379 template <typename Derived> 10380 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 10381 llvm::SmallVector<Expr *, 16> Vars; 10382 Vars.reserve(C->varlist_size()); 10383 for (auto *VE : C->varlists()) { 10384 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10385 if (EVar.isInvalid()) 10386 return nullptr; 10387 Vars.push_back(EVar.get()); 10388 } 10389 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 10390 C->getLParenLoc(), C->getEndLoc()); 10391 } 10392 10393 template <typename Derived> 10394 OMPClause * 10395 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 10396 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 10397 if (E.isInvalid()) 10398 return nullptr; 10399 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 10400 C->getLParenLoc(), C->getEndLoc()); 10401 } 10402 10403 template <typename Derived> 10404 OMPClause * 10405 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 10406 llvm::SmallVector<Expr *, 16> Vars; 10407 Expr *DepModifier = C->getModifier(); 10408 if (DepModifier) { 10409 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 10410 if (DepModRes.isInvalid()) 10411 return nullptr; 10412 DepModifier = DepModRes.get(); 10413 } 10414 Vars.reserve(C->varlist_size()); 10415 for (auto *VE : C->varlists()) { 10416 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10417 if (EVar.isInvalid()) 10418 return nullptr; 10419 Vars.push_back(EVar.get()); 10420 } 10421 return getDerived().RebuildOMPDependClause( 10422 {C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), 10423 C->getOmpAllMemoryLoc()}, 10424 DepModifier, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10425 } 10426 10427 template <typename Derived> 10428 OMPClause * 10429 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 10430 ExprResult E = getDerived().TransformExpr(C->getDevice()); 10431 if (E.isInvalid()) 10432 return nullptr; 10433 return getDerived().RebuildOMPDeviceClause( 10434 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10435 C->getModifierLoc(), C->getEndLoc()); 10436 } 10437 10438 template <typename Derived, class T> 10439 bool transformOMPMappableExprListClause( 10440 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 10441 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 10442 DeclarationNameInfo &MapperIdInfo, 10443 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 10444 // Transform expressions in the list. 10445 Vars.reserve(C->varlist_size()); 10446 for (auto *VE : C->varlists()) { 10447 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 10448 if (EVar.isInvalid()) 10449 return true; 10450 Vars.push_back(EVar.get()); 10451 } 10452 // Transform mapper scope specifier and identifier. 10453 NestedNameSpecifierLoc QualifierLoc; 10454 if (C->getMapperQualifierLoc()) { 10455 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 10456 C->getMapperQualifierLoc()); 10457 if (!QualifierLoc) 10458 return true; 10459 } 10460 MapperIdScopeSpec.Adopt(QualifierLoc); 10461 MapperIdInfo = C->getMapperIdInfo(); 10462 if (MapperIdInfo.getName()) { 10463 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 10464 if (!MapperIdInfo.getName()) 10465 return true; 10466 } 10467 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 10468 // the previous user-defined mapper lookup in dependent environment. 10469 for (auto *E : C->mapperlists()) { 10470 // Transform all the decls. 10471 if (E) { 10472 auto *ULE = cast<UnresolvedLookupExpr>(E); 10473 UnresolvedSet<8> Decls; 10474 for (auto *D : ULE->decls()) { 10475 NamedDecl *InstD = 10476 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 10477 Decls.addDecl(InstD, InstD->getAccess()); 10478 } 10479 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 10480 TT.getSema().Context, /*NamingClass=*/nullptr, 10481 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 10482 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 10483 Decls.end())); 10484 } else { 10485 UnresolvedMappers.push_back(nullptr); 10486 } 10487 } 10488 return false; 10489 } 10490 10491 template <typename Derived> 10492 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 10493 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10494 llvm::SmallVector<Expr *, 16> Vars; 10495 Expr *IteratorModifier = C->getIteratorModifier(); 10496 if (IteratorModifier) { 10497 ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier); 10498 if (MapModRes.isInvalid()) 10499 return nullptr; 10500 IteratorModifier = MapModRes.get(); 10501 } 10502 CXXScopeSpec MapperIdScopeSpec; 10503 DeclarationNameInfo MapperIdInfo; 10504 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10505 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 10506 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10507 return nullptr; 10508 return getDerived().RebuildOMPMapClause( 10509 IteratorModifier, C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), 10510 MapperIdScopeSpec, MapperIdInfo, C->getMapType(), C->isImplicitMapType(), 10511 C->getMapLoc(), C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10512 } 10513 10514 template <typename Derived> 10515 OMPClause * 10516 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10517 Expr *Allocator = C->getAllocator(); 10518 if (Allocator) { 10519 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10520 if (AllocatorRes.isInvalid()) 10521 return nullptr; 10522 Allocator = AllocatorRes.get(); 10523 } 10524 llvm::SmallVector<Expr *, 16> Vars; 10525 Vars.reserve(C->varlist_size()); 10526 for (auto *VE : C->varlists()) { 10527 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10528 if (EVar.isInvalid()) 10529 return nullptr; 10530 Vars.push_back(EVar.get()); 10531 } 10532 return getDerived().RebuildOMPAllocateClause( 10533 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10534 C->getEndLoc()); 10535 } 10536 10537 template <typename Derived> 10538 OMPClause * 10539 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10540 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10541 if (E.isInvalid()) 10542 return nullptr; 10543 return getDerived().RebuildOMPNumTeamsClause( 10544 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10545 } 10546 10547 template <typename Derived> 10548 OMPClause * 10549 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10550 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10551 if (E.isInvalid()) 10552 return nullptr; 10553 return getDerived().RebuildOMPThreadLimitClause( 10554 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10555 } 10556 10557 template <typename Derived> 10558 OMPClause * 10559 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10560 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10561 if (E.isInvalid()) 10562 return nullptr; 10563 return getDerived().RebuildOMPPriorityClause( 10564 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10565 } 10566 10567 template <typename Derived> 10568 OMPClause * 10569 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10570 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10571 if (E.isInvalid()) 10572 return nullptr; 10573 return getDerived().RebuildOMPGrainsizeClause( 10574 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10575 C->getModifierLoc(), C->getEndLoc()); 10576 } 10577 10578 template <typename Derived> 10579 OMPClause * 10580 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10581 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10582 if (E.isInvalid()) 10583 return nullptr; 10584 return getDerived().RebuildOMPNumTasksClause( 10585 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10586 C->getModifierLoc(), C->getEndLoc()); 10587 } 10588 10589 template <typename Derived> 10590 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10591 ExprResult E = getDerived().TransformExpr(C->getHint()); 10592 if (E.isInvalid()) 10593 return nullptr; 10594 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10595 C->getLParenLoc(), C->getEndLoc()); 10596 } 10597 10598 template <typename Derived> 10599 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10600 OMPDistScheduleClause *C) { 10601 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10602 if (E.isInvalid()) 10603 return nullptr; 10604 return getDerived().RebuildOMPDistScheduleClause( 10605 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10606 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10607 } 10608 10609 template <typename Derived> 10610 OMPClause * 10611 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10612 // Rebuild Defaultmap Clause since we need to invoke the checking of 10613 // defaultmap(none:variable-category) after template initialization. 10614 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10615 C->getDefaultmapKind(), 10616 C->getBeginLoc(), 10617 C->getLParenLoc(), 10618 C->getDefaultmapModifierLoc(), 10619 C->getDefaultmapKindLoc(), 10620 C->getEndLoc()); 10621 } 10622 10623 template <typename Derived> 10624 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10625 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10626 llvm::SmallVector<Expr *, 16> Vars; 10627 CXXScopeSpec MapperIdScopeSpec; 10628 DeclarationNameInfo MapperIdInfo; 10629 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10630 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10631 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10632 return nullptr; 10633 return getDerived().RebuildOMPToClause( 10634 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10635 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10636 } 10637 10638 template <typename Derived> 10639 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10640 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10641 llvm::SmallVector<Expr *, 16> Vars; 10642 CXXScopeSpec MapperIdScopeSpec; 10643 DeclarationNameInfo MapperIdInfo; 10644 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10645 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10646 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10647 return nullptr; 10648 return getDerived().RebuildOMPFromClause( 10649 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10650 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10651 } 10652 10653 template <typename Derived> 10654 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10655 OMPUseDevicePtrClause *C) { 10656 llvm::SmallVector<Expr *, 16> Vars; 10657 Vars.reserve(C->varlist_size()); 10658 for (auto *VE : C->varlists()) { 10659 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10660 if (EVar.isInvalid()) 10661 return nullptr; 10662 Vars.push_back(EVar.get()); 10663 } 10664 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10665 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10666 } 10667 10668 template <typename Derived> 10669 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10670 OMPUseDeviceAddrClause *C) { 10671 llvm::SmallVector<Expr *, 16> Vars; 10672 Vars.reserve(C->varlist_size()); 10673 for (auto *VE : C->varlists()) { 10674 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10675 if (EVar.isInvalid()) 10676 return nullptr; 10677 Vars.push_back(EVar.get()); 10678 } 10679 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10680 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10681 } 10682 10683 template <typename Derived> 10684 OMPClause * 10685 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10686 llvm::SmallVector<Expr *, 16> Vars; 10687 Vars.reserve(C->varlist_size()); 10688 for (auto *VE : C->varlists()) { 10689 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10690 if (EVar.isInvalid()) 10691 return nullptr; 10692 Vars.push_back(EVar.get()); 10693 } 10694 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10695 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10696 } 10697 10698 template <typename Derived> 10699 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause( 10700 OMPHasDeviceAddrClause *C) { 10701 llvm::SmallVector<Expr *, 16> Vars; 10702 Vars.reserve(C->varlist_size()); 10703 for (auto *VE : C->varlists()) { 10704 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10705 if (EVar.isInvalid()) 10706 return nullptr; 10707 Vars.push_back(EVar.get()); 10708 } 10709 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10710 return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs); 10711 } 10712 10713 template <typename Derived> 10714 OMPClause * 10715 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10716 llvm::SmallVector<Expr *, 16> Vars; 10717 Vars.reserve(C->varlist_size()); 10718 for (auto *VE : C->varlists()) { 10719 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10720 if (EVar.isInvalid()) 10721 return nullptr; 10722 Vars.push_back(EVar.get()); 10723 } 10724 return getDerived().RebuildOMPNontemporalClause( 10725 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10726 } 10727 10728 template <typename Derived> 10729 OMPClause * 10730 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10731 llvm::SmallVector<Expr *, 16> Vars; 10732 Vars.reserve(C->varlist_size()); 10733 for (auto *VE : C->varlists()) { 10734 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10735 if (EVar.isInvalid()) 10736 return nullptr; 10737 Vars.push_back(EVar.get()); 10738 } 10739 return getDerived().RebuildOMPInclusiveClause( 10740 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10741 } 10742 10743 template <typename Derived> 10744 OMPClause * 10745 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10746 llvm::SmallVector<Expr *, 16> Vars; 10747 Vars.reserve(C->varlist_size()); 10748 for (auto *VE : C->varlists()) { 10749 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10750 if (EVar.isInvalid()) 10751 return nullptr; 10752 Vars.push_back(EVar.get()); 10753 } 10754 return getDerived().RebuildOMPExclusiveClause( 10755 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10756 } 10757 10758 template <typename Derived> 10759 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10760 OMPUsesAllocatorsClause *C) { 10761 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10762 Data.reserve(C->getNumberOfAllocators()); 10763 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10764 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10765 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10766 if (Allocator.isInvalid()) 10767 continue; 10768 ExprResult AllocatorTraits; 10769 if (Expr *AT = D.AllocatorTraits) { 10770 AllocatorTraits = getDerived().TransformExpr(AT); 10771 if (AllocatorTraits.isInvalid()) 10772 continue; 10773 } 10774 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10775 NewD.Allocator = Allocator.get(); 10776 NewD.AllocatorTraits = AllocatorTraits.get(); 10777 NewD.LParenLoc = D.LParenLoc; 10778 NewD.RParenLoc = D.RParenLoc; 10779 } 10780 return getDerived().RebuildOMPUsesAllocatorsClause( 10781 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10782 } 10783 10784 template <typename Derived> 10785 OMPClause * 10786 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10787 SmallVector<Expr *, 4> Locators; 10788 Locators.reserve(C->varlist_size()); 10789 ExprResult ModifierRes; 10790 if (Expr *Modifier = C->getModifier()) { 10791 ModifierRes = getDerived().TransformExpr(Modifier); 10792 if (ModifierRes.isInvalid()) 10793 return nullptr; 10794 } 10795 for (Expr *E : C->varlists()) { 10796 ExprResult Locator = getDerived().TransformExpr(E); 10797 if (Locator.isInvalid()) 10798 continue; 10799 Locators.push_back(Locator.get()); 10800 } 10801 return getDerived().RebuildOMPAffinityClause( 10802 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10803 ModifierRes.get(), Locators); 10804 } 10805 10806 template <typename Derived> 10807 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10808 return getDerived().RebuildOMPOrderClause( 10809 C->getKind(), C->getKindKwLoc(), C->getBeginLoc(), C->getLParenLoc(), 10810 C->getEndLoc(), C->getModifier(), C->getModifierKwLoc()); 10811 } 10812 10813 template <typename Derived> 10814 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10815 return getDerived().RebuildOMPBindClause( 10816 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10817 C->getLParenLoc(), C->getEndLoc()); 10818 } 10819 10820 template <typename Derived> 10821 OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause( 10822 OMPXDynCGroupMemClause *C) { 10823 ExprResult Size = getDerived().TransformExpr(C->getSize()); 10824 if (Size.isInvalid()) 10825 return nullptr; 10826 return getDerived().RebuildOMPXDynCGroupMemClause( 10827 Size.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10828 } 10829 10830 template <typename Derived> 10831 OMPClause * 10832 TreeTransform<Derived>::TransformOMPDoacrossClause(OMPDoacrossClause *C) { 10833 llvm::SmallVector<Expr *, 16> Vars; 10834 Vars.reserve(C->varlist_size()); 10835 for (auto *VE : C->varlists()) { 10836 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10837 if (EVar.isInvalid()) 10838 return nullptr; 10839 Vars.push_back(EVar.get()); 10840 } 10841 return getDerived().RebuildOMPDoacrossClause( 10842 C->getDependenceType(), C->getDependenceLoc(), C->getColonLoc(), Vars, 10843 C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10844 } 10845 10846 template <typename Derived> 10847 OMPClause * 10848 TreeTransform<Derived>::TransformOMPXAttributeClause(OMPXAttributeClause *C) { 10849 SmallVector<const Attr *> NewAttrs; 10850 for (auto *A : C->getAttrs()) 10851 NewAttrs.push_back(getDerived().TransformAttr(A)); 10852 return getDerived().RebuildOMPXAttributeClause( 10853 NewAttrs, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10854 } 10855 10856 template <typename Derived> 10857 OMPClause *TreeTransform<Derived>::TransformOMPXBareClause(OMPXBareClause *C) { 10858 return getDerived().RebuildOMPXBareClause(C->getBeginLoc(), C->getEndLoc()); 10859 } 10860 10861 //===----------------------------------------------------------------------===// 10862 // Expression transformation 10863 //===----------------------------------------------------------------------===// 10864 template<typename Derived> 10865 ExprResult 10866 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10867 return TransformExpr(E->getSubExpr()); 10868 } 10869 10870 template <typename Derived> 10871 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10872 SYCLUniqueStableNameExpr *E) { 10873 if (!E->isTypeDependent()) 10874 return E; 10875 10876 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10877 10878 if (!NewT) 10879 return ExprError(); 10880 10881 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10882 return E; 10883 10884 return getDerived().RebuildSYCLUniqueStableNameExpr( 10885 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10886 } 10887 10888 template<typename Derived> 10889 ExprResult 10890 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10891 if (!E->isTypeDependent()) 10892 return E; 10893 10894 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10895 E->getIdentKind()); 10896 } 10897 10898 template<typename Derived> 10899 ExprResult 10900 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10901 NestedNameSpecifierLoc QualifierLoc; 10902 if (E->getQualifierLoc()) { 10903 QualifierLoc 10904 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10905 if (!QualifierLoc) 10906 return ExprError(); 10907 } 10908 10909 ValueDecl *ND 10910 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10911 E->getDecl())); 10912 if (!ND) 10913 return ExprError(); 10914 10915 NamedDecl *Found = ND; 10916 if (E->getFoundDecl() != E->getDecl()) { 10917 Found = cast_or_null<NamedDecl>( 10918 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10919 if (!Found) 10920 return ExprError(); 10921 } 10922 10923 DeclarationNameInfo NameInfo = E->getNameInfo(); 10924 if (NameInfo.getName()) { 10925 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10926 if (!NameInfo.getName()) 10927 return ExprError(); 10928 } 10929 10930 if (!getDerived().AlwaysRebuild() && 10931 QualifierLoc == E->getQualifierLoc() && 10932 ND == E->getDecl() && 10933 Found == E->getFoundDecl() && 10934 NameInfo.getName() == E->getDecl()->getDeclName() && 10935 !E->hasExplicitTemplateArgs()) { 10936 10937 // Mark it referenced in the new context regardless. 10938 // FIXME: this is a bit instantiation-specific. 10939 SemaRef.MarkDeclRefReferenced(E); 10940 10941 return E; 10942 } 10943 10944 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10945 if (E->hasExplicitTemplateArgs()) { 10946 TemplateArgs = &TransArgs; 10947 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10948 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10949 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10950 E->getNumTemplateArgs(), 10951 TransArgs)) 10952 return ExprError(); 10953 } 10954 10955 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10956 Found, TemplateArgs); 10957 } 10958 10959 template<typename Derived> 10960 ExprResult 10961 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10962 return E; 10963 } 10964 10965 template <typename Derived> 10966 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10967 FixedPointLiteral *E) { 10968 return E; 10969 } 10970 10971 template<typename Derived> 10972 ExprResult 10973 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10974 return E; 10975 } 10976 10977 template<typename Derived> 10978 ExprResult 10979 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10980 return E; 10981 } 10982 10983 template<typename Derived> 10984 ExprResult 10985 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10986 return E; 10987 } 10988 10989 template<typename Derived> 10990 ExprResult 10991 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10992 return E; 10993 } 10994 10995 template<typename Derived> 10996 ExprResult 10997 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10998 return getDerived().TransformCallExpr(E); 10999 } 11000 11001 template<typename Derived> 11002 ExprResult 11003 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 11004 ExprResult ControllingExpr; 11005 TypeSourceInfo *ControllingType = nullptr; 11006 if (E->isExprPredicate()) 11007 ControllingExpr = getDerived().TransformExpr(E->getControllingExpr()); 11008 else 11009 ControllingType = getDerived().TransformType(E->getControllingType()); 11010 11011 if (ControllingExpr.isInvalid() && !ControllingType) 11012 return ExprError(); 11013 11014 SmallVector<Expr *, 4> AssocExprs; 11015 SmallVector<TypeSourceInfo *, 4> AssocTypes; 11016 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 11017 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 11018 if (TSI) { 11019 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 11020 if (!AssocType) 11021 return ExprError(); 11022 AssocTypes.push_back(AssocType); 11023 } else { 11024 AssocTypes.push_back(nullptr); 11025 } 11026 11027 ExprResult AssocExpr = 11028 getDerived().TransformExpr(Assoc.getAssociationExpr()); 11029 if (AssocExpr.isInvalid()) 11030 return ExprError(); 11031 AssocExprs.push_back(AssocExpr.get()); 11032 } 11033 11034 if (!ControllingType) 11035 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 11036 E->getDefaultLoc(), 11037 E->getRParenLoc(), 11038 ControllingExpr.get(), 11039 AssocTypes, 11040 AssocExprs); 11041 return getDerived().RebuildGenericSelectionExpr( 11042 E->getGenericLoc(), E->getDefaultLoc(), E->getRParenLoc(), 11043 ControllingType, AssocTypes, AssocExprs); 11044 } 11045 11046 template<typename Derived> 11047 ExprResult 11048 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 11049 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11050 if (SubExpr.isInvalid()) 11051 return ExprError(); 11052 11053 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 11054 return E; 11055 11056 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 11057 E->getRParen()); 11058 } 11059 11060 /// The operand of a unary address-of operator has special rules: it's 11061 /// allowed to refer to a non-static member of a class even if there's no 'this' 11062 /// object available. 11063 template<typename Derived> 11064 ExprResult 11065 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 11066 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 11067 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 11068 else 11069 return getDerived().TransformExpr(E); 11070 } 11071 11072 template<typename Derived> 11073 ExprResult 11074 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 11075 ExprResult SubExpr; 11076 if (E->getOpcode() == UO_AddrOf) 11077 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 11078 else 11079 SubExpr = TransformExpr(E->getSubExpr()); 11080 if (SubExpr.isInvalid()) 11081 return ExprError(); 11082 11083 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 11084 return E; 11085 11086 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 11087 E->getOpcode(), 11088 SubExpr.get()); 11089 } 11090 11091 template<typename Derived> 11092 ExprResult 11093 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 11094 // Transform the type. 11095 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 11096 if (!Type) 11097 return ExprError(); 11098 11099 // Transform all of the components into components similar to what the 11100 // parser uses. 11101 // FIXME: It would be slightly more efficient in the non-dependent case to 11102 // just map FieldDecls, rather than requiring the rebuilder to look for 11103 // the fields again. However, __builtin_offsetof is rare enough in 11104 // template code that we don't care. 11105 bool ExprChanged = false; 11106 typedef Sema::OffsetOfComponent Component; 11107 SmallVector<Component, 4> Components; 11108 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 11109 const OffsetOfNode &ON = E->getComponent(I); 11110 Component Comp; 11111 Comp.isBrackets = true; 11112 Comp.LocStart = ON.getSourceRange().getBegin(); 11113 Comp.LocEnd = ON.getSourceRange().getEnd(); 11114 switch (ON.getKind()) { 11115 case OffsetOfNode::Array: { 11116 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 11117 ExprResult Index = getDerived().TransformExpr(FromIndex); 11118 if (Index.isInvalid()) 11119 return ExprError(); 11120 11121 ExprChanged = ExprChanged || Index.get() != FromIndex; 11122 Comp.isBrackets = true; 11123 Comp.U.E = Index.get(); 11124 break; 11125 } 11126 11127 case OffsetOfNode::Field: 11128 case OffsetOfNode::Identifier: 11129 Comp.isBrackets = false; 11130 Comp.U.IdentInfo = ON.getFieldName(); 11131 if (!Comp.U.IdentInfo) 11132 continue; 11133 11134 break; 11135 11136 case OffsetOfNode::Base: 11137 // Will be recomputed during the rebuild. 11138 continue; 11139 } 11140 11141 Components.push_back(Comp); 11142 } 11143 11144 // If nothing changed, retain the existing expression. 11145 if (!getDerived().AlwaysRebuild() && 11146 Type == E->getTypeSourceInfo() && 11147 !ExprChanged) 11148 return E; 11149 11150 // Build a new offsetof expression. 11151 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 11152 Components, E->getRParenLoc()); 11153 } 11154 11155 template<typename Derived> 11156 ExprResult 11157 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 11158 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 11159 "opaque value expression requires transformation"); 11160 return E; 11161 } 11162 11163 template<typename Derived> 11164 ExprResult 11165 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 11166 return E; 11167 } 11168 11169 template <typename Derived> 11170 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 11171 llvm::SmallVector<Expr *, 8> Children; 11172 bool Changed = false; 11173 for (Expr *C : E->subExpressions()) { 11174 ExprResult NewC = getDerived().TransformExpr(C); 11175 if (NewC.isInvalid()) 11176 return ExprError(); 11177 Children.push_back(NewC.get()); 11178 11179 Changed |= NewC.get() != C; 11180 } 11181 if (!getDerived().AlwaysRebuild() && !Changed) 11182 return E; 11183 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 11184 Children, E->getType()); 11185 } 11186 11187 template<typename Derived> 11188 ExprResult 11189 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 11190 // Rebuild the syntactic form. The original syntactic form has 11191 // opaque-value expressions in it, so strip those away and rebuild 11192 // the result. This is a really awful way of doing this, but the 11193 // better solution (rebuilding the semantic expressions and 11194 // rebinding OVEs as necessary) doesn't work; we'd need 11195 // TreeTransform to not strip away implicit conversions. 11196 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 11197 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 11198 if (result.isInvalid()) return ExprError(); 11199 11200 // If that gives us a pseudo-object result back, the pseudo-object 11201 // expression must have been an lvalue-to-rvalue conversion which we 11202 // should reapply. 11203 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 11204 result = SemaRef.checkPseudoObjectRValue(result.get()); 11205 11206 return result; 11207 } 11208 11209 template<typename Derived> 11210 ExprResult 11211 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 11212 UnaryExprOrTypeTraitExpr *E) { 11213 if (E->isArgumentType()) { 11214 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 11215 11216 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11217 if (!NewT) 11218 return ExprError(); 11219 11220 if (!getDerived().AlwaysRebuild() && OldT == NewT) 11221 return E; 11222 11223 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 11224 E->getKind(), 11225 E->getSourceRange()); 11226 } 11227 11228 // C++0x [expr.sizeof]p1: 11229 // The operand is either an expression, which is an unevaluated operand 11230 // [...] 11231 EnterExpressionEvaluationContext Unevaluated( 11232 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11233 Sema::ReuseLambdaContextDecl); 11234 11235 // Try to recover if we have something like sizeof(T::X) where X is a type. 11236 // Notably, there must be *exactly* one set of parens if X is a type. 11237 TypeSourceInfo *RecoveryTSI = nullptr; 11238 ExprResult SubExpr; 11239 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 11240 if (auto *DRE = 11241 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 11242 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 11243 PE, DRE, false, &RecoveryTSI); 11244 else 11245 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 11246 11247 if (RecoveryTSI) { 11248 return getDerived().RebuildUnaryExprOrTypeTrait( 11249 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 11250 } else if (SubExpr.isInvalid()) 11251 return ExprError(); 11252 11253 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 11254 return E; 11255 11256 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 11257 E->getOperatorLoc(), 11258 E->getKind(), 11259 E->getSourceRange()); 11260 } 11261 11262 template<typename Derived> 11263 ExprResult 11264 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 11265 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11266 if (LHS.isInvalid()) 11267 return ExprError(); 11268 11269 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11270 if (RHS.isInvalid()) 11271 return ExprError(); 11272 11273 11274 if (!getDerived().AlwaysRebuild() && 11275 LHS.get() == E->getLHS() && 11276 RHS.get() == E->getRHS()) 11277 return E; 11278 11279 return getDerived().RebuildArraySubscriptExpr( 11280 LHS.get(), 11281 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 11282 } 11283 11284 template <typename Derived> 11285 ExprResult 11286 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 11287 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11288 if (Base.isInvalid()) 11289 return ExprError(); 11290 11291 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 11292 if (RowIdx.isInvalid()) 11293 return ExprError(); 11294 11295 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 11296 if (ColumnIdx.isInvalid()) 11297 return ExprError(); 11298 11299 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 11300 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 11301 return E; 11302 11303 return getDerived().RebuildMatrixSubscriptExpr( 11304 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 11305 } 11306 11307 template <typename Derived> 11308 ExprResult 11309 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 11310 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11311 if (Base.isInvalid()) 11312 return ExprError(); 11313 11314 ExprResult LowerBound; 11315 if (E->getLowerBound()) { 11316 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 11317 if (LowerBound.isInvalid()) 11318 return ExprError(); 11319 } 11320 11321 ExprResult Length; 11322 if (E->getLength()) { 11323 Length = getDerived().TransformExpr(E->getLength()); 11324 if (Length.isInvalid()) 11325 return ExprError(); 11326 } 11327 11328 ExprResult Stride; 11329 if (Expr *Str = E->getStride()) { 11330 Stride = getDerived().TransformExpr(Str); 11331 if (Stride.isInvalid()) 11332 return ExprError(); 11333 } 11334 11335 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 11336 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 11337 return E; 11338 11339 return getDerived().RebuildOMPArraySectionExpr( 11340 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 11341 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 11342 E->getRBracketLoc()); 11343 } 11344 11345 template <typename Derived> 11346 ExprResult 11347 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 11348 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11349 if (Base.isInvalid()) 11350 return ExprError(); 11351 11352 SmallVector<Expr *, 4> Dims; 11353 bool ErrorFound = false; 11354 for (Expr *Dim : E->getDimensions()) { 11355 ExprResult DimRes = getDerived().TransformExpr(Dim); 11356 if (DimRes.isInvalid()) { 11357 ErrorFound = true; 11358 continue; 11359 } 11360 Dims.push_back(DimRes.get()); 11361 } 11362 11363 if (ErrorFound) 11364 return ExprError(); 11365 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 11366 E->getRParenLoc(), Dims, 11367 E->getBracketsRanges()); 11368 } 11369 11370 template <typename Derived> 11371 ExprResult 11372 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 11373 unsigned NumIterators = E->numOfIterators(); 11374 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 11375 11376 bool ErrorFound = false; 11377 bool NeedToRebuild = getDerived().AlwaysRebuild(); 11378 for (unsigned I = 0; I < NumIterators; ++I) { 11379 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 11380 Data[I].DeclIdent = D->getIdentifier(); 11381 Data[I].DeclIdentLoc = D->getLocation(); 11382 if (D->getLocation() == D->getBeginLoc()) { 11383 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 11384 "Implicit type must be int."); 11385 } else { 11386 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 11387 QualType DeclTy = getDerived().TransformType(D->getType()); 11388 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 11389 } 11390 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 11391 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 11392 ExprResult End = getDerived().TransformExpr(Range.End); 11393 ExprResult Step = getDerived().TransformExpr(Range.Step); 11394 ErrorFound = ErrorFound || 11395 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 11396 !Data[I].Type.get().isNull())) || 11397 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 11398 if (ErrorFound) 11399 continue; 11400 Data[I].Range.Begin = Begin.get(); 11401 Data[I].Range.End = End.get(); 11402 Data[I].Range.Step = Step.get(); 11403 Data[I].AssignLoc = E->getAssignLoc(I); 11404 Data[I].ColonLoc = E->getColonLoc(I); 11405 Data[I].SecColonLoc = E->getSecondColonLoc(I); 11406 NeedToRebuild = 11407 NeedToRebuild || 11408 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 11409 D->getType().getTypePtrOrNull()) || 11410 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 11411 Range.Step != Data[I].Range.Step; 11412 } 11413 if (ErrorFound) 11414 return ExprError(); 11415 if (!NeedToRebuild) 11416 return E; 11417 11418 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 11419 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 11420 if (!Res.isUsable()) 11421 return Res; 11422 auto *IE = cast<OMPIteratorExpr>(Res.get()); 11423 for (unsigned I = 0; I < NumIterators; ++I) 11424 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 11425 IE->getIteratorDecl(I)); 11426 return Res; 11427 } 11428 11429 template<typename Derived> 11430 ExprResult 11431 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 11432 // Transform the callee. 11433 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11434 if (Callee.isInvalid()) 11435 return ExprError(); 11436 11437 // Transform arguments. 11438 bool ArgChanged = false; 11439 SmallVector<Expr*, 8> Args; 11440 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11441 &ArgChanged)) 11442 return ExprError(); 11443 11444 if (!getDerived().AlwaysRebuild() && 11445 Callee.get() == E->getCallee() && 11446 !ArgChanged) 11447 return SemaRef.MaybeBindToTemporary(E); 11448 11449 // FIXME: Wrong source location information for the '('. 11450 SourceLocation FakeLParenLoc 11451 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11452 11453 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11454 if (E->hasStoredFPFeatures()) { 11455 FPOptionsOverride NewOverrides = E->getFPFeatures(); 11456 getSema().CurFPFeatures = 11457 NewOverrides.applyOverrides(getSema().getLangOpts()); 11458 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11459 } 11460 11461 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11462 Args, 11463 E->getRParenLoc()); 11464 } 11465 11466 template<typename Derived> 11467 ExprResult 11468 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 11469 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11470 if (Base.isInvalid()) 11471 return ExprError(); 11472 11473 NestedNameSpecifierLoc QualifierLoc; 11474 if (E->hasQualifier()) { 11475 QualifierLoc 11476 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 11477 11478 if (!QualifierLoc) 11479 return ExprError(); 11480 } 11481 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11482 11483 ValueDecl *Member 11484 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 11485 E->getMemberDecl())); 11486 if (!Member) 11487 return ExprError(); 11488 11489 NamedDecl *FoundDecl = E->getFoundDecl(); 11490 if (FoundDecl == E->getMemberDecl()) { 11491 FoundDecl = Member; 11492 } else { 11493 FoundDecl = cast_or_null<NamedDecl>( 11494 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 11495 if (!FoundDecl) 11496 return ExprError(); 11497 } 11498 11499 if (!getDerived().AlwaysRebuild() && 11500 Base.get() == E->getBase() && 11501 QualifierLoc == E->getQualifierLoc() && 11502 Member == E->getMemberDecl() && 11503 FoundDecl == E->getFoundDecl() && 11504 !E->hasExplicitTemplateArgs()) { 11505 11506 // Skip for member expression of (this->f), rebuilt thisi->f is needed 11507 // for Openmp where the field need to be privatizized in the case. 11508 if (!(isa<CXXThisExpr>(E->getBase()) && 11509 getSema().isOpenMPRebuildMemberExpr(cast<ValueDecl>(Member)))) { 11510 // Mark it referenced in the new context regardless. 11511 // FIXME: this is a bit instantiation-specific. 11512 SemaRef.MarkMemberReferenced(E); 11513 return E; 11514 } 11515 } 11516 11517 TemplateArgumentListInfo TransArgs; 11518 if (E->hasExplicitTemplateArgs()) { 11519 TransArgs.setLAngleLoc(E->getLAngleLoc()); 11520 TransArgs.setRAngleLoc(E->getRAngleLoc()); 11521 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11522 E->getNumTemplateArgs(), 11523 TransArgs)) 11524 return ExprError(); 11525 } 11526 11527 // FIXME: Bogus source location for the operator 11528 SourceLocation FakeOperatorLoc = 11529 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 11530 11531 // FIXME: to do this check properly, we will need to preserve the 11532 // first-qualifier-in-scope here, just in case we had a dependent 11533 // base (and therefore couldn't do the check) and a 11534 // nested-name-qualifier (and therefore could do the lookup). 11535 NamedDecl *FirstQualifierInScope = nullptr; 11536 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 11537 if (MemberNameInfo.getName()) { 11538 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 11539 if (!MemberNameInfo.getName()) 11540 return ExprError(); 11541 } 11542 11543 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 11544 E->isArrow(), 11545 QualifierLoc, 11546 TemplateKWLoc, 11547 MemberNameInfo, 11548 Member, 11549 FoundDecl, 11550 (E->hasExplicitTemplateArgs() 11551 ? &TransArgs : nullptr), 11552 FirstQualifierInScope); 11553 } 11554 11555 template<typename Derived> 11556 ExprResult 11557 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 11558 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11559 if (LHS.isInvalid()) 11560 return ExprError(); 11561 11562 ExprResult RHS = 11563 getDerived().TransformInitializer(E->getRHS(), /*NotCopyInit=*/false); 11564 if (RHS.isInvalid()) 11565 return ExprError(); 11566 11567 if (!getDerived().AlwaysRebuild() && 11568 LHS.get() == E->getLHS() && 11569 RHS.get() == E->getRHS()) 11570 return E; 11571 11572 if (E->isCompoundAssignmentOp()) 11573 // FPFeatures has already been established from trailing storage 11574 return getDerived().RebuildBinaryOperator( 11575 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 11576 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11577 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11578 getSema().CurFPFeatures = 11579 NewOverrides.applyOverrides(getSema().getLangOpts()); 11580 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11581 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 11582 LHS.get(), RHS.get()); 11583 } 11584 11585 template <typename Derived> 11586 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11587 CXXRewrittenBinaryOperator *E) { 11588 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11589 11590 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11591 if (LHS.isInvalid()) 11592 return ExprError(); 11593 11594 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11595 if (RHS.isInvalid()) 11596 return ExprError(); 11597 11598 // Extract the already-resolved callee declarations so that we can restrict 11599 // ourselves to using them as the unqualified lookup results when rebuilding. 11600 UnresolvedSet<2> UnqualLookups; 11601 bool ChangedAnyLookups = false; 11602 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11603 const_cast<Expr *>(Decomp.InnerBinOp)}; 11604 for (Expr *PossibleBinOp : PossibleBinOps) { 11605 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11606 if (!Op) 11607 continue; 11608 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11609 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11610 continue; 11611 11612 // Transform the callee in case we built a call to a local extern 11613 // declaration. 11614 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11615 E->getOperatorLoc(), Callee->getFoundDecl())); 11616 if (!Found) 11617 return ExprError(); 11618 if (Found != Callee->getFoundDecl()) 11619 ChangedAnyLookups = true; 11620 UnqualLookups.addDecl(Found); 11621 } 11622 11623 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11624 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11625 // Mark all functions used in the rewrite as referenced. Note that when 11626 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11627 // function calls, and/or there might be a user-defined conversion sequence 11628 // applied to the operands of the <. 11629 // FIXME: this is a bit instantiation-specific. 11630 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11631 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11632 return E; 11633 } 11634 11635 return getDerived().RebuildCXXRewrittenBinaryOperator( 11636 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11637 } 11638 11639 template<typename Derived> 11640 ExprResult 11641 TreeTransform<Derived>::TransformCompoundAssignOperator( 11642 CompoundAssignOperator *E) { 11643 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11644 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11645 getSema().CurFPFeatures = 11646 NewOverrides.applyOverrides(getSema().getLangOpts()); 11647 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11648 return getDerived().TransformBinaryOperator(E); 11649 } 11650 11651 template<typename Derived> 11652 ExprResult TreeTransform<Derived>:: 11653 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11654 // Just rebuild the common and RHS expressions and see whether we 11655 // get any changes. 11656 11657 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11658 if (commonExpr.isInvalid()) 11659 return ExprError(); 11660 11661 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11662 if (rhs.isInvalid()) 11663 return ExprError(); 11664 11665 if (!getDerived().AlwaysRebuild() && 11666 commonExpr.get() == e->getCommon() && 11667 rhs.get() == e->getFalseExpr()) 11668 return e; 11669 11670 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11671 e->getQuestionLoc(), 11672 nullptr, 11673 e->getColonLoc(), 11674 rhs.get()); 11675 } 11676 11677 template<typename Derived> 11678 ExprResult 11679 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11680 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11681 if (Cond.isInvalid()) 11682 return ExprError(); 11683 11684 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11685 if (LHS.isInvalid()) 11686 return ExprError(); 11687 11688 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11689 if (RHS.isInvalid()) 11690 return ExprError(); 11691 11692 if (!getDerived().AlwaysRebuild() && 11693 Cond.get() == E->getCond() && 11694 LHS.get() == E->getLHS() && 11695 RHS.get() == E->getRHS()) 11696 return E; 11697 11698 return getDerived().RebuildConditionalOperator(Cond.get(), 11699 E->getQuestionLoc(), 11700 LHS.get(), 11701 E->getColonLoc(), 11702 RHS.get()); 11703 } 11704 11705 template<typename Derived> 11706 ExprResult 11707 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11708 // Implicit casts are eliminated during transformation, since they 11709 // will be recomputed by semantic analysis after transformation. 11710 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11711 } 11712 11713 template<typename Derived> 11714 ExprResult 11715 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11716 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11717 if (!Type) 11718 return ExprError(); 11719 11720 ExprResult SubExpr 11721 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11722 if (SubExpr.isInvalid()) 11723 return ExprError(); 11724 11725 if (!getDerived().AlwaysRebuild() && 11726 Type == E->getTypeInfoAsWritten() && 11727 SubExpr.get() == E->getSubExpr()) 11728 return E; 11729 11730 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11731 Type, 11732 E->getRParenLoc(), 11733 SubExpr.get()); 11734 } 11735 11736 template<typename Derived> 11737 ExprResult 11738 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11739 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11740 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11741 if (!NewT) 11742 return ExprError(); 11743 11744 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11745 if (Init.isInvalid()) 11746 return ExprError(); 11747 11748 if (!getDerived().AlwaysRebuild() && 11749 OldT == NewT && 11750 Init.get() == E->getInitializer()) 11751 return SemaRef.MaybeBindToTemporary(E); 11752 11753 // Note: the expression type doesn't necessarily match the 11754 // type-as-written, but that's okay, because it should always be 11755 // derivable from the initializer. 11756 11757 return getDerived().RebuildCompoundLiteralExpr( 11758 E->getLParenLoc(), NewT, 11759 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11760 } 11761 11762 template<typename Derived> 11763 ExprResult 11764 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11765 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11766 if (Base.isInvalid()) 11767 return ExprError(); 11768 11769 if (!getDerived().AlwaysRebuild() && 11770 Base.get() == E->getBase()) 11771 return E; 11772 11773 // FIXME: Bad source location 11774 SourceLocation FakeOperatorLoc = 11775 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11776 return getDerived().RebuildExtVectorElementExpr( 11777 Base.get(), FakeOperatorLoc, E->isArrow(), E->getAccessorLoc(), 11778 E->getAccessor()); 11779 } 11780 11781 template<typename Derived> 11782 ExprResult 11783 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11784 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11785 E = Syntactic; 11786 11787 bool InitChanged = false; 11788 11789 EnterExpressionEvaluationContext Context( 11790 getSema(), EnterExpressionEvaluationContext::InitList); 11791 11792 SmallVector<Expr*, 4> Inits; 11793 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11794 Inits, &InitChanged)) 11795 return ExprError(); 11796 11797 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11798 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11799 // in some cases. We can't reuse it in general, because the syntactic and 11800 // semantic forms are linked, and we can't know that semantic form will 11801 // match even if the syntactic form does. 11802 } 11803 11804 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11805 E->getRBraceLoc()); 11806 } 11807 11808 template<typename Derived> 11809 ExprResult 11810 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11811 Designation Desig; 11812 11813 // transform the initializer value 11814 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11815 if (Init.isInvalid()) 11816 return ExprError(); 11817 11818 // transform the designators. 11819 SmallVector<Expr*, 4> ArrayExprs; 11820 bool ExprChanged = false; 11821 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11822 if (D.isFieldDesignator()) { 11823 if (D.getFieldDecl()) { 11824 FieldDecl *Field = cast_or_null<FieldDecl>( 11825 getDerived().TransformDecl(D.getFieldLoc(), D.getFieldDecl())); 11826 if (Field != D.getFieldDecl()) 11827 // Rebuild the expression when the transformed FieldDecl is 11828 // different to the already assigned FieldDecl. 11829 ExprChanged = true; 11830 if (Field->isAnonymousStructOrUnion()) 11831 continue; 11832 } else { 11833 // Ensure that the designator expression is rebuilt when there isn't 11834 // a resolved FieldDecl in the designator as we don't want to assign 11835 // a FieldDecl to a pattern designator that will be instantiated again. 11836 ExprChanged = true; 11837 } 11838 Desig.AddDesignator(Designator::CreateFieldDesignator( 11839 D.getFieldName(), D.getDotLoc(), D.getFieldLoc())); 11840 continue; 11841 } 11842 11843 if (D.isArrayDesignator()) { 11844 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11845 if (Index.isInvalid()) 11846 return ExprError(); 11847 11848 Desig.AddDesignator( 11849 Designator::CreateArrayDesignator(Index.get(), D.getLBracketLoc())); 11850 11851 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11852 ArrayExprs.push_back(Index.get()); 11853 continue; 11854 } 11855 11856 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11857 ExprResult Start 11858 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11859 if (Start.isInvalid()) 11860 return ExprError(); 11861 11862 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11863 if (End.isInvalid()) 11864 return ExprError(); 11865 11866 Desig.AddDesignator(Designator::CreateArrayRangeDesignator( 11867 Start.get(), End.get(), D.getLBracketLoc(), D.getEllipsisLoc())); 11868 11869 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11870 End.get() != E->getArrayRangeEnd(D); 11871 11872 ArrayExprs.push_back(Start.get()); 11873 ArrayExprs.push_back(End.get()); 11874 } 11875 11876 if (!getDerived().AlwaysRebuild() && 11877 Init.get() == E->getInit() && 11878 !ExprChanged) 11879 return E; 11880 11881 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11882 E->getEqualOrColonLoc(), 11883 E->usesGNUSyntax(), Init.get()); 11884 } 11885 11886 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11887 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11888 template<typename Derived> 11889 ExprResult 11890 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11891 DesignatedInitUpdateExpr *E) { 11892 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11893 "initializer"); 11894 return ExprError(); 11895 } 11896 11897 template<typename Derived> 11898 ExprResult 11899 TreeTransform<Derived>::TransformNoInitExpr( 11900 NoInitExpr *E) { 11901 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11902 return ExprError(); 11903 } 11904 11905 template<typename Derived> 11906 ExprResult 11907 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11908 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11909 return ExprError(); 11910 } 11911 11912 template<typename Derived> 11913 ExprResult 11914 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11915 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11916 return ExprError(); 11917 } 11918 11919 template<typename Derived> 11920 ExprResult 11921 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11922 ImplicitValueInitExpr *E) { 11923 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11924 11925 // FIXME: Will we ever have proper type location here? Will we actually 11926 // need to transform the type? 11927 QualType T = getDerived().TransformType(E->getType()); 11928 if (T.isNull()) 11929 return ExprError(); 11930 11931 if (!getDerived().AlwaysRebuild() && 11932 T == E->getType()) 11933 return E; 11934 11935 return getDerived().RebuildImplicitValueInitExpr(T); 11936 } 11937 11938 template<typename Derived> 11939 ExprResult 11940 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11941 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11942 if (!TInfo) 11943 return ExprError(); 11944 11945 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11946 if (SubExpr.isInvalid()) 11947 return ExprError(); 11948 11949 if (!getDerived().AlwaysRebuild() && 11950 TInfo == E->getWrittenTypeInfo() && 11951 SubExpr.get() == E->getSubExpr()) 11952 return E; 11953 11954 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11955 TInfo, E->getRParenLoc()); 11956 } 11957 11958 template<typename Derived> 11959 ExprResult 11960 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11961 bool ArgumentChanged = false; 11962 SmallVector<Expr*, 4> Inits; 11963 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11964 &ArgumentChanged)) 11965 return ExprError(); 11966 11967 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11968 Inits, 11969 E->getRParenLoc()); 11970 } 11971 11972 /// Transform an address-of-label expression. 11973 /// 11974 /// By default, the transformation of an address-of-label expression always 11975 /// rebuilds the expression, so that the label identifier can be resolved to 11976 /// the corresponding label statement by semantic analysis. 11977 template<typename Derived> 11978 ExprResult 11979 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11980 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11981 E->getLabel()); 11982 if (!LD) 11983 return ExprError(); 11984 11985 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11986 cast<LabelDecl>(LD)); 11987 } 11988 11989 template<typename Derived> 11990 ExprResult 11991 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11992 SemaRef.ActOnStartStmtExpr(); 11993 StmtResult SubStmt 11994 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11995 if (SubStmt.isInvalid()) { 11996 SemaRef.ActOnStmtExprError(); 11997 return ExprError(); 11998 } 11999 12000 unsigned OldDepth = E->getTemplateDepth(); 12001 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 12002 12003 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 12004 SubStmt.get() == E->getSubStmt()) { 12005 // Calling this an 'error' is unintuitive, but it does the right thing. 12006 SemaRef.ActOnStmtExprError(); 12007 return SemaRef.MaybeBindToTemporary(E); 12008 } 12009 12010 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 12011 E->getRParenLoc(), NewDepth); 12012 } 12013 12014 template<typename Derived> 12015 ExprResult 12016 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 12017 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 12018 if (Cond.isInvalid()) 12019 return ExprError(); 12020 12021 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 12022 if (LHS.isInvalid()) 12023 return ExprError(); 12024 12025 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 12026 if (RHS.isInvalid()) 12027 return ExprError(); 12028 12029 if (!getDerived().AlwaysRebuild() && 12030 Cond.get() == E->getCond() && 12031 LHS.get() == E->getLHS() && 12032 RHS.get() == E->getRHS()) 12033 return E; 12034 12035 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 12036 Cond.get(), LHS.get(), RHS.get(), 12037 E->getRParenLoc()); 12038 } 12039 12040 template<typename Derived> 12041 ExprResult 12042 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 12043 return E; 12044 } 12045 12046 template<typename Derived> 12047 ExprResult 12048 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 12049 switch (E->getOperator()) { 12050 case OO_New: 12051 case OO_Delete: 12052 case OO_Array_New: 12053 case OO_Array_Delete: 12054 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 12055 12056 case OO_Subscript: 12057 case OO_Call: { 12058 // This is a call to an object's operator(). 12059 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 12060 12061 // Transform the object itself. 12062 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 12063 if (Object.isInvalid()) 12064 return ExprError(); 12065 12066 // FIXME: Poor location information 12067 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 12068 static_cast<Expr *>(Object.get())->getEndLoc()); 12069 12070 // Transform the call arguments. 12071 SmallVector<Expr*, 8> Args; 12072 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 12073 Args)) 12074 return ExprError(); 12075 12076 if (E->getOperator() == OO_Subscript) 12077 return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc, 12078 Args, E->getEndLoc()); 12079 12080 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 12081 E->getEndLoc()); 12082 } 12083 12084 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 12085 case OO_##Name: \ 12086 break; 12087 12088 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 12089 #include "clang/Basic/OperatorKinds.def" 12090 12091 case OO_Conditional: 12092 llvm_unreachable("conditional operator is not actually overloadable"); 12093 12094 case OO_None: 12095 case NUM_OVERLOADED_OPERATORS: 12096 llvm_unreachable("not an overloaded operator?"); 12097 } 12098 12099 ExprResult First; 12100 if (E->getOperator() == OO_Amp) 12101 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 12102 else 12103 First = getDerived().TransformExpr(E->getArg(0)); 12104 if (First.isInvalid()) 12105 return ExprError(); 12106 12107 ExprResult Second; 12108 if (E->getNumArgs() == 2) { 12109 Second = 12110 getDerived().TransformInitializer(E->getArg(1), /*NotCopyInit=*/false); 12111 if (Second.isInvalid()) 12112 return ExprError(); 12113 } 12114 12115 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 12116 FPOptionsOverride NewOverrides(E->getFPFeatures()); 12117 getSema().CurFPFeatures = 12118 NewOverrides.applyOverrides(getSema().getLangOpts()); 12119 getSema().FpPragmaStack.CurrentValue = NewOverrides; 12120 12121 Expr *Callee = E->getCallee(); 12122 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12123 LookupResult R(SemaRef, ULE->getName(), ULE->getNameLoc(), 12124 Sema::LookupOrdinaryName); 12125 if (getDerived().TransformOverloadExprDecls(ULE, ULE->requiresADL(), R)) 12126 return ExprError(); 12127 12128 return getDerived().RebuildCXXOperatorCallExpr( 12129 E->getOperator(), E->getOperatorLoc(), Callee->getBeginLoc(), 12130 ULE->requiresADL(), R.asUnresolvedSet(), First.get(), Second.get()); 12131 } 12132 12133 UnresolvedSet<1> Functions; 12134 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee)) 12135 Callee = ICE->getSubExprAsWritten(); 12136 NamedDecl *DR = cast<DeclRefExpr>(Callee)->getDecl(); 12137 ValueDecl *VD = cast_or_null<ValueDecl>( 12138 getDerived().TransformDecl(DR->getLocation(), DR)); 12139 if (!VD) 12140 return ExprError(); 12141 12142 if (!isa<CXXMethodDecl>(VD)) 12143 Functions.addDecl(VD); 12144 12145 return getDerived().RebuildCXXOperatorCallExpr( 12146 E->getOperator(), E->getOperatorLoc(), Callee->getBeginLoc(), 12147 /*RequiresADL=*/false, Functions, First.get(), Second.get()); 12148 } 12149 12150 template<typename Derived> 12151 ExprResult 12152 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 12153 return getDerived().TransformCallExpr(E); 12154 } 12155 12156 template <typename Derived> 12157 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 12158 bool NeedRebuildFunc = SourceLocExpr::MayBeDependent(E->getIdentKind()) && 12159 getSema().CurContext != E->getParentContext(); 12160 12161 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 12162 return E; 12163 12164 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(), 12165 E->getBeginLoc(), E->getEndLoc(), 12166 getSema().CurContext); 12167 } 12168 12169 template<typename Derived> 12170 ExprResult 12171 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 12172 // Transform the callee. 12173 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 12174 if (Callee.isInvalid()) 12175 return ExprError(); 12176 12177 // Transform exec config. 12178 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 12179 if (EC.isInvalid()) 12180 return ExprError(); 12181 12182 // Transform arguments. 12183 bool ArgChanged = false; 12184 SmallVector<Expr*, 8> Args; 12185 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12186 &ArgChanged)) 12187 return ExprError(); 12188 12189 if (!getDerived().AlwaysRebuild() && 12190 Callee.get() == E->getCallee() && 12191 !ArgChanged) 12192 return SemaRef.MaybeBindToTemporary(E); 12193 12194 // FIXME: Wrong source location information for the '('. 12195 SourceLocation FakeLParenLoc 12196 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 12197 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 12198 Args, 12199 E->getRParenLoc(), EC.get()); 12200 } 12201 12202 template<typename Derived> 12203 ExprResult 12204 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 12205 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 12206 if (!Type) 12207 return ExprError(); 12208 12209 ExprResult SubExpr 12210 = getDerived().TransformExpr(E->getSubExprAsWritten()); 12211 if (SubExpr.isInvalid()) 12212 return ExprError(); 12213 12214 if (!getDerived().AlwaysRebuild() && 12215 Type == E->getTypeInfoAsWritten() && 12216 SubExpr.get() == E->getSubExpr()) 12217 return E; 12218 return getDerived().RebuildCXXNamedCastExpr( 12219 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 12220 Type, E->getAngleBrackets().getEnd(), 12221 // FIXME. this should be '(' location 12222 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 12223 } 12224 12225 template<typename Derived> 12226 ExprResult 12227 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 12228 TypeSourceInfo *TSI = 12229 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 12230 if (!TSI) 12231 return ExprError(); 12232 12233 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 12234 if (Sub.isInvalid()) 12235 return ExprError(); 12236 12237 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 12238 Sub.get(), BCE->getEndLoc()); 12239 } 12240 12241 template<typename Derived> 12242 ExprResult 12243 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 12244 return getDerived().TransformCXXNamedCastExpr(E); 12245 } 12246 12247 template<typename Derived> 12248 ExprResult 12249 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 12250 return getDerived().TransformCXXNamedCastExpr(E); 12251 } 12252 12253 template<typename Derived> 12254 ExprResult 12255 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 12256 CXXReinterpretCastExpr *E) { 12257 return getDerived().TransformCXXNamedCastExpr(E); 12258 } 12259 12260 template<typename Derived> 12261 ExprResult 12262 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 12263 return getDerived().TransformCXXNamedCastExpr(E); 12264 } 12265 12266 template<typename Derived> 12267 ExprResult 12268 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 12269 return getDerived().TransformCXXNamedCastExpr(E); 12270 } 12271 12272 template<typename Derived> 12273 ExprResult 12274 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 12275 CXXFunctionalCastExpr *E) { 12276 TypeSourceInfo *Type = 12277 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 12278 if (!Type) 12279 return ExprError(); 12280 12281 ExprResult SubExpr 12282 = getDerived().TransformExpr(E->getSubExprAsWritten()); 12283 if (SubExpr.isInvalid()) 12284 return ExprError(); 12285 12286 if (!getDerived().AlwaysRebuild() && 12287 Type == E->getTypeInfoAsWritten() && 12288 SubExpr.get() == E->getSubExpr()) 12289 return E; 12290 12291 return getDerived().RebuildCXXFunctionalCastExpr(Type, 12292 E->getLParenLoc(), 12293 SubExpr.get(), 12294 E->getRParenLoc(), 12295 E->isListInitialization()); 12296 } 12297 12298 template<typename Derived> 12299 ExprResult 12300 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 12301 if (E->isTypeOperand()) { 12302 TypeSourceInfo *TInfo 12303 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 12304 if (!TInfo) 12305 return ExprError(); 12306 12307 if (!getDerived().AlwaysRebuild() && 12308 TInfo == E->getTypeOperandSourceInfo()) 12309 return E; 12310 12311 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 12312 TInfo, E->getEndLoc()); 12313 } 12314 12315 // Typeid's operand is an unevaluated context, unless it's a polymorphic 12316 // type. We must not unilaterally enter unevaluated context here, as then 12317 // semantic processing can re-transform an already transformed operand. 12318 Expr *Op = E->getExprOperand(); 12319 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 12320 if (E->isGLValue()) 12321 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 12322 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 12323 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 12324 12325 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 12326 Sema::ReuseLambdaContextDecl); 12327 12328 ExprResult SubExpr = getDerived().TransformExpr(Op); 12329 if (SubExpr.isInvalid()) 12330 return ExprError(); 12331 12332 if (!getDerived().AlwaysRebuild() && 12333 SubExpr.get() == E->getExprOperand()) 12334 return E; 12335 12336 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 12337 SubExpr.get(), E->getEndLoc()); 12338 } 12339 12340 template<typename Derived> 12341 ExprResult 12342 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 12343 if (E->isTypeOperand()) { 12344 TypeSourceInfo *TInfo 12345 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 12346 if (!TInfo) 12347 return ExprError(); 12348 12349 if (!getDerived().AlwaysRebuild() && 12350 TInfo == E->getTypeOperandSourceInfo()) 12351 return E; 12352 12353 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 12354 TInfo, E->getEndLoc()); 12355 } 12356 12357 EnterExpressionEvaluationContext Unevaluated( 12358 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12359 12360 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 12361 if (SubExpr.isInvalid()) 12362 return ExprError(); 12363 12364 if (!getDerived().AlwaysRebuild() && 12365 SubExpr.get() == E->getExprOperand()) 12366 return E; 12367 12368 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 12369 SubExpr.get(), E->getEndLoc()); 12370 } 12371 12372 template<typename Derived> 12373 ExprResult 12374 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 12375 return E; 12376 } 12377 12378 template<typename Derived> 12379 ExprResult 12380 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 12381 CXXNullPtrLiteralExpr *E) { 12382 return E; 12383 } 12384 12385 template<typename Derived> 12386 ExprResult 12387 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 12388 12389 // In lambdas, the qualifiers of the type depends of where in 12390 // the call operator `this` appear, and we do not have a good way to 12391 // rebuild this information, so we transform the type. 12392 // 12393 // In other contexts, the type of `this` may be overrided 12394 // for type deduction, so we need to recompute it. 12395 QualType T = getSema().getCurLambda() ? 12396 getDerived().TransformType(E->getType()) 12397 : getSema().getCurrentThisType(); 12398 12399 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 12400 // Mark it referenced in the new context regardless. 12401 // FIXME: this is a bit instantiation-specific. 12402 getSema().MarkThisReferenced(E); 12403 return E; 12404 } 12405 12406 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 12407 } 12408 12409 template<typename Derived> 12410 ExprResult 12411 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 12412 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 12413 if (SubExpr.isInvalid()) 12414 return ExprError(); 12415 12416 if (!getDerived().AlwaysRebuild() && 12417 SubExpr.get() == E->getSubExpr()) 12418 return E; 12419 12420 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 12421 E->isThrownVariableInScope()); 12422 } 12423 12424 template<typename Derived> 12425 ExprResult 12426 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 12427 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 12428 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 12429 if (!Param) 12430 return ExprError(); 12431 12432 ExprResult InitRes; 12433 if (E->hasRewrittenInit()) { 12434 InitRes = getDerived().TransformExpr(E->getRewrittenExpr()); 12435 if (InitRes.isInvalid()) 12436 return ExprError(); 12437 } 12438 12439 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 12440 E->getUsedContext() == SemaRef.CurContext && 12441 InitRes.get() == E->getRewrittenExpr()) 12442 return E; 12443 12444 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param, 12445 InitRes.get()); 12446 } 12447 12448 template<typename Derived> 12449 ExprResult 12450 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 12451 FieldDecl *Field = cast_or_null<FieldDecl>( 12452 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 12453 if (!Field) 12454 return ExprError(); 12455 12456 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 12457 E->getUsedContext() == SemaRef.CurContext) 12458 return E; 12459 12460 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 12461 } 12462 12463 template<typename Derived> 12464 ExprResult 12465 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 12466 CXXScalarValueInitExpr *E) { 12467 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 12468 if (!T) 12469 return ExprError(); 12470 12471 if (!getDerived().AlwaysRebuild() && 12472 T == E->getTypeSourceInfo()) 12473 return E; 12474 12475 return getDerived().RebuildCXXScalarValueInitExpr(T, 12476 /*FIXME:*/T->getTypeLoc().getEndLoc(), 12477 E->getRParenLoc()); 12478 } 12479 12480 template<typename Derived> 12481 ExprResult 12482 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 12483 // Transform the type that we're allocating 12484 TypeSourceInfo *AllocTypeInfo = 12485 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 12486 if (!AllocTypeInfo) 12487 return ExprError(); 12488 12489 // Transform the size of the array we're allocating (if any). 12490 std::optional<Expr *> ArraySize; 12491 if (E->isArray()) { 12492 ExprResult NewArraySize; 12493 if (std::optional<Expr *> OldArraySize = E->getArraySize()) { 12494 NewArraySize = getDerived().TransformExpr(*OldArraySize); 12495 if (NewArraySize.isInvalid()) 12496 return ExprError(); 12497 } 12498 ArraySize = NewArraySize.get(); 12499 } 12500 12501 // Transform the placement arguments (if any). 12502 bool ArgumentChanged = false; 12503 SmallVector<Expr*, 8> PlacementArgs; 12504 if (getDerived().TransformExprs(E->getPlacementArgs(), 12505 E->getNumPlacementArgs(), true, 12506 PlacementArgs, &ArgumentChanged)) 12507 return ExprError(); 12508 12509 // Transform the initializer (if any). 12510 Expr *OldInit = E->getInitializer(); 12511 ExprResult NewInit; 12512 if (OldInit) 12513 NewInit = getDerived().TransformInitializer(OldInit, true); 12514 if (NewInit.isInvalid()) 12515 return ExprError(); 12516 12517 // Transform new operator and delete operator. 12518 FunctionDecl *OperatorNew = nullptr; 12519 if (E->getOperatorNew()) { 12520 OperatorNew = cast_or_null<FunctionDecl>( 12521 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 12522 if (!OperatorNew) 12523 return ExprError(); 12524 } 12525 12526 FunctionDecl *OperatorDelete = nullptr; 12527 if (E->getOperatorDelete()) { 12528 OperatorDelete = cast_or_null<FunctionDecl>( 12529 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12530 if (!OperatorDelete) 12531 return ExprError(); 12532 } 12533 12534 if (!getDerived().AlwaysRebuild() && 12535 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 12536 ArraySize == E->getArraySize() && 12537 NewInit.get() == OldInit && 12538 OperatorNew == E->getOperatorNew() && 12539 OperatorDelete == E->getOperatorDelete() && 12540 !ArgumentChanged) { 12541 // Mark any declarations we need as referenced. 12542 // FIXME: instantiation-specific. 12543 if (OperatorNew) 12544 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 12545 if (OperatorDelete) 12546 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12547 12548 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 12549 QualType ElementType 12550 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 12551 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 12552 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 12553 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 12554 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 12555 } 12556 } 12557 } 12558 12559 return E; 12560 } 12561 12562 QualType AllocType = AllocTypeInfo->getType(); 12563 if (!ArraySize) { 12564 // If no array size was specified, but the new expression was 12565 // instantiated with an array type (e.g., "new T" where T is 12566 // instantiated with "int[4]"), extract the outer bound from the 12567 // array type as our array size. We do this with constant and 12568 // dependently-sized array types. 12569 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 12570 if (!ArrayT) { 12571 // Do nothing 12572 } else if (const ConstantArrayType *ConsArrayT 12573 = dyn_cast<ConstantArrayType>(ArrayT)) { 12574 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 12575 SemaRef.Context.getSizeType(), 12576 /*FIXME:*/ E->getBeginLoc()); 12577 AllocType = ConsArrayT->getElementType(); 12578 } else if (const DependentSizedArrayType *DepArrayT 12579 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 12580 if (DepArrayT->getSizeExpr()) { 12581 ArraySize = DepArrayT->getSizeExpr(); 12582 AllocType = DepArrayT->getElementType(); 12583 } 12584 } 12585 } 12586 12587 return getDerived().RebuildCXXNewExpr( 12588 E->getBeginLoc(), E->isGlobalNew(), 12589 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 12590 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 12591 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 12592 } 12593 12594 template<typename Derived> 12595 ExprResult 12596 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 12597 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 12598 if (Operand.isInvalid()) 12599 return ExprError(); 12600 12601 // Transform the delete operator, if known. 12602 FunctionDecl *OperatorDelete = nullptr; 12603 if (E->getOperatorDelete()) { 12604 OperatorDelete = cast_or_null<FunctionDecl>( 12605 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12606 if (!OperatorDelete) 12607 return ExprError(); 12608 } 12609 12610 if (!getDerived().AlwaysRebuild() && 12611 Operand.get() == E->getArgument() && 12612 OperatorDelete == E->getOperatorDelete()) { 12613 // Mark any declarations we need as referenced. 12614 // FIXME: instantiation-specific. 12615 if (OperatorDelete) 12616 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12617 12618 if (!E->getArgument()->isTypeDependent()) { 12619 QualType Destroyed = SemaRef.Context.getBaseElementType( 12620 E->getDestroyedType()); 12621 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12622 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12623 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12624 SemaRef.LookupDestructor(Record)); 12625 } 12626 } 12627 12628 return E; 12629 } 12630 12631 return getDerived().RebuildCXXDeleteExpr( 12632 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12633 } 12634 12635 template<typename Derived> 12636 ExprResult 12637 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12638 CXXPseudoDestructorExpr *E) { 12639 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12640 if (Base.isInvalid()) 12641 return ExprError(); 12642 12643 ParsedType ObjectTypePtr; 12644 bool MayBePseudoDestructor = false; 12645 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12646 E->getOperatorLoc(), 12647 E->isArrow()? tok::arrow : tok::period, 12648 ObjectTypePtr, 12649 MayBePseudoDestructor); 12650 if (Base.isInvalid()) 12651 return ExprError(); 12652 12653 QualType ObjectType = ObjectTypePtr.get(); 12654 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12655 if (QualifierLoc) { 12656 QualifierLoc 12657 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12658 if (!QualifierLoc) 12659 return ExprError(); 12660 } 12661 CXXScopeSpec SS; 12662 SS.Adopt(QualifierLoc); 12663 12664 PseudoDestructorTypeStorage Destroyed; 12665 if (E->getDestroyedTypeInfo()) { 12666 TypeSourceInfo *DestroyedTypeInfo 12667 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12668 ObjectType, nullptr, SS); 12669 if (!DestroyedTypeInfo) 12670 return ExprError(); 12671 Destroyed = DestroyedTypeInfo; 12672 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12673 // We aren't likely to be able to resolve the identifier down to a type 12674 // now anyway, so just retain the identifier. 12675 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12676 E->getDestroyedTypeLoc()); 12677 } else { 12678 // Look for a destructor known with the given name. 12679 ParsedType T = SemaRef.getDestructorName( 12680 *E->getDestroyedTypeIdentifier(), E->getDestroyedTypeLoc(), 12681 /*Scope=*/nullptr, SS, ObjectTypePtr, false); 12682 if (!T) 12683 return ExprError(); 12684 12685 Destroyed 12686 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12687 E->getDestroyedTypeLoc()); 12688 } 12689 12690 TypeSourceInfo *ScopeTypeInfo = nullptr; 12691 if (E->getScopeTypeInfo()) { 12692 CXXScopeSpec EmptySS; 12693 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12694 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12695 if (!ScopeTypeInfo) 12696 return ExprError(); 12697 } 12698 12699 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12700 E->getOperatorLoc(), 12701 E->isArrow(), 12702 SS, 12703 ScopeTypeInfo, 12704 E->getColonColonLoc(), 12705 E->getTildeLoc(), 12706 Destroyed); 12707 } 12708 12709 template <typename Derived> 12710 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12711 bool RequiresADL, 12712 LookupResult &R) { 12713 // Transform all the decls. 12714 bool AllEmptyPacks = true; 12715 for (auto *OldD : Old->decls()) { 12716 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12717 if (!InstD) { 12718 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12719 // This can happen because of dependent hiding. 12720 if (isa<UsingShadowDecl>(OldD)) 12721 continue; 12722 else { 12723 R.clear(); 12724 return true; 12725 } 12726 } 12727 12728 // Expand using pack declarations. 12729 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12730 ArrayRef<NamedDecl*> Decls = SingleDecl; 12731 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12732 Decls = UPD->expansions(); 12733 12734 // Expand using declarations. 12735 for (auto *D : Decls) { 12736 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12737 for (auto *SD : UD->shadows()) 12738 R.addDecl(SD); 12739 } else { 12740 R.addDecl(D); 12741 } 12742 } 12743 12744 AllEmptyPacks &= Decls.empty(); 12745 }; 12746 12747 // C++ [temp.res]/8.4.2: 12748 // The program is ill-formed, no diagnostic required, if [...] lookup for 12749 // a name in the template definition found a using-declaration, but the 12750 // lookup in the corresponding scope in the instantiation odoes not find 12751 // any declarations because the using-declaration was a pack expansion and 12752 // the corresponding pack is empty 12753 if (AllEmptyPacks && !RequiresADL) { 12754 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12755 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12756 return true; 12757 } 12758 12759 // Resolve a kind, but don't do any further analysis. If it's 12760 // ambiguous, the callee needs to deal with it. 12761 R.resolveKind(); 12762 return false; 12763 } 12764 12765 template<typename Derived> 12766 ExprResult 12767 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12768 UnresolvedLookupExpr *Old) { 12769 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12770 Sema::LookupOrdinaryName); 12771 12772 // Transform the declaration set. 12773 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12774 return ExprError(); 12775 12776 // Rebuild the nested-name qualifier, if present. 12777 CXXScopeSpec SS; 12778 if (Old->getQualifierLoc()) { 12779 NestedNameSpecifierLoc QualifierLoc 12780 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12781 if (!QualifierLoc) 12782 return ExprError(); 12783 12784 SS.Adopt(QualifierLoc); 12785 } 12786 12787 if (Old->getNamingClass()) { 12788 CXXRecordDecl *NamingClass 12789 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12790 Old->getNameLoc(), 12791 Old->getNamingClass())); 12792 if (!NamingClass) { 12793 R.clear(); 12794 return ExprError(); 12795 } 12796 12797 R.setNamingClass(NamingClass); 12798 } 12799 12800 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12801 12802 // If we have neither explicit template arguments, nor the template keyword, 12803 // it's a normal declaration name or member reference. 12804 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12805 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12806 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12807 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12808 // give a good diagnostic. 12809 if (D && D->isCXXInstanceMember()) { 12810 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12811 /*TemplateArgs=*/nullptr, 12812 /*Scope=*/nullptr); 12813 } 12814 12815 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12816 } 12817 12818 // If we have template arguments, rebuild them, then rebuild the 12819 // templateid expression. 12820 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12821 if (Old->hasExplicitTemplateArgs() && 12822 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12823 Old->getNumTemplateArgs(), 12824 TransArgs)) { 12825 R.clear(); 12826 return ExprError(); 12827 } 12828 12829 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12830 Old->requiresADL(), &TransArgs); 12831 } 12832 12833 template<typename Derived> 12834 ExprResult 12835 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12836 bool ArgChanged = false; 12837 SmallVector<TypeSourceInfo *, 4> Args; 12838 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12839 TypeSourceInfo *From = E->getArg(I); 12840 TypeLoc FromTL = From->getTypeLoc(); 12841 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12842 TypeLocBuilder TLB; 12843 TLB.reserve(FromTL.getFullDataSize()); 12844 QualType To = getDerived().TransformType(TLB, FromTL); 12845 if (To.isNull()) 12846 return ExprError(); 12847 12848 if (To == From->getType()) 12849 Args.push_back(From); 12850 else { 12851 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12852 ArgChanged = true; 12853 } 12854 continue; 12855 } 12856 12857 ArgChanged = true; 12858 12859 // We have a pack expansion. Instantiate it. 12860 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12861 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12862 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12863 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12864 12865 // Determine whether the set of unexpanded parameter packs can and should 12866 // be expanded. 12867 bool Expand = true; 12868 bool RetainExpansion = false; 12869 std::optional<unsigned> OrigNumExpansions = 12870 ExpansionTL.getTypePtr()->getNumExpansions(); 12871 std::optional<unsigned> NumExpansions = OrigNumExpansions; 12872 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12873 PatternTL.getSourceRange(), 12874 Unexpanded, 12875 Expand, RetainExpansion, 12876 NumExpansions)) 12877 return ExprError(); 12878 12879 if (!Expand) { 12880 // The transform has determined that we should perform a simple 12881 // transformation on the pack expansion, producing another pack 12882 // expansion. 12883 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12884 12885 TypeLocBuilder TLB; 12886 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12887 12888 QualType To = getDerived().TransformType(TLB, PatternTL); 12889 if (To.isNull()) 12890 return ExprError(); 12891 12892 To = getDerived().RebuildPackExpansionType(To, 12893 PatternTL.getSourceRange(), 12894 ExpansionTL.getEllipsisLoc(), 12895 NumExpansions); 12896 if (To.isNull()) 12897 return ExprError(); 12898 12899 PackExpansionTypeLoc ToExpansionTL 12900 = TLB.push<PackExpansionTypeLoc>(To); 12901 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12902 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12903 continue; 12904 } 12905 12906 // Expand the pack expansion by substituting for each argument in the 12907 // pack(s). 12908 for (unsigned I = 0; I != *NumExpansions; ++I) { 12909 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12910 TypeLocBuilder TLB; 12911 TLB.reserve(PatternTL.getFullDataSize()); 12912 QualType To = getDerived().TransformType(TLB, PatternTL); 12913 if (To.isNull()) 12914 return ExprError(); 12915 12916 if (To->containsUnexpandedParameterPack()) { 12917 To = getDerived().RebuildPackExpansionType(To, 12918 PatternTL.getSourceRange(), 12919 ExpansionTL.getEllipsisLoc(), 12920 NumExpansions); 12921 if (To.isNull()) 12922 return ExprError(); 12923 12924 PackExpansionTypeLoc ToExpansionTL 12925 = TLB.push<PackExpansionTypeLoc>(To); 12926 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12927 } 12928 12929 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12930 } 12931 12932 if (!RetainExpansion) 12933 continue; 12934 12935 // If we're supposed to retain a pack expansion, do so by temporarily 12936 // forgetting the partially-substituted parameter pack. 12937 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12938 12939 TypeLocBuilder TLB; 12940 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12941 12942 QualType To = getDerived().TransformType(TLB, PatternTL); 12943 if (To.isNull()) 12944 return ExprError(); 12945 12946 To = getDerived().RebuildPackExpansionType(To, 12947 PatternTL.getSourceRange(), 12948 ExpansionTL.getEllipsisLoc(), 12949 NumExpansions); 12950 if (To.isNull()) 12951 return ExprError(); 12952 12953 PackExpansionTypeLoc ToExpansionTL 12954 = TLB.push<PackExpansionTypeLoc>(To); 12955 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12956 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12957 } 12958 12959 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12960 return E; 12961 12962 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12963 E->getEndLoc()); 12964 } 12965 12966 template<typename Derived> 12967 ExprResult 12968 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12969 ConceptSpecializationExpr *E) { 12970 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12971 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12972 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12973 Old->NumTemplateArgs, TransArgs)) 12974 return ExprError(); 12975 12976 return getDerived().RebuildConceptSpecializationExpr( 12977 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12978 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12979 &TransArgs); 12980 } 12981 12982 template<typename Derived> 12983 ExprResult 12984 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12985 SmallVector<ParmVarDecl*, 4> TransParams; 12986 SmallVector<QualType, 4> TransParamTypes; 12987 Sema::ExtParameterInfoBuilder ExtParamInfos; 12988 12989 // C++2a [expr.prim.req]p2 12990 // Expressions appearing within a requirement-body are unevaluated operands. 12991 EnterExpressionEvaluationContext Ctx( 12992 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 12993 Sema::ReuseLambdaContextDecl); 12994 12995 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12996 getSema().Context, getSema().CurContext, 12997 E->getBody()->getBeginLoc()); 12998 12999 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 13000 13001 ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams( 13002 E->getRequiresKWLoc(), E->getRBraceLoc(), E, Body, 13003 E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos); 13004 13005 for (ParmVarDecl *Param : TransParams) 13006 if (Param) 13007 Param->setDeclContext(Body); 13008 13009 // On failure to transform, TransformRequiresTypeParams returns an expression 13010 // in the event that the transformation of the type params failed in some way. 13011 // It is expected that this will result in a 'not satisfied' Requires clause 13012 // when instantiating. 13013 if (!TypeParamResult.isUnset()) 13014 return TypeParamResult; 13015 13016 SmallVector<concepts::Requirement *, 4> TransReqs; 13017 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 13018 TransReqs)) 13019 return ExprError(); 13020 13021 for (concepts::Requirement *Req : TransReqs) { 13022 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 13023 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 13024 ER->getReturnTypeRequirement() 13025 .getTypeConstraintTemplateParameterList()->getParam(0) 13026 ->setDeclContext(Body); 13027 } 13028 } 13029 } 13030 13031 return getDerived().RebuildRequiresExpr( 13032 E->getRequiresKWLoc(), Body, E->getLParenLoc(), TransParams, 13033 E->getRParenLoc(), TransReqs, E->getRBraceLoc()); 13034 } 13035 13036 template<typename Derived> 13037 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 13038 ArrayRef<concepts::Requirement *> Reqs, 13039 SmallVectorImpl<concepts::Requirement *> &Transformed) { 13040 for (concepts::Requirement *Req : Reqs) { 13041 concepts::Requirement *TransReq = nullptr; 13042 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 13043 TransReq = getDerived().TransformTypeRequirement(TypeReq); 13044 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 13045 TransReq = getDerived().TransformExprRequirement(ExprReq); 13046 else 13047 TransReq = getDerived().TransformNestedRequirement( 13048 cast<concepts::NestedRequirement>(Req)); 13049 if (!TransReq) 13050 return true; 13051 Transformed.push_back(TransReq); 13052 } 13053 return false; 13054 } 13055 13056 template<typename Derived> 13057 concepts::TypeRequirement * 13058 TreeTransform<Derived>::TransformTypeRequirement( 13059 concepts::TypeRequirement *Req) { 13060 if (Req->isSubstitutionFailure()) { 13061 if (getDerived().AlwaysRebuild()) 13062 return getDerived().RebuildTypeRequirement( 13063 Req->getSubstitutionDiagnostic()); 13064 return Req; 13065 } 13066 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 13067 if (!TransType) 13068 return nullptr; 13069 return getDerived().RebuildTypeRequirement(TransType); 13070 } 13071 13072 template<typename Derived> 13073 concepts::ExprRequirement * 13074 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 13075 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 13076 if (Req->isExprSubstitutionFailure()) 13077 TransExpr = Req->getExprSubstitutionDiagnostic(); 13078 else { 13079 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 13080 if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType()) 13081 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get()); 13082 if (TransExprRes.isInvalid()) 13083 return nullptr; 13084 TransExpr = TransExprRes.get(); 13085 } 13086 13087 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 13088 const auto &RetReq = Req->getReturnTypeRequirement(); 13089 if (RetReq.isEmpty()) 13090 TransRetReq.emplace(); 13091 else if (RetReq.isSubstitutionFailure()) 13092 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 13093 else if (RetReq.isTypeConstraint()) { 13094 TemplateParameterList *OrigTPL = 13095 RetReq.getTypeConstraintTemplateParameterList(); 13096 TemplateParameterList *TPL = 13097 getDerived().TransformTemplateParameterList(OrigTPL); 13098 if (!TPL) 13099 return nullptr; 13100 TransRetReq.emplace(TPL); 13101 } 13102 assert(TransRetReq && "All code paths leading here must set TransRetReq"); 13103 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 13104 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 13105 Req->getNoexceptLoc(), 13106 std::move(*TransRetReq)); 13107 return getDerived().RebuildExprRequirement( 13108 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 13109 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 13110 } 13111 13112 template<typename Derived> 13113 concepts::NestedRequirement * 13114 TreeTransform<Derived>::TransformNestedRequirement( 13115 concepts::NestedRequirement *Req) { 13116 if (Req->hasInvalidConstraint()) { 13117 if (getDerived().AlwaysRebuild()) 13118 return getDerived().RebuildNestedRequirement( 13119 Req->getInvalidConstraintEntity(), Req->getConstraintSatisfaction()); 13120 return Req; 13121 } 13122 ExprResult TransConstraint = 13123 getDerived().TransformExpr(Req->getConstraintExpr()); 13124 if (TransConstraint.isInvalid()) 13125 return nullptr; 13126 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 13127 } 13128 13129 template<typename Derived> 13130 ExprResult 13131 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 13132 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 13133 if (!T) 13134 return ExprError(); 13135 13136 if (!getDerived().AlwaysRebuild() && 13137 T == E->getQueriedTypeSourceInfo()) 13138 return E; 13139 13140 ExprResult SubExpr; 13141 { 13142 EnterExpressionEvaluationContext Unevaluated( 13143 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13144 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 13145 if (SubExpr.isInvalid()) 13146 return ExprError(); 13147 13148 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 13149 return E; 13150 } 13151 13152 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 13153 SubExpr.get(), E->getEndLoc()); 13154 } 13155 13156 template<typename Derived> 13157 ExprResult 13158 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 13159 ExprResult SubExpr; 13160 { 13161 EnterExpressionEvaluationContext Unevaluated( 13162 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13163 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 13164 if (SubExpr.isInvalid()) 13165 return ExprError(); 13166 13167 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 13168 return E; 13169 } 13170 13171 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 13172 SubExpr.get(), E->getEndLoc()); 13173 } 13174 13175 template <typename Derived> 13176 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 13177 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 13178 TypeSourceInfo **RecoveryTSI) { 13179 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 13180 DRE, AddrTaken, RecoveryTSI); 13181 13182 // Propagate both errors and recovered types, which return ExprEmpty. 13183 if (!NewDRE.isUsable()) 13184 return NewDRE; 13185 13186 // We got an expr, wrap it up in parens. 13187 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 13188 return PE; 13189 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 13190 PE->getRParen()); 13191 } 13192 13193 template <typename Derived> 13194 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 13195 DependentScopeDeclRefExpr *E) { 13196 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 13197 nullptr); 13198 } 13199 13200 template <typename Derived> 13201 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 13202 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 13203 TypeSourceInfo **RecoveryTSI) { 13204 assert(E->getQualifierLoc()); 13205 NestedNameSpecifierLoc QualifierLoc = 13206 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 13207 if (!QualifierLoc) 13208 return ExprError(); 13209 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13210 13211 // TODO: If this is a conversion-function-id, verify that the 13212 // destination type name (if present) resolves the same way after 13213 // instantiation as it did in the local scope. 13214 13215 DeclarationNameInfo NameInfo = 13216 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 13217 if (!NameInfo.getName()) 13218 return ExprError(); 13219 13220 if (!E->hasExplicitTemplateArgs()) { 13221 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 13222 // Note: it is sufficient to compare the Name component of NameInfo: 13223 // if name has not changed, DNLoc has not changed either. 13224 NameInfo.getName() == E->getDeclName()) 13225 return E; 13226 13227 return getDerived().RebuildDependentScopeDeclRefExpr( 13228 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 13229 IsAddressOfOperand, RecoveryTSI); 13230 } 13231 13232 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13233 if (getDerived().TransformTemplateArguments( 13234 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 13235 return ExprError(); 13236 13237 return getDerived().RebuildDependentScopeDeclRefExpr( 13238 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 13239 RecoveryTSI); 13240 } 13241 13242 template<typename Derived> 13243 ExprResult 13244 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 13245 // CXXConstructExprs other than for list-initialization and 13246 // CXXTemporaryObjectExpr are always implicit, so when we have 13247 // a 1-argument construction we just transform that argument. 13248 if (getDerived().AllowSkippingCXXConstructExpr() && 13249 ((E->getNumArgs() == 1 || 13250 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 13251 (!getDerived().DropCallArgument(E->getArg(0))) && 13252 !E->isListInitialization())) 13253 return getDerived().TransformInitializer(E->getArg(0), 13254 /*DirectInit*/ false); 13255 13256 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 13257 13258 QualType T = getDerived().TransformType(E->getType()); 13259 if (T.isNull()) 13260 return ExprError(); 13261 13262 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13263 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13264 if (!Constructor) 13265 return ExprError(); 13266 13267 bool ArgumentChanged = false; 13268 SmallVector<Expr*, 8> Args; 13269 { 13270 EnterExpressionEvaluationContext Context( 13271 getSema(), EnterExpressionEvaluationContext::InitList, 13272 E->isListInitialization()); 13273 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 13274 &ArgumentChanged)) 13275 return ExprError(); 13276 } 13277 13278 if (!getDerived().AlwaysRebuild() && 13279 T == E->getType() && 13280 Constructor == E->getConstructor() && 13281 !ArgumentChanged) { 13282 // Mark the constructor as referenced. 13283 // FIXME: Instantiation-specific 13284 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13285 return E; 13286 } 13287 13288 return getDerived().RebuildCXXConstructExpr( 13289 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 13290 E->hadMultipleCandidates(), E->isListInitialization(), 13291 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 13292 E->getConstructionKind(), E->getParenOrBraceRange()); 13293 } 13294 13295 template<typename Derived> 13296 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 13297 CXXInheritedCtorInitExpr *E) { 13298 QualType T = getDerived().TransformType(E->getType()); 13299 if (T.isNull()) 13300 return ExprError(); 13301 13302 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13303 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13304 if (!Constructor) 13305 return ExprError(); 13306 13307 if (!getDerived().AlwaysRebuild() && 13308 T == E->getType() && 13309 Constructor == E->getConstructor()) { 13310 // Mark the constructor as referenced. 13311 // FIXME: Instantiation-specific 13312 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13313 return E; 13314 } 13315 13316 return getDerived().RebuildCXXInheritedCtorInitExpr( 13317 T, E->getLocation(), Constructor, 13318 E->constructsVBase(), E->inheritedFromVBase()); 13319 } 13320 13321 /// Transform a C++ temporary-binding expression. 13322 /// 13323 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 13324 /// transform the subexpression and return that. 13325 template<typename Derived> 13326 ExprResult 13327 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 13328 if (auto *Dtor = E->getTemporary()->getDestructor()) 13329 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 13330 const_cast<CXXDestructorDecl *>(Dtor)); 13331 return getDerived().TransformExpr(E->getSubExpr()); 13332 } 13333 13334 /// Transform a C++ expression that contains cleanups that should 13335 /// be run after the expression is evaluated. 13336 /// 13337 /// Since ExprWithCleanups nodes are implicitly generated, we 13338 /// just transform the subexpression and return that. 13339 template<typename Derived> 13340 ExprResult 13341 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 13342 return getDerived().TransformExpr(E->getSubExpr()); 13343 } 13344 13345 template<typename Derived> 13346 ExprResult 13347 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 13348 CXXTemporaryObjectExpr *E) { 13349 TypeSourceInfo *T = 13350 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13351 if (!T) 13352 return ExprError(); 13353 13354 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13355 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13356 if (!Constructor) 13357 return ExprError(); 13358 13359 bool ArgumentChanged = false; 13360 SmallVector<Expr*, 8> Args; 13361 Args.reserve(E->getNumArgs()); 13362 { 13363 EnterExpressionEvaluationContext Context( 13364 getSema(), EnterExpressionEvaluationContext::InitList, 13365 E->isListInitialization()); 13366 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 13367 &ArgumentChanged)) 13368 return ExprError(); 13369 } 13370 13371 if (!getDerived().AlwaysRebuild() && 13372 T == E->getTypeSourceInfo() && 13373 Constructor == E->getConstructor() && 13374 !ArgumentChanged) { 13375 // FIXME: Instantiation-specific 13376 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13377 return SemaRef.MaybeBindToTemporary(E); 13378 } 13379 13380 // FIXME: We should just pass E->isListInitialization(), but we're not 13381 // prepared to handle list-initialization without a child InitListExpr. 13382 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 13383 return getDerived().RebuildCXXTemporaryObjectExpr( 13384 T, LParenLoc, Args, E->getEndLoc(), 13385 /*ListInitialization=*/LParenLoc.isInvalid()); 13386 } 13387 13388 template<typename Derived> 13389 ExprResult 13390 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 13391 // Transform any init-capture expressions before entering the scope of the 13392 // lambda body, because they are not semantically within that scope. 13393 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 13394 struct TransformedInitCapture { 13395 // The location of the ... if the result is retaining a pack expansion. 13396 SourceLocation EllipsisLoc; 13397 // Zero or more expansions of the init-capture. 13398 SmallVector<InitCaptureInfoTy, 4> Expansions; 13399 }; 13400 SmallVector<TransformedInitCapture, 4> InitCaptures; 13401 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 13402 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13403 CEnd = E->capture_end(); 13404 C != CEnd; ++C) { 13405 if (!E->isInitCapture(C)) 13406 continue; 13407 13408 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 13409 auto *OldVD = cast<VarDecl>(C->getCapturedVar()); 13410 13411 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 13412 std::optional<unsigned> NumExpansions) { 13413 ExprResult NewExprInitResult = getDerived().TransformInitializer( 13414 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 13415 13416 if (NewExprInitResult.isInvalid()) { 13417 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 13418 return; 13419 } 13420 Expr *NewExprInit = NewExprInitResult.get(); 13421 13422 QualType NewInitCaptureType = 13423 getSema().buildLambdaInitCaptureInitialization( 13424 C->getLocation(), C->getCaptureKind() == LCK_ByRef, 13425 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 13426 cast<VarDecl>(C->getCapturedVar())->getInitStyle() != 13427 VarDecl::CInit, 13428 NewExprInit); 13429 Result.Expansions.push_back( 13430 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 13431 }; 13432 13433 // If this is an init-capture pack, consider expanding the pack now. 13434 if (OldVD->isParameterPack()) { 13435 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 13436 ->getTypeLoc() 13437 .castAs<PackExpansionTypeLoc>(); 13438 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13439 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 13440 13441 // Determine whether the set of unexpanded parameter packs can and should 13442 // be expanded. 13443 bool Expand = true; 13444 bool RetainExpansion = false; 13445 std::optional<unsigned> OrigNumExpansions = 13446 ExpansionTL.getTypePtr()->getNumExpansions(); 13447 std::optional<unsigned> NumExpansions = OrigNumExpansions; 13448 if (getDerived().TryExpandParameterPacks( 13449 ExpansionTL.getEllipsisLoc(), 13450 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 13451 RetainExpansion, NumExpansions)) 13452 return ExprError(); 13453 if (Expand) { 13454 for (unsigned I = 0; I != *NumExpansions; ++I) { 13455 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13456 SubstInitCapture(SourceLocation(), std::nullopt); 13457 } 13458 } 13459 if (!Expand || RetainExpansion) { 13460 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13461 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 13462 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 13463 } 13464 } else { 13465 SubstInitCapture(SourceLocation(), std::nullopt); 13466 } 13467 } 13468 13469 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 13470 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 13471 13472 // Create the local class that will describe the lambda. 13473 13474 // FIXME: DependencyKind below is wrong when substituting inside a templated 13475 // context that isn't a DeclContext (such as a variable template), or when 13476 // substituting an unevaluated lambda inside of a function's parameter's type 13477 // - as parameter types are not instantiated from within a function's DC. We 13478 // use evaluation contexts to distinguish the function parameter case. 13479 CXXRecordDecl::LambdaDependencyKind DependencyKind = 13480 CXXRecordDecl::LDK_Unknown; 13481 if ((getSema().isUnevaluatedContext() || 13482 getSema().isConstantEvaluatedContext()) && 13483 (getSema().CurContext->isFileContext() || 13484 !getSema().CurContext->getParent()->isDependentContext())) 13485 DependencyKind = CXXRecordDecl::LDK_NeverDependent; 13486 13487 CXXRecordDecl *OldClass = E->getLambdaClass(); 13488 CXXRecordDecl *Class = getSema().createLambdaClosureType( 13489 E->getIntroducerRange(), /*Info=*/nullptr, DependencyKind, 13490 E->getCaptureDefault()); 13491 getDerived().transformedLocalDecl(OldClass, {Class}); 13492 13493 CXXMethodDecl *NewCallOperator = 13494 getSema().CreateLambdaCallOperator(E->getIntroducerRange(), Class); 13495 NewCallOperator->setLexicalDeclContext(getSema().CurContext); 13496 13497 // Enter the scope of the lambda. 13498 getSema().buildLambdaScope(LSI, NewCallOperator, E->getIntroducerRange(), 13499 E->getCaptureDefault(), E->getCaptureDefaultLoc(), 13500 E->hasExplicitParameters(), E->isMutable()); 13501 13502 // Introduce the context of the call operator. 13503 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 13504 /*NewThisContext*/false); 13505 13506 bool Invalid = false; 13507 13508 // Transform captures. 13509 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13510 CEnd = E->capture_end(); 13511 C != CEnd; ++C) { 13512 // When we hit the first implicit capture, tell Sema that we've finished 13513 // the list of explicit captures. 13514 if (C->isImplicit()) 13515 break; 13516 13517 // Capturing 'this' is trivial. 13518 if (C->capturesThis()) { 13519 // If this is a lambda that is part of a default member initialiser 13520 // and which we're instantiating outside the class that 'this' is 13521 // supposed to refer to, adjust the type of 'this' accordingly. 13522 // 13523 // Otherwise, leave the type of 'this' as-is. 13524 Sema::CXXThisScopeRAII ThisScope( 13525 getSema(), 13526 dyn_cast_if_present<CXXRecordDecl>( 13527 getSema().getFunctionLevelDeclContext()), 13528 Qualifiers()); 13529 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13530 /*BuildAndDiagnose*/ true, nullptr, 13531 C->getCaptureKind() == LCK_StarThis); 13532 continue; 13533 } 13534 // Captured expression will be recaptured during captured variables 13535 // rebuilding. 13536 if (C->capturesVLAType()) 13537 continue; 13538 13539 // Rebuild init-captures, including the implied field declaration. 13540 if (E->isInitCapture(C)) { 13541 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 13542 13543 auto *OldVD = cast<VarDecl>(C->getCapturedVar()); 13544 llvm::SmallVector<Decl*, 4> NewVDs; 13545 13546 for (InitCaptureInfoTy &Info : NewC.Expansions) { 13547 ExprResult Init = Info.first; 13548 QualType InitQualType = Info.second; 13549 if (Init.isInvalid() || InitQualType.isNull()) { 13550 Invalid = true; 13551 break; 13552 } 13553 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 13554 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 13555 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get(), 13556 getSema().CurContext); 13557 if (!NewVD) { 13558 Invalid = true; 13559 break; 13560 } 13561 NewVDs.push_back(NewVD); 13562 getSema().addInitCapture(LSI, NewVD, C->getCaptureKind() == LCK_ByRef); 13563 } 13564 13565 if (Invalid) 13566 break; 13567 13568 getDerived().transformedLocalDecl(OldVD, NewVDs); 13569 continue; 13570 } 13571 13572 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13573 13574 // Determine the capture kind for Sema. 13575 Sema::TryCaptureKind Kind 13576 = C->isImplicit()? Sema::TryCapture_Implicit 13577 : C->getCaptureKind() == LCK_ByCopy 13578 ? Sema::TryCapture_ExplicitByVal 13579 : Sema::TryCapture_ExplicitByRef; 13580 SourceLocation EllipsisLoc; 13581 if (C->isPackExpansion()) { 13582 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 13583 bool ShouldExpand = false; 13584 bool RetainExpansion = false; 13585 std::optional<unsigned> NumExpansions; 13586 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 13587 C->getLocation(), 13588 Unexpanded, 13589 ShouldExpand, RetainExpansion, 13590 NumExpansions)) { 13591 Invalid = true; 13592 continue; 13593 } 13594 13595 if (ShouldExpand) { 13596 // The transform has determined that we should perform an expansion; 13597 // transform and capture each of the arguments. 13598 // expansion of the pattern. Do so. 13599 auto *Pack = cast<VarDecl>(C->getCapturedVar()); 13600 for (unsigned I = 0; I != *NumExpansions; ++I) { 13601 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13602 VarDecl *CapturedVar 13603 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13604 Pack)); 13605 if (!CapturedVar) { 13606 Invalid = true; 13607 continue; 13608 } 13609 13610 // Capture the transformed variable. 13611 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13612 } 13613 13614 // FIXME: Retain a pack expansion if RetainExpansion is true. 13615 13616 continue; 13617 } 13618 13619 EllipsisLoc = C->getEllipsisLoc(); 13620 } 13621 13622 // Transform the captured variable. 13623 auto *CapturedVar = cast_or_null<ValueDecl>( 13624 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13625 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13626 Invalid = true; 13627 continue; 13628 } 13629 13630 // Capture the transformed variable. 13631 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13632 EllipsisLoc); 13633 } 13634 getSema().finishLambdaExplicitCaptures(LSI); 13635 13636 // Transform the template parameters, and add them to the current 13637 // instantiation scope. The null case is handled correctly. 13638 auto TPL = getDerived().TransformTemplateParameterList( 13639 E->getTemplateParameterList()); 13640 LSI->GLTemplateParameterList = TPL; 13641 if (TPL) 13642 getSema().AddTemplateParametersToLambdaCallOperator(NewCallOperator, Class, 13643 TPL); 13644 13645 // Transform the type of the original lambda's call operator. 13646 // The transformation MUST be done in the CurrentInstantiationScope since 13647 // it introduces a mapping of the original to the newly created 13648 // transformed parameters. 13649 TypeSourceInfo *NewCallOpTSI = nullptr; 13650 { 13651 auto OldCallOpTypeLoc = 13652 E->getCallOperator()->getTypeSourceInfo()->getTypeLoc(); 13653 13654 auto TransformFunctionProtoTypeLoc = 13655 [this](TypeLocBuilder &TLB, FunctionProtoTypeLoc FPTL) -> QualType { 13656 SmallVector<QualType, 4> ExceptionStorage; 13657 return this->TransformFunctionProtoType( 13658 TLB, FPTL, nullptr, Qualifiers(), 13659 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 13660 return TransformExceptionSpec(FPTL.getBeginLoc(), ESI, 13661 ExceptionStorage, Changed); 13662 }); 13663 }; 13664 13665 QualType NewCallOpType; 13666 TypeLocBuilder NewCallOpTLBuilder; 13667 13668 if (auto ATL = OldCallOpTypeLoc.getAs<AttributedTypeLoc>()) { 13669 NewCallOpType = this->TransformAttributedType( 13670 NewCallOpTLBuilder, ATL, 13671 [&](TypeLocBuilder &TLB, TypeLoc TL) -> QualType { 13672 return TransformFunctionProtoTypeLoc( 13673 TLB, TL.castAs<FunctionProtoTypeLoc>()); 13674 }); 13675 } else { 13676 auto FPTL = OldCallOpTypeLoc.castAs<FunctionProtoTypeLoc>(); 13677 NewCallOpType = TransformFunctionProtoTypeLoc(NewCallOpTLBuilder, FPTL); 13678 } 13679 13680 if (NewCallOpType.isNull()) 13681 return ExprError(); 13682 NewCallOpTSI = 13683 NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType); 13684 } 13685 13686 ArrayRef<ParmVarDecl *> Params; 13687 if (auto ATL = NewCallOpTSI->getTypeLoc().getAs<AttributedTypeLoc>()) { 13688 Params = ATL.getModifiedLoc().castAs<FunctionProtoTypeLoc>().getParams(); 13689 } else { 13690 auto FPTL = NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>(); 13691 Params = FPTL.getParams(); 13692 } 13693 13694 getSema().CompleteLambdaCallOperator( 13695 NewCallOperator, E->getCallOperator()->getLocation(), 13696 E->getCallOperator()->getInnerLocStart(), 13697 E->getCallOperator()->getTrailingRequiresClause(), NewCallOpTSI, 13698 E->getCallOperator()->getConstexprKind(), 13699 E->getCallOperator()->getStorageClass(), Params, 13700 E->hasExplicitResultType()); 13701 13702 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 13703 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 13704 13705 { 13706 // Number the lambda for linkage purposes if necessary. 13707 Sema::ContextRAII ManglingContext(getSema(), Class->getDeclContext()); 13708 13709 std::optional<CXXRecordDecl::LambdaNumbering> Numbering; 13710 if (getDerived().ReplacingOriginal()) { 13711 Numbering = OldClass->getLambdaNumbering(); 13712 } 13713 13714 getSema().handleLambdaNumbering(Class, NewCallOperator, Numbering); 13715 } 13716 13717 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13718 // evaluation context even if we're not transforming the function body. 13719 getSema().PushExpressionEvaluationContext( 13720 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13721 13722 Sema::CodeSynthesisContext C; 13723 C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution; 13724 C.PointOfInstantiation = E->getBody()->getBeginLoc(); 13725 getSema().pushCodeSynthesisContext(C); 13726 13727 // Instantiate the body of the lambda expression. 13728 StmtResult Body = 13729 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13730 13731 getSema().popCodeSynthesisContext(); 13732 13733 // ActOnLambda* will pop the function scope for us. 13734 FuncScopeCleanup.disable(); 13735 13736 if (Body.isInvalid()) { 13737 SavedContext.pop(); 13738 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13739 /*IsInstantiation=*/true); 13740 return ExprError(); 13741 } 13742 13743 // Copy the LSI before ActOnFinishFunctionBody removes it. 13744 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13745 // the call operator. 13746 auto LSICopy = *LSI; 13747 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13748 /*IsInstantiation*/ true); 13749 SavedContext.pop(); 13750 13751 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13752 &LSICopy); 13753 } 13754 13755 template<typename Derived> 13756 StmtResult 13757 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13758 return TransformStmt(S); 13759 } 13760 13761 template<typename Derived> 13762 StmtResult 13763 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13764 // Transform captures. 13765 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13766 CEnd = E->capture_end(); 13767 C != CEnd; ++C) { 13768 // When we hit the first implicit capture, tell Sema that we've finished 13769 // the list of explicit captures. 13770 if (!C->isImplicit()) 13771 continue; 13772 13773 // Capturing 'this' is trivial. 13774 if (C->capturesThis()) { 13775 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13776 /*BuildAndDiagnose*/ true, nullptr, 13777 C->getCaptureKind() == LCK_StarThis); 13778 continue; 13779 } 13780 // Captured expression will be recaptured during captured variables 13781 // rebuilding. 13782 if (C->capturesVLAType()) 13783 continue; 13784 13785 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13786 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13787 13788 // Transform the captured variable. 13789 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13790 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13791 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13792 return StmtError(); 13793 13794 // Capture the transformed variable. 13795 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13796 } 13797 13798 return S; 13799 } 13800 13801 template<typename Derived> 13802 ExprResult 13803 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13804 CXXUnresolvedConstructExpr *E) { 13805 TypeSourceInfo *T = 13806 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13807 if (!T) 13808 return ExprError(); 13809 13810 bool ArgumentChanged = false; 13811 SmallVector<Expr*, 8> Args; 13812 Args.reserve(E->getNumArgs()); 13813 { 13814 EnterExpressionEvaluationContext Context( 13815 getSema(), EnterExpressionEvaluationContext::InitList, 13816 E->isListInitialization()); 13817 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13818 &ArgumentChanged)) 13819 return ExprError(); 13820 } 13821 13822 if (!getDerived().AlwaysRebuild() && 13823 T == E->getTypeSourceInfo() && 13824 !ArgumentChanged) 13825 return E; 13826 13827 // FIXME: we're faking the locations of the commas 13828 return getDerived().RebuildCXXUnresolvedConstructExpr( 13829 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13830 } 13831 13832 template<typename Derived> 13833 ExprResult 13834 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13835 CXXDependentScopeMemberExpr *E) { 13836 // Transform the base of the expression. 13837 ExprResult Base((Expr*) nullptr); 13838 Expr *OldBase; 13839 QualType BaseType; 13840 QualType ObjectType; 13841 if (!E->isImplicitAccess()) { 13842 OldBase = E->getBase(); 13843 Base = getDerived().TransformExpr(OldBase); 13844 if (Base.isInvalid()) 13845 return ExprError(); 13846 13847 // Start the member reference and compute the object's type. 13848 ParsedType ObjectTy; 13849 bool MayBePseudoDestructor = false; 13850 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13851 E->getOperatorLoc(), 13852 E->isArrow()? tok::arrow : tok::period, 13853 ObjectTy, 13854 MayBePseudoDestructor); 13855 if (Base.isInvalid()) 13856 return ExprError(); 13857 13858 ObjectType = ObjectTy.get(); 13859 BaseType = ((Expr*) Base.get())->getType(); 13860 } else { 13861 OldBase = nullptr; 13862 BaseType = getDerived().TransformType(E->getBaseType()); 13863 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13864 } 13865 13866 // Transform the first part of the nested-name-specifier that qualifies 13867 // the member name. 13868 NamedDecl *FirstQualifierInScope 13869 = getDerived().TransformFirstQualifierInScope( 13870 E->getFirstQualifierFoundInScope(), 13871 E->getQualifierLoc().getBeginLoc()); 13872 13873 NestedNameSpecifierLoc QualifierLoc; 13874 if (E->getQualifier()) { 13875 QualifierLoc 13876 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13877 ObjectType, 13878 FirstQualifierInScope); 13879 if (!QualifierLoc) 13880 return ExprError(); 13881 } 13882 13883 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13884 13885 // TODO: If this is a conversion-function-id, verify that the 13886 // destination type name (if present) resolves the same way after 13887 // instantiation as it did in the local scope. 13888 13889 DeclarationNameInfo NameInfo 13890 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13891 if (!NameInfo.getName()) 13892 return ExprError(); 13893 13894 if (!E->hasExplicitTemplateArgs()) { 13895 // This is a reference to a member without an explicitly-specified 13896 // template argument list. Optimize for this common case. 13897 if (!getDerived().AlwaysRebuild() && 13898 Base.get() == OldBase && 13899 BaseType == E->getBaseType() && 13900 QualifierLoc == E->getQualifierLoc() && 13901 NameInfo.getName() == E->getMember() && 13902 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13903 return E; 13904 13905 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13906 BaseType, 13907 E->isArrow(), 13908 E->getOperatorLoc(), 13909 QualifierLoc, 13910 TemplateKWLoc, 13911 FirstQualifierInScope, 13912 NameInfo, 13913 /*TemplateArgs*/nullptr); 13914 } 13915 13916 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13917 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13918 E->getNumTemplateArgs(), 13919 TransArgs)) 13920 return ExprError(); 13921 13922 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13923 BaseType, 13924 E->isArrow(), 13925 E->getOperatorLoc(), 13926 QualifierLoc, 13927 TemplateKWLoc, 13928 FirstQualifierInScope, 13929 NameInfo, 13930 &TransArgs); 13931 } 13932 13933 template <typename Derived> 13934 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13935 UnresolvedMemberExpr *Old) { 13936 // Transform the base of the expression. 13937 ExprResult Base((Expr *)nullptr); 13938 QualType BaseType; 13939 if (!Old->isImplicitAccess()) { 13940 Base = getDerived().TransformExpr(Old->getBase()); 13941 if (Base.isInvalid()) 13942 return ExprError(); 13943 Base = 13944 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13945 if (Base.isInvalid()) 13946 return ExprError(); 13947 BaseType = Base.get()->getType(); 13948 } else { 13949 BaseType = getDerived().TransformType(Old->getBaseType()); 13950 } 13951 13952 NestedNameSpecifierLoc QualifierLoc; 13953 if (Old->getQualifierLoc()) { 13954 QualifierLoc = 13955 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13956 if (!QualifierLoc) 13957 return ExprError(); 13958 } 13959 13960 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13961 13962 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13963 13964 // Transform the declaration set. 13965 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13966 return ExprError(); 13967 13968 // Determine the naming class. 13969 if (Old->getNamingClass()) { 13970 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13971 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13972 if (!NamingClass) 13973 return ExprError(); 13974 13975 R.setNamingClass(NamingClass); 13976 } 13977 13978 TemplateArgumentListInfo TransArgs; 13979 if (Old->hasExplicitTemplateArgs()) { 13980 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13981 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13982 if (getDerived().TransformTemplateArguments( 13983 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13984 return ExprError(); 13985 } 13986 13987 // FIXME: to do this check properly, we will need to preserve the 13988 // first-qualifier-in-scope here, just in case we had a dependent 13989 // base (and therefore couldn't do the check) and a 13990 // nested-name-qualifier (and therefore could do the lookup). 13991 NamedDecl *FirstQualifierInScope = nullptr; 13992 13993 return getDerived().RebuildUnresolvedMemberExpr( 13994 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13995 TemplateKWLoc, FirstQualifierInScope, R, 13996 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13997 } 13998 13999 template<typename Derived> 14000 ExprResult 14001 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 14002 EnterExpressionEvaluationContext Unevaluated( 14003 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 14004 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 14005 if (SubExpr.isInvalid()) 14006 return ExprError(); 14007 14008 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 14009 return E; 14010 14011 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 14012 } 14013 14014 template<typename Derived> 14015 ExprResult 14016 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 14017 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 14018 if (Pattern.isInvalid()) 14019 return ExprError(); 14020 14021 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 14022 return E; 14023 14024 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 14025 E->getNumExpansions()); 14026 } 14027 14028 template<typename Derived> 14029 ExprResult 14030 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 14031 // If E is not value-dependent, then nothing will change when we transform it. 14032 // Note: This is an instantiation-centric view. 14033 if (!E->isValueDependent()) 14034 return E; 14035 14036 EnterExpressionEvaluationContext Unevaluated( 14037 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 14038 14039 ArrayRef<TemplateArgument> PackArgs; 14040 TemplateArgument ArgStorage; 14041 14042 // Find the argument list to transform. 14043 if (E->isPartiallySubstituted()) { 14044 PackArgs = E->getPartialArguments(); 14045 } else if (E->isValueDependent()) { 14046 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 14047 bool ShouldExpand = false; 14048 bool RetainExpansion = false; 14049 std::optional<unsigned> NumExpansions; 14050 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 14051 Unexpanded, 14052 ShouldExpand, RetainExpansion, 14053 NumExpansions)) 14054 return ExprError(); 14055 14056 // If we need to expand the pack, build a template argument from it and 14057 // expand that. 14058 if (ShouldExpand) { 14059 auto *Pack = E->getPack(); 14060 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 14061 ArgStorage = getSema().Context.getPackExpansionType( 14062 getSema().Context.getTypeDeclType(TTPD), std::nullopt); 14063 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 14064 ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt); 14065 } else { 14066 auto *VD = cast<ValueDecl>(Pack); 14067 ExprResult DRE = getSema().BuildDeclRefExpr( 14068 VD, VD->getType().getNonLValueExprType(getSema().Context), 14069 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 14070 E->getPackLoc()); 14071 if (DRE.isInvalid()) 14072 return ExprError(); 14073 ArgStorage = new (getSema().Context) 14074 PackExpansionExpr(getSema().Context.DependentTy, DRE.get(), 14075 E->getPackLoc(), std::nullopt); 14076 } 14077 PackArgs = ArgStorage; 14078 } 14079 } 14080 14081 // If we're not expanding the pack, just transform the decl. 14082 if (!PackArgs.size()) { 14083 auto *Pack = cast_or_null<NamedDecl>( 14084 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 14085 if (!Pack) 14086 return ExprError(); 14087 return getDerived().RebuildSizeOfPackExpr( 14088 E->getOperatorLoc(), Pack, E->getPackLoc(), E->getRParenLoc(), 14089 std::nullopt, std::nullopt); 14090 } 14091 14092 // Try to compute the result without performing a partial substitution. 14093 std::optional<unsigned> Result = 0; 14094 for (const TemplateArgument &Arg : PackArgs) { 14095 if (!Arg.isPackExpansion()) { 14096 Result = *Result + 1; 14097 continue; 14098 } 14099 14100 TemplateArgumentLoc ArgLoc; 14101 InventTemplateArgumentLoc(Arg, ArgLoc); 14102 14103 // Find the pattern of the pack expansion. 14104 SourceLocation Ellipsis; 14105 std::optional<unsigned> OrigNumExpansions; 14106 TemplateArgumentLoc Pattern = 14107 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 14108 OrigNumExpansions); 14109 14110 // Substitute under the pack expansion. Do not expand the pack (yet). 14111 TemplateArgumentLoc OutPattern; 14112 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 14113 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 14114 /*Uneval*/ true)) 14115 return true; 14116 14117 // See if we can determine the number of arguments from the result. 14118 std::optional<unsigned> NumExpansions = 14119 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 14120 if (!NumExpansions) { 14121 // No: we must be in an alias template expansion, and we're going to need 14122 // to actually expand the packs. 14123 Result = std::nullopt; 14124 break; 14125 } 14126 14127 Result = *Result + *NumExpansions; 14128 } 14129 14130 // Common case: we could determine the number of expansions without 14131 // substituting. 14132 if (Result) 14133 return getDerived().RebuildSizeOfPackExpr( 14134 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(), 14135 *Result, std::nullopt); 14136 14137 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 14138 E->getPackLoc()); 14139 { 14140 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 14141 typedef TemplateArgumentLocInventIterator< 14142 Derived, const TemplateArgument*> PackLocIterator; 14143 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 14144 PackLocIterator(*this, PackArgs.end()), 14145 TransformedPackArgs, /*Uneval*/true)) 14146 return ExprError(); 14147 } 14148 14149 // Check whether we managed to fully-expand the pack. 14150 // FIXME: Is it possible for us to do so and not hit the early exit path? 14151 SmallVector<TemplateArgument, 8> Args; 14152 bool PartialSubstitution = false; 14153 for (auto &Loc : TransformedPackArgs.arguments()) { 14154 Args.push_back(Loc.getArgument()); 14155 if (Loc.getArgument().isPackExpansion()) 14156 PartialSubstitution = true; 14157 } 14158 14159 if (PartialSubstitution) 14160 return getDerived().RebuildSizeOfPackExpr( 14161 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(), 14162 std::nullopt, Args); 14163 14164 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 14165 E->getPackLoc(), E->getRParenLoc(), 14166 Args.size(), std::nullopt); 14167 } 14168 14169 template<typename Derived> 14170 ExprResult 14171 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 14172 SubstNonTypeTemplateParmPackExpr *E) { 14173 // Default behavior is to do nothing with this transformation. 14174 return E; 14175 } 14176 14177 template<typename Derived> 14178 ExprResult 14179 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 14180 SubstNonTypeTemplateParmExpr *E) { 14181 // Default behavior is to do nothing with this transformation. 14182 return E; 14183 } 14184 14185 template<typename Derived> 14186 ExprResult 14187 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 14188 // Default behavior is to do nothing with this transformation. 14189 return E; 14190 } 14191 14192 template<typename Derived> 14193 ExprResult 14194 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 14195 MaterializeTemporaryExpr *E) { 14196 return getDerived().TransformExpr(E->getSubExpr()); 14197 } 14198 14199 template<typename Derived> 14200 ExprResult 14201 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 14202 UnresolvedLookupExpr *Callee = nullptr; 14203 if (Expr *OldCallee = E->getCallee()) { 14204 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 14205 if (CalleeResult.isInvalid()) 14206 return ExprError(); 14207 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 14208 } 14209 14210 Expr *Pattern = E->getPattern(); 14211 14212 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 14213 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 14214 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 14215 14216 // Determine whether the set of unexpanded parameter packs can and should 14217 // be expanded. 14218 bool Expand = true; 14219 bool RetainExpansion = false; 14220 std::optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 14221 NumExpansions = OrigNumExpansions; 14222 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 14223 Pattern->getSourceRange(), 14224 Unexpanded, 14225 Expand, RetainExpansion, 14226 NumExpansions)) 14227 return true; 14228 14229 if (!Expand) { 14230 // Do not expand any packs here, just transform and rebuild a fold 14231 // expression. 14232 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 14233 14234 ExprResult LHS = 14235 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 14236 if (LHS.isInvalid()) 14237 return true; 14238 14239 ExprResult RHS = 14240 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 14241 if (RHS.isInvalid()) 14242 return true; 14243 14244 if (!getDerived().AlwaysRebuild() && 14245 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 14246 return E; 14247 14248 return getDerived().RebuildCXXFoldExpr( 14249 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 14250 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 14251 } 14252 14253 // Formally a fold expression expands to nested parenthesized expressions. 14254 // Enforce this limit to avoid creating trees so deep we can't safely traverse 14255 // them. 14256 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 14257 SemaRef.Diag(E->getEllipsisLoc(), 14258 clang::diag::err_fold_expression_limit_exceeded) 14259 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 14260 << E->getSourceRange(); 14261 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 14262 return ExprError(); 14263 } 14264 14265 // The transform has determined that we should perform an elementwise 14266 // expansion of the pattern. Do so. 14267 ExprResult Result = getDerived().TransformExpr(E->getInit()); 14268 if (Result.isInvalid()) 14269 return true; 14270 bool LeftFold = E->isLeftFold(); 14271 14272 // If we're retaining an expansion for a right fold, it is the innermost 14273 // component and takes the init (if any). 14274 if (!LeftFold && RetainExpansion) { 14275 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 14276 14277 ExprResult Out = getDerived().TransformExpr(Pattern); 14278 if (Out.isInvalid()) 14279 return true; 14280 14281 Result = getDerived().RebuildCXXFoldExpr( 14282 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 14283 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 14284 if (Result.isInvalid()) 14285 return true; 14286 } 14287 14288 for (unsigned I = 0; I != *NumExpansions; ++I) { 14289 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 14290 getSema(), LeftFold ? I : *NumExpansions - I - 1); 14291 ExprResult Out = getDerived().TransformExpr(Pattern); 14292 if (Out.isInvalid()) 14293 return true; 14294 14295 if (Out.get()->containsUnexpandedParameterPack()) { 14296 // We still have a pack; retain a pack expansion for this slice. 14297 Result = getDerived().RebuildCXXFoldExpr( 14298 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 14299 E->getOperator(), E->getEllipsisLoc(), 14300 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 14301 OrigNumExpansions); 14302 } else if (Result.isUsable()) { 14303 // We've got down to a single element; build a binary operator. 14304 Expr *LHS = LeftFold ? Result.get() : Out.get(); 14305 Expr *RHS = LeftFold ? Out.get() : Result.get(); 14306 if (Callee) { 14307 UnresolvedSet<16> Functions; 14308 Functions.append(Callee->decls_begin(), Callee->decls_end()); 14309 Result = getDerived().RebuildCXXOperatorCallExpr( 14310 BinaryOperator::getOverloadedOperator(E->getOperator()), 14311 E->getEllipsisLoc(), Callee->getBeginLoc(), Callee->requiresADL(), 14312 Functions, LHS, RHS); 14313 } else { 14314 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 14315 E->getOperator(), LHS, RHS); 14316 } 14317 } else 14318 Result = Out; 14319 14320 if (Result.isInvalid()) 14321 return true; 14322 } 14323 14324 // If we're retaining an expansion for a left fold, it is the outermost 14325 // component and takes the complete expansion so far as its init (if any). 14326 if (LeftFold && RetainExpansion) { 14327 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 14328 14329 ExprResult Out = getDerived().TransformExpr(Pattern); 14330 if (Out.isInvalid()) 14331 return true; 14332 14333 Result = getDerived().RebuildCXXFoldExpr( 14334 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 14335 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 14336 if (Result.isInvalid()) 14337 return true; 14338 } 14339 14340 // If we had no init and an empty pack, and we're not retaining an expansion, 14341 // then produce a fallback value or error. 14342 if (Result.isUnset()) 14343 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 14344 E->getOperator()); 14345 14346 return Result; 14347 } 14348 14349 template <typename Derived> 14350 ExprResult 14351 TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *E) { 14352 SmallVector<Expr *, 4> TransformedInits; 14353 ArrayRef<Expr *> InitExprs = E->getInitExprs(); 14354 if (TransformExprs(InitExprs.data(), InitExprs.size(), true, 14355 TransformedInits)) 14356 return ExprError(); 14357 14358 return getDerived().RebuildParenListExpr(E->getBeginLoc(), TransformedInits, 14359 E->getEndLoc()); 14360 } 14361 14362 template<typename Derived> 14363 ExprResult 14364 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 14365 CXXStdInitializerListExpr *E) { 14366 return getDerived().TransformExpr(E->getSubExpr()); 14367 } 14368 14369 template<typename Derived> 14370 ExprResult 14371 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 14372 return SemaRef.MaybeBindToTemporary(E); 14373 } 14374 14375 template<typename Derived> 14376 ExprResult 14377 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 14378 return E; 14379 } 14380 14381 template<typename Derived> 14382 ExprResult 14383 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 14384 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 14385 if (SubExpr.isInvalid()) 14386 return ExprError(); 14387 14388 if (!getDerived().AlwaysRebuild() && 14389 SubExpr.get() == E->getSubExpr()) 14390 return E; 14391 14392 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 14393 } 14394 14395 template<typename Derived> 14396 ExprResult 14397 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 14398 // Transform each of the elements. 14399 SmallVector<Expr *, 8> Elements; 14400 bool ArgChanged = false; 14401 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 14402 /*IsCall=*/false, Elements, &ArgChanged)) 14403 return ExprError(); 14404 14405 if (!getDerived().AlwaysRebuild() && !ArgChanged) 14406 return SemaRef.MaybeBindToTemporary(E); 14407 14408 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 14409 Elements.data(), 14410 Elements.size()); 14411 } 14412 14413 template<typename Derived> 14414 ExprResult 14415 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 14416 ObjCDictionaryLiteral *E) { 14417 // Transform each of the elements. 14418 SmallVector<ObjCDictionaryElement, 8> Elements; 14419 bool ArgChanged = false; 14420 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 14421 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 14422 14423 if (OrigElement.isPackExpansion()) { 14424 // This key/value element is a pack expansion. 14425 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 14426 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 14427 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 14428 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 14429 14430 // Determine whether the set of unexpanded parameter packs can 14431 // and should be expanded. 14432 bool Expand = true; 14433 bool RetainExpansion = false; 14434 std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 14435 std::optional<unsigned> NumExpansions = OrigNumExpansions; 14436 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 14437 OrigElement.Value->getEndLoc()); 14438 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 14439 PatternRange, Unexpanded, Expand, 14440 RetainExpansion, NumExpansions)) 14441 return ExprError(); 14442 14443 if (!Expand) { 14444 // The transform has determined that we should perform a simple 14445 // transformation on the pack expansion, producing another pack 14446 // expansion. 14447 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 14448 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14449 if (Key.isInvalid()) 14450 return ExprError(); 14451 14452 if (Key.get() != OrigElement.Key) 14453 ArgChanged = true; 14454 14455 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 14456 if (Value.isInvalid()) 14457 return ExprError(); 14458 14459 if (Value.get() != OrigElement.Value) 14460 ArgChanged = true; 14461 14462 ObjCDictionaryElement Expansion = { 14463 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 14464 }; 14465 Elements.push_back(Expansion); 14466 continue; 14467 } 14468 14469 // Record right away that the argument was changed. This needs 14470 // to happen even if the array expands to nothing. 14471 ArgChanged = true; 14472 14473 // The transform has determined that we should perform an elementwise 14474 // expansion of the pattern. Do so. 14475 for (unsigned I = 0; I != *NumExpansions; ++I) { 14476 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 14477 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14478 if (Key.isInvalid()) 14479 return ExprError(); 14480 14481 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 14482 if (Value.isInvalid()) 14483 return ExprError(); 14484 14485 ObjCDictionaryElement Element = { 14486 Key.get(), Value.get(), SourceLocation(), NumExpansions 14487 }; 14488 14489 // If any unexpanded parameter packs remain, we still have a 14490 // pack expansion. 14491 // FIXME: Can this really happen? 14492 if (Key.get()->containsUnexpandedParameterPack() || 14493 Value.get()->containsUnexpandedParameterPack()) 14494 Element.EllipsisLoc = OrigElement.EllipsisLoc; 14495 14496 Elements.push_back(Element); 14497 } 14498 14499 // FIXME: Retain a pack expansion if RetainExpansion is true. 14500 14501 // We've finished with this pack expansion. 14502 continue; 14503 } 14504 14505 // Transform and check key. 14506 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14507 if (Key.isInvalid()) 14508 return ExprError(); 14509 14510 if (Key.get() != OrigElement.Key) 14511 ArgChanged = true; 14512 14513 // Transform and check value. 14514 ExprResult Value 14515 = getDerived().TransformExpr(OrigElement.Value); 14516 if (Value.isInvalid()) 14517 return ExprError(); 14518 14519 if (Value.get() != OrigElement.Value) 14520 ArgChanged = true; 14521 14522 ObjCDictionaryElement Element = {Key.get(), Value.get(), SourceLocation(), 14523 std::nullopt}; 14524 Elements.push_back(Element); 14525 } 14526 14527 if (!getDerived().AlwaysRebuild() && !ArgChanged) 14528 return SemaRef.MaybeBindToTemporary(E); 14529 14530 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 14531 Elements); 14532 } 14533 14534 template<typename Derived> 14535 ExprResult 14536 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 14537 TypeSourceInfo *EncodedTypeInfo 14538 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 14539 if (!EncodedTypeInfo) 14540 return ExprError(); 14541 14542 if (!getDerived().AlwaysRebuild() && 14543 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 14544 return E; 14545 14546 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 14547 EncodedTypeInfo, 14548 E->getRParenLoc()); 14549 } 14550 14551 template<typename Derived> 14552 ExprResult TreeTransform<Derived>:: 14553 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 14554 // This is a kind of implicit conversion, and it needs to get dropped 14555 // and recomputed for the same general reasons that ImplicitCastExprs 14556 // do, as well a more specific one: this expression is only valid when 14557 // it appears *immediately* as an argument expression. 14558 return getDerived().TransformExpr(E->getSubExpr()); 14559 } 14560 14561 template<typename Derived> 14562 ExprResult TreeTransform<Derived>:: 14563 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 14564 TypeSourceInfo *TSInfo 14565 = getDerived().TransformType(E->getTypeInfoAsWritten()); 14566 if (!TSInfo) 14567 return ExprError(); 14568 14569 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 14570 if (Result.isInvalid()) 14571 return ExprError(); 14572 14573 if (!getDerived().AlwaysRebuild() && 14574 TSInfo == E->getTypeInfoAsWritten() && 14575 Result.get() == E->getSubExpr()) 14576 return E; 14577 14578 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 14579 E->getBridgeKeywordLoc(), TSInfo, 14580 Result.get()); 14581 } 14582 14583 template <typename Derived> 14584 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 14585 ObjCAvailabilityCheckExpr *E) { 14586 return E; 14587 } 14588 14589 template<typename Derived> 14590 ExprResult 14591 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 14592 // Transform arguments. 14593 bool ArgChanged = false; 14594 SmallVector<Expr*, 8> Args; 14595 Args.reserve(E->getNumArgs()); 14596 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 14597 &ArgChanged)) 14598 return ExprError(); 14599 14600 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 14601 // Class message: transform the receiver type. 14602 TypeSourceInfo *ReceiverTypeInfo 14603 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 14604 if (!ReceiverTypeInfo) 14605 return ExprError(); 14606 14607 // If nothing changed, just retain the existing message send. 14608 if (!getDerived().AlwaysRebuild() && 14609 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 14610 return SemaRef.MaybeBindToTemporary(E); 14611 14612 // Build a new class message send. 14613 SmallVector<SourceLocation, 16> SelLocs; 14614 E->getSelectorLocs(SelLocs); 14615 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 14616 E->getSelector(), 14617 SelLocs, 14618 E->getMethodDecl(), 14619 E->getLeftLoc(), 14620 Args, 14621 E->getRightLoc()); 14622 } 14623 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 14624 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 14625 if (!E->getMethodDecl()) 14626 return ExprError(); 14627 14628 // Build a new class message send to 'super'. 14629 SmallVector<SourceLocation, 16> SelLocs; 14630 E->getSelectorLocs(SelLocs); 14631 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 14632 E->getSelector(), 14633 SelLocs, 14634 E->getReceiverType(), 14635 E->getMethodDecl(), 14636 E->getLeftLoc(), 14637 Args, 14638 E->getRightLoc()); 14639 } 14640 14641 // Instance message: transform the receiver 14642 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 14643 "Only class and instance messages may be instantiated"); 14644 ExprResult Receiver 14645 = getDerived().TransformExpr(E->getInstanceReceiver()); 14646 if (Receiver.isInvalid()) 14647 return ExprError(); 14648 14649 // If nothing changed, just retain the existing message send. 14650 if (!getDerived().AlwaysRebuild() && 14651 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 14652 return SemaRef.MaybeBindToTemporary(E); 14653 14654 // Build a new instance message send. 14655 SmallVector<SourceLocation, 16> SelLocs; 14656 E->getSelectorLocs(SelLocs); 14657 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 14658 E->getSelector(), 14659 SelLocs, 14660 E->getMethodDecl(), 14661 E->getLeftLoc(), 14662 Args, 14663 E->getRightLoc()); 14664 } 14665 14666 template<typename Derived> 14667 ExprResult 14668 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 14669 return E; 14670 } 14671 14672 template<typename Derived> 14673 ExprResult 14674 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 14675 return E; 14676 } 14677 14678 template<typename Derived> 14679 ExprResult 14680 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 14681 // Transform the base expression. 14682 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14683 if (Base.isInvalid()) 14684 return ExprError(); 14685 14686 // We don't need to transform the ivar; it will never change. 14687 14688 // If nothing changed, just retain the existing expression. 14689 if (!getDerived().AlwaysRebuild() && 14690 Base.get() == E->getBase()) 14691 return E; 14692 14693 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14694 E->getLocation(), 14695 E->isArrow(), E->isFreeIvar()); 14696 } 14697 14698 template<typename Derived> 14699 ExprResult 14700 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14701 // 'super' and types never change. Property never changes. Just 14702 // retain the existing expression. 14703 if (!E->isObjectReceiver()) 14704 return E; 14705 14706 // Transform the base expression. 14707 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14708 if (Base.isInvalid()) 14709 return ExprError(); 14710 14711 // We don't need to transform the property; it will never change. 14712 14713 // If nothing changed, just retain the existing expression. 14714 if (!getDerived().AlwaysRebuild() && 14715 Base.get() == E->getBase()) 14716 return E; 14717 14718 if (E->isExplicitProperty()) 14719 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14720 E->getExplicitProperty(), 14721 E->getLocation()); 14722 14723 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14724 SemaRef.Context.PseudoObjectTy, 14725 E->getImplicitPropertyGetter(), 14726 E->getImplicitPropertySetter(), 14727 E->getLocation()); 14728 } 14729 14730 template<typename Derived> 14731 ExprResult 14732 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14733 // Transform the base expression. 14734 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14735 if (Base.isInvalid()) 14736 return ExprError(); 14737 14738 // Transform the key expression. 14739 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14740 if (Key.isInvalid()) 14741 return ExprError(); 14742 14743 // If nothing changed, just retain the existing expression. 14744 if (!getDerived().AlwaysRebuild() && 14745 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14746 return E; 14747 14748 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14749 Base.get(), Key.get(), 14750 E->getAtIndexMethodDecl(), 14751 E->setAtIndexMethodDecl()); 14752 } 14753 14754 template<typename Derived> 14755 ExprResult 14756 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14757 // Transform the base expression. 14758 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14759 if (Base.isInvalid()) 14760 return ExprError(); 14761 14762 // If nothing changed, just retain the existing expression. 14763 if (!getDerived().AlwaysRebuild() && 14764 Base.get() == E->getBase()) 14765 return E; 14766 14767 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14768 E->getOpLoc(), 14769 E->isArrow()); 14770 } 14771 14772 template<typename Derived> 14773 ExprResult 14774 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14775 bool ArgumentChanged = false; 14776 SmallVector<Expr*, 8> SubExprs; 14777 SubExprs.reserve(E->getNumSubExprs()); 14778 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14779 SubExprs, &ArgumentChanged)) 14780 return ExprError(); 14781 14782 if (!getDerived().AlwaysRebuild() && 14783 !ArgumentChanged) 14784 return E; 14785 14786 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14787 SubExprs, 14788 E->getRParenLoc()); 14789 } 14790 14791 template<typename Derived> 14792 ExprResult 14793 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14794 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14795 if (SrcExpr.isInvalid()) 14796 return ExprError(); 14797 14798 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14799 if (!Type) 14800 return ExprError(); 14801 14802 if (!getDerived().AlwaysRebuild() && 14803 Type == E->getTypeSourceInfo() && 14804 SrcExpr.get() == E->getSrcExpr()) 14805 return E; 14806 14807 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14808 SrcExpr.get(), Type, 14809 E->getRParenLoc()); 14810 } 14811 14812 template<typename Derived> 14813 ExprResult 14814 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14815 BlockDecl *oldBlock = E->getBlockDecl(); 14816 14817 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14818 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14819 14820 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14821 blockScope->TheDecl->setBlockMissingReturnType( 14822 oldBlock->blockMissingReturnType()); 14823 14824 SmallVector<ParmVarDecl*, 4> params; 14825 SmallVector<QualType, 4> paramTypes; 14826 14827 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14828 14829 // Parameter substitution. 14830 Sema::ExtParameterInfoBuilder extParamInfos; 14831 if (getDerived().TransformFunctionTypeParams( 14832 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14833 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14834 extParamInfos)) { 14835 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14836 return ExprError(); 14837 } 14838 14839 QualType exprResultType = 14840 getDerived().TransformType(exprFunctionType->getReturnType()); 14841 14842 auto epi = exprFunctionType->getExtProtoInfo(); 14843 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14844 14845 QualType functionType = 14846 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14847 blockScope->FunctionType = functionType; 14848 14849 // Set the parameters on the block decl. 14850 if (!params.empty()) 14851 blockScope->TheDecl->setParams(params); 14852 14853 if (!oldBlock->blockMissingReturnType()) { 14854 blockScope->HasImplicitReturnType = false; 14855 blockScope->ReturnType = exprResultType; 14856 } 14857 14858 // Transform the body 14859 StmtResult body = getDerived().TransformStmt(E->getBody()); 14860 if (body.isInvalid()) { 14861 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14862 return ExprError(); 14863 } 14864 14865 #ifndef NDEBUG 14866 // In builds with assertions, make sure that we captured everything we 14867 // captured before. 14868 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14869 for (const auto &I : oldBlock->captures()) { 14870 VarDecl *oldCapture = I.getVariable(); 14871 14872 // Ignore parameter packs. 14873 if (oldCapture->isParameterPack()) 14874 continue; 14875 14876 VarDecl *newCapture = 14877 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14878 oldCapture)); 14879 assert(blockScope->CaptureMap.count(newCapture)); 14880 } 14881 14882 // The this pointer may not be captured by the instantiated block, even when 14883 // it's captured by the original block, if the expression causing the 14884 // capture is in the discarded branch of a constexpr if statement. 14885 assert((!blockScope->isCXXThisCaptured() || oldBlock->capturesCXXThis()) && 14886 "this pointer isn't captured in the old block"); 14887 } 14888 #endif 14889 14890 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14891 /*Scope=*/nullptr); 14892 } 14893 14894 template<typename Derived> 14895 ExprResult 14896 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14897 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14898 if (SrcExpr.isInvalid()) 14899 return ExprError(); 14900 14901 QualType Type = getDerived().TransformType(E->getType()); 14902 14903 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14904 E->getRParenLoc()); 14905 } 14906 14907 template<typename Derived> 14908 ExprResult 14909 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14910 bool ArgumentChanged = false; 14911 SmallVector<Expr*, 8> SubExprs; 14912 SubExprs.reserve(E->getNumSubExprs()); 14913 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14914 SubExprs, &ArgumentChanged)) 14915 return ExprError(); 14916 14917 if (!getDerived().AlwaysRebuild() && 14918 !ArgumentChanged) 14919 return E; 14920 14921 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14922 E->getOp(), E->getRParenLoc()); 14923 } 14924 14925 //===----------------------------------------------------------------------===// 14926 // Type reconstruction 14927 //===----------------------------------------------------------------------===// 14928 14929 template<typename Derived> 14930 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14931 SourceLocation Star) { 14932 return SemaRef.BuildPointerType(PointeeType, Star, 14933 getDerived().getBaseEntity()); 14934 } 14935 14936 template<typename Derived> 14937 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14938 SourceLocation Star) { 14939 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14940 getDerived().getBaseEntity()); 14941 } 14942 14943 template<typename Derived> 14944 QualType 14945 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14946 bool WrittenAsLValue, 14947 SourceLocation Sigil) { 14948 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14949 Sigil, getDerived().getBaseEntity()); 14950 } 14951 14952 template<typename Derived> 14953 QualType 14954 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14955 QualType ClassType, 14956 SourceLocation Sigil) { 14957 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14958 getDerived().getBaseEntity()); 14959 } 14960 14961 template<typename Derived> 14962 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14963 const ObjCTypeParamDecl *Decl, 14964 SourceLocation ProtocolLAngleLoc, 14965 ArrayRef<ObjCProtocolDecl *> Protocols, 14966 ArrayRef<SourceLocation> ProtocolLocs, 14967 SourceLocation ProtocolRAngleLoc) { 14968 return SemaRef.BuildObjCTypeParamType(Decl, 14969 ProtocolLAngleLoc, Protocols, 14970 ProtocolLocs, ProtocolRAngleLoc, 14971 /*FailOnError=*/true); 14972 } 14973 14974 template<typename Derived> 14975 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14976 QualType BaseType, 14977 SourceLocation Loc, 14978 SourceLocation TypeArgsLAngleLoc, 14979 ArrayRef<TypeSourceInfo *> TypeArgs, 14980 SourceLocation TypeArgsRAngleLoc, 14981 SourceLocation ProtocolLAngleLoc, 14982 ArrayRef<ObjCProtocolDecl *> Protocols, 14983 ArrayRef<SourceLocation> ProtocolLocs, 14984 SourceLocation ProtocolRAngleLoc) { 14985 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, TypeArgs, 14986 TypeArgsRAngleLoc, ProtocolLAngleLoc, 14987 Protocols, ProtocolLocs, ProtocolRAngleLoc, 14988 /*FailOnError=*/true, 14989 /*Rebuilding=*/true); 14990 } 14991 14992 template<typename Derived> 14993 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14994 QualType PointeeType, 14995 SourceLocation Star) { 14996 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14997 } 14998 14999 template <typename Derived> 15000 QualType TreeTransform<Derived>::RebuildArrayType( 15001 QualType ElementType, ArraySizeModifier SizeMod, const llvm::APInt *Size, 15002 Expr *SizeExpr, unsigned IndexTypeQuals, SourceRange BracketsRange) { 15003 if (SizeExpr || !Size) 15004 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 15005 IndexTypeQuals, BracketsRange, 15006 getDerived().getBaseEntity()); 15007 15008 QualType Types[] = { 15009 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 15010 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 15011 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 15012 }; 15013 QualType SizeType; 15014 for (const auto &T : Types) 15015 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(T)) { 15016 SizeType = T; 15017 break; 15018 } 15019 15020 // Note that we can return a VariableArrayType here in the case where 15021 // the element type was a dependent VariableArrayType. 15022 IntegerLiteral *ArraySize 15023 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 15024 /*FIXME*/BracketsRange.getBegin()); 15025 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 15026 IndexTypeQuals, BracketsRange, 15027 getDerived().getBaseEntity()); 15028 } 15029 15030 template <typename Derived> 15031 QualType TreeTransform<Derived>::RebuildConstantArrayType( 15032 QualType ElementType, ArraySizeModifier SizeMod, const llvm::APInt &Size, 15033 Expr *SizeExpr, unsigned IndexTypeQuals, SourceRange BracketsRange) { 15034 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 15035 IndexTypeQuals, BracketsRange); 15036 } 15037 15038 template <typename Derived> 15039 QualType TreeTransform<Derived>::RebuildIncompleteArrayType( 15040 QualType ElementType, ArraySizeModifier SizeMod, unsigned IndexTypeQuals, 15041 SourceRange BracketsRange) { 15042 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 15043 IndexTypeQuals, BracketsRange); 15044 } 15045 15046 template <typename Derived> 15047 QualType TreeTransform<Derived>::RebuildVariableArrayType( 15048 QualType ElementType, ArraySizeModifier SizeMod, Expr *SizeExpr, 15049 unsigned IndexTypeQuals, SourceRange BracketsRange) { 15050 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 15051 SizeExpr, 15052 IndexTypeQuals, BracketsRange); 15053 } 15054 15055 template <typename Derived> 15056 QualType TreeTransform<Derived>::RebuildDependentSizedArrayType( 15057 QualType ElementType, ArraySizeModifier SizeMod, Expr *SizeExpr, 15058 unsigned IndexTypeQuals, SourceRange BracketsRange) { 15059 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 15060 SizeExpr, 15061 IndexTypeQuals, BracketsRange); 15062 } 15063 15064 template <typename Derived> 15065 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 15066 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 15067 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 15068 AttributeLoc); 15069 } 15070 15071 template <typename Derived> 15072 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 15073 unsigned NumElements, 15074 VectorKind VecKind) { 15075 // FIXME: semantic checking! 15076 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 15077 } 15078 15079 template <typename Derived> 15080 QualType TreeTransform<Derived>::RebuildDependentVectorType( 15081 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 15082 VectorKind VecKind) { 15083 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 15084 } 15085 15086 template<typename Derived> 15087 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 15088 unsigned NumElements, 15089 SourceLocation AttributeLoc) { 15090 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 15091 NumElements, true); 15092 IntegerLiteral *VectorSize 15093 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 15094 AttributeLoc); 15095 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 15096 } 15097 15098 template<typename Derived> 15099 QualType 15100 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 15101 Expr *SizeExpr, 15102 SourceLocation AttributeLoc) { 15103 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 15104 } 15105 15106 template <typename Derived> 15107 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 15108 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 15109 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 15110 NumColumns); 15111 } 15112 15113 template <typename Derived> 15114 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 15115 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 15116 SourceLocation AttributeLoc) { 15117 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 15118 AttributeLoc); 15119 } 15120 15121 template<typename Derived> 15122 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 15123 QualType T, 15124 MutableArrayRef<QualType> ParamTypes, 15125 const FunctionProtoType::ExtProtoInfo &EPI) { 15126 return SemaRef.BuildFunctionType(T, ParamTypes, 15127 getDerived().getBaseLocation(), 15128 getDerived().getBaseEntity(), 15129 EPI); 15130 } 15131 15132 template<typename Derived> 15133 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 15134 return SemaRef.Context.getFunctionNoProtoType(T); 15135 } 15136 15137 template<typename Derived> 15138 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 15139 Decl *D) { 15140 assert(D && "no decl found"); 15141 if (D->isInvalidDecl()) return QualType(); 15142 15143 // FIXME: Doesn't account for ObjCInterfaceDecl! 15144 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 15145 // A valid resolved using typename pack expansion decl can have multiple 15146 // UsingDecls, but they must each have exactly one type, and it must be 15147 // the same type in every case. But we must have at least one expansion! 15148 if (UPD->expansions().empty()) { 15149 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 15150 << UPD->isCXXClassMember() << UPD; 15151 return QualType(); 15152 } 15153 15154 // We might still have some unresolved types. Try to pick a resolved type 15155 // if we can. The final instantiation will check that the remaining 15156 // unresolved types instantiate to the type we pick. 15157 QualType FallbackT; 15158 QualType T; 15159 for (auto *E : UPD->expansions()) { 15160 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 15161 if (ThisT.isNull()) 15162 continue; 15163 else if (ThisT->getAs<UnresolvedUsingType>()) 15164 FallbackT = ThisT; 15165 else if (T.isNull()) 15166 T = ThisT; 15167 else 15168 assert(getSema().Context.hasSameType(ThisT, T) && 15169 "mismatched resolved types in using pack expansion"); 15170 } 15171 return T.isNull() ? FallbackT : T; 15172 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 15173 assert(Using->hasTypename() && 15174 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 15175 15176 // A valid resolved using typename decl points to exactly one type decl. 15177 assert(++Using->shadow_begin() == Using->shadow_end()); 15178 15179 UsingShadowDecl *Shadow = *Using->shadow_begin(); 15180 if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc)) 15181 return QualType(); 15182 return SemaRef.Context.getUsingType( 15183 Shadow, SemaRef.Context.getTypeDeclType( 15184 cast<TypeDecl>(Shadow->getTargetDecl()))); 15185 } else { 15186 assert(isa<UnresolvedUsingTypenameDecl>(D) && 15187 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 15188 return SemaRef.Context.getTypeDeclType( 15189 cast<UnresolvedUsingTypenameDecl>(D)); 15190 } 15191 } 15192 15193 template <typename Derived> 15194 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, SourceLocation, 15195 TypeOfKind Kind) { 15196 return SemaRef.BuildTypeofExprType(E, Kind); 15197 } 15198 15199 template<typename Derived> 15200 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying, 15201 TypeOfKind Kind) { 15202 return SemaRef.Context.getTypeOfType(Underlying, Kind); 15203 } 15204 15205 template <typename Derived> 15206 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 15207 return SemaRef.BuildDecltypeType(E); 15208 } 15209 15210 template<typename Derived> 15211 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 15212 UnaryTransformType::UTTKind UKind, 15213 SourceLocation Loc) { 15214 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 15215 } 15216 15217 template<typename Derived> 15218 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 15219 TemplateName Template, 15220 SourceLocation TemplateNameLoc, 15221 TemplateArgumentListInfo &TemplateArgs) { 15222 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 15223 } 15224 15225 template<typename Derived> 15226 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 15227 SourceLocation KWLoc) { 15228 return SemaRef.BuildAtomicType(ValueType, KWLoc); 15229 } 15230 15231 template<typename Derived> 15232 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 15233 SourceLocation KWLoc, 15234 bool isReadPipe) { 15235 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 15236 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 15237 } 15238 15239 template <typename Derived> 15240 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned, 15241 unsigned NumBits, 15242 SourceLocation Loc) { 15243 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 15244 NumBits, true); 15245 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 15246 SemaRef.Context.IntTy, Loc); 15247 return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc); 15248 } 15249 15250 template <typename Derived> 15251 QualType TreeTransform<Derived>::RebuildDependentBitIntType( 15252 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 15253 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc); 15254 } 15255 15256 template<typename Derived> 15257 TemplateName 15258 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 15259 bool TemplateKW, 15260 TemplateDecl *Template) { 15261 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 15262 TemplateName(Template)); 15263 } 15264 15265 template<typename Derived> 15266 TemplateName 15267 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 15268 SourceLocation TemplateKWLoc, 15269 const IdentifierInfo &Name, 15270 SourceLocation NameLoc, 15271 QualType ObjectType, 15272 NamedDecl *FirstQualifierInScope, 15273 bool AllowInjectedClassName) { 15274 UnqualifiedId TemplateName; 15275 TemplateName.setIdentifier(&Name, NameLoc); 15276 Sema::TemplateTy Template; 15277 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 15278 TemplateName, ParsedType::make(ObjectType), 15279 /*EnteringContext=*/false, Template, 15280 AllowInjectedClassName); 15281 return Template.get(); 15282 } 15283 15284 template<typename Derived> 15285 TemplateName 15286 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 15287 SourceLocation TemplateKWLoc, 15288 OverloadedOperatorKind Operator, 15289 SourceLocation NameLoc, 15290 QualType ObjectType, 15291 bool AllowInjectedClassName) { 15292 UnqualifiedId Name; 15293 // FIXME: Bogus location information. 15294 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 15295 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 15296 Sema::TemplateTy Template; 15297 getSema().ActOnTemplateName( 15298 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 15299 /*EnteringContext=*/false, Template, AllowInjectedClassName); 15300 return Template.get(); 15301 } 15302 15303 template <typename Derived> 15304 ExprResult TreeTransform<Derived>::RebuildCXXOperatorCallExpr( 15305 OverloadedOperatorKind Op, SourceLocation OpLoc, SourceLocation CalleeLoc, 15306 bool RequiresADL, const UnresolvedSetImpl &Functions, Expr *First, 15307 Expr *Second) { 15308 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 15309 15310 if (First->getObjectKind() == OK_ObjCProperty) { 15311 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15312 if (BinaryOperator::isAssignmentOp(Opc)) 15313 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 15314 First, Second); 15315 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 15316 if (Result.isInvalid()) 15317 return ExprError(); 15318 First = Result.get(); 15319 } 15320 15321 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 15322 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 15323 if (Result.isInvalid()) 15324 return ExprError(); 15325 Second = Result.get(); 15326 } 15327 15328 // Determine whether this should be a builtin operation. 15329 if (Op == OO_Subscript) { 15330 if (!First->getType()->isOverloadableType() && 15331 !Second->getType()->isOverloadableType()) 15332 return getSema().CreateBuiltinArraySubscriptExpr(First, CalleeLoc, Second, 15333 OpLoc); 15334 } else if (Op == OO_Arrow) { 15335 // It is possible that the type refers to a RecoveryExpr created earlier 15336 // in the tree transformation. 15337 if (First->getType()->isDependentType()) 15338 return ExprError(); 15339 // -> is never a builtin operation. 15340 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 15341 } else if (Second == nullptr || isPostIncDec) { 15342 if (!First->getType()->isOverloadableType() || 15343 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 15344 // The argument is not of overloadable type, or this is an expression 15345 // of the form &Class::member, so try to create a built-in unary 15346 // operation. 15347 UnaryOperatorKind Opc 15348 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 15349 15350 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 15351 } 15352 } else { 15353 if (!First->getType()->isOverloadableType() && 15354 !Second->getType()->isOverloadableType()) { 15355 // Neither of the arguments is an overloadable type, so try to 15356 // create a built-in binary operation. 15357 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15358 ExprResult Result 15359 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 15360 if (Result.isInvalid()) 15361 return ExprError(); 15362 15363 return Result; 15364 } 15365 } 15366 15367 // Add any functions found via argument-dependent lookup. 15368 Expr *Args[2] = { First, Second }; 15369 unsigned NumArgs = 1 + (Second != nullptr); 15370 15371 // Create the overloaded operator invocation for unary operators. 15372 if (NumArgs == 1 || isPostIncDec) { 15373 UnaryOperatorKind Opc 15374 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 15375 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 15376 RequiresADL); 15377 } 15378 15379 // Create the overloaded operator invocation for binary operators. 15380 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15381 ExprResult Result = SemaRef.CreateOverloadedBinOp( 15382 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 15383 if (Result.isInvalid()) 15384 return ExprError(); 15385 15386 return Result; 15387 } 15388 15389 template<typename Derived> 15390 ExprResult 15391 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 15392 SourceLocation OperatorLoc, 15393 bool isArrow, 15394 CXXScopeSpec &SS, 15395 TypeSourceInfo *ScopeType, 15396 SourceLocation CCLoc, 15397 SourceLocation TildeLoc, 15398 PseudoDestructorTypeStorage Destroyed) { 15399 QualType BaseType = Base->getType(); 15400 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 15401 (!isArrow && !BaseType->getAs<RecordType>()) || 15402 (isArrow && BaseType->getAs<PointerType>() && 15403 !BaseType->castAs<PointerType>()->getPointeeType() 15404 ->template getAs<RecordType>())){ 15405 // This pseudo-destructor expression is still a pseudo-destructor. 15406 return SemaRef.BuildPseudoDestructorExpr( 15407 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 15408 CCLoc, TildeLoc, Destroyed); 15409 } 15410 15411 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 15412 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 15413 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 15414 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 15415 NameInfo.setNamedTypeInfo(DestroyedType); 15416 15417 // The scope type is now known to be a valid nested name specifier 15418 // component. Tack it on to the end of the nested name specifier. 15419 if (ScopeType) { 15420 if (!ScopeType->getType()->getAs<TagType>()) { 15421 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 15422 diag::err_expected_class_or_namespace) 15423 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 15424 return ExprError(); 15425 } 15426 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 15427 CCLoc); 15428 } 15429 15430 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 15431 return getSema().BuildMemberReferenceExpr(Base, BaseType, 15432 OperatorLoc, isArrow, 15433 SS, TemplateKWLoc, 15434 /*FIXME: FirstQualifier*/ nullptr, 15435 NameInfo, 15436 /*TemplateArgs*/ nullptr, 15437 /*S*/nullptr); 15438 } 15439 15440 template<typename Derived> 15441 StmtResult 15442 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 15443 SourceLocation Loc = S->getBeginLoc(); 15444 CapturedDecl *CD = S->getCapturedDecl(); 15445 unsigned NumParams = CD->getNumParams(); 15446 unsigned ContextParamPos = CD->getContextParamPosition(); 15447 SmallVector<Sema::CapturedParamNameType, 4> Params; 15448 for (unsigned I = 0; I < NumParams; ++I) { 15449 if (I != ContextParamPos) { 15450 Params.push_back( 15451 std::make_pair( 15452 CD->getParam(I)->getName(), 15453 getDerived().TransformType(CD->getParam(I)->getType()))); 15454 } else { 15455 Params.push_back(std::make_pair(StringRef(), QualType())); 15456 } 15457 } 15458 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 15459 S->getCapturedRegionKind(), Params); 15460 StmtResult Body; 15461 { 15462 Sema::CompoundScopeRAII CompoundScope(getSema()); 15463 Body = getDerived().TransformStmt(S->getCapturedStmt()); 15464 } 15465 15466 if (Body.isInvalid()) { 15467 getSema().ActOnCapturedRegionError(); 15468 return StmtError(); 15469 } 15470 15471 return getSema().ActOnCapturedRegionEnd(Body.get()); 15472 } 15473 15474 } // end namespace clang 15475 15476 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15477