1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 17 #include "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprConcepts.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/OpenMPClause.h" 27 #include "clang/AST/Stmt.h" 28 #include "clang/AST/StmtCXX.h" 29 #include "clang/AST/StmtObjC.h" 30 #include "clang/AST/StmtOpenMP.h" 31 #include "clang/Basic/DiagnosticParse.h" 32 #include "clang/Basic/OpenMPKinds.h" 33 #include "clang/Sema/Designator.h" 34 #include "clang/Sema/Lookup.h" 35 #include "clang/Sema/Ownership.h" 36 #include "clang/Sema/ParsedTemplate.h" 37 #include "clang/Sema/ScopeInfo.h" 38 #include "clang/Sema/SemaDiagnostic.h" 39 #include "clang/Sema/SemaInternal.h" 40 #include "llvm/ADT/ArrayRef.h" 41 #include "llvm/Support/ErrorHandling.h" 42 #include <algorithm> 43 44 using namespace llvm::omp; 45 46 namespace clang { 47 using namespace sema; 48 49 /// A semantic tree transformation that allows one to transform one 50 /// abstract syntax tree into another. 51 /// 52 /// A new tree transformation is defined by creating a new subclass \c X of 53 /// \c TreeTransform<X> and then overriding certain operations to provide 54 /// behavior specific to that transformation. For example, template 55 /// instantiation is implemented as a tree transformation where the 56 /// transformation of TemplateTypeParmType nodes involves substituting the 57 /// template arguments for their corresponding template parameters; a similar 58 /// transformation is performed for non-type template parameters and 59 /// template template parameters. 60 /// 61 /// This tree-transformation template uses static polymorphism to allow 62 /// subclasses to customize any of its operations. Thus, a subclass can 63 /// override any of the transformation or rebuild operators by providing an 64 /// operation with the same signature as the default implementation. The 65 /// overriding function should not be virtual. 66 /// 67 /// Semantic tree transformations are split into two stages, either of which 68 /// can be replaced by a subclass. The "transform" step transforms an AST node 69 /// or the parts of an AST node using the various transformation functions, 70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 71 /// node of the appropriate kind from the pieces. The default transformation 72 /// routines recursively transform the operands to composite AST nodes (e.g., 73 /// the pointee type of a PointerType node) and, if any of those operand nodes 74 /// were changed by the transformation, invokes the rebuild operation to create 75 /// a new AST node. 76 /// 77 /// Subclasses can customize the transformation at various levels. The 78 /// most coarse-grained transformations involve replacing TransformType(), 79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 81 /// new implementations. 82 /// 83 /// For more fine-grained transformations, subclasses can replace any of the 84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 86 /// replacing TransformTemplateTypeParmType() allows template instantiation 87 /// to substitute template arguments for their corresponding template 88 /// parameters. Additionally, subclasses can override the \c RebuildXXX 89 /// functions to control how AST nodes are rebuilt when their operands change. 90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 92 /// be able to use more efficient rebuild steps. 93 /// 94 /// There are a handful of other functions that can be overridden, allowing one 95 /// to avoid traversing nodes that don't need any transformation 96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 97 /// operands have not changed (\c AlwaysRebuild()), and customize the 98 /// default locations and entity names used for type-checking 99 /// (\c getBaseLocation(), \c getBaseEntity()). 100 template<typename Derived> 101 class TreeTransform { 102 /// Private RAII object that helps us forget and then re-remember 103 /// the template argument corresponding to a partially-substituted parameter 104 /// pack. 105 class ForgetPartiallySubstitutedPackRAII { 106 Derived &Self; 107 TemplateArgument Old; 108 109 public: 110 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 111 Old = Self.ForgetPartiallySubstitutedPack(); 112 } 113 114 ~ForgetPartiallySubstitutedPackRAII() { 115 Self.RememberPartiallySubstitutedPack(Old); 116 } 117 }; 118 119 protected: 120 Sema &SemaRef; 121 122 /// The set of local declarations that have been transformed, for 123 /// cases where we are forced to build new declarations within the transformer 124 /// rather than in the subclass (e.g., lambda closure types). 125 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 126 127 public: 128 /// Initializes a new tree transformer. 129 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 130 131 /// Retrieves a reference to the derived class. 132 Derived &getDerived() { return static_cast<Derived&>(*this); } 133 134 /// Retrieves a reference to the derived class. 135 const Derived &getDerived() const { 136 return static_cast<const Derived&>(*this); 137 } 138 139 static inline ExprResult Owned(Expr *E) { return E; } 140 static inline StmtResult Owned(Stmt *S) { return S; } 141 142 /// Retrieves a reference to the semantic analysis object used for 143 /// this tree transform. 144 Sema &getSema() const { return SemaRef; } 145 146 /// Whether the transformation should always rebuild AST nodes, even 147 /// if none of the children have changed. 148 /// 149 /// Subclasses may override this function to specify when the transformation 150 /// should rebuild all AST nodes. 151 /// 152 /// We must always rebuild all AST nodes when performing variadic template 153 /// pack expansion, in order to avoid violating the AST invariant that each 154 /// statement node appears at most once in its containing declaration. 155 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 156 157 /// Whether the transformation is forming an expression or statement that 158 /// replaces the original. In this case, we'll reuse mangling numbers from 159 /// existing lambdas. 160 bool ReplacingOriginal() { return false; } 161 162 /// Wether CXXConstructExpr can be skipped when they are implicit. 163 /// They will be reconstructed when used if needed. 164 /// This is useful when the user that cause rebuilding of the 165 /// CXXConstructExpr is outside of the expression at which the TreeTransform 166 /// started. 167 bool AllowSkippingCXXConstructExpr() { return true; } 168 169 /// Returns the location of the entity being transformed, if that 170 /// information was not available elsewhere in the AST. 171 /// 172 /// By default, returns no source-location information. Subclasses can 173 /// provide an alternative implementation that provides better location 174 /// information. 175 SourceLocation getBaseLocation() { return SourceLocation(); } 176 177 /// Returns the name of the entity being transformed, if that 178 /// information was not available elsewhere in the AST. 179 /// 180 /// By default, returns an empty name. Subclasses can provide an alternative 181 /// implementation with a more precise name. 182 DeclarationName getBaseEntity() { return DeclarationName(); } 183 184 /// Sets the "base" location and entity when that 185 /// information is known based on another transformation. 186 /// 187 /// By default, the source location and entity are ignored. Subclasses can 188 /// override this function to provide a customized implementation. 189 void setBase(SourceLocation Loc, DeclarationName Entity) { } 190 191 /// RAII object that temporarily sets the base location and entity 192 /// used for reporting diagnostics in types. 193 class TemporaryBase { 194 TreeTransform &Self; 195 SourceLocation OldLocation; 196 DeclarationName OldEntity; 197 198 public: 199 TemporaryBase(TreeTransform &Self, SourceLocation Location, 200 DeclarationName Entity) : Self(Self) { 201 OldLocation = Self.getDerived().getBaseLocation(); 202 OldEntity = Self.getDerived().getBaseEntity(); 203 204 if (Location.isValid()) 205 Self.getDerived().setBase(Location, Entity); 206 } 207 208 ~TemporaryBase() { 209 Self.getDerived().setBase(OldLocation, OldEntity); 210 } 211 }; 212 213 /// Determine whether the given type \p T has already been 214 /// transformed. 215 /// 216 /// Subclasses can provide an alternative implementation of this routine 217 /// to short-circuit evaluation when it is known that a given type will 218 /// not change. For example, template instantiation need not traverse 219 /// non-dependent types. 220 bool AlreadyTransformed(QualType T) { 221 return T.isNull(); 222 } 223 224 /// Transform a template parameter depth level. 225 /// 226 /// During a transformation that transforms template parameters, this maps 227 /// an old template parameter depth to a new depth. 228 unsigned TransformTemplateDepth(unsigned Depth) { 229 return Depth; 230 } 231 232 /// Determine whether the given call argument should be dropped, e.g., 233 /// because it is a default argument. 234 /// 235 /// Subclasses can provide an alternative implementation of this routine to 236 /// determine which kinds of call arguments get dropped. By default, 237 /// CXXDefaultArgument nodes are dropped (prior to transformation). 238 bool DropCallArgument(Expr *E) { 239 return E->isDefaultArgument(); 240 } 241 242 /// Determine whether we should expand a pack expansion with the 243 /// given set of parameter packs into separate arguments by repeatedly 244 /// transforming the pattern. 245 /// 246 /// By default, the transformer never tries to expand pack expansions. 247 /// Subclasses can override this routine to provide different behavior. 248 /// 249 /// \param EllipsisLoc The location of the ellipsis that identifies the 250 /// pack expansion. 251 /// 252 /// \param PatternRange The source range that covers the entire pattern of 253 /// the pack expansion. 254 /// 255 /// \param Unexpanded The set of unexpanded parameter packs within the 256 /// pattern. 257 /// 258 /// \param ShouldExpand Will be set to \c true if the transformer should 259 /// expand the corresponding pack expansions into separate arguments. When 260 /// set, \c NumExpansions must also be set. 261 /// 262 /// \param RetainExpansion Whether the caller should add an unexpanded 263 /// pack expansion after all of the expanded arguments. This is used 264 /// when extending explicitly-specified template argument packs per 265 /// C++0x [temp.arg.explicit]p9. 266 /// 267 /// \param NumExpansions The number of separate arguments that will be in 268 /// the expanded form of the corresponding pack expansion. This is both an 269 /// input and an output parameter, which can be set by the caller if the 270 /// number of expansions is known a priori (e.g., due to a prior substitution) 271 /// and will be set by the callee when the number of expansions is known. 272 /// The callee must set this value when \c ShouldExpand is \c true; it may 273 /// set this value in other cases. 274 /// 275 /// \returns true if an error occurred (e.g., because the parameter packs 276 /// are to be instantiated with arguments of different lengths), false 277 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 278 /// must be set. 279 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 280 SourceRange PatternRange, 281 ArrayRef<UnexpandedParameterPack> Unexpanded, 282 bool &ShouldExpand, 283 bool &RetainExpansion, 284 Optional<unsigned> &NumExpansions) { 285 ShouldExpand = false; 286 return false; 287 } 288 289 /// "Forget" about the partially-substituted pack template argument, 290 /// when performing an instantiation that must preserve the parameter pack 291 /// use. 292 /// 293 /// This routine is meant to be overridden by the template instantiator. 294 TemplateArgument ForgetPartiallySubstitutedPack() { 295 return TemplateArgument(); 296 } 297 298 /// "Remember" the partially-substituted pack template argument 299 /// after performing an instantiation that must preserve the parameter pack 300 /// use. 301 /// 302 /// This routine is meant to be overridden by the template instantiator. 303 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 304 305 /// Note to the derived class when a function parameter pack is 306 /// being expanded. 307 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 308 309 /// Transforms the given type into another type. 310 /// 311 /// By default, this routine transforms a type by creating a 312 /// TypeSourceInfo for it and delegating to the appropriate 313 /// function. This is expensive, but we don't mind, because 314 /// this method is deprecated anyway; all users should be 315 /// switched to storing TypeSourceInfos. 316 /// 317 /// \returns the transformed type. 318 QualType TransformType(QualType T); 319 320 /// Transforms the given type-with-location into a new 321 /// type-with-location. 322 /// 323 /// By default, this routine transforms a type by delegating to the 324 /// appropriate TransformXXXType to build a new type. Subclasses 325 /// may override this function (to take over all type 326 /// transformations) or some set of the TransformXXXType functions 327 /// to alter the transformation. 328 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 329 330 /// Transform the given type-with-location into a new 331 /// type, collecting location information in the given builder 332 /// as necessary. 333 /// 334 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 335 336 /// Transform a type that is permitted to produce a 337 /// DeducedTemplateSpecializationType. 338 /// 339 /// This is used in the (relatively rare) contexts where it is acceptable 340 /// for transformation to produce a class template type with deduced 341 /// template arguments. 342 /// @{ 343 QualType TransformTypeWithDeducedTST(QualType T); 344 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 345 /// @} 346 347 /// The reason why the value of a statement is not discarded, if any. 348 enum StmtDiscardKind { 349 SDK_Discarded, 350 SDK_NotDiscarded, 351 SDK_StmtExprResult, 352 }; 353 354 /// Transform the given statement. 355 /// 356 /// By default, this routine transforms a statement by delegating to the 357 /// appropriate TransformXXXStmt function to transform a specific kind of 358 /// statement or the TransformExpr() function to transform an expression. 359 /// Subclasses may override this function to transform statements using some 360 /// other mechanism. 361 /// 362 /// \returns the transformed statement. 363 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 364 365 /// Transform the given statement. 366 /// 367 /// By default, this routine transforms a statement by delegating to the 368 /// appropriate TransformOMPXXXClause function to transform a specific kind 369 /// of clause. Subclasses may override this function to transform statements 370 /// using some other mechanism. 371 /// 372 /// \returns the transformed OpenMP clause. 373 OMPClause *TransformOMPClause(OMPClause *S); 374 375 /// Transform the given attribute. 376 /// 377 /// By default, this routine transforms a statement by delegating to the 378 /// appropriate TransformXXXAttr function to transform a specific kind 379 /// of attribute. Subclasses may override this function to transform 380 /// attributed statements using some other mechanism. 381 /// 382 /// \returns the transformed attribute 383 const Attr *TransformAttr(const Attr *S); 384 385 /// Transform the specified attribute. 386 /// 387 /// Subclasses should override the transformation of attributes with a pragma 388 /// spelling to transform expressions stored within the attribute. 389 /// 390 /// \returns the transformed attribute. 391 #define ATTR(X) 392 #define PRAGMA_SPELLING_ATTR(X) \ 393 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 394 #include "clang/Basic/AttrList.inc" 395 396 /// Transform the given expression. 397 /// 398 /// By default, this routine transforms an expression by delegating to the 399 /// appropriate TransformXXXExpr function to build a new expression. 400 /// Subclasses may override this function to transform expressions using some 401 /// other mechanism. 402 /// 403 /// \returns the transformed expression. 404 ExprResult TransformExpr(Expr *E); 405 406 /// Transform the given initializer. 407 /// 408 /// By default, this routine transforms an initializer by stripping off the 409 /// semantic nodes added by initialization, then passing the result to 410 /// TransformExpr or TransformExprs. 411 /// 412 /// \returns the transformed initializer. 413 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 414 415 /// Transform the given list of expressions. 416 /// 417 /// This routine transforms a list of expressions by invoking 418 /// \c TransformExpr() for each subexpression. However, it also provides 419 /// support for variadic templates by expanding any pack expansions (if the 420 /// derived class permits such expansion) along the way. When pack expansions 421 /// are present, the number of outputs may not equal the number of inputs. 422 /// 423 /// \param Inputs The set of expressions to be transformed. 424 /// 425 /// \param NumInputs The number of expressions in \c Inputs. 426 /// 427 /// \param IsCall If \c true, then this transform is being performed on 428 /// function-call arguments, and any arguments that should be dropped, will 429 /// be. 430 /// 431 /// \param Outputs The transformed input expressions will be added to this 432 /// vector. 433 /// 434 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 435 /// due to transformation. 436 /// 437 /// \returns true if an error occurred, false otherwise. 438 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 439 SmallVectorImpl<Expr *> &Outputs, 440 bool *ArgChanged = nullptr); 441 442 /// Transform the given declaration, which is referenced from a type 443 /// or expression. 444 /// 445 /// By default, acts as the identity function on declarations, unless the 446 /// transformer has had to transform the declaration itself. Subclasses 447 /// may override this function to provide alternate behavior. 448 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 449 llvm::DenseMap<Decl *, Decl *>::iterator Known 450 = TransformedLocalDecls.find(D); 451 if (Known != TransformedLocalDecls.end()) 452 return Known->second; 453 454 return D; 455 } 456 457 /// Transform the specified condition. 458 /// 459 /// By default, this transforms the variable and expression and rebuilds 460 /// the condition. 461 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 462 Expr *Expr, 463 Sema::ConditionKind Kind); 464 465 /// Transform the attributes associated with the given declaration and 466 /// place them on the new declaration. 467 /// 468 /// By default, this operation does nothing. Subclasses may override this 469 /// behavior to transform attributes. 470 void transformAttrs(Decl *Old, Decl *New) { } 471 472 /// Note that a local declaration has been transformed by this 473 /// transformer. 474 /// 475 /// Local declarations are typically transformed via a call to 476 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 477 /// the transformer itself has to transform the declarations. This routine 478 /// can be overridden by a subclass that keeps track of such mappings. 479 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 480 assert(New.size() == 1 && 481 "must override transformedLocalDecl if performing pack expansion"); 482 TransformedLocalDecls[Old] = New.front(); 483 } 484 485 /// Transform the definition of the given declaration. 486 /// 487 /// By default, invokes TransformDecl() to transform the declaration. 488 /// Subclasses may override this function to provide alternate behavior. 489 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 490 return getDerived().TransformDecl(Loc, D); 491 } 492 493 /// Transform the given declaration, which was the first part of a 494 /// nested-name-specifier in a member access expression. 495 /// 496 /// This specific declaration transformation only applies to the first 497 /// identifier in a nested-name-specifier of a member access expression, e.g., 498 /// the \c T in \c x->T::member 499 /// 500 /// By default, invokes TransformDecl() to transform the declaration. 501 /// Subclasses may override this function to provide alternate behavior. 502 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 503 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 504 } 505 506 /// Transform the set of declarations in an OverloadExpr. 507 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 508 LookupResult &R); 509 510 /// Transform the given nested-name-specifier with source-location 511 /// information. 512 /// 513 /// By default, transforms all of the types and declarations within the 514 /// nested-name-specifier. Subclasses may override this function to provide 515 /// alternate behavior. 516 NestedNameSpecifierLoc 517 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 518 QualType ObjectType = QualType(), 519 NamedDecl *FirstQualifierInScope = nullptr); 520 521 /// Transform the given declaration name. 522 /// 523 /// By default, transforms the types of conversion function, constructor, 524 /// and destructor names and then (if needed) rebuilds the declaration name. 525 /// Identifiers and selectors are returned unmodified. Subclasses may 526 /// override this function to provide alternate behavior. 527 DeclarationNameInfo 528 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 529 530 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 531 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 532 concepts::TypeRequirement * 533 TransformTypeRequirement(concepts::TypeRequirement *Req); 534 concepts::ExprRequirement * 535 TransformExprRequirement(concepts::ExprRequirement *Req); 536 concepts::NestedRequirement * 537 TransformNestedRequirement(concepts::NestedRequirement *Req); 538 539 /// Transform the given template name. 540 /// 541 /// \param SS The nested-name-specifier that qualifies the template 542 /// name. This nested-name-specifier must already have been transformed. 543 /// 544 /// \param Name The template name to transform. 545 /// 546 /// \param NameLoc The source location of the template name. 547 /// 548 /// \param ObjectType If we're translating a template name within a member 549 /// access expression, this is the type of the object whose member template 550 /// is being referenced. 551 /// 552 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 553 /// also refers to a name within the current (lexical) scope, this is the 554 /// declaration it refers to. 555 /// 556 /// By default, transforms the template name by transforming the declarations 557 /// and nested-name-specifiers that occur within the template name. 558 /// Subclasses may override this function to provide alternate behavior. 559 TemplateName 560 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 561 SourceLocation NameLoc, 562 QualType ObjectType = QualType(), 563 NamedDecl *FirstQualifierInScope = nullptr, 564 bool AllowInjectedClassName = false); 565 566 /// Transform the given template argument. 567 /// 568 /// By default, this operation transforms the type, expression, or 569 /// declaration stored within the template argument and constructs a 570 /// new template argument from the transformed result. Subclasses may 571 /// override this function to provide alternate behavior. 572 /// 573 /// Returns true if there was an error. 574 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 575 TemplateArgumentLoc &Output, 576 bool Uneval = false); 577 578 /// Transform the given set of template arguments. 579 /// 580 /// By default, this operation transforms all of the template arguments 581 /// in the input set using \c TransformTemplateArgument(), and appends 582 /// the transformed arguments to the output list. 583 /// 584 /// Note that this overload of \c TransformTemplateArguments() is merely 585 /// a convenience function. Subclasses that wish to override this behavior 586 /// should override the iterator-based member template version. 587 /// 588 /// \param Inputs The set of template arguments to be transformed. 589 /// 590 /// \param NumInputs The number of template arguments in \p Inputs. 591 /// 592 /// \param Outputs The set of transformed template arguments output by this 593 /// routine. 594 /// 595 /// Returns true if an error occurred. 596 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 597 unsigned NumInputs, 598 TemplateArgumentListInfo &Outputs, 599 bool Uneval = false) { 600 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 601 Uneval); 602 } 603 604 /// Transform the given set of template arguments. 605 /// 606 /// By default, this operation transforms all of the template arguments 607 /// in the input set using \c TransformTemplateArgument(), and appends 608 /// the transformed arguments to the output list. 609 /// 610 /// \param First An iterator to the first template argument. 611 /// 612 /// \param Last An iterator one step past the last template argument. 613 /// 614 /// \param Outputs The set of transformed template arguments output by this 615 /// routine. 616 /// 617 /// Returns true if an error occurred. 618 template<typename InputIterator> 619 bool TransformTemplateArguments(InputIterator First, 620 InputIterator Last, 621 TemplateArgumentListInfo &Outputs, 622 bool Uneval = false); 623 624 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 625 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 626 TemplateArgumentLoc &ArgLoc); 627 628 /// Fakes up a TypeSourceInfo for a type. 629 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 630 return SemaRef.Context.getTrivialTypeSourceInfo(T, 631 getDerived().getBaseLocation()); 632 } 633 634 #define ABSTRACT_TYPELOC(CLASS, PARENT) 635 #define TYPELOC(CLASS, PARENT) \ 636 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 637 #include "clang/AST/TypeLocNodes.def" 638 639 template<typename Fn> 640 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 641 FunctionProtoTypeLoc TL, 642 CXXRecordDecl *ThisContext, 643 Qualifiers ThisTypeQuals, 644 Fn TransformExceptionSpec); 645 646 bool TransformExceptionSpec(SourceLocation Loc, 647 FunctionProtoType::ExceptionSpecInfo &ESI, 648 SmallVectorImpl<QualType> &Exceptions, 649 bool &Changed); 650 651 StmtResult TransformSEHHandler(Stmt *Handler); 652 653 QualType 654 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 655 TemplateSpecializationTypeLoc TL, 656 TemplateName Template); 657 658 QualType 659 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 660 DependentTemplateSpecializationTypeLoc TL, 661 TemplateName Template, 662 CXXScopeSpec &SS); 663 664 QualType TransformDependentTemplateSpecializationType( 665 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 666 NestedNameSpecifierLoc QualifierLoc); 667 668 /// Transforms the parameters of a function type into the 669 /// given vectors. 670 /// 671 /// The result vectors should be kept in sync; null entries in the 672 /// variables vector are acceptable. 673 /// 674 /// Return true on error. 675 bool TransformFunctionTypeParams( 676 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 677 const QualType *ParamTypes, 678 const FunctionProtoType::ExtParameterInfo *ParamInfos, 679 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 680 Sema::ExtParameterInfoBuilder &PInfos); 681 682 /// Transforms a single function-type parameter. Return null 683 /// on error. 684 /// 685 /// \param indexAdjustment - A number to add to the parameter's 686 /// scope index; can be negative 687 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 688 int indexAdjustment, 689 Optional<unsigned> NumExpansions, 690 bool ExpectParameterPack); 691 692 /// Transform the body of a lambda-expression. 693 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 694 /// Alternative implementation of TransformLambdaBody that skips transforming 695 /// the body. 696 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 697 698 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 699 700 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 701 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 702 703 TemplateParameterList *TransformTemplateParameterList( 704 TemplateParameterList *TPL) { 705 return TPL; 706 } 707 708 ExprResult TransformAddressOfOperand(Expr *E); 709 710 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 711 bool IsAddressOfOperand, 712 TypeSourceInfo **RecoveryTSI); 713 714 ExprResult TransformParenDependentScopeDeclRefExpr( 715 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 716 TypeSourceInfo **RecoveryTSI); 717 718 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 719 720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 721 // amount of stack usage with clang. 722 #define STMT(Node, Parent) \ 723 LLVM_ATTRIBUTE_NOINLINE \ 724 StmtResult Transform##Node(Node *S); 725 #define VALUESTMT(Node, Parent) \ 726 LLVM_ATTRIBUTE_NOINLINE \ 727 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 728 #define EXPR(Node, Parent) \ 729 LLVM_ATTRIBUTE_NOINLINE \ 730 ExprResult Transform##Node(Node *E); 731 #define ABSTRACT_STMT(Stmt) 732 #include "clang/AST/StmtNodes.inc" 733 734 #define GEN_CLANG_CLAUSE_CLASS 735 #define CLAUSE_CLASS(Enum, Str, Class) \ 736 LLVM_ATTRIBUTE_NOINLINE \ 737 OMPClause *Transform##Class(Class *S); 738 #include "llvm/Frontend/OpenMP/OMP.inc" 739 740 /// Build a new qualified type given its unqualified type and type location. 741 /// 742 /// By default, this routine adds type qualifiers only to types that can 743 /// have qualifiers, and silently suppresses those qualifiers that are not 744 /// permitted. Subclasses may override this routine to provide different 745 /// behavior. 746 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 747 748 /// Build a new pointer type given its pointee type. 749 /// 750 /// By default, performs semantic analysis when building the pointer type. 751 /// Subclasses may override this routine to provide different behavior. 752 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 753 754 /// Build a new block pointer type given its pointee type. 755 /// 756 /// By default, performs semantic analysis when building the block pointer 757 /// type. Subclasses may override this routine to provide different behavior. 758 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 759 760 /// Build a new reference type given the type it references. 761 /// 762 /// By default, performs semantic analysis when building the 763 /// reference type. Subclasses may override this routine to provide 764 /// different behavior. 765 /// 766 /// \param LValue whether the type was written with an lvalue sigil 767 /// or an rvalue sigil. 768 QualType RebuildReferenceType(QualType ReferentType, 769 bool LValue, 770 SourceLocation Sigil); 771 772 /// Build a new member pointer type given the pointee type and the 773 /// class type it refers into. 774 /// 775 /// By default, performs semantic analysis when building the member pointer 776 /// type. Subclasses may override this routine to provide different behavior. 777 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 778 SourceLocation Sigil); 779 780 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 781 SourceLocation ProtocolLAngleLoc, 782 ArrayRef<ObjCProtocolDecl *> Protocols, 783 ArrayRef<SourceLocation> ProtocolLocs, 784 SourceLocation ProtocolRAngleLoc); 785 786 /// Build an Objective-C object type. 787 /// 788 /// By default, performs semantic analysis when building the object type. 789 /// Subclasses may override this routine to provide different behavior. 790 QualType RebuildObjCObjectType(QualType BaseType, 791 SourceLocation Loc, 792 SourceLocation TypeArgsLAngleLoc, 793 ArrayRef<TypeSourceInfo *> TypeArgs, 794 SourceLocation TypeArgsRAngleLoc, 795 SourceLocation ProtocolLAngleLoc, 796 ArrayRef<ObjCProtocolDecl *> Protocols, 797 ArrayRef<SourceLocation> ProtocolLocs, 798 SourceLocation ProtocolRAngleLoc); 799 800 /// Build a new Objective-C object pointer type given the pointee type. 801 /// 802 /// By default, directly builds the pointer type, with no additional semantic 803 /// analysis. 804 QualType RebuildObjCObjectPointerType(QualType PointeeType, 805 SourceLocation Star); 806 807 /// Build a new array type given the element type, size 808 /// modifier, size of the array (if known), size expression, and index type 809 /// qualifiers. 810 /// 811 /// By default, performs semantic analysis when building the array type. 812 /// Subclasses may override this routine to provide different behavior. 813 /// Also by default, all of the other Rebuild*Array 814 QualType RebuildArrayType(QualType ElementType, 815 ArrayType::ArraySizeModifier SizeMod, 816 const llvm::APInt *Size, 817 Expr *SizeExpr, 818 unsigned IndexTypeQuals, 819 SourceRange BracketsRange); 820 821 /// Build a new constant array type given the element type, size 822 /// modifier, (known) size of the array, and index type qualifiers. 823 /// 824 /// By default, performs semantic analysis when building the array type. 825 /// Subclasses may override this routine to provide different behavior. 826 QualType RebuildConstantArrayType(QualType ElementType, 827 ArrayType::ArraySizeModifier SizeMod, 828 const llvm::APInt &Size, 829 Expr *SizeExpr, 830 unsigned IndexTypeQuals, 831 SourceRange BracketsRange); 832 833 /// Build a new incomplete array type given the element type, size 834 /// modifier, and index type qualifiers. 835 /// 836 /// By default, performs semantic analysis when building the array type. 837 /// Subclasses may override this routine to provide different behavior. 838 QualType RebuildIncompleteArrayType(QualType ElementType, 839 ArrayType::ArraySizeModifier SizeMod, 840 unsigned IndexTypeQuals, 841 SourceRange BracketsRange); 842 843 /// Build a new variable-length array type given the element type, 844 /// size modifier, size expression, and index type qualifiers. 845 /// 846 /// By default, performs semantic analysis when building the array type. 847 /// Subclasses may override this routine to provide different behavior. 848 QualType RebuildVariableArrayType(QualType ElementType, 849 ArrayType::ArraySizeModifier SizeMod, 850 Expr *SizeExpr, 851 unsigned IndexTypeQuals, 852 SourceRange BracketsRange); 853 854 /// Build a new dependent-sized array type given the element type, 855 /// size modifier, size expression, and index type qualifiers. 856 /// 857 /// By default, performs semantic analysis when building the array type. 858 /// Subclasses may override this routine to provide different behavior. 859 QualType RebuildDependentSizedArrayType(QualType ElementType, 860 ArrayType::ArraySizeModifier SizeMod, 861 Expr *SizeExpr, 862 unsigned IndexTypeQuals, 863 SourceRange BracketsRange); 864 865 /// Build a new vector type given the element type and 866 /// number of elements. 867 /// 868 /// By default, performs semantic analysis when building the vector type. 869 /// Subclasses may override this routine to provide different behavior. 870 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 871 VectorType::VectorKind VecKind); 872 873 /// Build a new potentially dependently-sized extended vector type 874 /// given the element type and number of elements. 875 /// 876 /// By default, performs semantic analysis when building the vector type. 877 /// Subclasses may override this routine to provide different behavior. 878 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 879 SourceLocation AttributeLoc, 880 VectorType::VectorKind); 881 882 /// Build a new extended vector type given the element type and 883 /// number of elements. 884 /// 885 /// By default, performs semantic analysis when building the vector type. 886 /// Subclasses may override this routine to provide different behavior. 887 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 888 SourceLocation AttributeLoc); 889 890 /// Build a new potentially dependently-sized extended vector type 891 /// given the element type and number of elements. 892 /// 893 /// By default, performs semantic analysis when building the vector type. 894 /// Subclasses may override this routine to provide different behavior. 895 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 896 Expr *SizeExpr, 897 SourceLocation AttributeLoc); 898 899 /// Build a new matrix type given the element type and dimensions. 900 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 901 unsigned NumColumns); 902 903 /// Build a new matrix type given the type and dependently-defined 904 /// dimensions. 905 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 906 Expr *ColumnExpr, 907 SourceLocation AttributeLoc); 908 909 /// Build a new DependentAddressSpaceType or return the pointee 910 /// type variable with the correct address space (retrieved from 911 /// AddrSpaceExpr) applied to it. The former will be returned in cases 912 /// where the address space remains dependent. 913 /// 914 /// By default, performs semantic analysis when building the type with address 915 /// space applied. Subclasses may override this routine to provide different 916 /// behavior. 917 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 918 Expr *AddrSpaceExpr, 919 SourceLocation AttributeLoc); 920 921 /// Build a new function type. 922 /// 923 /// By default, performs semantic analysis when building the function type. 924 /// Subclasses may override this routine to provide different behavior. 925 QualType RebuildFunctionProtoType(QualType T, 926 MutableArrayRef<QualType> ParamTypes, 927 const FunctionProtoType::ExtProtoInfo &EPI); 928 929 /// Build a new unprototyped function type. 930 QualType RebuildFunctionNoProtoType(QualType ResultType); 931 932 /// Rebuild an unresolved typename type, given the decl that 933 /// the UnresolvedUsingTypenameDecl was transformed to. 934 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 935 936 /// Build a new type found via an alias. 937 QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) { 938 return SemaRef.Context.getUsingType(Found, Underlying); 939 } 940 941 /// Build a new typedef type. 942 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 943 return SemaRef.Context.getTypeDeclType(Typedef); 944 } 945 946 /// Build a new MacroDefined type. 947 QualType RebuildMacroQualifiedType(QualType T, 948 const IdentifierInfo *MacroII) { 949 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 950 } 951 952 /// Build a new class/struct/union type. 953 QualType RebuildRecordType(RecordDecl *Record) { 954 return SemaRef.Context.getTypeDeclType(Record); 955 } 956 957 /// Build a new Enum type. 958 QualType RebuildEnumType(EnumDecl *Enum) { 959 return SemaRef.Context.getTypeDeclType(Enum); 960 } 961 962 /// Build a new typeof(expr) type. 963 /// 964 /// By default, performs semantic analysis when building the typeof type. 965 /// Subclasses may override this routine to provide different behavior. 966 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 967 968 /// Build a new typeof(type) type. 969 /// 970 /// By default, builds a new TypeOfType with the given underlying type. 971 QualType RebuildTypeOfType(QualType Underlying); 972 973 /// Build a new unary transform type. 974 QualType RebuildUnaryTransformType(QualType BaseType, 975 UnaryTransformType::UTTKind UKind, 976 SourceLocation Loc); 977 978 /// Build a new C++11 decltype type. 979 /// 980 /// By default, performs semantic analysis when building the decltype type. 981 /// Subclasses may override this routine to provide different behavior. 982 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 983 984 /// Build a new C++11 auto type. 985 /// 986 /// By default, builds a new AutoType with the given deduced type. 987 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 988 ConceptDecl *TypeConstraintConcept, 989 ArrayRef<TemplateArgument> TypeConstraintArgs) { 990 // Note, IsDependent is always false here: we implicitly convert an 'auto' 991 // which has been deduced to a dependent type into an undeduced 'auto', so 992 // that we'll retry deduction after the transformation. 993 return SemaRef.Context.getAutoType(Deduced, Keyword, 994 /*IsDependent*/ false, /*IsPack=*/false, 995 TypeConstraintConcept, 996 TypeConstraintArgs); 997 } 998 999 /// By default, builds a new DeducedTemplateSpecializationType with the given 1000 /// deduced type. 1001 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 1002 QualType Deduced) { 1003 return SemaRef.Context.getDeducedTemplateSpecializationType( 1004 Template, Deduced, /*IsDependent*/ false); 1005 } 1006 1007 /// Build a new template specialization type. 1008 /// 1009 /// By default, performs semantic analysis when building the template 1010 /// specialization type. Subclasses may override this routine to provide 1011 /// different behavior. 1012 QualType RebuildTemplateSpecializationType(TemplateName Template, 1013 SourceLocation TemplateLoc, 1014 TemplateArgumentListInfo &Args); 1015 1016 /// Build a new parenthesized type. 1017 /// 1018 /// By default, builds a new ParenType type from the inner type. 1019 /// Subclasses may override this routine to provide different behavior. 1020 QualType RebuildParenType(QualType InnerType) { 1021 return SemaRef.BuildParenType(InnerType); 1022 } 1023 1024 /// Build a new qualified name type. 1025 /// 1026 /// By default, builds a new ElaboratedType type from the keyword, 1027 /// the nested-name-specifier and the named type. 1028 /// Subclasses may override this routine to provide different behavior. 1029 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1030 ElaboratedTypeKeyword Keyword, 1031 NestedNameSpecifierLoc QualifierLoc, 1032 QualType Named) { 1033 return SemaRef.Context.getElaboratedType(Keyword, 1034 QualifierLoc.getNestedNameSpecifier(), 1035 Named); 1036 } 1037 1038 /// Build a new typename type that refers to a template-id. 1039 /// 1040 /// By default, builds a new DependentNameType type from the 1041 /// nested-name-specifier and the given type. Subclasses may override 1042 /// this routine to provide different behavior. 1043 QualType RebuildDependentTemplateSpecializationType( 1044 ElaboratedTypeKeyword Keyword, 1045 NestedNameSpecifierLoc QualifierLoc, 1046 SourceLocation TemplateKWLoc, 1047 const IdentifierInfo *Name, 1048 SourceLocation NameLoc, 1049 TemplateArgumentListInfo &Args, 1050 bool AllowInjectedClassName) { 1051 // Rebuild the template name. 1052 // TODO: avoid TemplateName abstraction 1053 CXXScopeSpec SS; 1054 SS.Adopt(QualifierLoc); 1055 TemplateName InstName = getDerived().RebuildTemplateName( 1056 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1057 AllowInjectedClassName); 1058 1059 if (InstName.isNull()) 1060 return QualType(); 1061 1062 // If it's still dependent, make a dependent specialization. 1063 if (InstName.getAsDependentTemplateName()) 1064 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1065 QualifierLoc.getNestedNameSpecifier(), 1066 Name, 1067 Args); 1068 1069 // Otherwise, make an elaborated type wrapping a non-dependent 1070 // specialization. 1071 QualType T = 1072 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1073 if (T.isNull()) return QualType(); 1074 1075 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1076 return T; 1077 1078 return SemaRef.Context.getElaboratedType(Keyword, 1079 QualifierLoc.getNestedNameSpecifier(), 1080 T); 1081 } 1082 1083 /// Build a new typename type that refers to an identifier. 1084 /// 1085 /// By default, performs semantic analysis when building the typename type 1086 /// (or elaborated type). Subclasses may override this routine to provide 1087 /// different behavior. 1088 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1089 SourceLocation KeywordLoc, 1090 NestedNameSpecifierLoc QualifierLoc, 1091 const IdentifierInfo *Id, 1092 SourceLocation IdLoc, 1093 bool DeducedTSTContext) { 1094 CXXScopeSpec SS; 1095 SS.Adopt(QualifierLoc); 1096 1097 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1098 // If the name is still dependent, just build a new dependent name type. 1099 if (!SemaRef.computeDeclContext(SS)) 1100 return SemaRef.Context.getDependentNameType(Keyword, 1101 QualifierLoc.getNestedNameSpecifier(), 1102 Id); 1103 } 1104 1105 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1106 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1107 *Id, IdLoc, DeducedTSTContext); 1108 } 1109 1110 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1111 1112 // We had a dependent elaborated-type-specifier that has been transformed 1113 // into a non-dependent elaborated-type-specifier. Find the tag we're 1114 // referring to. 1115 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1116 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1117 if (!DC) 1118 return QualType(); 1119 1120 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1121 return QualType(); 1122 1123 TagDecl *Tag = nullptr; 1124 SemaRef.LookupQualifiedName(Result, DC); 1125 switch (Result.getResultKind()) { 1126 case LookupResult::NotFound: 1127 case LookupResult::NotFoundInCurrentInstantiation: 1128 break; 1129 1130 case LookupResult::Found: 1131 Tag = Result.getAsSingle<TagDecl>(); 1132 break; 1133 1134 case LookupResult::FoundOverloaded: 1135 case LookupResult::FoundUnresolvedValue: 1136 llvm_unreachable("Tag lookup cannot find non-tags"); 1137 1138 case LookupResult::Ambiguous: 1139 // Let the LookupResult structure handle ambiguities. 1140 return QualType(); 1141 } 1142 1143 if (!Tag) { 1144 // Check where the name exists but isn't a tag type and use that to emit 1145 // better diagnostics. 1146 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1147 SemaRef.LookupQualifiedName(Result, DC); 1148 switch (Result.getResultKind()) { 1149 case LookupResult::Found: 1150 case LookupResult::FoundOverloaded: 1151 case LookupResult::FoundUnresolvedValue: { 1152 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1153 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1154 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1155 << NTK << Kind; 1156 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1157 break; 1158 } 1159 default: 1160 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1161 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1162 break; 1163 } 1164 return QualType(); 1165 } 1166 1167 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1168 IdLoc, Id)) { 1169 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1170 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1171 return QualType(); 1172 } 1173 1174 // Build the elaborated-type-specifier type. 1175 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1176 return SemaRef.Context.getElaboratedType(Keyword, 1177 QualifierLoc.getNestedNameSpecifier(), 1178 T); 1179 } 1180 1181 /// Build a new pack expansion type. 1182 /// 1183 /// By default, builds a new PackExpansionType type from the given pattern. 1184 /// Subclasses may override this routine to provide different behavior. 1185 QualType RebuildPackExpansionType(QualType Pattern, 1186 SourceRange PatternRange, 1187 SourceLocation EllipsisLoc, 1188 Optional<unsigned> NumExpansions) { 1189 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1190 NumExpansions); 1191 } 1192 1193 /// Build a new atomic type given its value type. 1194 /// 1195 /// By default, performs semantic analysis when building the atomic type. 1196 /// Subclasses may override this routine to provide different behavior. 1197 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1198 1199 /// Build a new pipe type given its value type. 1200 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1201 bool isReadPipe); 1202 1203 /// Build a bit-precise int given its value type. 1204 QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits, 1205 SourceLocation Loc); 1206 1207 /// Build a dependent bit-precise int given its value type. 1208 QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr, 1209 SourceLocation Loc); 1210 1211 /// Build a new template name given a nested name specifier, a flag 1212 /// indicating whether the "template" keyword was provided, and the template 1213 /// that the template name refers to. 1214 /// 1215 /// By default, builds the new template name directly. Subclasses may override 1216 /// this routine to provide different behavior. 1217 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1218 bool TemplateKW, 1219 TemplateDecl *Template); 1220 1221 /// Build a new template name given a nested name specifier and the 1222 /// name that is referred to as a template. 1223 /// 1224 /// By default, performs semantic analysis to determine whether the name can 1225 /// be resolved to a specific template, then builds the appropriate kind of 1226 /// template name. Subclasses may override this routine to provide different 1227 /// behavior. 1228 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1229 SourceLocation TemplateKWLoc, 1230 const IdentifierInfo &Name, 1231 SourceLocation NameLoc, QualType ObjectType, 1232 NamedDecl *FirstQualifierInScope, 1233 bool AllowInjectedClassName); 1234 1235 /// Build a new template name given a nested name specifier and the 1236 /// overloaded operator name that is referred to as a template. 1237 /// 1238 /// By default, performs semantic analysis to determine whether the name can 1239 /// be resolved to a specific template, then builds the appropriate kind of 1240 /// template name. Subclasses may override this routine to provide different 1241 /// behavior. 1242 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1243 SourceLocation TemplateKWLoc, 1244 OverloadedOperatorKind Operator, 1245 SourceLocation NameLoc, QualType ObjectType, 1246 bool AllowInjectedClassName); 1247 1248 /// Build a new template name given a template template parameter pack 1249 /// and the 1250 /// 1251 /// By default, performs semantic analysis to determine whether the name can 1252 /// be resolved to a specific template, then builds the appropriate kind of 1253 /// template name. Subclasses may override this routine to provide different 1254 /// behavior. 1255 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1256 const TemplateArgument &ArgPack) { 1257 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1258 } 1259 1260 /// Build a new compound statement. 1261 /// 1262 /// By default, performs semantic analysis to build the new statement. 1263 /// Subclasses may override this routine to provide different behavior. 1264 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1265 MultiStmtArg Statements, 1266 SourceLocation RBraceLoc, 1267 bool IsStmtExpr) { 1268 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1269 IsStmtExpr); 1270 } 1271 1272 /// Build a new case statement. 1273 /// 1274 /// By default, performs semantic analysis to build the new statement. 1275 /// Subclasses may override this routine to provide different behavior. 1276 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1277 Expr *LHS, 1278 SourceLocation EllipsisLoc, 1279 Expr *RHS, 1280 SourceLocation ColonLoc) { 1281 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1282 ColonLoc); 1283 } 1284 1285 /// Attach the body to a new case statement. 1286 /// 1287 /// By default, performs semantic analysis to build the new statement. 1288 /// Subclasses may override this routine to provide different behavior. 1289 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1290 getSema().ActOnCaseStmtBody(S, Body); 1291 return S; 1292 } 1293 1294 /// Build a new default statement. 1295 /// 1296 /// By default, performs semantic analysis to build the new statement. 1297 /// Subclasses may override this routine to provide different behavior. 1298 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1299 SourceLocation ColonLoc, 1300 Stmt *SubStmt) { 1301 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1302 /*CurScope=*/nullptr); 1303 } 1304 1305 /// Build a new label statement. 1306 /// 1307 /// By default, performs semantic analysis to build the new statement. 1308 /// Subclasses may override this routine to provide different behavior. 1309 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1310 SourceLocation ColonLoc, Stmt *SubStmt) { 1311 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1312 } 1313 1314 /// Build a new attributed statement. 1315 /// 1316 /// By default, performs semantic analysis to build the new statement. 1317 /// Subclasses may override this routine to provide different behavior. 1318 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1319 ArrayRef<const Attr *> Attrs, 1320 Stmt *SubStmt) { 1321 return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt); 1322 } 1323 1324 /// Build a new "if" 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 RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind, 1329 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1330 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1331 SourceLocation ElseLoc, Stmt *Else) { 1332 return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc, 1333 Then, ElseLoc, Else); 1334 } 1335 1336 /// Start building a new switch 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 RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1341 SourceLocation LParenLoc, Stmt *Init, 1342 Sema::ConditionResult Cond, 1343 SourceLocation RParenLoc) { 1344 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1345 RParenLoc); 1346 } 1347 1348 /// Attach the body to the switch statement. 1349 /// 1350 /// By default, performs semantic analysis to build the new statement. 1351 /// Subclasses may override this routine to provide different behavior. 1352 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1353 Stmt *Switch, Stmt *Body) { 1354 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1355 } 1356 1357 /// Build a new while statement. 1358 /// 1359 /// By default, performs semantic analysis to build the new statement. 1360 /// Subclasses may override this routine to provide different behavior. 1361 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1362 Sema::ConditionResult Cond, 1363 SourceLocation RParenLoc, Stmt *Body) { 1364 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1365 } 1366 1367 /// Build a new do-while statement. 1368 /// 1369 /// By default, performs semantic analysis to build the new statement. 1370 /// Subclasses may override this routine to provide different behavior. 1371 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1372 SourceLocation WhileLoc, SourceLocation LParenLoc, 1373 Expr *Cond, SourceLocation RParenLoc) { 1374 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1375 Cond, RParenLoc); 1376 } 1377 1378 /// Build a new for 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 RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1383 Stmt *Init, Sema::ConditionResult Cond, 1384 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1385 Stmt *Body) { 1386 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1387 Inc, RParenLoc, Body); 1388 } 1389 1390 /// Build a new goto 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 RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1395 LabelDecl *Label) { 1396 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1397 } 1398 1399 /// Build a new indirect goto statement. 1400 /// 1401 /// By default, performs semantic analysis to build the new statement. 1402 /// Subclasses may override this routine to provide different behavior. 1403 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1404 SourceLocation StarLoc, 1405 Expr *Target) { 1406 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1407 } 1408 1409 /// Build a new return statement. 1410 /// 1411 /// By default, performs semantic analysis to build the new statement. 1412 /// Subclasses may override this routine to provide different behavior. 1413 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1414 return getSema().BuildReturnStmt(ReturnLoc, Result); 1415 } 1416 1417 /// Build a new declaration statement. 1418 /// 1419 /// By default, performs semantic analysis to build the new statement. 1420 /// Subclasses may override this routine to provide different behavior. 1421 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1422 SourceLocation StartLoc, SourceLocation EndLoc) { 1423 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1424 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1425 } 1426 1427 /// Build a new inline asm statement. 1428 /// 1429 /// By default, performs semantic analysis to build the new statement. 1430 /// Subclasses may override this routine to provide different behavior. 1431 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1432 bool IsVolatile, unsigned NumOutputs, 1433 unsigned NumInputs, IdentifierInfo **Names, 1434 MultiExprArg Constraints, MultiExprArg Exprs, 1435 Expr *AsmString, MultiExprArg Clobbers, 1436 unsigned NumLabels, 1437 SourceLocation RParenLoc) { 1438 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1439 NumInputs, Names, Constraints, Exprs, 1440 AsmString, Clobbers, NumLabels, RParenLoc); 1441 } 1442 1443 /// Build a new MS style inline asm statement. 1444 /// 1445 /// By default, performs semantic analysis to build the new statement. 1446 /// Subclasses may override this routine to provide different behavior. 1447 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1448 ArrayRef<Token> AsmToks, 1449 StringRef AsmString, 1450 unsigned NumOutputs, unsigned NumInputs, 1451 ArrayRef<StringRef> Constraints, 1452 ArrayRef<StringRef> Clobbers, 1453 ArrayRef<Expr*> Exprs, 1454 SourceLocation EndLoc) { 1455 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1456 NumOutputs, NumInputs, 1457 Constraints, Clobbers, Exprs, EndLoc); 1458 } 1459 1460 /// Build a new co_return statement. 1461 /// 1462 /// By default, performs semantic analysis to build the new statement. 1463 /// Subclasses may override this routine to provide different behavior. 1464 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1465 bool IsImplicit) { 1466 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1467 } 1468 1469 /// Build a new co_await expression. 1470 /// 1471 /// By default, performs semantic analysis to build the new expression. 1472 /// Subclasses may override this routine to provide different behavior. 1473 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1474 bool IsImplicit) { 1475 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1476 } 1477 1478 /// Build a new co_await expression. 1479 /// 1480 /// By default, performs semantic analysis to build the new expression. 1481 /// Subclasses may override this routine to provide different behavior. 1482 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1483 Expr *Result, 1484 UnresolvedLookupExpr *Lookup) { 1485 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1486 } 1487 1488 /// Build a new co_yield expression. 1489 /// 1490 /// By default, performs semantic analysis to build the new expression. 1491 /// Subclasses may override this routine to provide different behavior. 1492 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1493 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1494 } 1495 1496 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1497 return getSema().BuildCoroutineBodyStmt(Args); 1498 } 1499 1500 /// Build a new Objective-C \@try statement. 1501 /// 1502 /// By default, performs semantic analysis to build the new statement. 1503 /// Subclasses may override this routine to provide different behavior. 1504 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1505 Stmt *TryBody, 1506 MultiStmtArg CatchStmts, 1507 Stmt *Finally) { 1508 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1509 Finally); 1510 } 1511 1512 /// Rebuild an Objective-C exception declaration. 1513 /// 1514 /// By default, performs semantic analysis to build the new declaration. 1515 /// Subclasses may override this routine to provide different behavior. 1516 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1517 TypeSourceInfo *TInfo, QualType T) { 1518 return getSema().BuildObjCExceptionDecl(TInfo, T, 1519 ExceptionDecl->getInnerLocStart(), 1520 ExceptionDecl->getLocation(), 1521 ExceptionDecl->getIdentifier()); 1522 } 1523 1524 /// Build a new Objective-C \@catch statement. 1525 /// 1526 /// By default, performs semantic analysis to build the new statement. 1527 /// Subclasses may override this routine to provide different behavior. 1528 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1529 SourceLocation RParenLoc, 1530 VarDecl *Var, 1531 Stmt *Body) { 1532 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1533 Var, Body); 1534 } 1535 1536 /// Build a new Objective-C \@finally statement. 1537 /// 1538 /// By default, performs semantic analysis to build the new statement. 1539 /// Subclasses may override this routine to provide different behavior. 1540 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1541 Stmt *Body) { 1542 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1543 } 1544 1545 /// Build a new Objective-C \@throw statement. 1546 /// 1547 /// By default, performs semantic analysis to build the new statement. 1548 /// Subclasses may override this routine to provide different behavior. 1549 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1550 Expr *Operand) { 1551 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1552 } 1553 1554 /// Build a new OpenMP Canonical loop. 1555 /// 1556 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1557 /// OMPCanonicalLoop. 1558 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1559 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1560 } 1561 1562 /// Build a new OpenMP executable directive. 1563 /// 1564 /// By default, performs semantic analysis to build the new statement. 1565 /// Subclasses may override this routine to provide different behavior. 1566 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1567 DeclarationNameInfo DirName, 1568 OpenMPDirectiveKind CancelRegion, 1569 ArrayRef<OMPClause *> Clauses, 1570 Stmt *AStmt, SourceLocation StartLoc, 1571 SourceLocation EndLoc) { 1572 return getSema().ActOnOpenMPExecutableDirective( 1573 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1574 } 1575 1576 /// Build a new OpenMP 'if' clause. 1577 /// 1578 /// By default, performs semantic analysis to build the new OpenMP clause. 1579 /// Subclasses may override this routine to provide different behavior. 1580 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1581 Expr *Condition, SourceLocation StartLoc, 1582 SourceLocation LParenLoc, 1583 SourceLocation NameModifierLoc, 1584 SourceLocation ColonLoc, 1585 SourceLocation EndLoc) { 1586 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1587 LParenLoc, NameModifierLoc, ColonLoc, 1588 EndLoc); 1589 } 1590 1591 /// Build a new OpenMP 'final' clause. 1592 /// 1593 /// By default, performs semantic analysis to build the new OpenMP clause. 1594 /// Subclasses may override this routine to provide different behavior. 1595 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1596 SourceLocation LParenLoc, 1597 SourceLocation EndLoc) { 1598 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1599 EndLoc); 1600 } 1601 1602 /// Build a new OpenMP 'num_threads' clause. 1603 /// 1604 /// By default, performs semantic analysis to build the new OpenMP clause. 1605 /// Subclasses may override this routine to provide different behavior. 1606 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1607 SourceLocation StartLoc, 1608 SourceLocation LParenLoc, 1609 SourceLocation EndLoc) { 1610 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1611 LParenLoc, EndLoc); 1612 } 1613 1614 /// Build a new OpenMP 'safelen' clause. 1615 /// 1616 /// By default, performs semantic analysis to build the new OpenMP clause. 1617 /// Subclasses may override this routine to provide different behavior. 1618 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1619 SourceLocation LParenLoc, 1620 SourceLocation EndLoc) { 1621 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1622 } 1623 1624 /// Build a new OpenMP 'simdlen' clause. 1625 /// 1626 /// By default, performs semantic analysis to build the new OpenMP clause. 1627 /// Subclasses may override this routine to provide different behavior. 1628 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1629 SourceLocation LParenLoc, 1630 SourceLocation EndLoc) { 1631 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1632 } 1633 1634 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1635 SourceLocation StartLoc, 1636 SourceLocation LParenLoc, 1637 SourceLocation EndLoc) { 1638 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1639 } 1640 1641 /// Build a new OpenMP 'full' clause. 1642 OMPClause *RebuildOMPFullClause(SourceLocation StartLoc, 1643 SourceLocation EndLoc) { 1644 return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc); 1645 } 1646 1647 /// Build a new OpenMP 'partial' clause. 1648 OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc, 1649 SourceLocation LParenLoc, 1650 SourceLocation EndLoc) { 1651 return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc, 1652 EndLoc); 1653 } 1654 1655 /// Build a new OpenMP 'allocator' clause. 1656 /// 1657 /// By default, performs semantic analysis to build the new OpenMP clause. 1658 /// Subclasses may override this routine to provide different behavior. 1659 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1660 SourceLocation LParenLoc, 1661 SourceLocation EndLoc) { 1662 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1663 } 1664 1665 /// Build a new OpenMP 'collapse' clause. 1666 /// 1667 /// By default, performs semantic analysis to build the new OpenMP clause. 1668 /// Subclasses may override this routine to provide different behavior. 1669 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1670 SourceLocation LParenLoc, 1671 SourceLocation EndLoc) { 1672 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1673 EndLoc); 1674 } 1675 1676 /// Build a new OpenMP 'default' clause. 1677 /// 1678 /// By default, performs semantic analysis to build the new OpenMP clause. 1679 /// Subclasses may override this routine to provide different behavior. 1680 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1681 SourceLocation StartLoc, 1682 SourceLocation LParenLoc, 1683 SourceLocation EndLoc) { 1684 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1685 StartLoc, LParenLoc, EndLoc); 1686 } 1687 1688 /// Build a new OpenMP 'proc_bind' 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 *RebuildOMPProcBindClause(ProcBindKind Kind, 1693 SourceLocation KindKwLoc, 1694 SourceLocation StartLoc, 1695 SourceLocation LParenLoc, 1696 SourceLocation EndLoc) { 1697 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1698 StartLoc, LParenLoc, EndLoc); 1699 } 1700 1701 /// Build a new OpenMP 'schedule' clause. 1702 /// 1703 /// By default, performs semantic analysis to build the new OpenMP clause. 1704 /// Subclasses may override this routine to provide different behavior. 1705 OMPClause *RebuildOMPScheduleClause( 1706 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1707 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1708 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1709 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1710 return getSema().ActOnOpenMPScheduleClause( 1711 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1712 CommaLoc, EndLoc); 1713 } 1714 1715 /// Build a new OpenMP 'ordered' clause. 1716 /// 1717 /// By default, performs semantic analysis to build the new OpenMP clause. 1718 /// Subclasses may override this routine to provide different behavior. 1719 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1720 SourceLocation EndLoc, 1721 SourceLocation LParenLoc, Expr *Num) { 1722 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1723 } 1724 1725 /// Build a new OpenMP 'private' clause. 1726 /// 1727 /// By default, performs semantic analysis to build the new OpenMP clause. 1728 /// Subclasses may override this routine to provide different behavior. 1729 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1730 SourceLocation StartLoc, 1731 SourceLocation LParenLoc, 1732 SourceLocation EndLoc) { 1733 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1734 EndLoc); 1735 } 1736 1737 /// Build a new OpenMP 'firstprivate' clause. 1738 /// 1739 /// By default, performs semantic analysis to build the new OpenMP clause. 1740 /// Subclasses may override this routine to provide different behavior. 1741 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1742 SourceLocation StartLoc, 1743 SourceLocation LParenLoc, 1744 SourceLocation EndLoc) { 1745 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1746 EndLoc); 1747 } 1748 1749 /// Build a new OpenMP 'lastprivate' clause. 1750 /// 1751 /// By default, performs semantic analysis to build the new OpenMP clause. 1752 /// Subclasses may override this routine to provide different behavior. 1753 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1754 OpenMPLastprivateModifier LPKind, 1755 SourceLocation LPKindLoc, 1756 SourceLocation ColonLoc, 1757 SourceLocation StartLoc, 1758 SourceLocation LParenLoc, 1759 SourceLocation EndLoc) { 1760 return getSema().ActOnOpenMPLastprivateClause( 1761 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1762 } 1763 1764 /// Build a new OpenMP 'shared' clause. 1765 /// 1766 /// By default, performs semantic analysis to build the new OpenMP clause. 1767 /// Subclasses may override this routine to provide different behavior. 1768 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1769 SourceLocation StartLoc, 1770 SourceLocation LParenLoc, 1771 SourceLocation EndLoc) { 1772 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1773 EndLoc); 1774 } 1775 1776 /// Build a new OpenMP 'reduction' clause. 1777 /// 1778 /// By default, performs semantic analysis to build the new statement. 1779 /// Subclasses may override this routine to provide different behavior. 1780 OMPClause *RebuildOMPReductionClause( 1781 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1782 SourceLocation StartLoc, SourceLocation LParenLoc, 1783 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1784 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1785 const DeclarationNameInfo &ReductionId, 1786 ArrayRef<Expr *> UnresolvedReductions) { 1787 return getSema().ActOnOpenMPReductionClause( 1788 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1789 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1790 } 1791 1792 /// Build a new OpenMP 'task_reduction' clause. 1793 /// 1794 /// By default, performs semantic analysis to build the new statement. 1795 /// Subclasses may override this routine to provide different behavior. 1796 OMPClause *RebuildOMPTaskReductionClause( 1797 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1798 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1799 CXXScopeSpec &ReductionIdScopeSpec, 1800 const DeclarationNameInfo &ReductionId, 1801 ArrayRef<Expr *> UnresolvedReductions) { 1802 return getSema().ActOnOpenMPTaskReductionClause( 1803 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1804 ReductionId, UnresolvedReductions); 1805 } 1806 1807 /// Build a new OpenMP 'in_reduction' clause. 1808 /// 1809 /// By default, performs semantic analysis to build the new statement. 1810 /// Subclasses may override this routine to provide different behavior. 1811 OMPClause * 1812 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1813 SourceLocation LParenLoc, SourceLocation ColonLoc, 1814 SourceLocation EndLoc, 1815 CXXScopeSpec &ReductionIdScopeSpec, 1816 const DeclarationNameInfo &ReductionId, 1817 ArrayRef<Expr *> UnresolvedReductions) { 1818 return getSema().ActOnOpenMPInReductionClause( 1819 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1820 ReductionId, UnresolvedReductions); 1821 } 1822 1823 /// Build a new OpenMP 'linear' 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 *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1828 SourceLocation StartLoc, 1829 SourceLocation LParenLoc, 1830 OpenMPLinearClauseKind Modifier, 1831 SourceLocation ModifierLoc, 1832 SourceLocation ColonLoc, 1833 SourceLocation EndLoc) { 1834 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1835 Modifier, ModifierLoc, ColonLoc, 1836 EndLoc); 1837 } 1838 1839 /// Build a new OpenMP 'aligned' clause. 1840 /// 1841 /// By default, performs semantic analysis to build the new OpenMP clause. 1842 /// Subclasses may override this routine to provide different behavior. 1843 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1844 SourceLocation StartLoc, 1845 SourceLocation LParenLoc, 1846 SourceLocation ColonLoc, 1847 SourceLocation EndLoc) { 1848 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1849 LParenLoc, ColonLoc, EndLoc); 1850 } 1851 1852 /// Build a new OpenMP 'copyin' clause. 1853 /// 1854 /// By default, performs semantic analysis to build the new OpenMP clause. 1855 /// Subclasses may override this routine to provide different behavior. 1856 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1857 SourceLocation StartLoc, 1858 SourceLocation LParenLoc, 1859 SourceLocation EndLoc) { 1860 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1861 EndLoc); 1862 } 1863 1864 /// Build a new OpenMP 'copyprivate' clause. 1865 /// 1866 /// By default, performs semantic analysis to build the new OpenMP clause. 1867 /// Subclasses may override this routine to provide different behavior. 1868 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1869 SourceLocation StartLoc, 1870 SourceLocation LParenLoc, 1871 SourceLocation EndLoc) { 1872 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1873 EndLoc); 1874 } 1875 1876 /// Build a new OpenMP 'flush' pseudo clause. 1877 /// 1878 /// By default, performs semantic analysis to build the new OpenMP clause. 1879 /// Subclasses may override this routine to provide different behavior. 1880 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1881 SourceLocation StartLoc, 1882 SourceLocation LParenLoc, 1883 SourceLocation EndLoc) { 1884 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1885 EndLoc); 1886 } 1887 1888 /// Build a new OpenMP 'depobj' pseudo clause. 1889 /// 1890 /// By default, performs semantic analysis to build the new OpenMP clause. 1891 /// Subclasses may override this routine to provide different behavior. 1892 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1893 SourceLocation LParenLoc, 1894 SourceLocation EndLoc) { 1895 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1896 EndLoc); 1897 } 1898 1899 /// Build a new OpenMP 'depend' pseudo clause. 1900 /// 1901 /// By default, performs semantic analysis to build the new OpenMP clause. 1902 /// Subclasses may override this routine to provide different behavior. 1903 OMPClause * 1904 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1905 SourceLocation DepLoc, SourceLocation ColonLoc, 1906 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1907 SourceLocation LParenLoc, SourceLocation EndLoc) { 1908 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1909 ColonLoc, VarList, StartLoc, 1910 LParenLoc, EndLoc); 1911 } 1912 1913 /// Build a new OpenMP 'device' clause. 1914 /// 1915 /// By default, performs semantic analysis to build the new statement. 1916 /// Subclasses may override this routine to provide different behavior. 1917 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1918 Expr *Device, SourceLocation StartLoc, 1919 SourceLocation LParenLoc, 1920 SourceLocation ModifierLoc, 1921 SourceLocation EndLoc) { 1922 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1923 LParenLoc, ModifierLoc, EndLoc); 1924 } 1925 1926 /// Build a new OpenMP 'map' clause. 1927 /// 1928 /// By default, performs semantic analysis to build the new OpenMP clause. 1929 /// Subclasses may override this routine to provide different behavior. 1930 OMPClause *RebuildOMPMapClause( 1931 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1932 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1933 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1934 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1935 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1936 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1937 return getSema().ActOnOpenMPMapClause( 1938 MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId, 1939 MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs, 1940 /*NoDiagnose=*/false, UnresolvedMappers); 1941 } 1942 1943 /// Build a new OpenMP 'allocate' clause. 1944 /// 1945 /// By default, performs semantic analysis to build the new OpenMP clause. 1946 /// Subclasses may override this routine to provide different behavior. 1947 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1948 SourceLocation StartLoc, 1949 SourceLocation LParenLoc, 1950 SourceLocation ColonLoc, 1951 SourceLocation EndLoc) { 1952 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1953 LParenLoc, ColonLoc, EndLoc); 1954 } 1955 1956 /// Build a new OpenMP 'num_teams' clause. 1957 /// 1958 /// By default, performs semantic analysis to build the new statement. 1959 /// Subclasses may override this routine to provide different behavior. 1960 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1961 SourceLocation LParenLoc, 1962 SourceLocation EndLoc) { 1963 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1964 EndLoc); 1965 } 1966 1967 /// Build a new OpenMP 'thread_limit' clause. 1968 /// 1969 /// By default, performs semantic analysis to build the new statement. 1970 /// Subclasses may override this routine to provide different behavior. 1971 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1972 SourceLocation StartLoc, 1973 SourceLocation LParenLoc, 1974 SourceLocation EndLoc) { 1975 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1976 LParenLoc, EndLoc); 1977 } 1978 1979 /// Build a new OpenMP 'priority' clause. 1980 /// 1981 /// By default, performs semantic analysis to build the new statement. 1982 /// Subclasses may override this routine to provide different behavior. 1983 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1984 SourceLocation LParenLoc, 1985 SourceLocation EndLoc) { 1986 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1987 EndLoc); 1988 } 1989 1990 /// Build a new OpenMP 'grainsize' clause. 1991 /// 1992 /// By default, performs semantic analysis to build the new statement. 1993 /// Subclasses may override this routine to provide different behavior. 1994 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1995 SourceLocation LParenLoc, 1996 SourceLocation EndLoc) { 1997 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1998 EndLoc); 1999 } 2000 2001 /// Build a new OpenMP 'num_tasks' clause. 2002 /// 2003 /// By default, performs semantic analysis to build the new statement. 2004 /// Subclasses may override this routine to provide different behavior. 2005 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 2006 SourceLocation LParenLoc, 2007 SourceLocation EndLoc) { 2008 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 2009 EndLoc); 2010 } 2011 2012 /// Build a new OpenMP 'hint' clause. 2013 /// 2014 /// By default, performs semantic analysis to build the new statement. 2015 /// Subclasses may override this routine to provide different behavior. 2016 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 2017 SourceLocation LParenLoc, 2018 SourceLocation EndLoc) { 2019 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2020 } 2021 2022 /// Build a new OpenMP 'detach' clause. 2023 /// 2024 /// By default, performs semantic analysis to build the new statement. 2025 /// Subclasses may override this routine to provide different behavior. 2026 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2027 SourceLocation LParenLoc, 2028 SourceLocation EndLoc) { 2029 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2030 } 2031 2032 /// Build a new OpenMP 'dist_schedule' clause. 2033 /// 2034 /// By default, performs semantic analysis to build the new OpenMP clause. 2035 /// Subclasses may override this routine to provide different behavior. 2036 OMPClause * 2037 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2038 Expr *ChunkSize, SourceLocation StartLoc, 2039 SourceLocation LParenLoc, SourceLocation KindLoc, 2040 SourceLocation CommaLoc, SourceLocation EndLoc) { 2041 return getSema().ActOnOpenMPDistScheduleClause( 2042 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2043 } 2044 2045 /// Build a new OpenMP 'to' clause. 2046 /// 2047 /// By default, performs semantic analysis to build the new statement. 2048 /// Subclasses may override this routine to provide different behavior. 2049 OMPClause * 2050 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2051 ArrayRef<SourceLocation> MotionModifiersLoc, 2052 CXXScopeSpec &MapperIdScopeSpec, 2053 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2054 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2055 ArrayRef<Expr *> UnresolvedMappers) { 2056 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2057 MapperIdScopeSpec, MapperId, ColonLoc, 2058 VarList, Locs, UnresolvedMappers); 2059 } 2060 2061 /// Build a new OpenMP 'from' clause. 2062 /// 2063 /// By default, performs semantic analysis to build the new statement. 2064 /// Subclasses may override this routine to provide different behavior. 2065 OMPClause * 2066 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2067 ArrayRef<SourceLocation> MotionModifiersLoc, 2068 CXXScopeSpec &MapperIdScopeSpec, 2069 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2070 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2071 ArrayRef<Expr *> UnresolvedMappers) { 2072 return getSema().ActOnOpenMPFromClause( 2073 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2074 ColonLoc, VarList, Locs, UnresolvedMappers); 2075 } 2076 2077 /// Build a new OpenMP 'use_device_ptr' clause. 2078 /// 2079 /// By default, performs semantic analysis to build the new OpenMP clause. 2080 /// Subclasses may override this routine to provide different behavior. 2081 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2082 const OMPVarListLocTy &Locs) { 2083 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2084 } 2085 2086 /// Build a new OpenMP 'use_device_addr' clause. 2087 /// 2088 /// By default, performs semantic analysis to build the new OpenMP clause. 2089 /// Subclasses may override this routine to provide different behavior. 2090 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2091 const OMPVarListLocTy &Locs) { 2092 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2093 } 2094 2095 /// Build a new OpenMP 'is_device_ptr' clause. 2096 /// 2097 /// By default, performs semantic analysis to build the new OpenMP clause. 2098 /// Subclasses may override this routine to provide different behavior. 2099 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2100 const OMPVarListLocTy &Locs) { 2101 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2102 } 2103 2104 /// Build a new OpenMP 'defaultmap' clause. 2105 /// 2106 /// By default, performs semantic analysis to build the new OpenMP clause. 2107 /// Subclasses may override this routine to provide different behavior. 2108 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2109 OpenMPDefaultmapClauseKind Kind, 2110 SourceLocation StartLoc, 2111 SourceLocation LParenLoc, 2112 SourceLocation MLoc, 2113 SourceLocation KindLoc, 2114 SourceLocation EndLoc) { 2115 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2116 MLoc, KindLoc, EndLoc); 2117 } 2118 2119 /// Build a new OpenMP 'nontemporal' clause. 2120 /// 2121 /// By default, performs semantic analysis to build the new OpenMP clause. 2122 /// Subclasses may override this routine to provide different behavior. 2123 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2124 SourceLocation StartLoc, 2125 SourceLocation LParenLoc, 2126 SourceLocation EndLoc) { 2127 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2128 EndLoc); 2129 } 2130 2131 /// Build a new OpenMP 'inclusive' clause. 2132 /// 2133 /// By default, performs semantic analysis to build the new OpenMP clause. 2134 /// Subclasses may override this routine to provide different behavior. 2135 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2136 SourceLocation StartLoc, 2137 SourceLocation LParenLoc, 2138 SourceLocation EndLoc) { 2139 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2140 EndLoc); 2141 } 2142 2143 /// Build a new OpenMP 'exclusive' clause. 2144 /// 2145 /// By default, performs semantic analysis to build the new OpenMP clause. 2146 /// Subclasses may override this routine to provide different behavior. 2147 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2148 SourceLocation StartLoc, 2149 SourceLocation LParenLoc, 2150 SourceLocation EndLoc) { 2151 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2152 EndLoc); 2153 } 2154 2155 /// Build a new OpenMP 'uses_allocators' clause. 2156 /// 2157 /// By default, performs semantic analysis to build the new OpenMP clause. 2158 /// Subclasses may override this routine to provide different behavior. 2159 OMPClause *RebuildOMPUsesAllocatorsClause( 2160 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2161 SourceLocation LParenLoc, SourceLocation EndLoc) { 2162 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2163 Data); 2164 } 2165 2166 /// Build a new OpenMP 'affinity' clause. 2167 /// 2168 /// By default, performs semantic analysis to build the new OpenMP clause. 2169 /// Subclasses may override this routine to provide different behavior. 2170 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2171 SourceLocation LParenLoc, 2172 SourceLocation ColonLoc, 2173 SourceLocation EndLoc, Expr *Modifier, 2174 ArrayRef<Expr *> Locators) { 2175 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2176 EndLoc, Modifier, Locators); 2177 } 2178 2179 /// Build a new OpenMP 'order' clause. 2180 /// 2181 /// By default, performs semantic analysis to build the new OpenMP clause. 2182 /// Subclasses may override this routine to provide different behavior. 2183 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2184 SourceLocation KindKwLoc, 2185 SourceLocation StartLoc, 2186 SourceLocation LParenLoc, 2187 SourceLocation EndLoc) { 2188 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2189 LParenLoc, EndLoc); 2190 } 2191 2192 /// Build a new OpenMP 'init' 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 *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2197 bool IsTarget, bool IsTargetSync, 2198 SourceLocation StartLoc, 2199 SourceLocation LParenLoc, 2200 SourceLocation VarLoc, 2201 SourceLocation EndLoc) { 2202 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2203 IsTargetSync, StartLoc, LParenLoc, 2204 VarLoc, EndLoc); 2205 } 2206 2207 /// Build a new OpenMP 'use' clause. 2208 /// 2209 /// By default, performs semantic analysis to build the new OpenMP clause. 2210 /// Subclasses may override this routine to provide different behavior. 2211 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2212 SourceLocation LParenLoc, 2213 SourceLocation VarLoc, SourceLocation EndLoc) { 2214 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2215 VarLoc, EndLoc); 2216 } 2217 2218 /// Build a new OpenMP 'destroy' clause. 2219 /// 2220 /// By default, performs semantic analysis to build the new OpenMP clause. 2221 /// Subclasses may override this routine to provide different behavior. 2222 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2223 SourceLocation LParenLoc, 2224 SourceLocation VarLoc, 2225 SourceLocation EndLoc) { 2226 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2227 VarLoc, EndLoc); 2228 } 2229 2230 /// Build a new OpenMP 'novariants' clause. 2231 /// 2232 /// By default, performs semantic analysis to build the new OpenMP clause. 2233 /// Subclasses may override this routine to provide different behavior. 2234 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2235 SourceLocation StartLoc, 2236 SourceLocation LParenLoc, 2237 SourceLocation EndLoc) { 2238 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2239 EndLoc); 2240 } 2241 2242 /// Build a new OpenMP 'nocontext' clause. 2243 /// 2244 /// By default, performs semantic analysis to build the new OpenMP clause. 2245 /// Subclasses may override this routine to provide different behavior. 2246 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2247 SourceLocation LParenLoc, 2248 SourceLocation EndLoc) { 2249 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2250 EndLoc); 2251 } 2252 2253 /// Build a new OpenMP 'filter' clause. 2254 /// 2255 /// By default, performs semantic analysis to build the new OpenMP clause. 2256 /// Subclasses may override this routine to provide different behavior. 2257 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2258 SourceLocation LParenLoc, 2259 SourceLocation EndLoc) { 2260 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2261 EndLoc); 2262 } 2263 2264 /// Build a new OpenMP 'bind' clause. 2265 /// 2266 /// By default, performs semantic analysis to build the new OpenMP clause. 2267 /// Subclasses may override this routine to provide different behavior. 2268 OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind, 2269 SourceLocation KindLoc, 2270 SourceLocation StartLoc, 2271 SourceLocation LParenLoc, 2272 SourceLocation EndLoc) { 2273 return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc, 2274 EndLoc); 2275 } 2276 2277 /// Build a new OpenMP 'align' clause. 2278 /// 2279 /// By default, performs semantic analysis to build the new OpenMP clause. 2280 /// Subclasses may override this routine to provide different behavior. 2281 OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc, 2282 SourceLocation LParenLoc, 2283 SourceLocation EndLoc) { 2284 return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc); 2285 } 2286 2287 /// Rebuild the operand to an Objective-C \@synchronized statement. 2288 /// 2289 /// By default, performs semantic analysis to build the new statement. 2290 /// Subclasses may override this routine to provide different behavior. 2291 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2292 Expr *object) { 2293 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2294 } 2295 2296 /// Build a new Objective-C \@synchronized statement. 2297 /// 2298 /// By default, performs semantic analysis to build the new statement. 2299 /// Subclasses may override this routine to provide different behavior. 2300 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2301 Expr *Object, Stmt *Body) { 2302 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2303 } 2304 2305 /// Build a new Objective-C \@autoreleasepool statement. 2306 /// 2307 /// By default, performs semantic analysis to build the new statement. 2308 /// Subclasses may override this routine to provide different behavior. 2309 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2310 Stmt *Body) { 2311 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2312 } 2313 2314 /// Build a new Objective-C fast enumeration statement. 2315 /// 2316 /// By default, performs semantic analysis to build the new statement. 2317 /// Subclasses may override this routine to provide different behavior. 2318 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2319 Stmt *Element, 2320 Expr *Collection, 2321 SourceLocation RParenLoc, 2322 Stmt *Body) { 2323 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2324 Element, 2325 Collection, 2326 RParenLoc); 2327 if (ForEachStmt.isInvalid()) 2328 return StmtError(); 2329 2330 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2331 } 2332 2333 /// Build a new C++ exception declaration. 2334 /// 2335 /// By default, performs semantic analysis to build the new decaration. 2336 /// Subclasses may override this routine to provide different behavior. 2337 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2338 TypeSourceInfo *Declarator, 2339 SourceLocation StartLoc, 2340 SourceLocation IdLoc, 2341 IdentifierInfo *Id) { 2342 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2343 StartLoc, IdLoc, Id); 2344 if (Var) 2345 getSema().CurContext->addDecl(Var); 2346 return Var; 2347 } 2348 2349 /// Build a new C++ catch statement. 2350 /// 2351 /// By default, performs semantic analysis to build the new statement. 2352 /// Subclasses may override this routine to provide different behavior. 2353 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2354 VarDecl *ExceptionDecl, 2355 Stmt *Handler) { 2356 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2357 Handler)); 2358 } 2359 2360 /// Build a new C++ try statement. 2361 /// 2362 /// By default, performs semantic analysis to build the new statement. 2363 /// Subclasses may override this routine to provide different behavior. 2364 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2365 ArrayRef<Stmt *> Handlers) { 2366 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2367 } 2368 2369 /// Build a new C++0x range-based for statement. 2370 /// 2371 /// By default, performs semantic analysis to build the new statement. 2372 /// Subclasses may override this routine to provide different behavior. 2373 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2374 SourceLocation CoawaitLoc, Stmt *Init, 2375 SourceLocation ColonLoc, Stmt *Range, 2376 Stmt *Begin, Stmt *End, Expr *Cond, 2377 Expr *Inc, Stmt *LoopVar, 2378 SourceLocation RParenLoc) { 2379 // If we've just learned that the range is actually an Objective-C 2380 // collection, treat this as an Objective-C fast enumeration loop. 2381 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2382 if (RangeStmt->isSingleDecl()) { 2383 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2384 if (RangeVar->isInvalidDecl()) 2385 return StmtError(); 2386 2387 Expr *RangeExpr = RangeVar->getInit(); 2388 if (!RangeExpr->isTypeDependent() && 2389 RangeExpr->getType()->isObjCObjectPointerType()) { 2390 // FIXME: Support init-statements in Objective-C++20 ranged for 2391 // statement. 2392 if (Init) { 2393 return SemaRef.Diag(Init->getBeginLoc(), 2394 diag::err_objc_for_range_init_stmt) 2395 << Init->getSourceRange(); 2396 } 2397 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2398 RangeExpr, RParenLoc); 2399 } 2400 } 2401 } 2402 } 2403 2404 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2405 Range, Begin, End, Cond, Inc, LoopVar, 2406 RParenLoc, Sema::BFRK_Rebuild); 2407 } 2408 2409 /// Build a new C++0x range-based for statement. 2410 /// 2411 /// By default, performs semantic analysis to build the new statement. 2412 /// Subclasses may override this routine to provide different behavior. 2413 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2414 bool IsIfExists, 2415 NestedNameSpecifierLoc QualifierLoc, 2416 DeclarationNameInfo NameInfo, 2417 Stmt *Nested) { 2418 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2419 QualifierLoc, NameInfo, Nested); 2420 } 2421 2422 /// Attach body to a C++0x range-based for statement. 2423 /// 2424 /// By default, performs semantic analysis to finish the new statement. 2425 /// Subclasses may override this routine to provide different behavior. 2426 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2427 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2428 } 2429 2430 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2431 Stmt *TryBlock, Stmt *Handler) { 2432 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2433 } 2434 2435 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2436 Stmt *Block) { 2437 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2438 } 2439 2440 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2441 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2442 } 2443 2444 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2445 SourceLocation LParen, 2446 SourceLocation RParen, 2447 TypeSourceInfo *TSI) { 2448 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2449 } 2450 2451 /// Build a new predefined expression. 2452 /// 2453 /// By default, performs semantic analysis to build the new expression. 2454 /// Subclasses may override this routine to provide different behavior. 2455 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2456 PredefinedExpr::IdentKind IK) { 2457 return getSema().BuildPredefinedExpr(Loc, IK); 2458 } 2459 2460 /// Build a new expression that references a declaration. 2461 /// 2462 /// By default, performs semantic analysis to build the new expression. 2463 /// Subclasses may override this routine to provide different behavior. 2464 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2465 LookupResult &R, 2466 bool RequiresADL) { 2467 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2468 } 2469 2470 2471 /// Build a new expression that references a declaration. 2472 /// 2473 /// By default, performs semantic analysis to build the new expression. 2474 /// Subclasses may override this routine to provide different behavior. 2475 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2476 ValueDecl *VD, 2477 const DeclarationNameInfo &NameInfo, 2478 NamedDecl *Found, 2479 TemplateArgumentListInfo *TemplateArgs) { 2480 CXXScopeSpec SS; 2481 SS.Adopt(QualifierLoc); 2482 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2483 TemplateArgs); 2484 } 2485 2486 /// Build a new expression in parentheses. 2487 /// 2488 /// By default, performs semantic analysis to build the new expression. 2489 /// Subclasses may override this routine to provide different behavior. 2490 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2491 SourceLocation RParen) { 2492 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2493 } 2494 2495 /// Build a new pseudo-destructor expression. 2496 /// 2497 /// By default, performs semantic analysis to build the new expression. 2498 /// Subclasses may override this routine to provide different behavior. 2499 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2500 SourceLocation OperatorLoc, 2501 bool isArrow, 2502 CXXScopeSpec &SS, 2503 TypeSourceInfo *ScopeType, 2504 SourceLocation CCLoc, 2505 SourceLocation TildeLoc, 2506 PseudoDestructorTypeStorage Destroyed); 2507 2508 /// Build a new unary operator expression. 2509 /// 2510 /// By default, performs semantic analysis to build the new expression. 2511 /// Subclasses may override this routine to provide different behavior. 2512 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2513 UnaryOperatorKind Opc, 2514 Expr *SubExpr) { 2515 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2516 } 2517 2518 /// Build a new builtin offsetof expression. 2519 /// 2520 /// By default, performs semantic analysis to build the new expression. 2521 /// Subclasses may override this routine to provide different behavior. 2522 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2523 TypeSourceInfo *Type, 2524 ArrayRef<Sema::OffsetOfComponent> Components, 2525 SourceLocation RParenLoc) { 2526 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2527 RParenLoc); 2528 } 2529 2530 /// Build a new sizeof, alignof or vec_step expression with a 2531 /// type argument. 2532 /// 2533 /// By default, performs semantic analysis to build the new expression. 2534 /// Subclasses may override this routine to provide different behavior. 2535 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2536 SourceLocation OpLoc, 2537 UnaryExprOrTypeTrait ExprKind, 2538 SourceRange R) { 2539 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2540 } 2541 2542 /// Build a new sizeof, alignof or vec step expression with an 2543 /// expression argument. 2544 /// 2545 /// By default, performs semantic analysis to build the new expression. 2546 /// Subclasses may override this routine to provide different behavior. 2547 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2548 UnaryExprOrTypeTrait ExprKind, 2549 SourceRange R) { 2550 ExprResult Result 2551 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2552 if (Result.isInvalid()) 2553 return ExprError(); 2554 2555 return Result; 2556 } 2557 2558 /// Build a new array subscript expression. 2559 /// 2560 /// By default, performs semantic analysis to build the new expression. 2561 /// Subclasses may override this routine to provide different behavior. 2562 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2563 SourceLocation LBracketLoc, 2564 Expr *RHS, 2565 SourceLocation RBracketLoc) { 2566 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2567 LBracketLoc, RHS, 2568 RBracketLoc); 2569 } 2570 2571 /// Build a new matrix subscript expression. 2572 /// 2573 /// By default, performs semantic analysis to build the new expression. 2574 /// Subclasses may override this routine to provide different behavior. 2575 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2576 Expr *ColumnIdx, 2577 SourceLocation RBracketLoc) { 2578 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2579 RBracketLoc); 2580 } 2581 2582 /// Build a new array section expression. 2583 /// 2584 /// By default, performs semantic analysis to build the new expression. 2585 /// Subclasses may override this routine to provide different behavior. 2586 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2587 Expr *LowerBound, 2588 SourceLocation ColonLocFirst, 2589 SourceLocation ColonLocSecond, 2590 Expr *Length, Expr *Stride, 2591 SourceLocation RBracketLoc) { 2592 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2593 ColonLocFirst, ColonLocSecond, 2594 Length, Stride, RBracketLoc); 2595 } 2596 2597 /// Build a new array shaping expression. 2598 /// 2599 /// By default, performs semantic analysis to build the new expression. 2600 /// Subclasses may override this routine to provide different behavior. 2601 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2602 SourceLocation RParenLoc, 2603 ArrayRef<Expr *> Dims, 2604 ArrayRef<SourceRange> BracketsRanges) { 2605 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2606 BracketsRanges); 2607 } 2608 2609 /// Build a new iterator expression. 2610 /// 2611 /// By default, performs semantic analysis to build the new expression. 2612 /// Subclasses may override this routine to provide different behavior. 2613 ExprResult RebuildOMPIteratorExpr( 2614 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2615 ArrayRef<Sema::OMPIteratorData> Data) { 2616 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2617 LLoc, RLoc, Data); 2618 } 2619 2620 /// Build a new call expression. 2621 /// 2622 /// By default, performs semantic analysis to build the new expression. 2623 /// Subclasses may override this routine to provide different behavior. 2624 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2625 MultiExprArg Args, 2626 SourceLocation RParenLoc, 2627 Expr *ExecConfig = nullptr) { 2628 return getSema().ActOnCallExpr( 2629 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2630 } 2631 2632 ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc, 2633 MultiExprArg Args, 2634 SourceLocation RParenLoc) { 2635 return getSema().ActOnArraySubscriptExpr( 2636 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc); 2637 } 2638 2639 /// Build a new member access expression. 2640 /// 2641 /// By default, performs semantic analysis to build the new expression. 2642 /// Subclasses may override this routine to provide different behavior. 2643 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2644 bool isArrow, 2645 NestedNameSpecifierLoc QualifierLoc, 2646 SourceLocation TemplateKWLoc, 2647 const DeclarationNameInfo &MemberNameInfo, 2648 ValueDecl *Member, 2649 NamedDecl *FoundDecl, 2650 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2651 NamedDecl *FirstQualifierInScope) { 2652 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2653 isArrow); 2654 if (!Member->getDeclName()) { 2655 // We have a reference to an unnamed field. This is always the 2656 // base of an anonymous struct/union member access, i.e. the 2657 // field is always of record type. 2658 assert(Member->getType()->isRecordType() && 2659 "unnamed member not of record type?"); 2660 2661 BaseResult = 2662 getSema().PerformObjectMemberConversion(BaseResult.get(), 2663 QualifierLoc.getNestedNameSpecifier(), 2664 FoundDecl, Member); 2665 if (BaseResult.isInvalid()) 2666 return ExprError(); 2667 Base = BaseResult.get(); 2668 2669 CXXScopeSpec EmptySS; 2670 return getSema().BuildFieldReferenceExpr( 2671 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2672 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2673 } 2674 2675 CXXScopeSpec SS; 2676 SS.Adopt(QualifierLoc); 2677 2678 Base = BaseResult.get(); 2679 QualType BaseType = Base->getType(); 2680 2681 if (isArrow && !BaseType->isPointerType()) 2682 return ExprError(); 2683 2684 // FIXME: this involves duplicating earlier analysis in a lot of 2685 // cases; we should avoid this when possible. 2686 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2687 R.addDecl(FoundDecl); 2688 R.resolveKind(); 2689 2690 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2691 SS, TemplateKWLoc, 2692 FirstQualifierInScope, 2693 R, ExplicitTemplateArgs, 2694 /*S*/nullptr); 2695 } 2696 2697 /// Build a new binary operator expression. 2698 /// 2699 /// By default, performs semantic analysis to build the new expression. 2700 /// Subclasses may override this routine to provide different behavior. 2701 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2702 BinaryOperatorKind Opc, 2703 Expr *LHS, Expr *RHS) { 2704 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2705 } 2706 2707 /// Build a new rewritten operator expression. 2708 /// 2709 /// By default, performs semantic analysis to build the new expression. 2710 /// Subclasses may override this routine to provide different behavior. 2711 ExprResult RebuildCXXRewrittenBinaryOperator( 2712 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2713 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2714 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2715 RHS, /*RequiresADL*/false); 2716 } 2717 2718 /// Build a new conditional operator expression. 2719 /// 2720 /// By default, performs semantic analysis to build the new expression. 2721 /// Subclasses may override this routine to provide different behavior. 2722 ExprResult RebuildConditionalOperator(Expr *Cond, 2723 SourceLocation QuestionLoc, 2724 Expr *LHS, 2725 SourceLocation ColonLoc, 2726 Expr *RHS) { 2727 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2728 LHS, RHS); 2729 } 2730 2731 /// Build a new C-style cast 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 RebuildCStyleCastExpr(SourceLocation LParenLoc, 2736 TypeSourceInfo *TInfo, 2737 SourceLocation RParenLoc, 2738 Expr *SubExpr) { 2739 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2740 SubExpr); 2741 } 2742 2743 /// Build a new compound literal expression. 2744 /// 2745 /// By default, performs semantic analysis to build the new expression. 2746 /// Subclasses may override this routine to provide different behavior. 2747 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2748 TypeSourceInfo *TInfo, 2749 SourceLocation RParenLoc, 2750 Expr *Init) { 2751 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2752 Init); 2753 } 2754 2755 /// Build a new extended vector element access expression. 2756 /// 2757 /// By default, performs semantic analysis to build the new expression. 2758 /// Subclasses may override this routine to provide different behavior. 2759 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2760 SourceLocation OpLoc, 2761 SourceLocation AccessorLoc, 2762 IdentifierInfo &Accessor) { 2763 2764 CXXScopeSpec SS; 2765 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2766 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2767 OpLoc, /*IsArrow*/ false, 2768 SS, SourceLocation(), 2769 /*FirstQualifierInScope*/ nullptr, 2770 NameInfo, 2771 /* TemplateArgs */ nullptr, 2772 /*S*/ nullptr); 2773 } 2774 2775 /// Build a new initializer list expression. 2776 /// 2777 /// By default, performs semantic analysis to build the new expression. 2778 /// Subclasses may override this routine to provide different behavior. 2779 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2780 MultiExprArg Inits, 2781 SourceLocation RBraceLoc) { 2782 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2783 } 2784 2785 /// Build a new designated initializer expression. 2786 /// 2787 /// By default, performs semantic analysis to build the new expression. 2788 /// Subclasses may override this routine to provide different behavior. 2789 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2790 MultiExprArg ArrayExprs, 2791 SourceLocation EqualOrColonLoc, 2792 bool GNUSyntax, 2793 Expr *Init) { 2794 ExprResult Result 2795 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2796 Init); 2797 if (Result.isInvalid()) 2798 return ExprError(); 2799 2800 return Result; 2801 } 2802 2803 /// Build a new value-initialized expression. 2804 /// 2805 /// By default, builds the implicit value initialization without performing 2806 /// any semantic analysis. Subclasses may override this routine to provide 2807 /// different behavior. 2808 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2809 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2810 } 2811 2812 /// Build a new \c va_arg 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 RebuildVAArgExpr(SourceLocation BuiltinLoc, 2817 Expr *SubExpr, TypeSourceInfo *TInfo, 2818 SourceLocation RParenLoc) { 2819 return getSema().BuildVAArgExpr(BuiltinLoc, 2820 SubExpr, TInfo, 2821 RParenLoc); 2822 } 2823 2824 /// Build a new expression list in parentheses. 2825 /// 2826 /// By default, performs semantic analysis to build the new expression. 2827 /// Subclasses may override this routine to provide different behavior. 2828 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2829 MultiExprArg SubExprs, 2830 SourceLocation RParenLoc) { 2831 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2832 } 2833 2834 /// Build a new address-of-label expression. 2835 /// 2836 /// By default, performs semantic analysis, using the name of the label 2837 /// rather than attempting to map the label statement itself. 2838 /// Subclasses may override this routine to provide different behavior. 2839 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2840 SourceLocation LabelLoc, LabelDecl *Label) { 2841 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2842 } 2843 2844 /// Build a new GNU statement expression. 2845 /// 2846 /// By default, performs semantic analysis to build the new expression. 2847 /// Subclasses may override this routine to provide different behavior. 2848 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2849 SourceLocation RParenLoc, unsigned TemplateDepth) { 2850 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2851 TemplateDepth); 2852 } 2853 2854 /// Build a new __builtin_choose_expr expression. 2855 /// 2856 /// By default, performs semantic analysis to build the new expression. 2857 /// Subclasses may override this routine to provide different behavior. 2858 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2859 Expr *Cond, Expr *LHS, Expr *RHS, 2860 SourceLocation RParenLoc) { 2861 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2862 Cond, LHS, RHS, 2863 RParenLoc); 2864 } 2865 2866 /// Build a new generic selection expression. 2867 /// 2868 /// By default, performs semantic analysis to build the new expression. 2869 /// Subclasses may override this routine to provide different behavior. 2870 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2871 SourceLocation DefaultLoc, 2872 SourceLocation RParenLoc, 2873 Expr *ControllingExpr, 2874 ArrayRef<TypeSourceInfo *> Types, 2875 ArrayRef<Expr *> Exprs) { 2876 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2877 ControllingExpr, Types, Exprs); 2878 } 2879 2880 /// Build a new overloaded operator call expression. 2881 /// 2882 /// By default, performs semantic analysis to build the new expression. 2883 /// The semantic analysis provides the behavior of template instantiation, 2884 /// copying with transformations that turn what looks like an overloaded 2885 /// operator call into a use of a builtin operator, performing 2886 /// argument-dependent lookup, etc. Subclasses may override this routine to 2887 /// provide different behavior. 2888 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2889 SourceLocation OpLoc, 2890 Expr *Callee, 2891 Expr *First, 2892 Expr *Second); 2893 2894 /// Build a new C++ "named" cast expression, such as static_cast or 2895 /// reinterpret_cast. 2896 /// 2897 /// By default, this routine dispatches to one of the more-specific routines 2898 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2899 /// Subclasses may override this routine to provide different behavior. 2900 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2901 Stmt::StmtClass Class, 2902 SourceLocation LAngleLoc, 2903 TypeSourceInfo *TInfo, 2904 SourceLocation RAngleLoc, 2905 SourceLocation LParenLoc, 2906 Expr *SubExpr, 2907 SourceLocation RParenLoc) { 2908 switch (Class) { 2909 case Stmt::CXXStaticCastExprClass: 2910 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2911 RAngleLoc, LParenLoc, 2912 SubExpr, RParenLoc); 2913 2914 case Stmt::CXXDynamicCastExprClass: 2915 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2916 RAngleLoc, LParenLoc, 2917 SubExpr, RParenLoc); 2918 2919 case Stmt::CXXReinterpretCastExprClass: 2920 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2921 RAngleLoc, LParenLoc, 2922 SubExpr, 2923 RParenLoc); 2924 2925 case Stmt::CXXConstCastExprClass: 2926 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2927 RAngleLoc, LParenLoc, 2928 SubExpr, RParenLoc); 2929 2930 case Stmt::CXXAddrspaceCastExprClass: 2931 return getDerived().RebuildCXXAddrspaceCastExpr( 2932 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2933 2934 default: 2935 llvm_unreachable("Invalid C++ named cast"); 2936 } 2937 } 2938 2939 /// Build a new C++ static_cast expression. 2940 /// 2941 /// By default, performs semantic analysis to build the new expression. 2942 /// Subclasses may override this routine to provide different behavior. 2943 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2944 SourceLocation LAngleLoc, 2945 TypeSourceInfo *TInfo, 2946 SourceLocation RAngleLoc, 2947 SourceLocation LParenLoc, 2948 Expr *SubExpr, 2949 SourceLocation RParenLoc) { 2950 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2951 TInfo, SubExpr, 2952 SourceRange(LAngleLoc, RAngleLoc), 2953 SourceRange(LParenLoc, RParenLoc)); 2954 } 2955 2956 /// Build a new C++ dynamic_cast expression. 2957 /// 2958 /// By default, performs semantic analysis to build the new expression. 2959 /// Subclasses may override this routine to provide different behavior. 2960 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2961 SourceLocation LAngleLoc, 2962 TypeSourceInfo *TInfo, 2963 SourceLocation RAngleLoc, 2964 SourceLocation LParenLoc, 2965 Expr *SubExpr, 2966 SourceLocation RParenLoc) { 2967 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2968 TInfo, SubExpr, 2969 SourceRange(LAngleLoc, RAngleLoc), 2970 SourceRange(LParenLoc, RParenLoc)); 2971 } 2972 2973 /// Build a new C++ reinterpret_cast expression. 2974 /// 2975 /// By default, performs semantic analysis to build the new expression. 2976 /// Subclasses may override this routine to provide different behavior. 2977 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2978 SourceLocation LAngleLoc, 2979 TypeSourceInfo *TInfo, 2980 SourceLocation RAngleLoc, 2981 SourceLocation LParenLoc, 2982 Expr *SubExpr, 2983 SourceLocation RParenLoc) { 2984 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2985 TInfo, SubExpr, 2986 SourceRange(LAngleLoc, RAngleLoc), 2987 SourceRange(LParenLoc, RParenLoc)); 2988 } 2989 2990 /// Build a new C++ const_cast expression. 2991 /// 2992 /// By default, performs semantic analysis to build the new expression. 2993 /// Subclasses may override this routine to provide different behavior. 2994 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2995 SourceLocation LAngleLoc, 2996 TypeSourceInfo *TInfo, 2997 SourceLocation RAngleLoc, 2998 SourceLocation LParenLoc, 2999 Expr *SubExpr, 3000 SourceLocation RParenLoc) { 3001 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 3002 TInfo, SubExpr, 3003 SourceRange(LAngleLoc, RAngleLoc), 3004 SourceRange(LParenLoc, RParenLoc)); 3005 } 3006 3007 ExprResult 3008 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 3009 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 3010 SourceLocation LParenLoc, Expr *SubExpr, 3011 SourceLocation RParenLoc) { 3012 return getSema().BuildCXXNamedCast( 3013 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 3014 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 3015 } 3016 3017 /// Build a new C++ functional-style cast expression. 3018 /// 3019 /// By default, performs semantic analysis to build the new expression. 3020 /// Subclasses may override this routine to provide different behavior. 3021 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 3022 SourceLocation LParenLoc, 3023 Expr *Sub, 3024 SourceLocation RParenLoc, 3025 bool ListInitialization) { 3026 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3027 MultiExprArg(&Sub, 1), RParenLoc, 3028 ListInitialization); 3029 } 3030 3031 /// Build a new C++ __builtin_bit_cast expression. 3032 /// 3033 /// By default, performs semantic analysis to build the new expression. 3034 /// Subclasses may override this routine to provide different behavior. 3035 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3036 TypeSourceInfo *TSI, Expr *Sub, 3037 SourceLocation RParenLoc) { 3038 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3039 } 3040 3041 /// Build a new C++ typeid(type) expression. 3042 /// 3043 /// By default, performs semantic analysis to build the new expression. 3044 /// Subclasses may override this routine to provide different behavior. 3045 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3046 SourceLocation TypeidLoc, 3047 TypeSourceInfo *Operand, 3048 SourceLocation RParenLoc) { 3049 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3050 RParenLoc); 3051 } 3052 3053 3054 /// Build a new C++ typeid(expr) expression. 3055 /// 3056 /// By default, performs semantic analysis to build the new expression. 3057 /// Subclasses may override this routine to provide different behavior. 3058 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3059 SourceLocation TypeidLoc, 3060 Expr *Operand, 3061 SourceLocation RParenLoc) { 3062 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3063 RParenLoc); 3064 } 3065 3066 /// Build a new C++ __uuidof(type) expression. 3067 /// 3068 /// By default, performs semantic analysis to build the new expression. 3069 /// Subclasses may override this routine to provide different behavior. 3070 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3071 TypeSourceInfo *Operand, 3072 SourceLocation RParenLoc) { 3073 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3074 } 3075 3076 /// Build a new C++ __uuidof(expr) expression. 3077 /// 3078 /// By default, performs semantic analysis to build the new expression. 3079 /// Subclasses may override this routine to provide different behavior. 3080 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3081 Expr *Operand, SourceLocation RParenLoc) { 3082 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3083 } 3084 3085 /// Build a new C++ "this" expression. 3086 /// 3087 /// By default, builds a new "this" expression without performing any 3088 /// semantic analysis. Subclasses may override this routine to provide 3089 /// different behavior. 3090 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3091 QualType ThisType, 3092 bool isImplicit) { 3093 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3094 } 3095 3096 /// Build a new C++ throw expression. 3097 /// 3098 /// By default, performs semantic analysis to build the new expression. 3099 /// Subclasses may override this routine to provide different behavior. 3100 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3101 bool IsThrownVariableInScope) { 3102 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3103 } 3104 3105 /// Build a new C++ default-argument expression. 3106 /// 3107 /// By default, builds a new default-argument expression, which does not 3108 /// require any semantic analysis. Subclasses may override this routine to 3109 /// provide different behavior. 3110 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3111 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3112 getSema().CurContext); 3113 } 3114 3115 /// Build a new C++11 default-initialization expression. 3116 /// 3117 /// By default, builds a new default field initialization expression, which 3118 /// does not require any semantic analysis. Subclasses may override this 3119 /// routine to provide different behavior. 3120 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3121 FieldDecl *Field) { 3122 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3123 getSema().CurContext); 3124 } 3125 3126 /// Build a new C++ zero-initialization expression. 3127 /// 3128 /// By default, performs semantic analysis to build the new expression. 3129 /// Subclasses may override this routine to provide different behavior. 3130 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3131 SourceLocation LParenLoc, 3132 SourceLocation RParenLoc) { 3133 return getSema().BuildCXXTypeConstructExpr( 3134 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3135 } 3136 3137 /// Build a new C++ "new" expression. 3138 /// 3139 /// By default, performs semantic analysis to build the new expression. 3140 /// Subclasses may override this routine to provide different behavior. 3141 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3142 bool UseGlobal, 3143 SourceLocation PlacementLParen, 3144 MultiExprArg PlacementArgs, 3145 SourceLocation PlacementRParen, 3146 SourceRange TypeIdParens, 3147 QualType AllocatedType, 3148 TypeSourceInfo *AllocatedTypeInfo, 3149 Optional<Expr *> ArraySize, 3150 SourceRange DirectInitRange, 3151 Expr *Initializer) { 3152 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3153 PlacementLParen, 3154 PlacementArgs, 3155 PlacementRParen, 3156 TypeIdParens, 3157 AllocatedType, 3158 AllocatedTypeInfo, 3159 ArraySize, 3160 DirectInitRange, 3161 Initializer); 3162 } 3163 3164 /// Build a new C++ "delete" expression. 3165 /// 3166 /// By default, performs semantic analysis to build the new expression. 3167 /// Subclasses may override this routine to provide different behavior. 3168 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3169 bool IsGlobalDelete, 3170 bool IsArrayForm, 3171 Expr *Operand) { 3172 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3173 Operand); 3174 } 3175 3176 /// Build a new type trait 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 RebuildTypeTrait(TypeTrait Trait, 3181 SourceLocation StartLoc, 3182 ArrayRef<TypeSourceInfo *> Args, 3183 SourceLocation RParenLoc) { 3184 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3185 } 3186 3187 /// Build a new array type trait expression. 3188 /// 3189 /// By default, performs semantic analysis to build the new expression. 3190 /// Subclasses may override this routine to provide different behavior. 3191 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3192 SourceLocation StartLoc, 3193 TypeSourceInfo *TSInfo, 3194 Expr *DimExpr, 3195 SourceLocation RParenLoc) { 3196 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3197 } 3198 3199 /// Build a new expression trait expression. 3200 /// 3201 /// By default, performs semantic analysis to build the new expression. 3202 /// Subclasses may override this routine to provide different behavior. 3203 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3204 SourceLocation StartLoc, 3205 Expr *Queried, 3206 SourceLocation RParenLoc) { 3207 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3208 } 3209 3210 /// Build a new (previously unresolved) declaration reference 3211 /// expression. 3212 /// 3213 /// By default, performs semantic analysis to build the new expression. 3214 /// Subclasses may override this routine to provide different behavior. 3215 ExprResult RebuildDependentScopeDeclRefExpr( 3216 NestedNameSpecifierLoc QualifierLoc, 3217 SourceLocation TemplateKWLoc, 3218 const DeclarationNameInfo &NameInfo, 3219 const TemplateArgumentListInfo *TemplateArgs, 3220 bool IsAddressOfOperand, 3221 TypeSourceInfo **RecoveryTSI) { 3222 CXXScopeSpec SS; 3223 SS.Adopt(QualifierLoc); 3224 3225 if (TemplateArgs || TemplateKWLoc.isValid()) 3226 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3227 TemplateArgs); 3228 3229 return getSema().BuildQualifiedDeclarationNameExpr( 3230 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3231 } 3232 3233 /// Build a new template-id expression. 3234 /// 3235 /// By default, performs semantic analysis to build the new expression. 3236 /// Subclasses may override this routine to provide different behavior. 3237 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3238 SourceLocation TemplateKWLoc, 3239 LookupResult &R, 3240 bool RequiresADL, 3241 const TemplateArgumentListInfo *TemplateArgs) { 3242 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3243 TemplateArgs); 3244 } 3245 3246 /// Build a new object-construction expression. 3247 /// 3248 /// By default, performs semantic analysis to build the new expression. 3249 /// Subclasses may override this routine to provide different behavior. 3250 ExprResult RebuildCXXConstructExpr(QualType T, 3251 SourceLocation Loc, 3252 CXXConstructorDecl *Constructor, 3253 bool IsElidable, 3254 MultiExprArg Args, 3255 bool HadMultipleCandidates, 3256 bool ListInitialization, 3257 bool StdInitListInitialization, 3258 bool RequiresZeroInit, 3259 CXXConstructExpr::ConstructionKind ConstructKind, 3260 SourceRange ParenRange) { 3261 // Reconstruct the constructor we originally found, which might be 3262 // different if this is a call to an inherited constructor. 3263 CXXConstructorDecl *FoundCtor = Constructor; 3264 if (Constructor->isInheritingConstructor()) 3265 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3266 3267 SmallVector<Expr *, 8> ConvertedArgs; 3268 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3269 ConvertedArgs)) 3270 return ExprError(); 3271 3272 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3273 IsElidable, 3274 ConvertedArgs, 3275 HadMultipleCandidates, 3276 ListInitialization, 3277 StdInitListInitialization, 3278 RequiresZeroInit, ConstructKind, 3279 ParenRange); 3280 } 3281 3282 /// Build a new implicit construction via inherited constructor 3283 /// expression. 3284 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3285 CXXConstructorDecl *Constructor, 3286 bool ConstructsVBase, 3287 bool InheritedFromVBase) { 3288 return new (getSema().Context) CXXInheritedCtorInitExpr( 3289 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3290 } 3291 3292 /// Build a new object-construction expression. 3293 /// 3294 /// By default, performs semantic analysis to build the new expression. 3295 /// Subclasses may override this routine to provide different behavior. 3296 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3297 SourceLocation LParenOrBraceLoc, 3298 MultiExprArg Args, 3299 SourceLocation RParenOrBraceLoc, 3300 bool ListInitialization) { 3301 return getSema().BuildCXXTypeConstructExpr( 3302 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3303 } 3304 3305 /// Build a new object-construction expression. 3306 /// 3307 /// By default, performs semantic analysis to build the new expression. 3308 /// Subclasses may override this routine to provide different behavior. 3309 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3310 SourceLocation LParenLoc, 3311 MultiExprArg Args, 3312 SourceLocation RParenLoc, 3313 bool ListInitialization) { 3314 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3315 RParenLoc, ListInitialization); 3316 } 3317 3318 /// Build a new member reference expression. 3319 /// 3320 /// By default, performs semantic analysis to build the new expression. 3321 /// Subclasses may override this routine to provide different behavior. 3322 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3323 QualType BaseType, 3324 bool IsArrow, 3325 SourceLocation OperatorLoc, 3326 NestedNameSpecifierLoc QualifierLoc, 3327 SourceLocation TemplateKWLoc, 3328 NamedDecl *FirstQualifierInScope, 3329 const DeclarationNameInfo &MemberNameInfo, 3330 const TemplateArgumentListInfo *TemplateArgs) { 3331 CXXScopeSpec SS; 3332 SS.Adopt(QualifierLoc); 3333 3334 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3335 OperatorLoc, IsArrow, 3336 SS, TemplateKWLoc, 3337 FirstQualifierInScope, 3338 MemberNameInfo, 3339 TemplateArgs, /*S*/nullptr); 3340 } 3341 3342 /// Build a new member reference expression. 3343 /// 3344 /// By default, performs semantic analysis to build the new expression. 3345 /// Subclasses may override this routine to provide different behavior. 3346 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3347 SourceLocation OperatorLoc, 3348 bool IsArrow, 3349 NestedNameSpecifierLoc QualifierLoc, 3350 SourceLocation TemplateKWLoc, 3351 NamedDecl *FirstQualifierInScope, 3352 LookupResult &R, 3353 const TemplateArgumentListInfo *TemplateArgs) { 3354 CXXScopeSpec SS; 3355 SS.Adopt(QualifierLoc); 3356 3357 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3358 OperatorLoc, IsArrow, 3359 SS, TemplateKWLoc, 3360 FirstQualifierInScope, 3361 R, TemplateArgs, /*S*/nullptr); 3362 } 3363 3364 /// Build a new noexcept expression. 3365 /// 3366 /// By default, performs semantic analysis to build the new expression. 3367 /// Subclasses may override this routine to provide different behavior. 3368 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3369 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3370 } 3371 3372 /// Build a new expression to compute the length of a parameter pack. 3373 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3374 NamedDecl *Pack, 3375 SourceLocation PackLoc, 3376 SourceLocation RParenLoc, 3377 Optional<unsigned> Length, 3378 ArrayRef<TemplateArgument> PartialArgs) { 3379 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3380 RParenLoc, Length, PartialArgs); 3381 } 3382 3383 /// Build a new expression representing a call to a source location 3384 /// builtin. 3385 /// 3386 /// By default, performs semantic analysis to build the new expression. 3387 /// Subclasses may override this routine to provide different behavior. 3388 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3389 SourceLocation BuiltinLoc, 3390 SourceLocation RPLoc, 3391 DeclContext *ParentContext) { 3392 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3393 } 3394 3395 /// Build a new Objective-C boxed 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 RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3400 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3401 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3402 TemplateArgumentListInfo *TALI) { 3403 CXXScopeSpec SS; 3404 SS.Adopt(NNS); 3405 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3406 ConceptNameInfo, 3407 FoundDecl, 3408 NamedConcept, TALI); 3409 if (Result.isInvalid()) 3410 return ExprError(); 3411 return Result; 3412 } 3413 3414 /// \brief Build a new requires expression. 3415 /// 3416 /// By default, performs semantic analysis to build the new expression. 3417 /// Subclasses may override this routine to provide different behavior. 3418 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3419 RequiresExprBodyDecl *Body, 3420 ArrayRef<ParmVarDecl *> LocalParameters, 3421 ArrayRef<concepts::Requirement *> Requirements, 3422 SourceLocation ClosingBraceLoc) { 3423 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3424 LocalParameters, Requirements, ClosingBraceLoc); 3425 } 3426 3427 concepts::TypeRequirement * 3428 RebuildTypeRequirement( 3429 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3430 return SemaRef.BuildTypeRequirement(SubstDiag); 3431 } 3432 3433 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3434 return SemaRef.BuildTypeRequirement(T); 3435 } 3436 3437 concepts::ExprRequirement * 3438 RebuildExprRequirement( 3439 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3440 SourceLocation NoexceptLoc, 3441 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3442 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3443 std::move(Ret)); 3444 } 3445 3446 concepts::ExprRequirement * 3447 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3448 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3449 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3450 std::move(Ret)); 3451 } 3452 3453 concepts::NestedRequirement * 3454 RebuildNestedRequirement( 3455 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3456 return SemaRef.BuildNestedRequirement(SubstDiag); 3457 } 3458 3459 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3460 return SemaRef.BuildNestedRequirement(Constraint); 3461 } 3462 3463 /// \brief Build a new Objective-C boxed expression. 3464 /// 3465 /// By default, performs semantic analysis to build the new expression. 3466 /// Subclasses may override this routine to provide different behavior. 3467 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3468 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3469 } 3470 3471 /// Build a new Objective-C array literal. 3472 /// 3473 /// By default, performs semantic analysis to build the new expression. 3474 /// Subclasses may override this routine to provide different behavior. 3475 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3476 Expr **Elements, unsigned NumElements) { 3477 return getSema().BuildObjCArrayLiteral(Range, 3478 MultiExprArg(Elements, NumElements)); 3479 } 3480 3481 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3482 Expr *Base, Expr *Key, 3483 ObjCMethodDecl *getterMethod, 3484 ObjCMethodDecl *setterMethod) { 3485 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3486 getterMethod, setterMethod); 3487 } 3488 3489 /// Build a new Objective-C dictionary literal. 3490 /// 3491 /// By default, performs semantic analysis to build the new expression. 3492 /// Subclasses may override this routine to provide different behavior. 3493 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3494 MutableArrayRef<ObjCDictionaryElement> Elements) { 3495 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3496 } 3497 3498 /// Build a new Objective-C \@encode expression. 3499 /// 3500 /// By default, performs semantic analysis to build the new expression. 3501 /// Subclasses may override this routine to provide different behavior. 3502 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3503 TypeSourceInfo *EncodeTypeInfo, 3504 SourceLocation RParenLoc) { 3505 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3506 } 3507 3508 /// Build a new Objective-C class message. 3509 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3510 Selector Sel, 3511 ArrayRef<SourceLocation> SelectorLocs, 3512 ObjCMethodDecl *Method, 3513 SourceLocation LBracLoc, 3514 MultiExprArg Args, 3515 SourceLocation RBracLoc) { 3516 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3517 ReceiverTypeInfo->getType(), 3518 /*SuperLoc=*/SourceLocation(), 3519 Sel, Method, LBracLoc, SelectorLocs, 3520 RBracLoc, Args); 3521 } 3522 3523 /// Build a new Objective-C instance message. 3524 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3525 Selector Sel, 3526 ArrayRef<SourceLocation> SelectorLocs, 3527 ObjCMethodDecl *Method, 3528 SourceLocation LBracLoc, 3529 MultiExprArg Args, 3530 SourceLocation RBracLoc) { 3531 return SemaRef.BuildInstanceMessage(Receiver, 3532 Receiver->getType(), 3533 /*SuperLoc=*/SourceLocation(), 3534 Sel, Method, LBracLoc, SelectorLocs, 3535 RBracLoc, Args); 3536 } 3537 3538 /// Build a new Objective-C instance/class message to 'super'. 3539 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3540 Selector Sel, 3541 ArrayRef<SourceLocation> SelectorLocs, 3542 QualType SuperType, 3543 ObjCMethodDecl *Method, 3544 SourceLocation LBracLoc, 3545 MultiExprArg Args, 3546 SourceLocation RBracLoc) { 3547 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3548 SuperType, 3549 SuperLoc, 3550 Sel, Method, LBracLoc, SelectorLocs, 3551 RBracLoc, Args) 3552 : SemaRef.BuildClassMessage(nullptr, 3553 SuperType, 3554 SuperLoc, 3555 Sel, Method, LBracLoc, SelectorLocs, 3556 RBracLoc, Args); 3557 3558 3559 } 3560 3561 /// Build a new Objective-C ivar reference expression. 3562 /// 3563 /// By default, performs semantic analysis to build the new expression. 3564 /// Subclasses may override this routine to provide different behavior. 3565 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3566 SourceLocation IvarLoc, 3567 bool IsArrow, bool IsFreeIvar) { 3568 CXXScopeSpec SS; 3569 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3570 ExprResult Result = getSema().BuildMemberReferenceExpr( 3571 BaseArg, BaseArg->getType(), 3572 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3573 /*FirstQualifierInScope=*/nullptr, NameInfo, 3574 /*TemplateArgs=*/nullptr, 3575 /*S=*/nullptr); 3576 if (IsFreeIvar && Result.isUsable()) 3577 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3578 return Result; 3579 } 3580 3581 /// Build a new Objective-C property reference expression. 3582 /// 3583 /// By default, performs semantic analysis to build the new expression. 3584 /// Subclasses may override this routine to provide different behavior. 3585 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3586 ObjCPropertyDecl *Property, 3587 SourceLocation PropertyLoc) { 3588 CXXScopeSpec SS; 3589 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3590 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3591 /*FIXME:*/PropertyLoc, 3592 /*IsArrow=*/false, 3593 SS, SourceLocation(), 3594 /*FirstQualifierInScope=*/nullptr, 3595 NameInfo, 3596 /*TemplateArgs=*/nullptr, 3597 /*S=*/nullptr); 3598 } 3599 3600 /// Build a new Objective-C property reference expression. 3601 /// 3602 /// By default, performs semantic analysis to build the new expression. 3603 /// Subclasses may override this routine to provide different behavior. 3604 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3605 ObjCMethodDecl *Getter, 3606 ObjCMethodDecl *Setter, 3607 SourceLocation PropertyLoc) { 3608 // Since these expressions can only be value-dependent, we do not 3609 // need to perform semantic analysis again. 3610 return Owned( 3611 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3612 VK_LValue, OK_ObjCProperty, 3613 PropertyLoc, Base)); 3614 } 3615 3616 /// Build a new Objective-C "isa" expression. 3617 /// 3618 /// By default, performs semantic analysis to build the new expression. 3619 /// Subclasses may override this routine to provide different behavior. 3620 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3621 SourceLocation OpLoc, bool IsArrow) { 3622 CXXScopeSpec SS; 3623 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3624 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3625 OpLoc, IsArrow, 3626 SS, SourceLocation(), 3627 /*FirstQualifierInScope=*/nullptr, 3628 NameInfo, 3629 /*TemplateArgs=*/nullptr, 3630 /*S=*/nullptr); 3631 } 3632 3633 /// Build a new shuffle vector expression. 3634 /// 3635 /// By default, performs semantic analysis to build the new expression. 3636 /// Subclasses may override this routine to provide different behavior. 3637 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3638 MultiExprArg SubExprs, 3639 SourceLocation RParenLoc) { 3640 // Find the declaration for __builtin_shufflevector 3641 const IdentifierInfo &Name 3642 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3643 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3644 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3645 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3646 3647 // Build a reference to the __builtin_shufflevector builtin 3648 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3649 Expr *Callee = new (SemaRef.Context) 3650 DeclRefExpr(SemaRef.Context, Builtin, false, 3651 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3652 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3653 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3654 CK_BuiltinFnToFnPtr).get(); 3655 3656 // Build the CallExpr 3657 ExprResult TheCall = CallExpr::Create( 3658 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3659 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3660 FPOptionsOverride()); 3661 3662 // Type-check the __builtin_shufflevector expression. 3663 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3664 } 3665 3666 /// Build a new convert vector expression. 3667 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3668 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3669 SourceLocation RParenLoc) { 3670 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3671 BuiltinLoc, RParenLoc); 3672 } 3673 3674 /// Build a new template argument pack expansion. 3675 /// 3676 /// By default, performs semantic analysis to build a new pack expansion 3677 /// for a template argument. Subclasses may override this routine to provide 3678 /// different behavior. 3679 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3680 SourceLocation EllipsisLoc, 3681 Optional<unsigned> NumExpansions) { 3682 switch (Pattern.getArgument().getKind()) { 3683 case TemplateArgument::Expression: { 3684 ExprResult Result 3685 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3686 EllipsisLoc, NumExpansions); 3687 if (Result.isInvalid()) 3688 return TemplateArgumentLoc(); 3689 3690 return TemplateArgumentLoc(Result.get(), Result.get()); 3691 } 3692 3693 case TemplateArgument::Template: 3694 return TemplateArgumentLoc( 3695 SemaRef.Context, 3696 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3697 NumExpansions), 3698 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3699 EllipsisLoc); 3700 3701 case TemplateArgument::Null: 3702 case TemplateArgument::Integral: 3703 case TemplateArgument::Declaration: 3704 case TemplateArgument::Pack: 3705 case TemplateArgument::TemplateExpansion: 3706 case TemplateArgument::NullPtr: 3707 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3708 3709 case TemplateArgument::Type: 3710 if (TypeSourceInfo *Expansion 3711 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3712 EllipsisLoc, 3713 NumExpansions)) 3714 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3715 Expansion); 3716 break; 3717 } 3718 3719 return TemplateArgumentLoc(); 3720 } 3721 3722 /// Build a new expression pack expansion. 3723 /// 3724 /// By default, performs semantic analysis to build a new pack expansion 3725 /// for an expression. Subclasses may override this routine to provide 3726 /// different behavior. 3727 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3728 Optional<unsigned> NumExpansions) { 3729 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3730 } 3731 3732 /// Build a new C++1z fold-expression. 3733 /// 3734 /// By default, performs semantic analysis in order to build a new fold 3735 /// expression. 3736 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3737 SourceLocation LParenLoc, Expr *LHS, 3738 BinaryOperatorKind Operator, 3739 SourceLocation EllipsisLoc, Expr *RHS, 3740 SourceLocation RParenLoc, 3741 Optional<unsigned> NumExpansions) { 3742 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3743 EllipsisLoc, RHS, RParenLoc, 3744 NumExpansions); 3745 } 3746 3747 /// Build an empty C++1z fold-expression with the given operator. 3748 /// 3749 /// By default, produces the fallback value for the fold-expression, or 3750 /// produce an error if there is no fallback value. 3751 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3752 BinaryOperatorKind Operator) { 3753 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3754 } 3755 3756 /// Build a new atomic operation expression. 3757 /// 3758 /// By default, performs semantic analysis to build the new expression. 3759 /// Subclasses may override this routine to provide different behavior. 3760 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3761 AtomicExpr::AtomicOp Op, 3762 SourceLocation RParenLoc) { 3763 // Use this for all of the locations, since we don't know the difference 3764 // between the call and the expr at this point. 3765 SourceRange Range{BuiltinLoc, RParenLoc}; 3766 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3767 Sema::AtomicArgumentOrder::AST); 3768 } 3769 3770 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3771 ArrayRef<Expr *> SubExprs, QualType Type) { 3772 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3773 } 3774 3775 private: 3776 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3777 QualType ObjectType, 3778 NamedDecl *FirstQualifierInScope, 3779 CXXScopeSpec &SS); 3780 3781 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3782 QualType ObjectType, 3783 NamedDecl *FirstQualifierInScope, 3784 CXXScopeSpec &SS); 3785 3786 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3787 NamedDecl *FirstQualifierInScope, 3788 CXXScopeSpec &SS); 3789 3790 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3791 DependentNameTypeLoc TL, 3792 bool DeducibleTSTContext); 3793 }; 3794 3795 template <typename Derived> 3796 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3797 if (!S) 3798 return S; 3799 3800 switch (S->getStmtClass()) { 3801 case Stmt::NoStmtClass: break; 3802 3803 // Transform individual statement nodes 3804 // Pass SDK into statements that can produce a value 3805 #define STMT(Node, Parent) \ 3806 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3807 #define VALUESTMT(Node, Parent) \ 3808 case Stmt::Node##Class: \ 3809 return getDerived().Transform##Node(cast<Node>(S), SDK); 3810 #define ABSTRACT_STMT(Node) 3811 #define EXPR(Node, Parent) 3812 #include "clang/AST/StmtNodes.inc" 3813 3814 // Transform expressions by calling TransformExpr. 3815 #define STMT(Node, Parent) 3816 #define ABSTRACT_STMT(Stmt) 3817 #define EXPR(Node, Parent) case Stmt::Node##Class: 3818 #include "clang/AST/StmtNodes.inc" 3819 { 3820 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3821 3822 if (SDK == SDK_StmtExprResult) 3823 E = getSema().ActOnStmtExprResult(E); 3824 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3825 } 3826 } 3827 3828 return S; 3829 } 3830 3831 template<typename Derived> 3832 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3833 if (!S) 3834 return S; 3835 3836 switch (S->getClauseKind()) { 3837 default: break; 3838 // Transform individual clause nodes 3839 #define GEN_CLANG_CLAUSE_CLASS 3840 #define CLAUSE_CLASS(Enum, Str, Class) \ 3841 case Enum: \ 3842 return getDerived().Transform##Class(cast<Class>(S)); 3843 #include "llvm/Frontend/OpenMP/OMP.inc" 3844 } 3845 3846 return S; 3847 } 3848 3849 3850 template<typename Derived> 3851 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3852 if (!E) 3853 return E; 3854 3855 switch (E->getStmtClass()) { 3856 case Stmt::NoStmtClass: break; 3857 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3858 #define ABSTRACT_STMT(Stmt) 3859 #define EXPR(Node, Parent) \ 3860 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3861 #include "clang/AST/StmtNodes.inc" 3862 } 3863 3864 return E; 3865 } 3866 3867 template<typename Derived> 3868 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3869 bool NotCopyInit) { 3870 // Initializers are instantiated like expressions, except that various outer 3871 // layers are stripped. 3872 if (!Init) 3873 return Init; 3874 3875 if (auto *FE = dyn_cast<FullExpr>(Init)) 3876 Init = FE->getSubExpr(); 3877 3878 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 3879 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 3880 Init = OVE->getSourceExpr(); 3881 } 3882 3883 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3884 Init = MTE->getSubExpr(); 3885 3886 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3887 Init = Binder->getSubExpr(); 3888 3889 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3890 Init = ICE->getSubExprAsWritten(); 3891 3892 if (CXXStdInitializerListExpr *ILE = 3893 dyn_cast<CXXStdInitializerListExpr>(Init)) 3894 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3895 3896 // If this is copy-initialization, we only need to reconstruct 3897 // InitListExprs. Other forms of copy-initialization will be a no-op if 3898 // the initializer is already the right type. 3899 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3900 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3901 return getDerived().TransformExpr(Init); 3902 3903 // Revert value-initialization back to empty parens. 3904 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3905 SourceRange Parens = VIE->getSourceRange(); 3906 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3907 Parens.getEnd()); 3908 } 3909 3910 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3911 if (isa<ImplicitValueInitExpr>(Init)) 3912 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3913 SourceLocation()); 3914 3915 // Revert initialization by constructor back to a parenthesized or braced list 3916 // of expressions. Any other form of initializer can just be reused directly. 3917 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3918 return getDerived().TransformExpr(Init); 3919 3920 // If the initialization implicitly converted an initializer list to a 3921 // std::initializer_list object, unwrap the std::initializer_list too. 3922 if (Construct && Construct->isStdInitListInitialization()) 3923 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3924 3925 // Enter a list-init context if this was list initialization. 3926 EnterExpressionEvaluationContext Context( 3927 getSema(), EnterExpressionEvaluationContext::InitList, 3928 Construct->isListInitialization()); 3929 3930 SmallVector<Expr*, 8> NewArgs; 3931 bool ArgChanged = false; 3932 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3933 /*IsCall*/true, NewArgs, &ArgChanged)) 3934 return ExprError(); 3935 3936 // If this was list initialization, revert to syntactic list form. 3937 if (Construct->isListInitialization()) 3938 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3939 Construct->getEndLoc()); 3940 3941 // Build a ParenListExpr to represent anything else. 3942 SourceRange Parens = Construct->getParenOrBraceRange(); 3943 if (Parens.isInvalid()) { 3944 // This was a variable declaration's initialization for which no initializer 3945 // was specified. 3946 assert(NewArgs.empty() && 3947 "no parens or braces but have direct init with arguments?"); 3948 return ExprEmpty(); 3949 } 3950 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3951 Parens.getEnd()); 3952 } 3953 3954 template<typename Derived> 3955 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3956 unsigned NumInputs, 3957 bool IsCall, 3958 SmallVectorImpl<Expr *> &Outputs, 3959 bool *ArgChanged) { 3960 for (unsigned I = 0; I != NumInputs; ++I) { 3961 // If requested, drop call arguments that need to be dropped. 3962 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3963 if (ArgChanged) 3964 *ArgChanged = true; 3965 3966 break; 3967 } 3968 3969 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3970 Expr *Pattern = Expansion->getPattern(); 3971 3972 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3973 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3974 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3975 3976 // Determine whether the set of unexpanded parameter packs can and should 3977 // be expanded. 3978 bool Expand = true; 3979 bool RetainExpansion = false; 3980 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3981 Optional<unsigned> NumExpansions = OrigNumExpansions; 3982 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3983 Pattern->getSourceRange(), 3984 Unexpanded, 3985 Expand, RetainExpansion, 3986 NumExpansions)) 3987 return true; 3988 3989 if (!Expand) { 3990 // The transform has determined that we should perform a simple 3991 // transformation on the pack expansion, producing another pack 3992 // expansion. 3993 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3994 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3995 if (OutPattern.isInvalid()) 3996 return true; 3997 3998 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3999 Expansion->getEllipsisLoc(), 4000 NumExpansions); 4001 if (Out.isInvalid()) 4002 return true; 4003 4004 if (ArgChanged) 4005 *ArgChanged = true; 4006 Outputs.push_back(Out.get()); 4007 continue; 4008 } 4009 4010 // Record right away that the argument was changed. This needs 4011 // to happen even if the array expands to nothing. 4012 if (ArgChanged) *ArgChanged = true; 4013 4014 // The transform has determined that we should perform an elementwise 4015 // expansion of the pattern. Do so. 4016 for (unsigned I = 0; I != *NumExpansions; ++I) { 4017 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4018 ExprResult Out = getDerived().TransformExpr(Pattern); 4019 if (Out.isInvalid()) 4020 return true; 4021 4022 if (Out.get()->containsUnexpandedParameterPack()) { 4023 Out = getDerived().RebuildPackExpansion( 4024 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4025 if (Out.isInvalid()) 4026 return true; 4027 } 4028 4029 Outputs.push_back(Out.get()); 4030 } 4031 4032 // If we're supposed to retain a pack expansion, do so by temporarily 4033 // forgetting the partially-substituted parameter pack. 4034 if (RetainExpansion) { 4035 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4036 4037 ExprResult Out = getDerived().TransformExpr(Pattern); 4038 if (Out.isInvalid()) 4039 return true; 4040 4041 Out = getDerived().RebuildPackExpansion( 4042 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4043 if (Out.isInvalid()) 4044 return true; 4045 4046 Outputs.push_back(Out.get()); 4047 } 4048 4049 continue; 4050 } 4051 4052 ExprResult Result = 4053 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4054 : getDerived().TransformExpr(Inputs[I]); 4055 if (Result.isInvalid()) 4056 return true; 4057 4058 if (Result.get() != Inputs[I] && ArgChanged) 4059 *ArgChanged = true; 4060 4061 Outputs.push_back(Result.get()); 4062 } 4063 4064 return false; 4065 } 4066 4067 template <typename Derived> 4068 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4069 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4070 if (Var) { 4071 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4072 getDerived().TransformDefinition(Var->getLocation(), Var)); 4073 4074 if (!ConditionVar) 4075 return Sema::ConditionError(); 4076 4077 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4078 } 4079 4080 if (Expr) { 4081 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4082 4083 if (CondExpr.isInvalid()) 4084 return Sema::ConditionError(); 4085 4086 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind, 4087 /*MissingOK=*/true); 4088 } 4089 4090 return Sema::ConditionResult(); 4091 } 4092 4093 template <typename Derived> 4094 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4095 NestedNameSpecifierLoc NNS, QualType ObjectType, 4096 NamedDecl *FirstQualifierInScope) { 4097 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4098 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4099 Qualifier = Qualifier.getPrefix()) 4100 Qualifiers.push_back(Qualifier); 4101 4102 CXXScopeSpec SS; 4103 while (!Qualifiers.empty()) { 4104 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4105 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4106 4107 switch (QNNS->getKind()) { 4108 case NestedNameSpecifier::Identifier: { 4109 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4110 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4111 ObjectType); 4112 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4113 SS, FirstQualifierInScope, false)) 4114 return NestedNameSpecifierLoc(); 4115 break; 4116 } 4117 4118 case NestedNameSpecifier::Namespace: { 4119 NamespaceDecl *NS = 4120 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4121 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4122 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4123 break; 4124 } 4125 4126 case NestedNameSpecifier::NamespaceAlias: { 4127 NamespaceAliasDecl *Alias = 4128 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4129 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4130 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4131 Q.getLocalEndLoc()); 4132 break; 4133 } 4134 4135 case NestedNameSpecifier::Global: 4136 // There is no meaningful transformation that one could perform on the 4137 // global scope. 4138 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4139 break; 4140 4141 case NestedNameSpecifier::Super: { 4142 CXXRecordDecl *RD = 4143 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4144 SourceLocation(), QNNS->getAsRecordDecl())); 4145 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4146 break; 4147 } 4148 4149 case NestedNameSpecifier::TypeSpecWithTemplate: 4150 case NestedNameSpecifier::TypeSpec: { 4151 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4152 FirstQualifierInScope, SS); 4153 4154 if (!TL) 4155 return NestedNameSpecifierLoc(); 4156 4157 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4158 (SemaRef.getLangOpts().CPlusPlus11 && 4159 TL.getType()->isEnumeralType())) { 4160 assert(!TL.getType().hasLocalQualifiers() && 4161 "Can't get cv-qualifiers here"); 4162 if (TL.getType()->isEnumeralType()) 4163 SemaRef.Diag(TL.getBeginLoc(), 4164 diag::warn_cxx98_compat_enum_nested_name_spec); 4165 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4166 Q.getLocalEndLoc()); 4167 break; 4168 } 4169 // If the nested-name-specifier is an invalid type def, don't emit an 4170 // error because a previous error should have already been emitted. 4171 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4172 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4173 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4174 << TL.getType() << SS.getRange(); 4175 } 4176 return NestedNameSpecifierLoc(); 4177 } 4178 } 4179 4180 // The qualifier-in-scope and object type only apply to the leftmost entity. 4181 FirstQualifierInScope = nullptr; 4182 ObjectType = QualType(); 4183 } 4184 4185 // Don't rebuild the nested-name-specifier if we don't have to. 4186 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4187 !getDerived().AlwaysRebuild()) 4188 return NNS; 4189 4190 // If we can re-use the source-location data from the original 4191 // nested-name-specifier, do so. 4192 if (SS.location_size() == NNS.getDataLength() && 4193 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4194 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4195 4196 // Allocate new nested-name-specifier location information. 4197 return SS.getWithLocInContext(SemaRef.Context); 4198 } 4199 4200 template<typename Derived> 4201 DeclarationNameInfo 4202 TreeTransform<Derived> 4203 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4204 DeclarationName Name = NameInfo.getName(); 4205 if (!Name) 4206 return DeclarationNameInfo(); 4207 4208 switch (Name.getNameKind()) { 4209 case DeclarationName::Identifier: 4210 case DeclarationName::ObjCZeroArgSelector: 4211 case DeclarationName::ObjCOneArgSelector: 4212 case DeclarationName::ObjCMultiArgSelector: 4213 case DeclarationName::CXXOperatorName: 4214 case DeclarationName::CXXLiteralOperatorName: 4215 case DeclarationName::CXXUsingDirective: 4216 return NameInfo; 4217 4218 case DeclarationName::CXXDeductionGuideName: { 4219 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4220 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4221 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4222 if (!NewTemplate) 4223 return DeclarationNameInfo(); 4224 4225 DeclarationNameInfo NewNameInfo(NameInfo); 4226 NewNameInfo.setName( 4227 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4228 return NewNameInfo; 4229 } 4230 4231 case DeclarationName::CXXConstructorName: 4232 case DeclarationName::CXXDestructorName: 4233 case DeclarationName::CXXConversionFunctionName: { 4234 TypeSourceInfo *NewTInfo; 4235 CanQualType NewCanTy; 4236 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4237 NewTInfo = getDerived().TransformType(OldTInfo); 4238 if (!NewTInfo) 4239 return DeclarationNameInfo(); 4240 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4241 } 4242 else { 4243 NewTInfo = nullptr; 4244 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4245 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4246 if (NewT.isNull()) 4247 return DeclarationNameInfo(); 4248 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4249 } 4250 4251 DeclarationName NewName 4252 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4253 NewCanTy); 4254 DeclarationNameInfo NewNameInfo(NameInfo); 4255 NewNameInfo.setName(NewName); 4256 NewNameInfo.setNamedTypeInfo(NewTInfo); 4257 return NewNameInfo; 4258 } 4259 } 4260 4261 llvm_unreachable("Unknown name kind."); 4262 } 4263 4264 template<typename Derived> 4265 TemplateName 4266 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4267 TemplateName Name, 4268 SourceLocation NameLoc, 4269 QualType ObjectType, 4270 NamedDecl *FirstQualifierInScope, 4271 bool AllowInjectedClassName) { 4272 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4273 TemplateDecl *Template = QTN->getTemplateDecl(); 4274 assert(Template && "qualified template name must refer to a template"); 4275 4276 TemplateDecl *TransTemplate 4277 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4278 Template)); 4279 if (!TransTemplate) 4280 return TemplateName(); 4281 4282 if (!getDerived().AlwaysRebuild() && 4283 SS.getScopeRep() == QTN->getQualifier() && 4284 TransTemplate == Template) 4285 return Name; 4286 4287 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4288 TransTemplate); 4289 } 4290 4291 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4292 if (SS.getScopeRep()) { 4293 // These apply to the scope specifier, not the template. 4294 ObjectType = QualType(); 4295 FirstQualifierInScope = nullptr; 4296 } 4297 4298 if (!getDerived().AlwaysRebuild() && 4299 SS.getScopeRep() == DTN->getQualifier() && 4300 ObjectType.isNull()) 4301 return Name; 4302 4303 // FIXME: Preserve the location of the "template" keyword. 4304 SourceLocation TemplateKWLoc = NameLoc; 4305 4306 if (DTN->isIdentifier()) { 4307 return getDerived().RebuildTemplateName(SS, 4308 TemplateKWLoc, 4309 *DTN->getIdentifier(), 4310 NameLoc, 4311 ObjectType, 4312 FirstQualifierInScope, 4313 AllowInjectedClassName); 4314 } 4315 4316 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4317 DTN->getOperator(), NameLoc, 4318 ObjectType, AllowInjectedClassName); 4319 } 4320 4321 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4322 TemplateDecl *TransTemplate 4323 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4324 Template)); 4325 if (!TransTemplate) 4326 return TemplateName(); 4327 4328 if (!getDerived().AlwaysRebuild() && 4329 TransTemplate == Template) 4330 return Name; 4331 4332 return TemplateName(TransTemplate); 4333 } 4334 4335 if (SubstTemplateTemplateParmPackStorage *SubstPack 4336 = Name.getAsSubstTemplateTemplateParmPack()) { 4337 TemplateTemplateParmDecl *TransParam 4338 = cast_or_null<TemplateTemplateParmDecl>( 4339 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4340 if (!TransParam) 4341 return TemplateName(); 4342 4343 if (!getDerived().AlwaysRebuild() && 4344 TransParam == SubstPack->getParameterPack()) 4345 return Name; 4346 4347 return getDerived().RebuildTemplateName(TransParam, 4348 SubstPack->getArgumentPack()); 4349 } 4350 4351 // These should be getting filtered out before they reach the AST. 4352 llvm_unreachable("overloaded function decl survived to here"); 4353 } 4354 4355 template<typename Derived> 4356 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4357 const TemplateArgument &Arg, 4358 TemplateArgumentLoc &Output) { 4359 Output = getSema().getTrivialTemplateArgumentLoc( 4360 Arg, QualType(), getDerived().getBaseLocation()); 4361 } 4362 4363 template <typename Derived> 4364 bool TreeTransform<Derived>::TransformTemplateArgument( 4365 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4366 bool Uneval) { 4367 const TemplateArgument &Arg = Input.getArgument(); 4368 switch (Arg.getKind()) { 4369 case TemplateArgument::Null: 4370 case TemplateArgument::Pack: 4371 llvm_unreachable("Unexpected TemplateArgument"); 4372 4373 case TemplateArgument::Integral: 4374 case TemplateArgument::NullPtr: 4375 case TemplateArgument::Declaration: { 4376 // Transform a resolved template argument straight to a resolved template 4377 // argument. We get here when substituting into an already-substituted 4378 // template type argument during concept satisfaction checking. 4379 QualType T = Arg.getNonTypeTemplateArgumentType(); 4380 QualType NewT = getDerived().TransformType(T); 4381 if (NewT.isNull()) 4382 return true; 4383 4384 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4385 ? Arg.getAsDecl() 4386 : nullptr; 4387 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4388 getDerived().getBaseLocation(), D)) 4389 : nullptr; 4390 if (D && !NewD) 4391 return true; 4392 4393 if (NewT == T && D == NewD) 4394 Output = Input; 4395 else if (Arg.getKind() == TemplateArgument::Integral) 4396 Output = TemplateArgumentLoc( 4397 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4398 TemplateArgumentLocInfo()); 4399 else if (Arg.getKind() == TemplateArgument::NullPtr) 4400 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4401 TemplateArgumentLocInfo()); 4402 else 4403 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4404 TemplateArgumentLocInfo()); 4405 4406 return false; 4407 } 4408 4409 case TemplateArgument::Type: { 4410 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4411 if (!DI) 4412 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4413 4414 DI = getDerived().TransformType(DI); 4415 if (!DI) 4416 return true; 4417 4418 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4419 return false; 4420 } 4421 4422 case TemplateArgument::Template: { 4423 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4424 if (QualifierLoc) { 4425 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4426 if (!QualifierLoc) 4427 return true; 4428 } 4429 4430 CXXScopeSpec SS; 4431 SS.Adopt(QualifierLoc); 4432 TemplateName Template = getDerived().TransformTemplateName( 4433 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4434 if (Template.isNull()) 4435 return true; 4436 4437 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4438 QualifierLoc, Input.getTemplateNameLoc()); 4439 return false; 4440 } 4441 4442 case TemplateArgument::TemplateExpansion: 4443 llvm_unreachable("Caller should expand pack expansions"); 4444 4445 case TemplateArgument::Expression: { 4446 // Template argument expressions are constant expressions. 4447 EnterExpressionEvaluationContext Unevaluated( 4448 getSema(), 4449 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4450 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4451 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4452 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4453 4454 Expr *InputExpr = Input.getSourceExpression(); 4455 if (!InputExpr) 4456 InputExpr = Input.getArgument().getAsExpr(); 4457 4458 ExprResult E = getDerived().TransformExpr(InputExpr); 4459 E = SemaRef.ActOnConstantExpression(E); 4460 if (E.isInvalid()) 4461 return true; 4462 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4463 return false; 4464 } 4465 } 4466 4467 // Work around bogus GCC warning 4468 return true; 4469 } 4470 4471 /// Iterator adaptor that invents template argument location information 4472 /// for each of the template arguments in its underlying iterator. 4473 template<typename Derived, typename InputIterator> 4474 class TemplateArgumentLocInventIterator { 4475 TreeTransform<Derived> &Self; 4476 InputIterator Iter; 4477 4478 public: 4479 typedef TemplateArgumentLoc value_type; 4480 typedef TemplateArgumentLoc reference; 4481 typedef typename std::iterator_traits<InputIterator>::difference_type 4482 difference_type; 4483 typedef std::input_iterator_tag iterator_category; 4484 4485 class pointer { 4486 TemplateArgumentLoc Arg; 4487 4488 public: 4489 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4490 4491 const TemplateArgumentLoc *operator->() const { return &Arg; } 4492 }; 4493 4494 TemplateArgumentLocInventIterator() { } 4495 4496 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4497 InputIterator Iter) 4498 : Self(Self), Iter(Iter) { } 4499 4500 TemplateArgumentLocInventIterator &operator++() { 4501 ++Iter; 4502 return *this; 4503 } 4504 4505 TemplateArgumentLocInventIterator operator++(int) { 4506 TemplateArgumentLocInventIterator Old(*this); 4507 ++(*this); 4508 return Old; 4509 } 4510 4511 reference operator*() const { 4512 TemplateArgumentLoc Result; 4513 Self.InventTemplateArgumentLoc(*Iter, Result); 4514 return Result; 4515 } 4516 4517 pointer operator->() const { return pointer(**this); } 4518 4519 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4520 const TemplateArgumentLocInventIterator &Y) { 4521 return X.Iter == Y.Iter; 4522 } 4523 4524 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4525 const TemplateArgumentLocInventIterator &Y) { 4526 return X.Iter != Y.Iter; 4527 } 4528 }; 4529 4530 template<typename Derived> 4531 template<typename InputIterator> 4532 bool TreeTransform<Derived>::TransformTemplateArguments( 4533 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4534 bool Uneval) { 4535 for (; First != Last; ++First) { 4536 TemplateArgumentLoc Out; 4537 TemplateArgumentLoc In = *First; 4538 4539 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4540 // Unpack argument packs, which we translate them into separate 4541 // arguments. 4542 // FIXME: We could do much better if we could guarantee that the 4543 // TemplateArgumentLocInfo for the pack expansion would be usable for 4544 // all of the template arguments in the argument pack. 4545 typedef TemplateArgumentLocInventIterator<Derived, 4546 TemplateArgument::pack_iterator> 4547 PackLocIterator; 4548 if (TransformTemplateArguments(PackLocIterator(*this, 4549 In.getArgument().pack_begin()), 4550 PackLocIterator(*this, 4551 In.getArgument().pack_end()), 4552 Outputs, Uneval)) 4553 return true; 4554 4555 continue; 4556 } 4557 4558 if (In.getArgument().isPackExpansion()) { 4559 // We have a pack expansion, for which we will be substituting into 4560 // the pattern. 4561 SourceLocation Ellipsis; 4562 Optional<unsigned> OrigNumExpansions; 4563 TemplateArgumentLoc Pattern 4564 = getSema().getTemplateArgumentPackExpansionPattern( 4565 In, Ellipsis, OrigNumExpansions); 4566 4567 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4568 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4569 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4570 4571 // Determine whether the set of unexpanded parameter packs can and should 4572 // be expanded. 4573 bool Expand = true; 4574 bool RetainExpansion = false; 4575 Optional<unsigned> NumExpansions = OrigNumExpansions; 4576 if (getDerived().TryExpandParameterPacks(Ellipsis, 4577 Pattern.getSourceRange(), 4578 Unexpanded, 4579 Expand, 4580 RetainExpansion, 4581 NumExpansions)) 4582 return true; 4583 4584 if (!Expand) { 4585 // The transform has determined that we should perform a simple 4586 // transformation on the pack expansion, producing another pack 4587 // expansion. 4588 TemplateArgumentLoc OutPattern; 4589 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4590 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4591 return true; 4592 4593 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4594 NumExpansions); 4595 if (Out.getArgument().isNull()) 4596 return true; 4597 4598 Outputs.addArgument(Out); 4599 continue; 4600 } 4601 4602 // The transform has determined that we should perform an elementwise 4603 // expansion of the pattern. Do so. 4604 for (unsigned I = 0; I != *NumExpansions; ++I) { 4605 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4606 4607 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4608 return true; 4609 4610 if (Out.getArgument().containsUnexpandedParameterPack()) { 4611 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4612 OrigNumExpansions); 4613 if (Out.getArgument().isNull()) 4614 return true; 4615 } 4616 4617 Outputs.addArgument(Out); 4618 } 4619 4620 // If we're supposed to retain a pack expansion, do so by temporarily 4621 // forgetting the partially-substituted parameter pack. 4622 if (RetainExpansion) { 4623 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4624 4625 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4626 return true; 4627 4628 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4629 OrigNumExpansions); 4630 if (Out.getArgument().isNull()) 4631 return true; 4632 4633 Outputs.addArgument(Out); 4634 } 4635 4636 continue; 4637 } 4638 4639 // The simple case: 4640 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4641 return true; 4642 4643 Outputs.addArgument(Out); 4644 } 4645 4646 return false; 4647 4648 } 4649 4650 //===----------------------------------------------------------------------===// 4651 // Type transformation 4652 //===----------------------------------------------------------------------===// 4653 4654 template<typename Derived> 4655 QualType TreeTransform<Derived>::TransformType(QualType T) { 4656 if (getDerived().AlreadyTransformed(T)) 4657 return T; 4658 4659 // Temporary workaround. All of these transformations should 4660 // eventually turn into transformations on TypeLocs. 4661 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4662 getDerived().getBaseLocation()); 4663 4664 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4665 4666 if (!NewDI) 4667 return QualType(); 4668 4669 return NewDI->getType(); 4670 } 4671 4672 template<typename Derived> 4673 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4674 // Refine the base location to the type's location. 4675 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4676 getDerived().getBaseEntity()); 4677 if (getDerived().AlreadyTransformed(DI->getType())) 4678 return DI; 4679 4680 TypeLocBuilder TLB; 4681 4682 TypeLoc TL = DI->getTypeLoc(); 4683 TLB.reserve(TL.getFullDataSize()); 4684 4685 QualType Result = getDerived().TransformType(TLB, TL); 4686 if (Result.isNull()) 4687 return nullptr; 4688 4689 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4690 } 4691 4692 template<typename Derived> 4693 QualType 4694 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4695 switch (T.getTypeLocClass()) { 4696 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4697 #define TYPELOC(CLASS, PARENT) \ 4698 case TypeLoc::CLASS: \ 4699 return getDerived().Transform##CLASS##Type(TLB, \ 4700 T.castAs<CLASS##TypeLoc>()); 4701 #include "clang/AST/TypeLocNodes.def" 4702 } 4703 4704 llvm_unreachable("unhandled type loc!"); 4705 } 4706 4707 template<typename Derived> 4708 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4709 if (!isa<DependentNameType>(T)) 4710 return TransformType(T); 4711 4712 if (getDerived().AlreadyTransformed(T)) 4713 return T; 4714 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4715 getDerived().getBaseLocation()); 4716 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4717 return NewDI ? NewDI->getType() : QualType(); 4718 } 4719 4720 template<typename Derived> 4721 TypeSourceInfo * 4722 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4723 if (!isa<DependentNameType>(DI->getType())) 4724 return TransformType(DI); 4725 4726 // Refine the base location to the type's location. 4727 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4728 getDerived().getBaseEntity()); 4729 if (getDerived().AlreadyTransformed(DI->getType())) 4730 return DI; 4731 4732 TypeLocBuilder TLB; 4733 4734 TypeLoc TL = DI->getTypeLoc(); 4735 TLB.reserve(TL.getFullDataSize()); 4736 4737 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4738 if (QTL) 4739 TL = QTL.getUnqualifiedLoc(); 4740 4741 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4742 4743 QualType Result = getDerived().TransformDependentNameType( 4744 TLB, DNTL, /*DeducedTSTContext*/true); 4745 if (Result.isNull()) 4746 return nullptr; 4747 4748 if (QTL) { 4749 Result = getDerived().RebuildQualifiedType(Result, QTL); 4750 if (Result.isNull()) 4751 return nullptr; 4752 TLB.TypeWasModifiedSafely(Result); 4753 } 4754 4755 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4756 } 4757 4758 template<typename Derived> 4759 QualType 4760 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4761 QualifiedTypeLoc T) { 4762 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4763 if (Result.isNull()) 4764 return QualType(); 4765 4766 Result = getDerived().RebuildQualifiedType(Result, T); 4767 4768 if (Result.isNull()) 4769 return QualType(); 4770 4771 // RebuildQualifiedType might have updated the type, but not in a way 4772 // that invalidates the TypeLoc. (There's no location information for 4773 // qualifiers.) 4774 TLB.TypeWasModifiedSafely(Result); 4775 4776 return Result; 4777 } 4778 4779 template <typename Derived> 4780 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4781 QualifiedTypeLoc TL) { 4782 4783 SourceLocation Loc = TL.getBeginLoc(); 4784 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4785 4786 if ((T.getAddressSpace() != LangAS::Default && 4787 Quals.getAddressSpace() != LangAS::Default) && 4788 T.getAddressSpace() != Quals.getAddressSpace()) { 4789 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4790 << TL.getType() << T; 4791 return QualType(); 4792 } 4793 4794 // C++ [dcl.fct]p7: 4795 // [When] adding cv-qualifications on top of the function type [...] the 4796 // cv-qualifiers are ignored. 4797 if (T->isFunctionType()) { 4798 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4799 Quals.getAddressSpace()); 4800 return T; 4801 } 4802 4803 // C++ [dcl.ref]p1: 4804 // when the cv-qualifiers are introduced through the use of a typedef-name 4805 // or decltype-specifier [...] the cv-qualifiers are ignored. 4806 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4807 // applied to a reference type. 4808 if (T->isReferenceType()) { 4809 // The only qualifier that applies to a reference type is restrict. 4810 if (!Quals.hasRestrict()) 4811 return T; 4812 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4813 } 4814 4815 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4816 // resulting type. 4817 if (Quals.hasObjCLifetime()) { 4818 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4819 Quals.removeObjCLifetime(); 4820 else if (T.getObjCLifetime()) { 4821 // Objective-C ARC: 4822 // A lifetime qualifier applied to a substituted template parameter 4823 // overrides the lifetime qualifier from the template argument. 4824 const AutoType *AutoTy; 4825 if (const SubstTemplateTypeParmType *SubstTypeParam 4826 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4827 QualType Replacement = SubstTypeParam->getReplacementType(); 4828 Qualifiers Qs = Replacement.getQualifiers(); 4829 Qs.removeObjCLifetime(); 4830 Replacement = SemaRef.Context.getQualifiedType( 4831 Replacement.getUnqualifiedType(), Qs); 4832 T = SemaRef.Context.getSubstTemplateTypeParmType( 4833 SubstTypeParam->getReplacedParameter(), Replacement); 4834 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4835 // 'auto' types behave the same way as template parameters. 4836 QualType Deduced = AutoTy->getDeducedType(); 4837 Qualifiers Qs = Deduced.getQualifiers(); 4838 Qs.removeObjCLifetime(); 4839 Deduced = 4840 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4841 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4842 AutoTy->isDependentType(), 4843 /*isPack=*/false, 4844 AutoTy->getTypeConstraintConcept(), 4845 AutoTy->getTypeConstraintArguments()); 4846 } else { 4847 // Otherwise, complain about the addition of a qualifier to an 4848 // already-qualified type. 4849 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4850 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4851 Quals.removeObjCLifetime(); 4852 } 4853 } 4854 } 4855 4856 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4857 } 4858 4859 template<typename Derived> 4860 TypeLoc 4861 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4862 QualType ObjectType, 4863 NamedDecl *UnqualLookup, 4864 CXXScopeSpec &SS) { 4865 if (getDerived().AlreadyTransformed(TL.getType())) 4866 return TL; 4867 4868 TypeSourceInfo *TSI = 4869 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4870 if (TSI) 4871 return TSI->getTypeLoc(); 4872 return TypeLoc(); 4873 } 4874 4875 template<typename Derived> 4876 TypeSourceInfo * 4877 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4878 QualType ObjectType, 4879 NamedDecl *UnqualLookup, 4880 CXXScopeSpec &SS) { 4881 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4882 return TSInfo; 4883 4884 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4885 UnqualLookup, SS); 4886 } 4887 4888 template <typename Derived> 4889 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4890 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4891 CXXScopeSpec &SS) { 4892 QualType T = TL.getType(); 4893 assert(!getDerived().AlreadyTransformed(T)); 4894 4895 TypeLocBuilder TLB; 4896 QualType Result; 4897 4898 if (isa<TemplateSpecializationType>(T)) { 4899 TemplateSpecializationTypeLoc SpecTL = 4900 TL.castAs<TemplateSpecializationTypeLoc>(); 4901 4902 TemplateName Template = getDerived().TransformTemplateName( 4903 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4904 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4905 if (Template.isNull()) 4906 return nullptr; 4907 4908 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4909 Template); 4910 } else if (isa<DependentTemplateSpecializationType>(T)) { 4911 DependentTemplateSpecializationTypeLoc SpecTL = 4912 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4913 4914 TemplateName Template 4915 = getDerived().RebuildTemplateName(SS, 4916 SpecTL.getTemplateKeywordLoc(), 4917 *SpecTL.getTypePtr()->getIdentifier(), 4918 SpecTL.getTemplateNameLoc(), 4919 ObjectType, UnqualLookup, 4920 /*AllowInjectedClassName*/true); 4921 if (Template.isNull()) 4922 return nullptr; 4923 4924 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4925 SpecTL, 4926 Template, 4927 SS); 4928 } else { 4929 // Nothing special needs to be done for these. 4930 Result = getDerived().TransformType(TLB, TL); 4931 } 4932 4933 if (Result.isNull()) 4934 return nullptr; 4935 4936 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4937 } 4938 4939 template <class TyLoc> static inline 4940 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4941 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4942 NewT.setNameLoc(T.getNameLoc()); 4943 return T.getType(); 4944 } 4945 4946 template<typename Derived> 4947 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4948 BuiltinTypeLoc T) { 4949 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4950 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4951 if (T.needsExtraLocalData()) 4952 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4953 return T.getType(); 4954 } 4955 4956 template<typename Derived> 4957 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4958 ComplexTypeLoc T) { 4959 // FIXME: recurse? 4960 return TransformTypeSpecType(TLB, T); 4961 } 4962 4963 template <typename Derived> 4964 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4965 AdjustedTypeLoc TL) { 4966 // Adjustments applied during transformation are handled elsewhere. 4967 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4968 } 4969 4970 template<typename Derived> 4971 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4972 DecayedTypeLoc TL) { 4973 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4974 if (OriginalType.isNull()) 4975 return QualType(); 4976 4977 QualType Result = TL.getType(); 4978 if (getDerived().AlwaysRebuild() || 4979 OriginalType != TL.getOriginalLoc().getType()) 4980 Result = SemaRef.Context.getDecayedType(OriginalType); 4981 TLB.push<DecayedTypeLoc>(Result); 4982 // Nothing to set for DecayedTypeLoc. 4983 return Result; 4984 } 4985 4986 template<typename Derived> 4987 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4988 PointerTypeLoc TL) { 4989 QualType PointeeType 4990 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4991 if (PointeeType.isNull()) 4992 return QualType(); 4993 4994 QualType Result = TL.getType(); 4995 if (PointeeType->getAs<ObjCObjectType>()) { 4996 // A dependent pointer type 'T *' has is being transformed such 4997 // that an Objective-C class type is being replaced for 'T'. The 4998 // resulting pointer type is an ObjCObjectPointerType, not a 4999 // PointerType. 5000 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 5001 5002 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 5003 NewT.setStarLoc(TL.getStarLoc()); 5004 return Result; 5005 } 5006 5007 if (getDerived().AlwaysRebuild() || 5008 PointeeType != TL.getPointeeLoc().getType()) { 5009 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 5010 if (Result.isNull()) 5011 return QualType(); 5012 } 5013 5014 // Objective-C ARC can add lifetime qualifiers to the type that we're 5015 // pointing to. 5016 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5017 5018 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5019 NewT.setSigilLoc(TL.getSigilLoc()); 5020 return Result; 5021 } 5022 5023 template<typename Derived> 5024 QualType 5025 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5026 BlockPointerTypeLoc TL) { 5027 QualType PointeeType 5028 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5029 if (PointeeType.isNull()) 5030 return QualType(); 5031 5032 QualType Result = TL.getType(); 5033 if (getDerived().AlwaysRebuild() || 5034 PointeeType != TL.getPointeeLoc().getType()) { 5035 Result = getDerived().RebuildBlockPointerType(PointeeType, 5036 TL.getSigilLoc()); 5037 if (Result.isNull()) 5038 return QualType(); 5039 } 5040 5041 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5042 NewT.setSigilLoc(TL.getSigilLoc()); 5043 return Result; 5044 } 5045 5046 /// Transforms a reference type. Note that somewhat paradoxically we 5047 /// don't care whether the type itself is an l-value type or an r-value 5048 /// type; we only care if the type was *written* as an l-value type 5049 /// or an r-value type. 5050 template<typename Derived> 5051 QualType 5052 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5053 ReferenceTypeLoc TL) { 5054 const ReferenceType *T = TL.getTypePtr(); 5055 5056 // Note that this works with the pointee-as-written. 5057 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5058 if (PointeeType.isNull()) 5059 return QualType(); 5060 5061 QualType Result = TL.getType(); 5062 if (getDerived().AlwaysRebuild() || 5063 PointeeType != T->getPointeeTypeAsWritten()) { 5064 Result = getDerived().RebuildReferenceType(PointeeType, 5065 T->isSpelledAsLValue(), 5066 TL.getSigilLoc()); 5067 if (Result.isNull()) 5068 return QualType(); 5069 } 5070 5071 // Objective-C ARC can add lifetime qualifiers to the type that we're 5072 // referring to. 5073 TLB.TypeWasModifiedSafely( 5074 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5075 5076 // r-value references can be rebuilt as l-value references. 5077 ReferenceTypeLoc NewTL; 5078 if (isa<LValueReferenceType>(Result)) 5079 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5080 else 5081 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5082 NewTL.setSigilLoc(TL.getSigilLoc()); 5083 5084 return Result; 5085 } 5086 5087 template<typename Derived> 5088 QualType 5089 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5090 LValueReferenceTypeLoc TL) { 5091 return TransformReferenceType(TLB, TL); 5092 } 5093 5094 template<typename Derived> 5095 QualType 5096 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5097 RValueReferenceTypeLoc TL) { 5098 return TransformReferenceType(TLB, TL); 5099 } 5100 5101 template<typename Derived> 5102 QualType 5103 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5104 MemberPointerTypeLoc TL) { 5105 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5106 if (PointeeType.isNull()) 5107 return QualType(); 5108 5109 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5110 TypeSourceInfo *NewClsTInfo = nullptr; 5111 if (OldClsTInfo) { 5112 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5113 if (!NewClsTInfo) 5114 return QualType(); 5115 } 5116 5117 const MemberPointerType *T = TL.getTypePtr(); 5118 QualType OldClsType = QualType(T->getClass(), 0); 5119 QualType NewClsType; 5120 if (NewClsTInfo) 5121 NewClsType = NewClsTInfo->getType(); 5122 else { 5123 NewClsType = getDerived().TransformType(OldClsType); 5124 if (NewClsType.isNull()) 5125 return QualType(); 5126 } 5127 5128 QualType Result = TL.getType(); 5129 if (getDerived().AlwaysRebuild() || 5130 PointeeType != T->getPointeeType() || 5131 NewClsType != OldClsType) { 5132 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5133 TL.getStarLoc()); 5134 if (Result.isNull()) 5135 return QualType(); 5136 } 5137 5138 // If we had to adjust the pointee type when building a member pointer, make 5139 // sure to push TypeLoc info for it. 5140 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5141 if (MPT && PointeeType != MPT->getPointeeType()) { 5142 assert(isa<AdjustedType>(MPT->getPointeeType())); 5143 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5144 } 5145 5146 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5147 NewTL.setSigilLoc(TL.getSigilLoc()); 5148 NewTL.setClassTInfo(NewClsTInfo); 5149 5150 return Result; 5151 } 5152 5153 template<typename Derived> 5154 QualType 5155 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5156 ConstantArrayTypeLoc TL) { 5157 const ConstantArrayType *T = TL.getTypePtr(); 5158 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5159 if (ElementType.isNull()) 5160 return QualType(); 5161 5162 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5163 Expr *OldSize = TL.getSizeExpr(); 5164 if (!OldSize) 5165 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5166 Expr *NewSize = nullptr; 5167 if (OldSize) { 5168 EnterExpressionEvaluationContext Unevaluated( 5169 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5170 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5171 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5172 } 5173 5174 QualType Result = TL.getType(); 5175 if (getDerived().AlwaysRebuild() || 5176 ElementType != T->getElementType() || 5177 (T->getSizeExpr() && NewSize != OldSize)) { 5178 Result = getDerived().RebuildConstantArrayType(ElementType, 5179 T->getSizeModifier(), 5180 T->getSize(), NewSize, 5181 T->getIndexTypeCVRQualifiers(), 5182 TL.getBracketsRange()); 5183 if (Result.isNull()) 5184 return QualType(); 5185 } 5186 5187 // We might have either a ConstantArrayType or a VariableArrayType now: 5188 // a ConstantArrayType is allowed to have an element type which is a 5189 // VariableArrayType if the type is dependent. Fortunately, all array 5190 // types have the same location layout. 5191 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5192 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5193 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5194 NewTL.setSizeExpr(NewSize); 5195 5196 return Result; 5197 } 5198 5199 template<typename Derived> 5200 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5201 TypeLocBuilder &TLB, 5202 IncompleteArrayTypeLoc TL) { 5203 const IncompleteArrayType *T = TL.getTypePtr(); 5204 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5205 if (ElementType.isNull()) 5206 return QualType(); 5207 5208 QualType Result = TL.getType(); 5209 if (getDerived().AlwaysRebuild() || 5210 ElementType != T->getElementType()) { 5211 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5212 T->getSizeModifier(), 5213 T->getIndexTypeCVRQualifiers(), 5214 TL.getBracketsRange()); 5215 if (Result.isNull()) 5216 return QualType(); 5217 } 5218 5219 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5220 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5221 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5222 NewTL.setSizeExpr(nullptr); 5223 5224 return Result; 5225 } 5226 5227 template<typename Derived> 5228 QualType 5229 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5230 VariableArrayTypeLoc TL) { 5231 const VariableArrayType *T = TL.getTypePtr(); 5232 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5233 if (ElementType.isNull()) 5234 return QualType(); 5235 5236 ExprResult SizeResult; 5237 { 5238 EnterExpressionEvaluationContext Context( 5239 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5240 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5241 } 5242 if (SizeResult.isInvalid()) 5243 return QualType(); 5244 SizeResult = 5245 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5246 if (SizeResult.isInvalid()) 5247 return QualType(); 5248 5249 Expr *Size = SizeResult.get(); 5250 5251 QualType Result = TL.getType(); 5252 if (getDerived().AlwaysRebuild() || 5253 ElementType != T->getElementType() || 5254 Size != T->getSizeExpr()) { 5255 Result = getDerived().RebuildVariableArrayType(ElementType, 5256 T->getSizeModifier(), 5257 Size, 5258 T->getIndexTypeCVRQualifiers(), 5259 TL.getBracketsRange()); 5260 if (Result.isNull()) 5261 return QualType(); 5262 } 5263 5264 // We might have constant size array now, but fortunately it has the same 5265 // location layout. 5266 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5267 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5268 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5269 NewTL.setSizeExpr(Size); 5270 5271 return Result; 5272 } 5273 5274 template<typename Derived> 5275 QualType 5276 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5277 DependentSizedArrayTypeLoc TL) { 5278 const DependentSizedArrayType *T = TL.getTypePtr(); 5279 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5280 if (ElementType.isNull()) 5281 return QualType(); 5282 5283 // Array bounds are constant expressions. 5284 EnterExpressionEvaluationContext Unevaluated( 5285 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5286 5287 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5288 Expr *origSize = TL.getSizeExpr(); 5289 if (!origSize) origSize = T->getSizeExpr(); 5290 5291 ExprResult sizeResult 5292 = getDerived().TransformExpr(origSize); 5293 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5294 if (sizeResult.isInvalid()) 5295 return QualType(); 5296 5297 Expr *size = sizeResult.get(); 5298 5299 QualType Result = TL.getType(); 5300 if (getDerived().AlwaysRebuild() || 5301 ElementType != T->getElementType() || 5302 size != origSize) { 5303 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5304 T->getSizeModifier(), 5305 size, 5306 T->getIndexTypeCVRQualifiers(), 5307 TL.getBracketsRange()); 5308 if (Result.isNull()) 5309 return QualType(); 5310 } 5311 5312 // We might have any sort of array type now, but fortunately they 5313 // all have the same location layout. 5314 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5315 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5316 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5317 NewTL.setSizeExpr(size); 5318 5319 return Result; 5320 } 5321 5322 template <typename Derived> 5323 QualType TreeTransform<Derived>::TransformDependentVectorType( 5324 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5325 const DependentVectorType *T = TL.getTypePtr(); 5326 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5327 if (ElementType.isNull()) 5328 return QualType(); 5329 5330 EnterExpressionEvaluationContext Unevaluated( 5331 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5332 5333 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5334 Size = SemaRef.ActOnConstantExpression(Size); 5335 if (Size.isInvalid()) 5336 return QualType(); 5337 5338 QualType Result = TL.getType(); 5339 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5340 Size.get() != T->getSizeExpr()) { 5341 Result = getDerived().RebuildDependentVectorType( 5342 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5343 if (Result.isNull()) 5344 return QualType(); 5345 } 5346 5347 // Result might be dependent or not. 5348 if (isa<DependentVectorType>(Result)) { 5349 DependentVectorTypeLoc NewTL = 5350 TLB.push<DependentVectorTypeLoc>(Result); 5351 NewTL.setNameLoc(TL.getNameLoc()); 5352 } else { 5353 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5354 NewTL.setNameLoc(TL.getNameLoc()); 5355 } 5356 5357 return Result; 5358 } 5359 5360 template<typename Derived> 5361 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5362 TypeLocBuilder &TLB, 5363 DependentSizedExtVectorTypeLoc TL) { 5364 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5365 5366 // FIXME: ext vector locs should be nested 5367 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5368 if (ElementType.isNull()) 5369 return QualType(); 5370 5371 // Vector sizes are constant expressions. 5372 EnterExpressionEvaluationContext Unevaluated( 5373 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5374 5375 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5376 Size = SemaRef.ActOnConstantExpression(Size); 5377 if (Size.isInvalid()) 5378 return QualType(); 5379 5380 QualType Result = TL.getType(); 5381 if (getDerived().AlwaysRebuild() || 5382 ElementType != T->getElementType() || 5383 Size.get() != T->getSizeExpr()) { 5384 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5385 Size.get(), 5386 T->getAttributeLoc()); 5387 if (Result.isNull()) 5388 return QualType(); 5389 } 5390 5391 // Result might be dependent or not. 5392 if (isa<DependentSizedExtVectorType>(Result)) { 5393 DependentSizedExtVectorTypeLoc NewTL 5394 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5395 NewTL.setNameLoc(TL.getNameLoc()); 5396 } else { 5397 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5398 NewTL.setNameLoc(TL.getNameLoc()); 5399 } 5400 5401 return Result; 5402 } 5403 5404 template <typename Derived> 5405 QualType 5406 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5407 ConstantMatrixTypeLoc TL) { 5408 const ConstantMatrixType *T = TL.getTypePtr(); 5409 QualType ElementType = getDerived().TransformType(T->getElementType()); 5410 if (ElementType.isNull()) 5411 return QualType(); 5412 5413 QualType Result = TL.getType(); 5414 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5415 Result = getDerived().RebuildConstantMatrixType( 5416 ElementType, T->getNumRows(), T->getNumColumns()); 5417 if (Result.isNull()) 5418 return QualType(); 5419 } 5420 5421 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5422 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5423 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5424 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5425 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5426 5427 return Result; 5428 } 5429 5430 template <typename Derived> 5431 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5432 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5433 const DependentSizedMatrixType *T = TL.getTypePtr(); 5434 5435 QualType ElementType = getDerived().TransformType(T->getElementType()); 5436 if (ElementType.isNull()) { 5437 return QualType(); 5438 } 5439 5440 // Matrix dimensions are constant expressions. 5441 EnterExpressionEvaluationContext Unevaluated( 5442 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5443 5444 Expr *origRows = TL.getAttrRowOperand(); 5445 if (!origRows) 5446 origRows = T->getRowExpr(); 5447 Expr *origColumns = TL.getAttrColumnOperand(); 5448 if (!origColumns) 5449 origColumns = T->getColumnExpr(); 5450 5451 ExprResult rowResult = getDerived().TransformExpr(origRows); 5452 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5453 if (rowResult.isInvalid()) 5454 return QualType(); 5455 5456 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5457 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5458 if (columnResult.isInvalid()) 5459 return QualType(); 5460 5461 Expr *rows = rowResult.get(); 5462 Expr *columns = columnResult.get(); 5463 5464 QualType Result = TL.getType(); 5465 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5466 rows != origRows || columns != origColumns) { 5467 Result = getDerived().RebuildDependentSizedMatrixType( 5468 ElementType, rows, columns, T->getAttributeLoc()); 5469 5470 if (Result.isNull()) 5471 return QualType(); 5472 } 5473 5474 // We might have any sort of matrix type now, but fortunately they 5475 // all have the same location layout. 5476 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5477 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5478 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5479 NewTL.setAttrRowOperand(rows); 5480 NewTL.setAttrColumnOperand(columns); 5481 return Result; 5482 } 5483 5484 template <typename Derived> 5485 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5486 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5487 const DependentAddressSpaceType *T = TL.getTypePtr(); 5488 5489 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5490 5491 if (pointeeType.isNull()) 5492 return QualType(); 5493 5494 // Address spaces are constant expressions. 5495 EnterExpressionEvaluationContext Unevaluated( 5496 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5497 5498 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5499 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5500 if (AddrSpace.isInvalid()) 5501 return QualType(); 5502 5503 QualType Result = TL.getType(); 5504 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5505 AddrSpace.get() != T->getAddrSpaceExpr()) { 5506 Result = getDerived().RebuildDependentAddressSpaceType( 5507 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5508 if (Result.isNull()) 5509 return QualType(); 5510 } 5511 5512 // Result might be dependent or not. 5513 if (isa<DependentAddressSpaceType>(Result)) { 5514 DependentAddressSpaceTypeLoc NewTL = 5515 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5516 5517 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5518 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5519 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5520 5521 } else { 5522 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5523 Result, getDerived().getBaseLocation()); 5524 TransformType(TLB, DI->getTypeLoc()); 5525 } 5526 5527 return Result; 5528 } 5529 5530 template <typename Derived> 5531 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5532 VectorTypeLoc TL) { 5533 const VectorType *T = TL.getTypePtr(); 5534 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5535 if (ElementType.isNull()) 5536 return QualType(); 5537 5538 QualType Result = TL.getType(); 5539 if (getDerived().AlwaysRebuild() || 5540 ElementType != T->getElementType()) { 5541 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5542 T->getVectorKind()); 5543 if (Result.isNull()) 5544 return QualType(); 5545 } 5546 5547 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5548 NewTL.setNameLoc(TL.getNameLoc()); 5549 5550 return Result; 5551 } 5552 5553 template<typename Derived> 5554 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5555 ExtVectorTypeLoc TL) { 5556 const VectorType *T = TL.getTypePtr(); 5557 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5558 if (ElementType.isNull()) 5559 return QualType(); 5560 5561 QualType Result = TL.getType(); 5562 if (getDerived().AlwaysRebuild() || 5563 ElementType != T->getElementType()) { 5564 Result = getDerived().RebuildExtVectorType(ElementType, 5565 T->getNumElements(), 5566 /*FIXME*/ SourceLocation()); 5567 if (Result.isNull()) 5568 return QualType(); 5569 } 5570 5571 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5572 NewTL.setNameLoc(TL.getNameLoc()); 5573 5574 return Result; 5575 } 5576 5577 template <typename Derived> 5578 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5579 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5580 bool ExpectParameterPack) { 5581 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5582 TypeSourceInfo *NewDI = nullptr; 5583 5584 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5585 // If we're substituting into a pack expansion type and we know the 5586 // length we want to expand to, just substitute for the pattern. 5587 TypeLoc OldTL = OldDI->getTypeLoc(); 5588 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5589 5590 TypeLocBuilder TLB; 5591 TypeLoc NewTL = OldDI->getTypeLoc(); 5592 TLB.reserve(NewTL.getFullDataSize()); 5593 5594 QualType Result = getDerived().TransformType(TLB, 5595 OldExpansionTL.getPatternLoc()); 5596 if (Result.isNull()) 5597 return nullptr; 5598 5599 Result = RebuildPackExpansionType(Result, 5600 OldExpansionTL.getPatternLoc().getSourceRange(), 5601 OldExpansionTL.getEllipsisLoc(), 5602 NumExpansions); 5603 if (Result.isNull()) 5604 return nullptr; 5605 5606 PackExpansionTypeLoc NewExpansionTL 5607 = TLB.push<PackExpansionTypeLoc>(Result); 5608 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5609 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5610 } else 5611 NewDI = getDerived().TransformType(OldDI); 5612 if (!NewDI) 5613 return nullptr; 5614 5615 if (NewDI == OldDI && indexAdjustment == 0) 5616 return OldParm; 5617 5618 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5619 OldParm->getDeclContext(), 5620 OldParm->getInnerLocStart(), 5621 OldParm->getLocation(), 5622 OldParm->getIdentifier(), 5623 NewDI->getType(), 5624 NewDI, 5625 OldParm->getStorageClass(), 5626 /* DefArg */ nullptr); 5627 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5628 OldParm->getFunctionScopeIndex() + indexAdjustment); 5629 transformedLocalDecl(OldParm, {newParm}); 5630 return newParm; 5631 } 5632 5633 template <typename Derived> 5634 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5635 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5636 const QualType *ParamTypes, 5637 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5638 SmallVectorImpl<QualType> &OutParamTypes, 5639 SmallVectorImpl<ParmVarDecl *> *PVars, 5640 Sema::ExtParameterInfoBuilder &PInfos) { 5641 int indexAdjustment = 0; 5642 5643 unsigned NumParams = Params.size(); 5644 for (unsigned i = 0; i != NumParams; ++i) { 5645 if (ParmVarDecl *OldParm = Params[i]) { 5646 assert(OldParm->getFunctionScopeIndex() == i); 5647 5648 Optional<unsigned> NumExpansions; 5649 ParmVarDecl *NewParm = nullptr; 5650 if (OldParm->isParameterPack()) { 5651 // We have a function parameter pack that may need to be expanded. 5652 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5653 5654 // Find the parameter packs that could be expanded. 5655 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5656 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5657 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5658 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5659 5660 // Determine whether we should expand the parameter packs. 5661 bool ShouldExpand = false; 5662 bool RetainExpansion = false; 5663 Optional<unsigned> OrigNumExpansions; 5664 if (Unexpanded.size() > 0) { 5665 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5666 NumExpansions = OrigNumExpansions; 5667 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5668 Pattern.getSourceRange(), 5669 Unexpanded, 5670 ShouldExpand, 5671 RetainExpansion, 5672 NumExpansions)) { 5673 return true; 5674 } 5675 } else { 5676 #ifndef NDEBUG 5677 const AutoType *AT = 5678 Pattern.getType().getTypePtr()->getContainedAutoType(); 5679 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5680 "Could not find parameter packs or undeduced auto type!"); 5681 #endif 5682 } 5683 5684 if (ShouldExpand) { 5685 // Expand the function parameter pack into multiple, separate 5686 // parameters. 5687 getDerived().ExpandingFunctionParameterPack(OldParm); 5688 for (unsigned I = 0; I != *NumExpansions; ++I) { 5689 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5690 ParmVarDecl *NewParm 5691 = getDerived().TransformFunctionTypeParam(OldParm, 5692 indexAdjustment++, 5693 OrigNumExpansions, 5694 /*ExpectParameterPack=*/false); 5695 if (!NewParm) 5696 return true; 5697 5698 if (ParamInfos) 5699 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5700 OutParamTypes.push_back(NewParm->getType()); 5701 if (PVars) 5702 PVars->push_back(NewParm); 5703 } 5704 5705 // If we're supposed to retain a pack expansion, do so by temporarily 5706 // forgetting the partially-substituted parameter pack. 5707 if (RetainExpansion) { 5708 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5709 ParmVarDecl *NewParm 5710 = getDerived().TransformFunctionTypeParam(OldParm, 5711 indexAdjustment++, 5712 OrigNumExpansions, 5713 /*ExpectParameterPack=*/false); 5714 if (!NewParm) 5715 return true; 5716 5717 if (ParamInfos) 5718 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5719 OutParamTypes.push_back(NewParm->getType()); 5720 if (PVars) 5721 PVars->push_back(NewParm); 5722 } 5723 5724 // The next parameter should have the same adjustment as the 5725 // last thing we pushed, but we post-incremented indexAdjustment 5726 // on every push. Also, if we push nothing, the adjustment should 5727 // go down by one. 5728 indexAdjustment--; 5729 5730 // We're done with the pack expansion. 5731 continue; 5732 } 5733 5734 // We'll substitute the parameter now without expanding the pack 5735 // expansion. 5736 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5737 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5738 indexAdjustment, 5739 NumExpansions, 5740 /*ExpectParameterPack=*/true); 5741 assert(NewParm->isParameterPack() && 5742 "Parameter pack no longer a parameter pack after " 5743 "transformation."); 5744 } else { 5745 NewParm = getDerived().TransformFunctionTypeParam( 5746 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5747 } 5748 5749 if (!NewParm) 5750 return true; 5751 5752 if (ParamInfos) 5753 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5754 OutParamTypes.push_back(NewParm->getType()); 5755 if (PVars) 5756 PVars->push_back(NewParm); 5757 continue; 5758 } 5759 5760 // Deal with the possibility that we don't have a parameter 5761 // declaration for this parameter. 5762 QualType OldType = ParamTypes[i]; 5763 bool IsPackExpansion = false; 5764 Optional<unsigned> NumExpansions; 5765 QualType NewType; 5766 if (const PackExpansionType *Expansion 5767 = dyn_cast<PackExpansionType>(OldType)) { 5768 // We have a function parameter pack that may need to be expanded. 5769 QualType Pattern = Expansion->getPattern(); 5770 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5771 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5772 5773 // Determine whether we should expand the parameter packs. 5774 bool ShouldExpand = false; 5775 bool RetainExpansion = false; 5776 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5777 Unexpanded, 5778 ShouldExpand, 5779 RetainExpansion, 5780 NumExpansions)) { 5781 return true; 5782 } 5783 5784 if (ShouldExpand) { 5785 // Expand the function parameter pack into multiple, separate 5786 // parameters. 5787 for (unsigned I = 0; I != *NumExpansions; ++I) { 5788 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5789 QualType NewType = getDerived().TransformType(Pattern); 5790 if (NewType.isNull()) 5791 return true; 5792 5793 if (NewType->containsUnexpandedParameterPack()) { 5794 NewType = 5795 getSema().getASTContext().getPackExpansionType(NewType, None); 5796 5797 if (NewType.isNull()) 5798 return true; 5799 } 5800 5801 if (ParamInfos) 5802 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5803 OutParamTypes.push_back(NewType); 5804 if (PVars) 5805 PVars->push_back(nullptr); 5806 } 5807 5808 // We're done with the pack expansion. 5809 continue; 5810 } 5811 5812 // If we're supposed to retain a pack expansion, do so by temporarily 5813 // forgetting the partially-substituted parameter pack. 5814 if (RetainExpansion) { 5815 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5816 QualType NewType = getDerived().TransformType(Pattern); 5817 if (NewType.isNull()) 5818 return true; 5819 5820 if (ParamInfos) 5821 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5822 OutParamTypes.push_back(NewType); 5823 if (PVars) 5824 PVars->push_back(nullptr); 5825 } 5826 5827 // We'll substitute the parameter now without expanding the pack 5828 // expansion. 5829 OldType = Expansion->getPattern(); 5830 IsPackExpansion = true; 5831 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5832 NewType = getDerived().TransformType(OldType); 5833 } else { 5834 NewType = getDerived().TransformType(OldType); 5835 } 5836 5837 if (NewType.isNull()) 5838 return true; 5839 5840 if (IsPackExpansion) 5841 NewType = getSema().Context.getPackExpansionType(NewType, 5842 NumExpansions); 5843 5844 if (ParamInfos) 5845 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5846 OutParamTypes.push_back(NewType); 5847 if (PVars) 5848 PVars->push_back(nullptr); 5849 } 5850 5851 #ifndef NDEBUG 5852 if (PVars) { 5853 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5854 if (ParmVarDecl *parm = (*PVars)[i]) 5855 assert(parm->getFunctionScopeIndex() == i); 5856 } 5857 #endif 5858 5859 return false; 5860 } 5861 5862 template<typename Derived> 5863 QualType 5864 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5865 FunctionProtoTypeLoc TL) { 5866 SmallVector<QualType, 4> ExceptionStorage; 5867 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5868 return getDerived().TransformFunctionProtoType( 5869 TLB, TL, nullptr, Qualifiers(), 5870 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5871 return This->getDerived().TransformExceptionSpec( 5872 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 5873 }); 5874 } 5875 5876 template<typename Derived> template<typename Fn> 5877 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5878 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5879 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5880 5881 // Transform the parameters and return type. 5882 // 5883 // We are required to instantiate the params and return type in source order. 5884 // When the function has a trailing return type, we instantiate the 5885 // parameters before the return type, since the return type can then refer 5886 // to the parameters themselves (via decltype, sizeof, etc.). 5887 // 5888 SmallVector<QualType, 4> ParamTypes; 5889 SmallVector<ParmVarDecl*, 4> ParamDecls; 5890 Sema::ExtParameterInfoBuilder ExtParamInfos; 5891 const FunctionProtoType *T = TL.getTypePtr(); 5892 5893 QualType ResultType; 5894 5895 if (T->hasTrailingReturn()) { 5896 if (getDerived().TransformFunctionTypeParams( 5897 TL.getBeginLoc(), TL.getParams(), 5898 TL.getTypePtr()->param_type_begin(), 5899 T->getExtParameterInfosOrNull(), 5900 ParamTypes, &ParamDecls, ExtParamInfos)) 5901 return QualType(); 5902 5903 { 5904 // C++11 [expr.prim.general]p3: 5905 // If a declaration declares a member function or member function 5906 // template of a class X, the expression this is a prvalue of type 5907 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5908 // and the end of the function-definition, member-declarator, or 5909 // declarator. 5910 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5911 5912 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5913 if (ResultType.isNull()) 5914 return QualType(); 5915 } 5916 } 5917 else { 5918 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5919 if (ResultType.isNull()) 5920 return QualType(); 5921 5922 if (getDerived().TransformFunctionTypeParams( 5923 TL.getBeginLoc(), TL.getParams(), 5924 TL.getTypePtr()->param_type_begin(), 5925 T->getExtParameterInfosOrNull(), 5926 ParamTypes, &ParamDecls, ExtParamInfos)) 5927 return QualType(); 5928 } 5929 5930 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5931 5932 bool EPIChanged = false; 5933 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5934 return QualType(); 5935 5936 // Handle extended parameter information. 5937 if (auto NewExtParamInfos = 5938 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5939 if (!EPI.ExtParameterInfos || 5940 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5941 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5942 EPIChanged = true; 5943 } 5944 EPI.ExtParameterInfos = NewExtParamInfos; 5945 } else if (EPI.ExtParameterInfos) { 5946 EPIChanged = true; 5947 EPI.ExtParameterInfos = nullptr; 5948 } 5949 5950 QualType Result = TL.getType(); 5951 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5952 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5953 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5954 if (Result.isNull()) 5955 return QualType(); 5956 } 5957 5958 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5959 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5960 NewTL.setLParenLoc(TL.getLParenLoc()); 5961 NewTL.setRParenLoc(TL.getRParenLoc()); 5962 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5963 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5964 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5965 NewTL.setParam(i, ParamDecls[i]); 5966 5967 return Result; 5968 } 5969 5970 template<typename Derived> 5971 bool TreeTransform<Derived>::TransformExceptionSpec( 5972 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5973 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5974 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5975 5976 // Instantiate a dynamic noexcept expression, if any. 5977 if (isComputedNoexcept(ESI.Type)) { 5978 EnterExpressionEvaluationContext Unevaluated( 5979 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5980 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5981 if (NoexceptExpr.isInvalid()) 5982 return true; 5983 5984 ExceptionSpecificationType EST = ESI.Type; 5985 NoexceptExpr = 5986 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 5987 if (NoexceptExpr.isInvalid()) 5988 return true; 5989 5990 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5991 Changed = true; 5992 ESI.NoexceptExpr = NoexceptExpr.get(); 5993 ESI.Type = EST; 5994 } 5995 5996 if (ESI.Type != EST_Dynamic) 5997 return false; 5998 5999 // Instantiate a dynamic exception specification's type. 6000 for (QualType T : ESI.Exceptions) { 6001 if (const PackExpansionType *PackExpansion = 6002 T->getAs<PackExpansionType>()) { 6003 Changed = true; 6004 6005 // We have a pack expansion. Instantiate it. 6006 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6007 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6008 Unexpanded); 6009 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6010 6011 // Determine whether the set of unexpanded parameter packs can and 6012 // should 6013 // be expanded. 6014 bool Expand = false; 6015 bool RetainExpansion = false; 6016 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6017 // FIXME: Track the location of the ellipsis (and track source location 6018 // information for the types in the exception specification in general). 6019 if (getDerived().TryExpandParameterPacks( 6020 Loc, SourceRange(), Unexpanded, Expand, 6021 RetainExpansion, NumExpansions)) 6022 return true; 6023 6024 if (!Expand) { 6025 // We can't expand this pack expansion into separate arguments yet; 6026 // just substitute into the pattern and create a new pack expansion 6027 // type. 6028 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6029 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6030 if (U.isNull()) 6031 return true; 6032 6033 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6034 Exceptions.push_back(U); 6035 continue; 6036 } 6037 6038 // Substitute into the pack expansion pattern for each slice of the 6039 // pack. 6040 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6041 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6042 6043 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6044 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6045 return true; 6046 6047 Exceptions.push_back(U); 6048 } 6049 } else { 6050 QualType U = getDerived().TransformType(T); 6051 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6052 return true; 6053 if (T != U) 6054 Changed = true; 6055 6056 Exceptions.push_back(U); 6057 } 6058 } 6059 6060 ESI.Exceptions = Exceptions; 6061 if (ESI.Exceptions.empty()) 6062 ESI.Type = EST_DynamicNone; 6063 return false; 6064 } 6065 6066 template<typename Derived> 6067 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6068 TypeLocBuilder &TLB, 6069 FunctionNoProtoTypeLoc TL) { 6070 const FunctionNoProtoType *T = TL.getTypePtr(); 6071 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6072 if (ResultType.isNull()) 6073 return QualType(); 6074 6075 QualType Result = TL.getType(); 6076 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6077 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6078 6079 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6080 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6081 NewTL.setLParenLoc(TL.getLParenLoc()); 6082 NewTL.setRParenLoc(TL.getRParenLoc()); 6083 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6084 6085 return Result; 6086 } 6087 6088 template <typename Derived> 6089 QualType TreeTransform<Derived>::TransformUnresolvedUsingType( 6090 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) { 6091 const UnresolvedUsingType *T = TL.getTypePtr(); 6092 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6093 if (!D) 6094 return QualType(); 6095 6096 QualType Result = TL.getType(); 6097 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6098 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6099 if (Result.isNull()) 6100 return QualType(); 6101 } 6102 6103 // We might get an arbitrary type spec type back. We should at 6104 // least always get a type spec type, though. 6105 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6106 NewTL.setNameLoc(TL.getNameLoc()); 6107 6108 return Result; 6109 } 6110 6111 template <typename Derived> 6112 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB, 6113 UsingTypeLoc TL) { 6114 const UsingType *T = TL.getTypePtr(); 6115 6116 auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl( 6117 TL.getLocalSourceRange().getBegin(), T->getFoundDecl())); 6118 if (!Found) 6119 return QualType(); 6120 6121 QualType Underlying = getDerived().TransformType(T->desugar()); 6122 if (Underlying.isNull()) 6123 return QualType(); 6124 6125 QualType Result = TL.getType(); 6126 if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() || 6127 Underlying != T->getUnderlyingType()) { 6128 Result = getDerived().RebuildUsingType(Found, Underlying); 6129 if (Result.isNull()) 6130 return QualType(); 6131 } 6132 6133 TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc()); 6134 return Result; 6135 } 6136 6137 template<typename Derived> 6138 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6139 TypedefTypeLoc TL) { 6140 const TypedefType *T = TL.getTypePtr(); 6141 TypedefNameDecl *Typedef 6142 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6143 T->getDecl())); 6144 if (!Typedef) 6145 return QualType(); 6146 6147 QualType Result = TL.getType(); 6148 if (getDerived().AlwaysRebuild() || 6149 Typedef != T->getDecl()) { 6150 Result = getDerived().RebuildTypedefType(Typedef); 6151 if (Result.isNull()) 6152 return QualType(); 6153 } 6154 6155 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6156 NewTL.setNameLoc(TL.getNameLoc()); 6157 6158 return Result; 6159 } 6160 6161 template<typename Derived> 6162 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6163 TypeOfExprTypeLoc TL) { 6164 // typeof expressions are not potentially evaluated contexts 6165 EnterExpressionEvaluationContext Unevaluated( 6166 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6167 Sema::ReuseLambdaContextDecl); 6168 6169 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6170 if (E.isInvalid()) 6171 return QualType(); 6172 6173 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6174 if (E.isInvalid()) 6175 return QualType(); 6176 6177 QualType Result = TL.getType(); 6178 if (getDerived().AlwaysRebuild() || 6179 E.get() != TL.getUnderlyingExpr()) { 6180 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6181 if (Result.isNull()) 6182 return QualType(); 6183 } 6184 else E.get(); 6185 6186 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6187 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6188 NewTL.setLParenLoc(TL.getLParenLoc()); 6189 NewTL.setRParenLoc(TL.getRParenLoc()); 6190 6191 return Result; 6192 } 6193 6194 template<typename Derived> 6195 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6196 TypeOfTypeLoc TL) { 6197 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6198 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6199 if (!New_Under_TI) 6200 return QualType(); 6201 6202 QualType Result = TL.getType(); 6203 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6204 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6205 if (Result.isNull()) 6206 return QualType(); 6207 } 6208 6209 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6210 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6211 NewTL.setLParenLoc(TL.getLParenLoc()); 6212 NewTL.setRParenLoc(TL.getRParenLoc()); 6213 NewTL.setUnderlyingTInfo(New_Under_TI); 6214 6215 return Result; 6216 } 6217 6218 template<typename Derived> 6219 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6220 DecltypeTypeLoc TL) { 6221 const DecltypeType *T = TL.getTypePtr(); 6222 6223 // decltype expressions are not potentially evaluated contexts 6224 EnterExpressionEvaluationContext Unevaluated( 6225 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6226 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6227 6228 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6229 if (E.isInvalid()) 6230 return QualType(); 6231 6232 E = getSema().ActOnDecltypeExpression(E.get()); 6233 if (E.isInvalid()) 6234 return QualType(); 6235 6236 QualType Result = TL.getType(); 6237 if (getDerived().AlwaysRebuild() || 6238 E.get() != T->getUnderlyingExpr()) { 6239 Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc()); 6240 if (Result.isNull()) 6241 return QualType(); 6242 } 6243 else E.get(); 6244 6245 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6246 NewTL.setDecltypeLoc(TL.getDecltypeLoc()); 6247 NewTL.setRParenLoc(TL.getRParenLoc()); 6248 return Result; 6249 } 6250 6251 template<typename Derived> 6252 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6253 TypeLocBuilder &TLB, 6254 UnaryTransformTypeLoc TL) { 6255 QualType Result = TL.getType(); 6256 if (Result->isDependentType()) { 6257 const UnaryTransformType *T = TL.getTypePtr(); 6258 QualType NewBase = 6259 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6260 Result = getDerived().RebuildUnaryTransformType(NewBase, 6261 T->getUTTKind(), 6262 TL.getKWLoc()); 6263 if (Result.isNull()) 6264 return QualType(); 6265 } 6266 6267 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6268 NewTL.setKWLoc(TL.getKWLoc()); 6269 NewTL.setParensRange(TL.getParensRange()); 6270 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6271 return Result; 6272 } 6273 6274 template<typename Derived> 6275 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6276 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6277 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6278 6279 CXXScopeSpec SS; 6280 TemplateName TemplateName = getDerived().TransformTemplateName( 6281 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6282 if (TemplateName.isNull()) 6283 return QualType(); 6284 6285 QualType OldDeduced = T->getDeducedType(); 6286 QualType NewDeduced; 6287 if (!OldDeduced.isNull()) { 6288 NewDeduced = getDerived().TransformType(OldDeduced); 6289 if (NewDeduced.isNull()) 6290 return QualType(); 6291 } 6292 6293 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6294 TemplateName, NewDeduced); 6295 if (Result.isNull()) 6296 return QualType(); 6297 6298 DeducedTemplateSpecializationTypeLoc NewTL = 6299 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6300 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6301 6302 return Result; 6303 } 6304 6305 template<typename Derived> 6306 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6307 RecordTypeLoc TL) { 6308 const RecordType *T = TL.getTypePtr(); 6309 RecordDecl *Record 6310 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6311 T->getDecl())); 6312 if (!Record) 6313 return QualType(); 6314 6315 QualType Result = TL.getType(); 6316 if (getDerived().AlwaysRebuild() || 6317 Record != T->getDecl()) { 6318 Result = getDerived().RebuildRecordType(Record); 6319 if (Result.isNull()) 6320 return QualType(); 6321 } 6322 6323 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6324 NewTL.setNameLoc(TL.getNameLoc()); 6325 6326 return Result; 6327 } 6328 6329 template<typename Derived> 6330 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6331 EnumTypeLoc TL) { 6332 const EnumType *T = TL.getTypePtr(); 6333 EnumDecl *Enum 6334 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6335 T->getDecl())); 6336 if (!Enum) 6337 return QualType(); 6338 6339 QualType Result = TL.getType(); 6340 if (getDerived().AlwaysRebuild() || 6341 Enum != T->getDecl()) { 6342 Result = getDerived().RebuildEnumType(Enum); 6343 if (Result.isNull()) 6344 return QualType(); 6345 } 6346 6347 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6348 NewTL.setNameLoc(TL.getNameLoc()); 6349 6350 return Result; 6351 } 6352 6353 template<typename Derived> 6354 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6355 TypeLocBuilder &TLB, 6356 InjectedClassNameTypeLoc TL) { 6357 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6358 TL.getTypePtr()->getDecl()); 6359 if (!D) return QualType(); 6360 6361 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6362 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6363 return T; 6364 } 6365 6366 template<typename Derived> 6367 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6368 TypeLocBuilder &TLB, 6369 TemplateTypeParmTypeLoc TL) { 6370 return TransformTypeSpecType(TLB, TL); 6371 } 6372 6373 template<typename Derived> 6374 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6375 TypeLocBuilder &TLB, 6376 SubstTemplateTypeParmTypeLoc TL) { 6377 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6378 6379 // Substitute into the replacement type, which itself might involve something 6380 // that needs to be transformed. This only tends to occur with default 6381 // template arguments of template template parameters. 6382 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6383 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6384 if (Replacement.isNull()) 6385 return QualType(); 6386 6387 // Always canonicalize the replacement type. 6388 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6389 QualType Result 6390 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6391 Replacement); 6392 6393 // Propagate type-source information. 6394 SubstTemplateTypeParmTypeLoc NewTL 6395 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6396 NewTL.setNameLoc(TL.getNameLoc()); 6397 return Result; 6398 6399 } 6400 6401 template<typename Derived> 6402 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6403 TypeLocBuilder &TLB, 6404 SubstTemplateTypeParmPackTypeLoc TL) { 6405 return TransformTypeSpecType(TLB, TL); 6406 } 6407 6408 template<typename Derived> 6409 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6410 TypeLocBuilder &TLB, 6411 TemplateSpecializationTypeLoc TL) { 6412 const TemplateSpecializationType *T = TL.getTypePtr(); 6413 6414 // The nested-name-specifier never matters in a TemplateSpecializationType, 6415 // because we can't have a dependent nested-name-specifier anyway. 6416 CXXScopeSpec SS; 6417 TemplateName Template 6418 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6419 TL.getTemplateNameLoc()); 6420 if (Template.isNull()) 6421 return QualType(); 6422 6423 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6424 } 6425 6426 template<typename Derived> 6427 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6428 AtomicTypeLoc TL) { 6429 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6430 if (ValueType.isNull()) 6431 return QualType(); 6432 6433 QualType Result = TL.getType(); 6434 if (getDerived().AlwaysRebuild() || 6435 ValueType != TL.getValueLoc().getType()) { 6436 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6437 if (Result.isNull()) 6438 return QualType(); 6439 } 6440 6441 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6442 NewTL.setKWLoc(TL.getKWLoc()); 6443 NewTL.setLParenLoc(TL.getLParenLoc()); 6444 NewTL.setRParenLoc(TL.getRParenLoc()); 6445 6446 return Result; 6447 } 6448 6449 template <typename Derived> 6450 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6451 PipeTypeLoc TL) { 6452 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6453 if (ValueType.isNull()) 6454 return QualType(); 6455 6456 QualType Result = TL.getType(); 6457 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6458 const PipeType *PT = Result->castAs<PipeType>(); 6459 bool isReadPipe = PT->isReadOnly(); 6460 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6461 if (Result.isNull()) 6462 return QualType(); 6463 } 6464 6465 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6466 NewTL.setKWLoc(TL.getKWLoc()); 6467 6468 return Result; 6469 } 6470 6471 template <typename Derived> 6472 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB, 6473 BitIntTypeLoc TL) { 6474 const BitIntType *EIT = TL.getTypePtr(); 6475 QualType Result = TL.getType(); 6476 6477 if (getDerived().AlwaysRebuild()) { 6478 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(), 6479 EIT->getNumBits(), TL.getNameLoc()); 6480 if (Result.isNull()) 6481 return QualType(); 6482 } 6483 6484 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6485 NewTL.setNameLoc(TL.getNameLoc()); 6486 return Result; 6487 } 6488 6489 template <typename Derived> 6490 QualType TreeTransform<Derived>::TransformDependentBitIntType( 6491 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) { 6492 const DependentBitIntType *EIT = TL.getTypePtr(); 6493 6494 EnterExpressionEvaluationContext Unevaluated( 6495 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6496 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6497 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6498 6499 if (BitsExpr.isInvalid()) 6500 return QualType(); 6501 6502 QualType Result = TL.getType(); 6503 6504 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6505 Result = getDerived().RebuildDependentBitIntType( 6506 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6507 6508 if (Result.isNull()) 6509 return QualType(); 6510 } 6511 6512 if (isa<DependentBitIntType>(Result)) { 6513 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result); 6514 NewTL.setNameLoc(TL.getNameLoc()); 6515 } else { 6516 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6517 NewTL.setNameLoc(TL.getNameLoc()); 6518 } 6519 return Result; 6520 } 6521 6522 /// Simple iterator that traverses the template arguments in a 6523 /// container that provides a \c getArgLoc() member function. 6524 /// 6525 /// This iterator is intended to be used with the iterator form of 6526 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6527 template<typename ArgLocContainer> 6528 class TemplateArgumentLocContainerIterator { 6529 ArgLocContainer *Container; 6530 unsigned Index; 6531 6532 public: 6533 typedef TemplateArgumentLoc value_type; 6534 typedef TemplateArgumentLoc reference; 6535 typedef int difference_type; 6536 typedef std::input_iterator_tag iterator_category; 6537 6538 class pointer { 6539 TemplateArgumentLoc Arg; 6540 6541 public: 6542 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6543 6544 const TemplateArgumentLoc *operator->() const { 6545 return &Arg; 6546 } 6547 }; 6548 6549 6550 TemplateArgumentLocContainerIterator() {} 6551 6552 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6553 unsigned Index) 6554 : Container(&Container), Index(Index) { } 6555 6556 TemplateArgumentLocContainerIterator &operator++() { 6557 ++Index; 6558 return *this; 6559 } 6560 6561 TemplateArgumentLocContainerIterator operator++(int) { 6562 TemplateArgumentLocContainerIterator Old(*this); 6563 ++(*this); 6564 return Old; 6565 } 6566 6567 TemplateArgumentLoc operator*() const { 6568 return Container->getArgLoc(Index); 6569 } 6570 6571 pointer operator->() const { 6572 return pointer(Container->getArgLoc(Index)); 6573 } 6574 6575 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6576 const TemplateArgumentLocContainerIterator &Y) { 6577 return X.Container == Y.Container && X.Index == Y.Index; 6578 } 6579 6580 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6581 const TemplateArgumentLocContainerIterator &Y) { 6582 return !(X == Y); 6583 } 6584 }; 6585 6586 template<typename Derived> 6587 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6588 AutoTypeLoc TL) { 6589 const AutoType *T = TL.getTypePtr(); 6590 QualType OldDeduced = T->getDeducedType(); 6591 QualType NewDeduced; 6592 if (!OldDeduced.isNull()) { 6593 NewDeduced = getDerived().TransformType(OldDeduced); 6594 if (NewDeduced.isNull()) 6595 return QualType(); 6596 } 6597 6598 ConceptDecl *NewCD = nullptr; 6599 TemplateArgumentListInfo NewTemplateArgs; 6600 NestedNameSpecifierLoc NewNestedNameSpec; 6601 if (T->isConstrained()) { 6602 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6603 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6604 6605 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6606 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6607 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6608 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6609 ArgIterator(TL, 6610 TL.getNumArgs()), 6611 NewTemplateArgs)) 6612 return QualType(); 6613 6614 if (TL.getNestedNameSpecifierLoc()) { 6615 NewNestedNameSpec 6616 = getDerived().TransformNestedNameSpecifierLoc( 6617 TL.getNestedNameSpecifierLoc()); 6618 if (!NewNestedNameSpec) 6619 return QualType(); 6620 } 6621 } 6622 6623 QualType Result = TL.getType(); 6624 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6625 T->isDependentType() || T->isConstrained()) { 6626 // FIXME: Maybe don't rebuild if all template arguments are the same. 6627 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6628 NewArgList.reserve(NewTemplateArgs.size()); 6629 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6630 NewArgList.push_back(ArgLoc.getArgument()); 6631 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6632 NewArgList); 6633 if (Result.isNull()) 6634 return QualType(); 6635 } 6636 6637 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6638 NewTL.setNameLoc(TL.getNameLoc()); 6639 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6640 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6641 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6642 NewTL.setFoundDecl(TL.getFoundDecl()); 6643 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6644 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6645 NewTL.setRParenLoc(TL.getRParenLoc()); 6646 for (unsigned I = 0; I < NewTL.getNumArgs(); ++I) 6647 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6648 6649 return Result; 6650 } 6651 6652 template <typename Derived> 6653 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6654 TypeLocBuilder &TLB, 6655 TemplateSpecializationTypeLoc TL, 6656 TemplateName Template) { 6657 TemplateArgumentListInfo NewTemplateArgs; 6658 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6659 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6660 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6661 ArgIterator; 6662 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6663 ArgIterator(TL, TL.getNumArgs()), 6664 NewTemplateArgs)) 6665 return QualType(); 6666 6667 // FIXME: maybe don't rebuild if all the template arguments are the same. 6668 6669 QualType Result = 6670 getDerived().RebuildTemplateSpecializationType(Template, 6671 TL.getTemplateNameLoc(), 6672 NewTemplateArgs); 6673 6674 if (!Result.isNull()) { 6675 // Specializations of template template parameters are represented as 6676 // TemplateSpecializationTypes, and substitution of type alias templates 6677 // within a dependent context can transform them into 6678 // DependentTemplateSpecializationTypes. 6679 if (isa<DependentTemplateSpecializationType>(Result)) { 6680 DependentTemplateSpecializationTypeLoc NewTL 6681 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6682 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6683 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6684 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6685 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6686 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6687 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6688 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6689 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6690 return Result; 6691 } 6692 6693 TemplateSpecializationTypeLoc NewTL 6694 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6695 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6696 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6697 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6698 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6699 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6700 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6701 } 6702 6703 return Result; 6704 } 6705 6706 template <typename Derived> 6707 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6708 TypeLocBuilder &TLB, 6709 DependentTemplateSpecializationTypeLoc TL, 6710 TemplateName Template, 6711 CXXScopeSpec &SS) { 6712 TemplateArgumentListInfo NewTemplateArgs; 6713 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6714 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6715 typedef TemplateArgumentLocContainerIterator< 6716 DependentTemplateSpecializationTypeLoc> ArgIterator; 6717 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6718 ArgIterator(TL, TL.getNumArgs()), 6719 NewTemplateArgs)) 6720 return QualType(); 6721 6722 // FIXME: maybe don't rebuild if all the template arguments are the same. 6723 6724 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6725 QualType Result 6726 = getSema().Context.getDependentTemplateSpecializationType( 6727 TL.getTypePtr()->getKeyword(), 6728 DTN->getQualifier(), 6729 DTN->getIdentifier(), 6730 NewTemplateArgs); 6731 6732 DependentTemplateSpecializationTypeLoc NewTL 6733 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6734 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6735 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6736 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6737 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6738 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6739 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6740 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6741 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6742 return Result; 6743 } 6744 6745 QualType Result 6746 = getDerived().RebuildTemplateSpecializationType(Template, 6747 TL.getTemplateNameLoc(), 6748 NewTemplateArgs); 6749 6750 if (!Result.isNull()) { 6751 /// FIXME: Wrap this in an elaborated-type-specifier? 6752 TemplateSpecializationTypeLoc NewTL 6753 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6754 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6755 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6756 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6757 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6758 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6759 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6760 } 6761 6762 return Result; 6763 } 6764 6765 template<typename Derived> 6766 QualType 6767 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6768 ElaboratedTypeLoc TL) { 6769 const ElaboratedType *T = TL.getTypePtr(); 6770 6771 NestedNameSpecifierLoc QualifierLoc; 6772 // NOTE: the qualifier in an ElaboratedType is optional. 6773 if (TL.getQualifierLoc()) { 6774 QualifierLoc 6775 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6776 if (!QualifierLoc) 6777 return QualType(); 6778 } 6779 6780 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6781 if (NamedT.isNull()) 6782 return QualType(); 6783 6784 // C++0x [dcl.type.elab]p2: 6785 // If the identifier resolves to a typedef-name or the simple-template-id 6786 // resolves to an alias template specialization, the 6787 // elaborated-type-specifier is ill-formed. 6788 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6789 if (const TemplateSpecializationType *TST = 6790 NamedT->getAs<TemplateSpecializationType>()) { 6791 TemplateName Template = TST->getTemplateName(); 6792 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6793 Template.getAsTemplateDecl())) { 6794 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6795 diag::err_tag_reference_non_tag) 6796 << TAT << Sema::NTK_TypeAliasTemplate 6797 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6798 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6799 } 6800 } 6801 } 6802 6803 QualType Result = TL.getType(); 6804 if (getDerived().AlwaysRebuild() || 6805 QualifierLoc != TL.getQualifierLoc() || 6806 NamedT != T->getNamedType()) { 6807 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6808 T->getKeyword(), 6809 QualifierLoc, NamedT); 6810 if (Result.isNull()) 6811 return QualType(); 6812 } 6813 6814 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6815 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6816 NewTL.setQualifierLoc(QualifierLoc); 6817 return Result; 6818 } 6819 6820 template<typename Derived> 6821 QualType TreeTransform<Derived>::TransformAttributedType( 6822 TypeLocBuilder &TLB, 6823 AttributedTypeLoc TL) { 6824 const AttributedType *oldType = TL.getTypePtr(); 6825 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6826 if (modifiedType.isNull()) 6827 return QualType(); 6828 6829 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6830 const Attr *oldAttr = TL.getAttr(); 6831 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6832 if (oldAttr && !newAttr) 6833 return QualType(); 6834 6835 QualType result = TL.getType(); 6836 6837 // FIXME: dependent operand expressions? 6838 if (getDerived().AlwaysRebuild() || 6839 modifiedType != oldType->getModifiedType()) { 6840 // TODO: this is really lame; we should really be rebuilding the 6841 // equivalent type from first principles. 6842 QualType equivalentType 6843 = getDerived().TransformType(oldType->getEquivalentType()); 6844 if (equivalentType.isNull()) 6845 return QualType(); 6846 6847 // Check whether we can add nullability; it is only represented as 6848 // type sugar, and therefore cannot be diagnosed in any other way. 6849 if (auto nullability = oldType->getImmediateNullability()) { 6850 if (!modifiedType->canHaveNullability()) { 6851 SemaRef.Diag(TL.getAttr()->getLocation(), 6852 diag::err_nullability_nonpointer) 6853 << DiagNullabilityKind(*nullability, false) << modifiedType; 6854 return QualType(); 6855 } 6856 } 6857 6858 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6859 modifiedType, 6860 equivalentType); 6861 } 6862 6863 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6864 newTL.setAttr(newAttr); 6865 return result; 6866 } 6867 6868 template <typename Derived> 6869 QualType TreeTransform<Derived>::TransformBTFTagAttributedType( 6870 TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) { 6871 // The BTFTagAttributedType is available for C only. 6872 llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType"); 6873 } 6874 6875 template<typename Derived> 6876 QualType 6877 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6878 ParenTypeLoc TL) { 6879 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6880 if (Inner.isNull()) 6881 return QualType(); 6882 6883 QualType Result = TL.getType(); 6884 if (getDerived().AlwaysRebuild() || 6885 Inner != TL.getInnerLoc().getType()) { 6886 Result = getDerived().RebuildParenType(Inner); 6887 if (Result.isNull()) 6888 return QualType(); 6889 } 6890 6891 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6892 NewTL.setLParenLoc(TL.getLParenLoc()); 6893 NewTL.setRParenLoc(TL.getRParenLoc()); 6894 return Result; 6895 } 6896 6897 template <typename Derived> 6898 QualType 6899 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6900 MacroQualifiedTypeLoc TL) { 6901 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6902 if (Inner.isNull()) 6903 return QualType(); 6904 6905 QualType Result = TL.getType(); 6906 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6907 Result = 6908 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6909 if (Result.isNull()) 6910 return QualType(); 6911 } 6912 6913 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6914 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6915 return Result; 6916 } 6917 6918 template<typename Derived> 6919 QualType TreeTransform<Derived>::TransformDependentNameType( 6920 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6921 return TransformDependentNameType(TLB, TL, false); 6922 } 6923 6924 template<typename Derived> 6925 QualType TreeTransform<Derived>::TransformDependentNameType( 6926 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6927 const DependentNameType *T = TL.getTypePtr(); 6928 6929 NestedNameSpecifierLoc QualifierLoc 6930 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6931 if (!QualifierLoc) 6932 return QualType(); 6933 6934 QualType Result 6935 = getDerived().RebuildDependentNameType(T->getKeyword(), 6936 TL.getElaboratedKeywordLoc(), 6937 QualifierLoc, 6938 T->getIdentifier(), 6939 TL.getNameLoc(), 6940 DeducedTSTContext); 6941 if (Result.isNull()) 6942 return QualType(); 6943 6944 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6945 QualType NamedT = ElabT->getNamedType(); 6946 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6947 6948 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6949 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6950 NewTL.setQualifierLoc(QualifierLoc); 6951 } else { 6952 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6953 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6954 NewTL.setQualifierLoc(QualifierLoc); 6955 NewTL.setNameLoc(TL.getNameLoc()); 6956 } 6957 return Result; 6958 } 6959 6960 template<typename Derived> 6961 QualType TreeTransform<Derived>:: 6962 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6963 DependentTemplateSpecializationTypeLoc TL) { 6964 NestedNameSpecifierLoc QualifierLoc; 6965 if (TL.getQualifierLoc()) { 6966 QualifierLoc 6967 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6968 if (!QualifierLoc) 6969 return QualType(); 6970 } 6971 6972 return getDerived() 6973 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6974 } 6975 6976 template<typename Derived> 6977 QualType TreeTransform<Derived>:: 6978 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6979 DependentTemplateSpecializationTypeLoc TL, 6980 NestedNameSpecifierLoc QualifierLoc) { 6981 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6982 6983 TemplateArgumentListInfo NewTemplateArgs; 6984 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6985 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6986 6987 typedef TemplateArgumentLocContainerIterator< 6988 DependentTemplateSpecializationTypeLoc> ArgIterator; 6989 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6990 ArgIterator(TL, TL.getNumArgs()), 6991 NewTemplateArgs)) 6992 return QualType(); 6993 6994 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6995 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6996 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6997 /*AllowInjectedClassName*/ false); 6998 if (Result.isNull()) 6999 return QualType(); 7000 7001 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 7002 QualType NamedT = ElabT->getNamedType(); 7003 7004 // Copy information relevant to the template specialization. 7005 TemplateSpecializationTypeLoc NamedTL 7006 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 7007 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7008 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7009 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 7010 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 7011 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7012 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7013 7014 // Copy information relevant to the elaborated type. 7015 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7016 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7017 NewTL.setQualifierLoc(QualifierLoc); 7018 } else if (isa<DependentTemplateSpecializationType>(Result)) { 7019 DependentTemplateSpecializationTypeLoc SpecTL 7020 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 7021 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7022 SpecTL.setQualifierLoc(QualifierLoc); 7023 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7024 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7025 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7026 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7027 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7028 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7029 } else { 7030 TemplateSpecializationTypeLoc SpecTL 7031 = TLB.push<TemplateSpecializationTypeLoc>(Result); 7032 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7033 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7034 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7035 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7036 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7037 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7038 } 7039 return Result; 7040 } 7041 7042 template<typename Derived> 7043 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 7044 PackExpansionTypeLoc TL) { 7045 QualType Pattern 7046 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7047 if (Pattern.isNull()) 7048 return QualType(); 7049 7050 QualType Result = TL.getType(); 7051 if (getDerived().AlwaysRebuild() || 7052 Pattern != TL.getPatternLoc().getType()) { 7053 Result = getDerived().RebuildPackExpansionType(Pattern, 7054 TL.getPatternLoc().getSourceRange(), 7055 TL.getEllipsisLoc(), 7056 TL.getTypePtr()->getNumExpansions()); 7057 if (Result.isNull()) 7058 return QualType(); 7059 } 7060 7061 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7062 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7063 return Result; 7064 } 7065 7066 template<typename Derived> 7067 QualType 7068 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7069 ObjCInterfaceTypeLoc TL) { 7070 // ObjCInterfaceType is never dependent. 7071 TLB.pushFullCopy(TL); 7072 return TL.getType(); 7073 } 7074 7075 template<typename Derived> 7076 QualType 7077 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7078 ObjCTypeParamTypeLoc TL) { 7079 const ObjCTypeParamType *T = TL.getTypePtr(); 7080 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7081 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7082 if (!OTP) 7083 return QualType(); 7084 7085 QualType Result = TL.getType(); 7086 if (getDerived().AlwaysRebuild() || 7087 OTP != T->getDecl()) { 7088 Result = getDerived().RebuildObjCTypeParamType(OTP, 7089 TL.getProtocolLAngleLoc(), 7090 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7091 TL.getNumProtocols()), 7092 TL.getProtocolLocs(), 7093 TL.getProtocolRAngleLoc()); 7094 if (Result.isNull()) 7095 return QualType(); 7096 } 7097 7098 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7099 if (TL.getNumProtocols()) { 7100 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7101 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7102 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7103 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7104 } 7105 return Result; 7106 } 7107 7108 template<typename Derived> 7109 QualType 7110 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7111 ObjCObjectTypeLoc TL) { 7112 // Transform base type. 7113 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7114 if (BaseType.isNull()) 7115 return QualType(); 7116 7117 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7118 7119 // Transform type arguments. 7120 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7121 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7122 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7123 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7124 QualType TypeArg = TypeArgInfo->getType(); 7125 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7126 AnyChanged = true; 7127 7128 // We have a pack expansion. Instantiate it. 7129 const auto *PackExpansion = PackExpansionLoc.getType() 7130 ->castAs<PackExpansionType>(); 7131 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7132 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7133 Unexpanded); 7134 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7135 7136 // Determine whether the set of unexpanded parameter packs can 7137 // and should be expanded. 7138 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7139 bool Expand = false; 7140 bool RetainExpansion = false; 7141 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7142 if (getDerived().TryExpandParameterPacks( 7143 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7144 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7145 return QualType(); 7146 7147 if (!Expand) { 7148 // We can't expand this pack expansion into separate arguments yet; 7149 // just substitute into the pattern and create a new pack expansion 7150 // type. 7151 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7152 7153 TypeLocBuilder TypeArgBuilder; 7154 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7155 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7156 PatternLoc); 7157 if (NewPatternType.isNull()) 7158 return QualType(); 7159 7160 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7161 NewPatternType, NumExpansions); 7162 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7163 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7164 NewTypeArgInfos.push_back( 7165 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7166 continue; 7167 } 7168 7169 // Substitute into the pack expansion pattern for each slice of the 7170 // pack. 7171 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7172 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7173 7174 TypeLocBuilder TypeArgBuilder; 7175 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7176 7177 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7178 PatternLoc); 7179 if (NewTypeArg.isNull()) 7180 return QualType(); 7181 7182 NewTypeArgInfos.push_back( 7183 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7184 } 7185 7186 continue; 7187 } 7188 7189 TypeLocBuilder TypeArgBuilder; 7190 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7191 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7192 if (NewTypeArg.isNull()) 7193 return QualType(); 7194 7195 // If nothing changed, just keep the old TypeSourceInfo. 7196 if (NewTypeArg == TypeArg) { 7197 NewTypeArgInfos.push_back(TypeArgInfo); 7198 continue; 7199 } 7200 7201 NewTypeArgInfos.push_back( 7202 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7203 AnyChanged = true; 7204 } 7205 7206 QualType Result = TL.getType(); 7207 if (getDerived().AlwaysRebuild() || AnyChanged) { 7208 // Rebuild the type. 7209 Result = getDerived().RebuildObjCObjectType( 7210 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7211 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7212 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7213 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7214 7215 if (Result.isNull()) 7216 return QualType(); 7217 } 7218 7219 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7220 NewT.setHasBaseTypeAsWritten(true); 7221 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7222 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7223 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7224 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7225 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7226 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7227 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7228 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7229 return Result; 7230 } 7231 7232 template<typename Derived> 7233 QualType 7234 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7235 ObjCObjectPointerTypeLoc TL) { 7236 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7237 if (PointeeType.isNull()) 7238 return QualType(); 7239 7240 QualType Result = TL.getType(); 7241 if (getDerived().AlwaysRebuild() || 7242 PointeeType != TL.getPointeeLoc().getType()) { 7243 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7244 TL.getStarLoc()); 7245 if (Result.isNull()) 7246 return QualType(); 7247 } 7248 7249 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7250 NewT.setStarLoc(TL.getStarLoc()); 7251 return Result; 7252 } 7253 7254 //===----------------------------------------------------------------------===// 7255 // Statement transformation 7256 //===----------------------------------------------------------------------===// 7257 template<typename Derived> 7258 StmtResult 7259 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7260 return S; 7261 } 7262 7263 template<typename Derived> 7264 StmtResult 7265 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7266 return getDerived().TransformCompoundStmt(S, false); 7267 } 7268 7269 template<typename Derived> 7270 StmtResult 7271 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7272 bool IsStmtExpr) { 7273 Sema::CompoundScopeRAII CompoundScope(getSema()); 7274 7275 const Stmt *ExprResult = S->getStmtExprResult(); 7276 bool SubStmtInvalid = false; 7277 bool SubStmtChanged = false; 7278 SmallVector<Stmt*, 8> Statements; 7279 for (auto *B : S->body()) { 7280 StmtResult Result = getDerived().TransformStmt( 7281 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7282 7283 if (Result.isInvalid()) { 7284 // Immediately fail if this was a DeclStmt, since it's very 7285 // likely that this will cause problems for future statements. 7286 if (isa<DeclStmt>(B)) 7287 return StmtError(); 7288 7289 // Otherwise, just keep processing substatements and fail later. 7290 SubStmtInvalid = true; 7291 continue; 7292 } 7293 7294 SubStmtChanged = SubStmtChanged || Result.get() != B; 7295 Statements.push_back(Result.getAs<Stmt>()); 7296 } 7297 7298 if (SubStmtInvalid) 7299 return StmtError(); 7300 7301 if (!getDerived().AlwaysRebuild() && 7302 !SubStmtChanged) 7303 return S; 7304 7305 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7306 Statements, 7307 S->getRBracLoc(), 7308 IsStmtExpr); 7309 } 7310 7311 template<typename Derived> 7312 StmtResult 7313 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7314 ExprResult LHS, RHS; 7315 { 7316 EnterExpressionEvaluationContext Unevaluated( 7317 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7318 7319 // Transform the left-hand case value. 7320 LHS = getDerived().TransformExpr(S->getLHS()); 7321 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7322 if (LHS.isInvalid()) 7323 return StmtError(); 7324 7325 // Transform the right-hand case value (for the GNU case-range extension). 7326 RHS = getDerived().TransformExpr(S->getRHS()); 7327 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7328 if (RHS.isInvalid()) 7329 return StmtError(); 7330 } 7331 7332 // Build the case statement. 7333 // Case statements are always rebuilt so that they will attached to their 7334 // transformed switch statement. 7335 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7336 LHS.get(), 7337 S->getEllipsisLoc(), 7338 RHS.get(), 7339 S->getColonLoc()); 7340 if (Case.isInvalid()) 7341 return StmtError(); 7342 7343 // Transform the statement following the case 7344 StmtResult SubStmt = 7345 getDerived().TransformStmt(S->getSubStmt()); 7346 if (SubStmt.isInvalid()) 7347 return StmtError(); 7348 7349 // Attach the body to the case statement 7350 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7351 } 7352 7353 template <typename Derived> 7354 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7355 // Transform the statement following the default case 7356 StmtResult SubStmt = 7357 getDerived().TransformStmt(S->getSubStmt()); 7358 if (SubStmt.isInvalid()) 7359 return StmtError(); 7360 7361 // Default statements are always rebuilt 7362 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7363 SubStmt.get()); 7364 } 7365 7366 template<typename Derived> 7367 StmtResult 7368 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7369 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7370 if (SubStmt.isInvalid()) 7371 return StmtError(); 7372 7373 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7374 S->getDecl()); 7375 if (!LD) 7376 return StmtError(); 7377 7378 // If we're transforming "in-place" (we're not creating new local 7379 // declarations), assume we're replacing the old label statement 7380 // and clear out the reference to it. 7381 if (LD == S->getDecl()) 7382 S->getDecl()->setStmt(nullptr); 7383 7384 // FIXME: Pass the real colon location in. 7385 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7386 cast<LabelDecl>(LD), SourceLocation(), 7387 SubStmt.get()); 7388 } 7389 7390 template <typename Derived> 7391 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7392 if (!R) 7393 return R; 7394 7395 switch (R->getKind()) { 7396 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7397 #define ATTR(X) 7398 #define PRAGMA_SPELLING_ATTR(X) \ 7399 case attr::X: \ 7400 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7401 #include "clang/Basic/AttrList.inc" 7402 default: 7403 return R; 7404 } 7405 } 7406 7407 template <typename Derived> 7408 StmtResult 7409 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7410 StmtDiscardKind SDK) { 7411 bool AttrsChanged = false; 7412 SmallVector<const Attr *, 1> Attrs; 7413 7414 // Visit attributes and keep track if any are transformed. 7415 for (const auto *I : S->getAttrs()) { 7416 const Attr *R = getDerived().TransformAttr(I); 7417 AttrsChanged |= (I != R); 7418 if (R) 7419 Attrs.push_back(R); 7420 } 7421 7422 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7423 if (SubStmt.isInvalid()) 7424 return StmtError(); 7425 7426 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7427 return S; 7428 7429 // If transforming the attributes failed for all of the attributes in the 7430 // statement, don't make an AttributedStmt without attributes. 7431 if (Attrs.empty()) 7432 return SubStmt; 7433 7434 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7435 SubStmt.get()); 7436 } 7437 7438 template<typename Derived> 7439 StmtResult 7440 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7441 // Transform the initialization statement 7442 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7443 if (Init.isInvalid()) 7444 return StmtError(); 7445 7446 Sema::ConditionResult Cond; 7447 if (!S->isConsteval()) { 7448 // Transform the condition 7449 Cond = getDerived().TransformCondition( 7450 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7451 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7452 : Sema::ConditionKind::Boolean); 7453 if (Cond.isInvalid()) 7454 return StmtError(); 7455 } 7456 7457 // If this is a constexpr if, determine which arm we should instantiate. 7458 llvm::Optional<bool> ConstexprConditionValue; 7459 if (S->isConstexpr()) 7460 ConstexprConditionValue = Cond.getKnownValue(); 7461 7462 // Transform the "then" branch. 7463 StmtResult Then; 7464 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7465 Then = getDerived().TransformStmt(S->getThen()); 7466 if (Then.isInvalid()) 7467 return StmtError(); 7468 } else { 7469 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7470 } 7471 7472 // Transform the "else" branch. 7473 StmtResult Else; 7474 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7475 Else = getDerived().TransformStmt(S->getElse()); 7476 if (Else.isInvalid()) 7477 return StmtError(); 7478 } 7479 7480 if (!getDerived().AlwaysRebuild() && 7481 Init.get() == S->getInit() && 7482 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7483 Then.get() == S->getThen() && 7484 Else.get() == S->getElse()) 7485 return S; 7486 7487 return getDerived().RebuildIfStmt( 7488 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7489 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7490 } 7491 7492 template<typename Derived> 7493 StmtResult 7494 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7495 // Transform the initialization statement 7496 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7497 if (Init.isInvalid()) 7498 return StmtError(); 7499 7500 // Transform the condition. 7501 Sema::ConditionResult Cond = getDerived().TransformCondition( 7502 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7503 Sema::ConditionKind::Switch); 7504 if (Cond.isInvalid()) 7505 return StmtError(); 7506 7507 // Rebuild the switch statement. 7508 StmtResult Switch = 7509 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7510 Init.get(), Cond, S->getRParenLoc()); 7511 if (Switch.isInvalid()) 7512 return StmtError(); 7513 7514 // Transform the body of the switch statement. 7515 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7516 if (Body.isInvalid()) 7517 return StmtError(); 7518 7519 // Complete the switch statement. 7520 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7521 Body.get()); 7522 } 7523 7524 template<typename Derived> 7525 StmtResult 7526 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7527 // Transform the condition 7528 Sema::ConditionResult Cond = getDerived().TransformCondition( 7529 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7530 Sema::ConditionKind::Boolean); 7531 if (Cond.isInvalid()) 7532 return StmtError(); 7533 7534 // Transform the body 7535 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7536 if (Body.isInvalid()) 7537 return StmtError(); 7538 7539 if (!getDerived().AlwaysRebuild() && 7540 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7541 Body.get() == S->getBody()) 7542 return Owned(S); 7543 7544 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7545 Cond, S->getRParenLoc(), Body.get()); 7546 } 7547 7548 template<typename Derived> 7549 StmtResult 7550 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7551 // Transform the body 7552 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7553 if (Body.isInvalid()) 7554 return StmtError(); 7555 7556 // Transform the condition 7557 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7558 if (Cond.isInvalid()) 7559 return StmtError(); 7560 7561 if (!getDerived().AlwaysRebuild() && 7562 Cond.get() == S->getCond() && 7563 Body.get() == S->getBody()) 7564 return S; 7565 7566 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7567 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7568 S->getRParenLoc()); 7569 } 7570 7571 template<typename Derived> 7572 StmtResult 7573 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7574 if (getSema().getLangOpts().OpenMP) 7575 getSema().startOpenMPLoop(); 7576 7577 // Transform the initialization statement 7578 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7579 if (Init.isInvalid()) 7580 return StmtError(); 7581 7582 // In OpenMP loop region loop control variable must be captured and be 7583 // private. Perform analysis of first part (if any). 7584 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7585 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7586 7587 // Transform the condition 7588 Sema::ConditionResult Cond = getDerived().TransformCondition( 7589 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7590 Sema::ConditionKind::Boolean); 7591 if (Cond.isInvalid()) 7592 return StmtError(); 7593 7594 // Transform the increment 7595 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7596 if (Inc.isInvalid()) 7597 return StmtError(); 7598 7599 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7600 if (S->getInc() && !FullInc.get()) 7601 return StmtError(); 7602 7603 // Transform the body 7604 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7605 if (Body.isInvalid()) 7606 return StmtError(); 7607 7608 if (!getDerived().AlwaysRebuild() && 7609 Init.get() == S->getInit() && 7610 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7611 Inc.get() == S->getInc() && 7612 Body.get() == S->getBody()) 7613 return S; 7614 7615 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7616 Init.get(), Cond, FullInc, 7617 S->getRParenLoc(), Body.get()); 7618 } 7619 7620 template<typename Derived> 7621 StmtResult 7622 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7623 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7624 S->getLabel()); 7625 if (!LD) 7626 return StmtError(); 7627 7628 // Goto statements must always be rebuilt, to resolve the label. 7629 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7630 cast<LabelDecl>(LD)); 7631 } 7632 7633 template<typename Derived> 7634 StmtResult 7635 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7636 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7637 if (Target.isInvalid()) 7638 return StmtError(); 7639 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7640 7641 if (!getDerived().AlwaysRebuild() && 7642 Target.get() == S->getTarget()) 7643 return S; 7644 7645 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7646 Target.get()); 7647 } 7648 7649 template<typename Derived> 7650 StmtResult 7651 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7652 return S; 7653 } 7654 7655 template<typename Derived> 7656 StmtResult 7657 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7658 return S; 7659 } 7660 7661 template<typename Derived> 7662 StmtResult 7663 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7664 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7665 /*NotCopyInit*/false); 7666 if (Result.isInvalid()) 7667 return StmtError(); 7668 7669 // FIXME: We always rebuild the return statement because there is no way 7670 // to tell whether the return type of the function has changed. 7671 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7672 } 7673 7674 template<typename Derived> 7675 StmtResult 7676 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7677 bool DeclChanged = false; 7678 SmallVector<Decl *, 4> Decls; 7679 for (auto *D : S->decls()) { 7680 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7681 if (!Transformed) 7682 return StmtError(); 7683 7684 if (Transformed != D) 7685 DeclChanged = true; 7686 7687 Decls.push_back(Transformed); 7688 } 7689 7690 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7691 return S; 7692 7693 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7694 } 7695 7696 template<typename Derived> 7697 StmtResult 7698 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7699 7700 SmallVector<Expr*, 8> Constraints; 7701 SmallVector<Expr*, 8> Exprs; 7702 SmallVector<IdentifierInfo *, 4> Names; 7703 7704 ExprResult AsmString; 7705 SmallVector<Expr*, 8> Clobbers; 7706 7707 bool ExprsChanged = false; 7708 7709 // Go through the outputs. 7710 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7711 Names.push_back(S->getOutputIdentifier(I)); 7712 7713 // No need to transform the constraint literal. 7714 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7715 7716 // Transform the output expr. 7717 Expr *OutputExpr = S->getOutputExpr(I); 7718 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7719 if (Result.isInvalid()) 7720 return StmtError(); 7721 7722 ExprsChanged |= Result.get() != OutputExpr; 7723 7724 Exprs.push_back(Result.get()); 7725 } 7726 7727 // Go through the inputs. 7728 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7729 Names.push_back(S->getInputIdentifier(I)); 7730 7731 // No need to transform the constraint literal. 7732 Constraints.push_back(S->getInputConstraintLiteral(I)); 7733 7734 // Transform the input expr. 7735 Expr *InputExpr = S->getInputExpr(I); 7736 ExprResult Result = getDerived().TransformExpr(InputExpr); 7737 if (Result.isInvalid()) 7738 return StmtError(); 7739 7740 ExprsChanged |= Result.get() != InputExpr; 7741 7742 Exprs.push_back(Result.get()); 7743 } 7744 7745 // Go through the Labels. 7746 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7747 Names.push_back(S->getLabelIdentifier(I)); 7748 7749 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7750 if (Result.isInvalid()) 7751 return StmtError(); 7752 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7753 Exprs.push_back(Result.get()); 7754 } 7755 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7756 return S; 7757 7758 // Go through the clobbers. 7759 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7760 Clobbers.push_back(S->getClobberStringLiteral(I)); 7761 7762 // No need to transform the asm string literal. 7763 AsmString = S->getAsmString(); 7764 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7765 S->isVolatile(), S->getNumOutputs(), 7766 S->getNumInputs(), Names.data(), 7767 Constraints, Exprs, AsmString.get(), 7768 Clobbers, S->getNumLabels(), 7769 S->getRParenLoc()); 7770 } 7771 7772 template<typename Derived> 7773 StmtResult 7774 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7775 ArrayRef<Token> AsmToks = 7776 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7777 7778 bool HadError = false, HadChange = false; 7779 7780 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7781 SmallVector<Expr*, 8> TransformedExprs; 7782 TransformedExprs.reserve(SrcExprs.size()); 7783 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7784 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7785 if (!Result.isUsable()) { 7786 HadError = true; 7787 } else { 7788 HadChange |= (Result.get() != SrcExprs[i]); 7789 TransformedExprs.push_back(Result.get()); 7790 } 7791 } 7792 7793 if (HadError) return StmtError(); 7794 if (!HadChange && !getDerived().AlwaysRebuild()) 7795 return Owned(S); 7796 7797 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7798 AsmToks, S->getAsmString(), 7799 S->getNumOutputs(), S->getNumInputs(), 7800 S->getAllConstraints(), S->getClobbers(), 7801 TransformedExprs, S->getEndLoc()); 7802 } 7803 7804 // C++ Coroutines TS 7805 7806 template<typename Derived> 7807 StmtResult 7808 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7809 auto *ScopeInfo = SemaRef.getCurFunction(); 7810 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7811 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7812 ScopeInfo->NeedsCoroutineSuspends && 7813 ScopeInfo->CoroutineSuspends.first == nullptr && 7814 ScopeInfo->CoroutineSuspends.second == nullptr && 7815 "expected clean scope info"); 7816 7817 // Set that we have (possibly-invalid) suspend points before we do anything 7818 // that may fail. 7819 ScopeInfo->setNeedsCoroutineSuspends(false); 7820 7821 // We re-build the coroutine promise object (and the coroutine parameters its 7822 // type and constructor depend on) based on the types used in our current 7823 // function. We must do so, and set it on the current FunctionScopeInfo, 7824 // before attempting to transform the other parts of the coroutine body 7825 // statement, such as the implicit suspend statements (because those 7826 // statements reference the FunctionScopeInfo::CoroutinePromise). 7827 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7828 return StmtError(); 7829 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7830 if (!Promise) 7831 return StmtError(); 7832 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7833 ScopeInfo->CoroutinePromise = Promise; 7834 7835 // Transform the implicit coroutine statements constructed using dependent 7836 // types during the previous parse: initial and final suspensions, the return 7837 // object, and others. We also transform the coroutine function's body. 7838 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7839 if (InitSuspend.isInvalid()) 7840 return StmtError(); 7841 StmtResult FinalSuspend = 7842 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7843 if (FinalSuspend.isInvalid() || 7844 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7845 return StmtError(); 7846 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7847 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7848 7849 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7850 if (BodyRes.isInvalid()) 7851 return StmtError(); 7852 7853 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7854 if (Builder.isInvalid()) 7855 return StmtError(); 7856 7857 Expr *ReturnObject = S->getReturnValueInit(); 7858 assert(ReturnObject && "the return object is expected to be valid"); 7859 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7860 /*NoCopyInit*/ false); 7861 if (Res.isInvalid()) 7862 return StmtError(); 7863 Builder.ReturnValue = Res.get(); 7864 7865 // If during the previous parse the coroutine still had a dependent promise 7866 // statement, we may need to build some implicit coroutine statements 7867 // (such as exception and fallthrough handlers) for the first time. 7868 if (S->hasDependentPromiseType()) { 7869 // We can only build these statements, however, if the current promise type 7870 // is not dependent. 7871 if (!Promise->getType()->isDependentType()) { 7872 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7873 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7874 "these nodes should not have been built yet"); 7875 if (!Builder.buildDependentStatements()) 7876 return StmtError(); 7877 } 7878 } else { 7879 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7880 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7881 if (Res.isInvalid()) 7882 return StmtError(); 7883 Builder.OnFallthrough = Res.get(); 7884 } 7885 7886 if (auto *OnException = S->getExceptionHandler()) { 7887 StmtResult Res = getDerived().TransformStmt(OnException); 7888 if (Res.isInvalid()) 7889 return StmtError(); 7890 Builder.OnException = Res.get(); 7891 } 7892 7893 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7894 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7895 if (Res.isInvalid()) 7896 return StmtError(); 7897 Builder.ReturnStmtOnAllocFailure = Res.get(); 7898 } 7899 7900 // Transform any additional statements we may have already built 7901 assert(S->getAllocate() && S->getDeallocate() && 7902 "allocation and deallocation calls must already be built"); 7903 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7904 if (AllocRes.isInvalid()) 7905 return StmtError(); 7906 Builder.Allocate = AllocRes.get(); 7907 7908 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7909 if (DeallocRes.isInvalid()) 7910 return StmtError(); 7911 Builder.Deallocate = DeallocRes.get(); 7912 7913 if (auto *ReturnStmt = S->getReturnStmt()) { 7914 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7915 if (Res.isInvalid()) 7916 return StmtError(); 7917 Builder.ReturnStmt = Res.get(); 7918 } 7919 } 7920 7921 return getDerived().RebuildCoroutineBodyStmt(Builder); 7922 } 7923 7924 template<typename Derived> 7925 StmtResult 7926 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7927 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7928 /*NotCopyInit*/false); 7929 if (Result.isInvalid()) 7930 return StmtError(); 7931 7932 // Always rebuild; we don't know if this needs to be injected into a new 7933 // context or if the promise type has changed. 7934 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7935 S->isImplicit()); 7936 } 7937 7938 template<typename Derived> 7939 ExprResult 7940 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7941 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7942 /*NotCopyInit*/false); 7943 if (Result.isInvalid()) 7944 return ExprError(); 7945 7946 // Always rebuild; we don't know if this needs to be injected into a new 7947 // context or if the promise type has changed. 7948 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7949 E->isImplicit()); 7950 } 7951 7952 template <typename Derived> 7953 ExprResult 7954 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7955 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7956 /*NotCopyInit*/ false); 7957 if (OperandResult.isInvalid()) 7958 return ExprError(); 7959 7960 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7961 E->getOperatorCoawaitLookup()); 7962 7963 if (LookupResult.isInvalid()) 7964 return ExprError(); 7965 7966 // Always rebuild; we don't know if this needs to be injected into a new 7967 // context or if the promise type has changed. 7968 return getDerived().RebuildDependentCoawaitExpr( 7969 E->getKeywordLoc(), OperandResult.get(), 7970 cast<UnresolvedLookupExpr>(LookupResult.get())); 7971 } 7972 7973 template<typename Derived> 7974 ExprResult 7975 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7976 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7977 /*NotCopyInit*/false); 7978 if (Result.isInvalid()) 7979 return ExprError(); 7980 7981 // Always rebuild; we don't know if this needs to be injected into a new 7982 // context or if the promise type has changed. 7983 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7984 } 7985 7986 // Objective-C Statements. 7987 7988 template<typename Derived> 7989 StmtResult 7990 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7991 // Transform the body of the @try. 7992 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7993 if (TryBody.isInvalid()) 7994 return StmtError(); 7995 7996 // Transform the @catch statements (if present). 7997 bool AnyCatchChanged = false; 7998 SmallVector<Stmt*, 8> CatchStmts; 7999 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 8000 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 8001 if (Catch.isInvalid()) 8002 return StmtError(); 8003 if (Catch.get() != S->getCatchStmt(I)) 8004 AnyCatchChanged = true; 8005 CatchStmts.push_back(Catch.get()); 8006 } 8007 8008 // Transform the @finally statement (if present). 8009 StmtResult Finally; 8010 if (S->getFinallyStmt()) { 8011 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 8012 if (Finally.isInvalid()) 8013 return StmtError(); 8014 } 8015 8016 // If nothing changed, just retain this statement. 8017 if (!getDerived().AlwaysRebuild() && 8018 TryBody.get() == S->getTryBody() && 8019 !AnyCatchChanged && 8020 Finally.get() == S->getFinallyStmt()) 8021 return S; 8022 8023 // Build a new statement. 8024 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 8025 CatchStmts, Finally.get()); 8026 } 8027 8028 template<typename Derived> 8029 StmtResult 8030 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 8031 // Transform the @catch parameter, if there is one. 8032 VarDecl *Var = nullptr; 8033 if (VarDecl *FromVar = S->getCatchParamDecl()) { 8034 TypeSourceInfo *TSInfo = nullptr; 8035 if (FromVar->getTypeSourceInfo()) { 8036 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 8037 if (!TSInfo) 8038 return StmtError(); 8039 } 8040 8041 QualType T; 8042 if (TSInfo) 8043 T = TSInfo->getType(); 8044 else { 8045 T = getDerived().TransformType(FromVar->getType()); 8046 if (T.isNull()) 8047 return StmtError(); 8048 } 8049 8050 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8051 if (!Var) 8052 return StmtError(); 8053 } 8054 8055 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8056 if (Body.isInvalid()) 8057 return StmtError(); 8058 8059 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8060 S->getRParenLoc(), 8061 Var, Body.get()); 8062 } 8063 8064 template<typename Derived> 8065 StmtResult 8066 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8067 // Transform the body. 8068 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8069 if (Body.isInvalid()) 8070 return StmtError(); 8071 8072 // If nothing changed, just retain this statement. 8073 if (!getDerived().AlwaysRebuild() && 8074 Body.get() == S->getFinallyBody()) 8075 return S; 8076 8077 // Build a new statement. 8078 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8079 Body.get()); 8080 } 8081 8082 template<typename Derived> 8083 StmtResult 8084 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8085 ExprResult Operand; 8086 if (S->getThrowExpr()) { 8087 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8088 if (Operand.isInvalid()) 8089 return StmtError(); 8090 } 8091 8092 if (!getDerived().AlwaysRebuild() && 8093 Operand.get() == S->getThrowExpr()) 8094 return S; 8095 8096 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8097 } 8098 8099 template<typename Derived> 8100 StmtResult 8101 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8102 ObjCAtSynchronizedStmt *S) { 8103 // Transform the object we are locking. 8104 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8105 if (Object.isInvalid()) 8106 return StmtError(); 8107 Object = 8108 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8109 Object.get()); 8110 if (Object.isInvalid()) 8111 return StmtError(); 8112 8113 // Transform the body. 8114 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8115 if (Body.isInvalid()) 8116 return StmtError(); 8117 8118 // If nothing change, just retain the current statement. 8119 if (!getDerived().AlwaysRebuild() && 8120 Object.get() == S->getSynchExpr() && 8121 Body.get() == S->getSynchBody()) 8122 return S; 8123 8124 // Build a new statement. 8125 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8126 Object.get(), Body.get()); 8127 } 8128 8129 template<typename Derived> 8130 StmtResult 8131 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8132 ObjCAutoreleasePoolStmt *S) { 8133 // Transform the body. 8134 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8135 if (Body.isInvalid()) 8136 return StmtError(); 8137 8138 // If nothing changed, just retain this statement. 8139 if (!getDerived().AlwaysRebuild() && 8140 Body.get() == S->getSubStmt()) 8141 return S; 8142 8143 // Build a new statement. 8144 return getDerived().RebuildObjCAutoreleasePoolStmt( 8145 S->getAtLoc(), Body.get()); 8146 } 8147 8148 template<typename Derived> 8149 StmtResult 8150 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8151 ObjCForCollectionStmt *S) { 8152 // Transform the element statement. 8153 StmtResult Element = 8154 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8155 if (Element.isInvalid()) 8156 return StmtError(); 8157 8158 // Transform the collection expression. 8159 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8160 if (Collection.isInvalid()) 8161 return StmtError(); 8162 8163 // Transform the body. 8164 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8165 if (Body.isInvalid()) 8166 return StmtError(); 8167 8168 // If nothing changed, just retain this statement. 8169 if (!getDerived().AlwaysRebuild() && 8170 Element.get() == S->getElement() && 8171 Collection.get() == S->getCollection() && 8172 Body.get() == S->getBody()) 8173 return S; 8174 8175 // Build a new statement. 8176 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8177 Element.get(), 8178 Collection.get(), 8179 S->getRParenLoc(), 8180 Body.get()); 8181 } 8182 8183 template <typename Derived> 8184 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8185 // Transform the exception declaration, if any. 8186 VarDecl *Var = nullptr; 8187 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8188 TypeSourceInfo *T = 8189 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8190 if (!T) 8191 return StmtError(); 8192 8193 Var = getDerived().RebuildExceptionDecl( 8194 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8195 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8196 if (!Var || Var->isInvalidDecl()) 8197 return StmtError(); 8198 } 8199 8200 // Transform the actual exception handler. 8201 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8202 if (Handler.isInvalid()) 8203 return StmtError(); 8204 8205 if (!getDerived().AlwaysRebuild() && !Var && 8206 Handler.get() == S->getHandlerBlock()) 8207 return S; 8208 8209 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8210 } 8211 8212 template <typename Derived> 8213 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8214 // Transform the try block itself. 8215 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8216 if (TryBlock.isInvalid()) 8217 return StmtError(); 8218 8219 // Transform the handlers. 8220 bool HandlerChanged = false; 8221 SmallVector<Stmt *, 8> Handlers; 8222 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8223 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8224 if (Handler.isInvalid()) 8225 return StmtError(); 8226 8227 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8228 Handlers.push_back(Handler.getAs<Stmt>()); 8229 } 8230 8231 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8232 !HandlerChanged) 8233 return S; 8234 8235 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8236 Handlers); 8237 } 8238 8239 template<typename Derived> 8240 StmtResult 8241 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8242 StmtResult Init = 8243 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8244 if (Init.isInvalid()) 8245 return StmtError(); 8246 8247 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8248 if (Range.isInvalid()) 8249 return StmtError(); 8250 8251 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8252 if (Begin.isInvalid()) 8253 return StmtError(); 8254 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8255 if (End.isInvalid()) 8256 return StmtError(); 8257 8258 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8259 if (Cond.isInvalid()) 8260 return StmtError(); 8261 if (Cond.get()) 8262 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8263 if (Cond.isInvalid()) 8264 return StmtError(); 8265 if (Cond.get()) 8266 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8267 8268 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8269 if (Inc.isInvalid()) 8270 return StmtError(); 8271 if (Inc.get()) 8272 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8273 8274 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8275 if (LoopVar.isInvalid()) 8276 return StmtError(); 8277 8278 StmtResult NewStmt = S; 8279 if (getDerived().AlwaysRebuild() || 8280 Init.get() != S->getInit() || 8281 Range.get() != S->getRangeStmt() || 8282 Begin.get() != S->getBeginStmt() || 8283 End.get() != S->getEndStmt() || 8284 Cond.get() != S->getCond() || 8285 Inc.get() != S->getInc() || 8286 LoopVar.get() != S->getLoopVarStmt()) { 8287 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8288 S->getCoawaitLoc(), Init.get(), 8289 S->getColonLoc(), Range.get(), 8290 Begin.get(), End.get(), 8291 Cond.get(), 8292 Inc.get(), LoopVar.get(), 8293 S->getRParenLoc()); 8294 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8295 // Might not have attached any initializer to the loop variable. 8296 getSema().ActOnInitializerError( 8297 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8298 return StmtError(); 8299 } 8300 } 8301 8302 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8303 if (Body.isInvalid()) 8304 return StmtError(); 8305 8306 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8307 // it now so we have a new statement to attach the body to. 8308 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8309 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8310 S->getCoawaitLoc(), Init.get(), 8311 S->getColonLoc(), Range.get(), 8312 Begin.get(), End.get(), 8313 Cond.get(), 8314 Inc.get(), LoopVar.get(), 8315 S->getRParenLoc()); 8316 if (NewStmt.isInvalid()) 8317 return StmtError(); 8318 } 8319 8320 if (NewStmt.get() == S) 8321 return S; 8322 8323 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8324 } 8325 8326 template<typename Derived> 8327 StmtResult 8328 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8329 MSDependentExistsStmt *S) { 8330 // Transform the nested-name-specifier, if any. 8331 NestedNameSpecifierLoc QualifierLoc; 8332 if (S->getQualifierLoc()) { 8333 QualifierLoc 8334 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8335 if (!QualifierLoc) 8336 return StmtError(); 8337 } 8338 8339 // Transform the declaration name. 8340 DeclarationNameInfo NameInfo = S->getNameInfo(); 8341 if (NameInfo.getName()) { 8342 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8343 if (!NameInfo.getName()) 8344 return StmtError(); 8345 } 8346 8347 // Check whether anything changed. 8348 if (!getDerived().AlwaysRebuild() && 8349 QualifierLoc == S->getQualifierLoc() && 8350 NameInfo.getName() == S->getNameInfo().getName()) 8351 return S; 8352 8353 // Determine whether this name exists, if we can. 8354 CXXScopeSpec SS; 8355 SS.Adopt(QualifierLoc); 8356 bool Dependent = false; 8357 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8358 case Sema::IER_Exists: 8359 if (S->isIfExists()) 8360 break; 8361 8362 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8363 8364 case Sema::IER_DoesNotExist: 8365 if (S->isIfNotExists()) 8366 break; 8367 8368 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8369 8370 case Sema::IER_Dependent: 8371 Dependent = true; 8372 break; 8373 8374 case Sema::IER_Error: 8375 return StmtError(); 8376 } 8377 8378 // We need to continue with the instantiation, so do so now. 8379 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8380 if (SubStmt.isInvalid()) 8381 return StmtError(); 8382 8383 // If we have resolved the name, just transform to the substatement. 8384 if (!Dependent) 8385 return SubStmt; 8386 8387 // The name is still dependent, so build a dependent expression again. 8388 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8389 S->isIfExists(), 8390 QualifierLoc, 8391 NameInfo, 8392 SubStmt.get()); 8393 } 8394 8395 template<typename Derived> 8396 ExprResult 8397 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8398 NestedNameSpecifierLoc QualifierLoc; 8399 if (E->getQualifierLoc()) { 8400 QualifierLoc 8401 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8402 if (!QualifierLoc) 8403 return ExprError(); 8404 } 8405 8406 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8407 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8408 if (!PD) 8409 return ExprError(); 8410 8411 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8412 if (Base.isInvalid()) 8413 return ExprError(); 8414 8415 return new (SemaRef.getASTContext()) 8416 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8417 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8418 QualifierLoc, E->getMemberLoc()); 8419 } 8420 8421 template <typename Derived> 8422 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8423 MSPropertySubscriptExpr *E) { 8424 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8425 if (BaseRes.isInvalid()) 8426 return ExprError(); 8427 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8428 if (IdxRes.isInvalid()) 8429 return ExprError(); 8430 8431 if (!getDerived().AlwaysRebuild() && 8432 BaseRes.get() == E->getBase() && 8433 IdxRes.get() == E->getIdx()) 8434 return E; 8435 8436 return getDerived().RebuildArraySubscriptExpr( 8437 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8438 } 8439 8440 template <typename Derived> 8441 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8442 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8443 if (TryBlock.isInvalid()) 8444 return StmtError(); 8445 8446 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8447 if (Handler.isInvalid()) 8448 return StmtError(); 8449 8450 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8451 Handler.get() == S->getHandler()) 8452 return S; 8453 8454 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8455 TryBlock.get(), Handler.get()); 8456 } 8457 8458 template <typename Derived> 8459 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8460 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8461 if (Block.isInvalid()) 8462 return StmtError(); 8463 8464 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8465 } 8466 8467 template <typename Derived> 8468 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8469 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8470 if (FilterExpr.isInvalid()) 8471 return StmtError(); 8472 8473 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8474 if (Block.isInvalid()) 8475 return StmtError(); 8476 8477 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8478 Block.get()); 8479 } 8480 8481 template <typename Derived> 8482 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8483 if (isa<SEHFinallyStmt>(Handler)) 8484 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8485 else 8486 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8487 } 8488 8489 template<typename Derived> 8490 StmtResult 8491 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8492 return S; 8493 } 8494 8495 //===----------------------------------------------------------------------===// 8496 // OpenMP directive transformation 8497 //===----------------------------------------------------------------------===// 8498 8499 template <typename Derived> 8500 StmtResult 8501 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8502 // OMPCanonicalLoops are eliminated during transformation, since they will be 8503 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8504 // after transformation. 8505 return getDerived().TransformStmt(L->getLoopStmt()); 8506 } 8507 8508 template <typename Derived> 8509 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8510 OMPExecutableDirective *D) { 8511 8512 // Transform the clauses 8513 llvm::SmallVector<OMPClause *, 16> TClauses; 8514 ArrayRef<OMPClause *> Clauses = D->clauses(); 8515 TClauses.reserve(Clauses.size()); 8516 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8517 I != E; ++I) { 8518 if (*I) { 8519 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8520 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8521 getDerived().getSema().EndOpenMPClause(); 8522 if (Clause) 8523 TClauses.push_back(Clause); 8524 } else { 8525 TClauses.push_back(nullptr); 8526 } 8527 } 8528 StmtResult AssociatedStmt; 8529 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8530 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8531 /*CurScope=*/nullptr); 8532 StmtResult Body; 8533 { 8534 Sema::CompoundScopeRAII CompoundScope(getSema()); 8535 Stmt *CS; 8536 if (D->getDirectiveKind() == OMPD_atomic || 8537 D->getDirectiveKind() == OMPD_critical || 8538 D->getDirectiveKind() == OMPD_section || 8539 D->getDirectiveKind() == OMPD_master) 8540 CS = D->getAssociatedStmt(); 8541 else 8542 CS = D->getRawStmt(); 8543 Body = getDerived().TransformStmt(CS); 8544 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8545 getSema().getLangOpts().OpenMPIRBuilder) 8546 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8547 } 8548 AssociatedStmt = 8549 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8550 if (AssociatedStmt.isInvalid()) { 8551 return StmtError(); 8552 } 8553 } 8554 if (TClauses.size() != Clauses.size()) { 8555 return StmtError(); 8556 } 8557 8558 // Transform directive name for 'omp critical' directive. 8559 DeclarationNameInfo DirName; 8560 if (D->getDirectiveKind() == OMPD_critical) { 8561 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8562 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8563 } 8564 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8565 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8566 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8567 } else if (D->getDirectiveKind() == OMPD_cancel) { 8568 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8569 } 8570 8571 return getDerived().RebuildOMPExecutableDirective( 8572 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8573 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8574 } 8575 8576 template <typename Derived> 8577 StmtResult 8578 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8579 // TODO: Fix This 8580 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8581 << getOpenMPDirectiveName(D->getDirectiveKind()); 8582 return StmtError(); 8583 } 8584 8585 template <typename Derived> 8586 StmtResult 8587 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8588 DeclarationNameInfo DirName; 8589 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8590 D->getBeginLoc()); 8591 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8592 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8593 return Res; 8594 } 8595 8596 template <typename Derived> 8597 StmtResult 8598 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8599 DeclarationNameInfo DirName; 8600 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8601 D->getBeginLoc()); 8602 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8603 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8604 return Res; 8605 } 8606 8607 template <typename Derived> 8608 StmtResult 8609 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8610 DeclarationNameInfo DirName; 8611 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8612 nullptr, D->getBeginLoc()); 8613 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8614 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8615 return Res; 8616 } 8617 8618 template <typename Derived> 8619 StmtResult 8620 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8621 DeclarationNameInfo DirName; 8622 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8623 nullptr, D->getBeginLoc()); 8624 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8625 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8626 return Res; 8627 } 8628 8629 template <typename Derived> 8630 StmtResult 8631 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8632 DeclarationNameInfo DirName; 8633 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8634 D->getBeginLoc()); 8635 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8636 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8637 return Res; 8638 } 8639 8640 template <typename Derived> 8641 StmtResult 8642 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8643 DeclarationNameInfo DirName; 8644 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8645 D->getBeginLoc()); 8646 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8647 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8648 return Res; 8649 } 8650 8651 template <typename Derived> 8652 StmtResult 8653 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8654 DeclarationNameInfo DirName; 8655 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8656 D->getBeginLoc()); 8657 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8658 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8659 return Res; 8660 } 8661 8662 template <typename Derived> 8663 StmtResult 8664 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8665 DeclarationNameInfo DirName; 8666 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8667 D->getBeginLoc()); 8668 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8669 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8670 return Res; 8671 } 8672 8673 template <typename Derived> 8674 StmtResult 8675 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8676 DeclarationNameInfo DirName; 8677 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8678 D->getBeginLoc()); 8679 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8680 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8681 return Res; 8682 } 8683 8684 template <typename Derived> 8685 StmtResult 8686 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8687 DeclarationNameInfo DirName; 8688 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8689 D->getBeginLoc()); 8690 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8691 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8692 return Res; 8693 } 8694 8695 template <typename Derived> 8696 StmtResult 8697 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8698 getDerived().getSema().StartOpenMPDSABlock( 8699 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8700 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8701 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8702 return Res; 8703 } 8704 8705 template <typename Derived> 8706 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8707 OMPParallelForDirective *D) { 8708 DeclarationNameInfo DirName; 8709 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8710 nullptr, D->getBeginLoc()); 8711 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8712 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8713 return Res; 8714 } 8715 8716 template <typename Derived> 8717 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8718 OMPParallelForSimdDirective *D) { 8719 DeclarationNameInfo DirName; 8720 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8721 nullptr, D->getBeginLoc()); 8722 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8723 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8724 return Res; 8725 } 8726 8727 template <typename Derived> 8728 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8729 OMPParallelMasterDirective *D) { 8730 DeclarationNameInfo DirName; 8731 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8732 nullptr, D->getBeginLoc()); 8733 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8734 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8735 return Res; 8736 } 8737 8738 template <typename Derived> 8739 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8740 OMPParallelSectionsDirective *D) { 8741 DeclarationNameInfo DirName; 8742 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8743 nullptr, D->getBeginLoc()); 8744 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8745 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8746 return Res; 8747 } 8748 8749 template <typename Derived> 8750 StmtResult 8751 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8752 DeclarationNameInfo DirName; 8753 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8754 D->getBeginLoc()); 8755 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8756 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8757 return Res; 8758 } 8759 8760 template <typename Derived> 8761 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8762 OMPTaskyieldDirective *D) { 8763 DeclarationNameInfo DirName; 8764 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8765 D->getBeginLoc()); 8766 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8767 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8768 return Res; 8769 } 8770 8771 template <typename Derived> 8772 StmtResult 8773 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8774 DeclarationNameInfo DirName; 8775 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8776 D->getBeginLoc()); 8777 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8778 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8779 return Res; 8780 } 8781 8782 template <typename Derived> 8783 StmtResult 8784 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8785 DeclarationNameInfo DirName; 8786 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8787 D->getBeginLoc()); 8788 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8789 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8790 return Res; 8791 } 8792 8793 template <typename Derived> 8794 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8795 OMPTaskgroupDirective *D) { 8796 DeclarationNameInfo DirName; 8797 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8798 D->getBeginLoc()); 8799 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8800 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8801 return Res; 8802 } 8803 8804 template <typename Derived> 8805 StmtResult 8806 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8807 DeclarationNameInfo DirName; 8808 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8809 D->getBeginLoc()); 8810 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8811 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8812 return Res; 8813 } 8814 8815 template <typename Derived> 8816 StmtResult 8817 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8818 DeclarationNameInfo DirName; 8819 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8820 D->getBeginLoc()); 8821 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8822 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8823 return Res; 8824 } 8825 8826 template <typename Derived> 8827 StmtResult 8828 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8829 DeclarationNameInfo DirName; 8830 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8831 D->getBeginLoc()); 8832 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8833 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8834 return Res; 8835 } 8836 8837 template <typename Derived> 8838 StmtResult 8839 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8840 DeclarationNameInfo DirName; 8841 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8842 D->getBeginLoc()); 8843 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8844 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8845 return Res; 8846 } 8847 8848 template <typename Derived> 8849 StmtResult 8850 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8851 DeclarationNameInfo DirName; 8852 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8853 D->getBeginLoc()); 8854 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8855 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8856 return Res; 8857 } 8858 8859 template <typename Derived> 8860 StmtResult 8861 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8862 DeclarationNameInfo DirName; 8863 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8864 D->getBeginLoc()); 8865 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8866 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8867 return Res; 8868 } 8869 8870 template <typename Derived> 8871 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8872 OMPTargetDataDirective *D) { 8873 DeclarationNameInfo DirName; 8874 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8875 D->getBeginLoc()); 8876 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8877 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8878 return Res; 8879 } 8880 8881 template <typename Derived> 8882 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8883 OMPTargetEnterDataDirective *D) { 8884 DeclarationNameInfo DirName; 8885 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8886 nullptr, D->getBeginLoc()); 8887 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8888 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8889 return Res; 8890 } 8891 8892 template <typename Derived> 8893 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8894 OMPTargetExitDataDirective *D) { 8895 DeclarationNameInfo DirName; 8896 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8897 nullptr, D->getBeginLoc()); 8898 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8899 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8900 return Res; 8901 } 8902 8903 template <typename Derived> 8904 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8905 OMPTargetParallelDirective *D) { 8906 DeclarationNameInfo DirName; 8907 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8908 nullptr, D->getBeginLoc()); 8909 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8910 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8911 return Res; 8912 } 8913 8914 template <typename Derived> 8915 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8916 OMPTargetParallelForDirective *D) { 8917 DeclarationNameInfo DirName; 8918 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8919 nullptr, D->getBeginLoc()); 8920 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8921 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8922 return Res; 8923 } 8924 8925 template <typename Derived> 8926 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8927 OMPTargetUpdateDirective *D) { 8928 DeclarationNameInfo DirName; 8929 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8930 nullptr, D->getBeginLoc()); 8931 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8932 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8933 return Res; 8934 } 8935 8936 template <typename Derived> 8937 StmtResult 8938 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8939 DeclarationNameInfo DirName; 8940 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8941 D->getBeginLoc()); 8942 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8943 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8944 return Res; 8945 } 8946 8947 template <typename Derived> 8948 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8949 OMPCancellationPointDirective *D) { 8950 DeclarationNameInfo DirName; 8951 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8952 nullptr, D->getBeginLoc()); 8953 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8954 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8955 return Res; 8956 } 8957 8958 template <typename Derived> 8959 StmtResult 8960 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8961 DeclarationNameInfo DirName; 8962 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8963 D->getBeginLoc()); 8964 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8965 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8966 return Res; 8967 } 8968 8969 template <typename Derived> 8970 StmtResult 8971 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8972 DeclarationNameInfo DirName; 8973 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8974 D->getBeginLoc()); 8975 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8976 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8977 return Res; 8978 } 8979 8980 template <typename Derived> 8981 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8982 OMPTaskLoopSimdDirective *D) { 8983 DeclarationNameInfo DirName; 8984 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8985 nullptr, D->getBeginLoc()); 8986 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8987 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8988 return Res; 8989 } 8990 8991 template <typename Derived> 8992 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8993 OMPMasterTaskLoopDirective *D) { 8994 DeclarationNameInfo DirName; 8995 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8996 nullptr, D->getBeginLoc()); 8997 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8998 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8999 return Res; 9000 } 9001 9002 template <typename Derived> 9003 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 9004 OMPMasterTaskLoopSimdDirective *D) { 9005 DeclarationNameInfo DirName; 9006 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 9007 nullptr, D->getBeginLoc()); 9008 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9009 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9010 return Res; 9011 } 9012 9013 template <typename Derived> 9014 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 9015 OMPParallelMasterTaskLoopDirective *D) { 9016 DeclarationNameInfo DirName; 9017 getDerived().getSema().StartOpenMPDSABlock( 9018 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 9019 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9020 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9021 return Res; 9022 } 9023 9024 template <typename Derived> 9025 StmtResult 9026 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 9027 OMPParallelMasterTaskLoopSimdDirective *D) { 9028 DeclarationNameInfo DirName; 9029 getDerived().getSema().StartOpenMPDSABlock( 9030 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9031 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9032 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9033 return Res; 9034 } 9035 9036 template <typename Derived> 9037 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 9038 OMPDistributeDirective *D) { 9039 DeclarationNameInfo DirName; 9040 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9041 D->getBeginLoc()); 9042 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9043 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9044 return Res; 9045 } 9046 9047 template <typename Derived> 9048 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 9049 OMPDistributeParallelForDirective *D) { 9050 DeclarationNameInfo DirName; 9051 getDerived().getSema().StartOpenMPDSABlock( 9052 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9053 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9054 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9055 return Res; 9056 } 9057 9058 template <typename Derived> 9059 StmtResult 9060 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9061 OMPDistributeParallelForSimdDirective *D) { 9062 DeclarationNameInfo DirName; 9063 getDerived().getSema().StartOpenMPDSABlock( 9064 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9065 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9066 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9067 return Res; 9068 } 9069 9070 template <typename Derived> 9071 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9072 OMPDistributeSimdDirective *D) { 9073 DeclarationNameInfo DirName; 9074 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9075 nullptr, D->getBeginLoc()); 9076 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9077 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9078 return Res; 9079 } 9080 9081 template <typename Derived> 9082 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9083 OMPTargetParallelForSimdDirective *D) { 9084 DeclarationNameInfo DirName; 9085 getDerived().getSema().StartOpenMPDSABlock( 9086 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9087 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9088 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9089 return Res; 9090 } 9091 9092 template <typename Derived> 9093 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9094 OMPTargetSimdDirective *D) { 9095 DeclarationNameInfo DirName; 9096 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 9097 D->getBeginLoc()); 9098 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9099 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9100 return Res; 9101 } 9102 9103 template <typename Derived> 9104 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9105 OMPTeamsDistributeDirective *D) { 9106 DeclarationNameInfo DirName; 9107 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9108 nullptr, D->getBeginLoc()); 9109 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9110 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9111 return Res; 9112 } 9113 9114 template <typename Derived> 9115 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9116 OMPTeamsDistributeSimdDirective *D) { 9117 DeclarationNameInfo DirName; 9118 getDerived().getSema().StartOpenMPDSABlock( 9119 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9120 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9121 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9122 return Res; 9123 } 9124 9125 template <typename Derived> 9126 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9127 OMPTeamsDistributeParallelForSimdDirective *D) { 9128 DeclarationNameInfo DirName; 9129 getDerived().getSema().StartOpenMPDSABlock( 9130 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9131 D->getBeginLoc()); 9132 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9133 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9134 return Res; 9135 } 9136 9137 template <typename Derived> 9138 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9139 OMPTeamsDistributeParallelForDirective *D) { 9140 DeclarationNameInfo DirName; 9141 getDerived().getSema().StartOpenMPDSABlock( 9142 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9143 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9144 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9145 return Res; 9146 } 9147 9148 template <typename Derived> 9149 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9150 OMPTargetTeamsDirective *D) { 9151 DeclarationNameInfo DirName; 9152 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9153 nullptr, D->getBeginLoc()); 9154 auto Res = getDerived().TransformOMPExecutableDirective(D); 9155 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9156 return Res; 9157 } 9158 9159 template <typename Derived> 9160 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9161 OMPTargetTeamsDistributeDirective *D) { 9162 DeclarationNameInfo DirName; 9163 getDerived().getSema().StartOpenMPDSABlock( 9164 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9165 auto Res = getDerived().TransformOMPExecutableDirective(D); 9166 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9167 return Res; 9168 } 9169 9170 template <typename Derived> 9171 StmtResult 9172 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9173 OMPTargetTeamsDistributeParallelForDirective *D) { 9174 DeclarationNameInfo DirName; 9175 getDerived().getSema().StartOpenMPDSABlock( 9176 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9177 D->getBeginLoc()); 9178 auto Res = getDerived().TransformOMPExecutableDirective(D); 9179 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9180 return Res; 9181 } 9182 9183 template <typename Derived> 9184 StmtResult TreeTransform<Derived>:: 9185 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9186 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9187 DeclarationNameInfo DirName; 9188 getDerived().getSema().StartOpenMPDSABlock( 9189 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9190 D->getBeginLoc()); 9191 auto Res = getDerived().TransformOMPExecutableDirective(D); 9192 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9193 return Res; 9194 } 9195 9196 template <typename Derived> 9197 StmtResult 9198 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9199 OMPTargetTeamsDistributeSimdDirective *D) { 9200 DeclarationNameInfo DirName; 9201 getDerived().getSema().StartOpenMPDSABlock( 9202 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9203 auto Res = getDerived().TransformOMPExecutableDirective(D); 9204 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9205 return Res; 9206 } 9207 9208 template <typename Derived> 9209 StmtResult 9210 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9211 DeclarationNameInfo DirName; 9212 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9213 D->getBeginLoc()); 9214 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9215 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9216 return Res; 9217 } 9218 9219 template <typename Derived> 9220 StmtResult 9221 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9222 DeclarationNameInfo DirName; 9223 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9224 D->getBeginLoc()); 9225 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9226 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9227 return Res; 9228 } 9229 9230 template <typename Derived> 9231 StmtResult 9232 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9233 DeclarationNameInfo DirName; 9234 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9235 D->getBeginLoc()); 9236 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9237 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9238 return Res; 9239 } 9240 9241 template <typename Derived> 9242 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9243 OMPGenericLoopDirective *D) { 9244 DeclarationNameInfo DirName; 9245 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9246 D->getBeginLoc()); 9247 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9248 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9249 return Res; 9250 } 9251 9252 template <typename Derived> 9253 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective( 9254 OMPTeamsGenericLoopDirective *D) { 9255 DeclarationNameInfo DirName; 9256 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr, 9257 D->getBeginLoc()); 9258 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9259 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9260 return Res; 9261 } 9262 9263 //===----------------------------------------------------------------------===// 9264 // OpenMP clause transformation 9265 //===----------------------------------------------------------------------===// 9266 template <typename Derived> 9267 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9268 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9269 if (Cond.isInvalid()) 9270 return nullptr; 9271 return getDerived().RebuildOMPIfClause( 9272 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9273 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9274 } 9275 9276 template <typename Derived> 9277 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9278 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9279 if (Cond.isInvalid()) 9280 return nullptr; 9281 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9282 C->getLParenLoc(), C->getEndLoc()); 9283 } 9284 9285 template <typename Derived> 9286 OMPClause * 9287 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9288 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9289 if (NumThreads.isInvalid()) 9290 return nullptr; 9291 return getDerived().RebuildOMPNumThreadsClause( 9292 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9293 } 9294 9295 template <typename Derived> 9296 OMPClause * 9297 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9298 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9299 if (E.isInvalid()) 9300 return nullptr; 9301 return getDerived().RebuildOMPSafelenClause( 9302 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9303 } 9304 9305 template <typename Derived> 9306 OMPClause * 9307 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9308 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9309 if (E.isInvalid()) 9310 return nullptr; 9311 return getDerived().RebuildOMPAllocatorClause( 9312 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9313 } 9314 9315 template <typename Derived> 9316 OMPClause * 9317 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9318 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9319 if (E.isInvalid()) 9320 return nullptr; 9321 return getDerived().RebuildOMPSimdlenClause( 9322 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9323 } 9324 9325 template <typename Derived> 9326 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9327 SmallVector<Expr *, 4> TransformedSizes; 9328 TransformedSizes.reserve(C->getNumSizes()); 9329 bool Changed = false; 9330 for (Expr *E : C->getSizesRefs()) { 9331 if (!E) { 9332 TransformedSizes.push_back(nullptr); 9333 continue; 9334 } 9335 9336 ExprResult T = getDerived().TransformExpr(E); 9337 if (T.isInvalid()) 9338 return nullptr; 9339 if (E != T.get()) 9340 Changed = true; 9341 TransformedSizes.push_back(T.get()); 9342 } 9343 9344 if (!Changed && !getDerived().AlwaysRebuild()) 9345 return C; 9346 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9347 C->getLParenLoc(), C->getEndLoc()); 9348 } 9349 9350 template <typename Derived> 9351 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9352 if (!getDerived().AlwaysRebuild()) 9353 return C; 9354 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9355 } 9356 9357 template <typename Derived> 9358 OMPClause * 9359 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9360 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9361 if (T.isInvalid()) 9362 return nullptr; 9363 Expr *Factor = T.get(); 9364 bool Changed = Factor != C->getFactor(); 9365 9366 if (!Changed && !getDerived().AlwaysRebuild()) 9367 return C; 9368 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9369 C->getEndLoc()); 9370 } 9371 9372 template <typename Derived> 9373 OMPClause * 9374 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9375 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9376 if (E.isInvalid()) 9377 return nullptr; 9378 return getDerived().RebuildOMPCollapseClause( 9379 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9380 } 9381 9382 template <typename Derived> 9383 OMPClause * 9384 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9385 return getDerived().RebuildOMPDefaultClause( 9386 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9387 C->getLParenLoc(), C->getEndLoc()); 9388 } 9389 9390 template <typename Derived> 9391 OMPClause * 9392 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9393 return getDerived().RebuildOMPProcBindClause( 9394 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9395 C->getLParenLoc(), C->getEndLoc()); 9396 } 9397 9398 template <typename Derived> 9399 OMPClause * 9400 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9401 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9402 if (E.isInvalid()) 9403 return nullptr; 9404 return getDerived().RebuildOMPScheduleClause( 9405 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9406 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9407 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9408 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9409 } 9410 9411 template <typename Derived> 9412 OMPClause * 9413 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9414 ExprResult E; 9415 if (auto *Num = C->getNumForLoops()) { 9416 E = getDerived().TransformExpr(Num); 9417 if (E.isInvalid()) 9418 return nullptr; 9419 } 9420 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9421 C->getLParenLoc(), E.get()); 9422 } 9423 9424 template <typename Derived> 9425 OMPClause * 9426 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9427 ExprResult E; 9428 if (Expr *Evt = C->getEventHandler()) { 9429 E = getDerived().TransformExpr(Evt); 9430 if (E.isInvalid()) 9431 return nullptr; 9432 } 9433 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9434 C->getLParenLoc(), C->getEndLoc()); 9435 } 9436 9437 template <typename Derived> 9438 OMPClause * 9439 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9440 // No need to rebuild this clause, no template-dependent parameters. 9441 return C; 9442 } 9443 9444 template <typename Derived> 9445 OMPClause * 9446 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9447 // No need to rebuild this clause, no template-dependent parameters. 9448 return C; 9449 } 9450 9451 template <typename Derived> 9452 OMPClause * 9453 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9454 // No need to rebuild this clause, no template-dependent parameters. 9455 return C; 9456 } 9457 9458 template <typename Derived> 9459 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9460 // No need to rebuild this clause, no template-dependent parameters. 9461 return C; 9462 } 9463 9464 template <typename Derived> 9465 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9466 // No need to rebuild this clause, no template-dependent parameters. 9467 return C; 9468 } 9469 9470 template <typename Derived> 9471 OMPClause * 9472 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9473 // No need to rebuild this clause, no template-dependent parameters. 9474 return C; 9475 } 9476 9477 template <typename Derived> 9478 OMPClause * 9479 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9480 // No need to rebuild this clause, no template-dependent parameters. 9481 return C; 9482 } 9483 9484 template <typename Derived> 9485 OMPClause * 9486 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) { 9487 // No need to rebuild this clause, no template-dependent parameters. 9488 return C; 9489 } 9490 9491 template <typename Derived> 9492 OMPClause * 9493 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9494 // No need to rebuild this clause, no template-dependent parameters. 9495 return C; 9496 } 9497 9498 template <typename Derived> 9499 OMPClause * 9500 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9501 // No need to rebuild this clause, no template-dependent parameters. 9502 return C; 9503 } 9504 9505 template <typename Derived> 9506 OMPClause * 9507 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9508 // No need to rebuild this clause, no template-dependent parameters. 9509 return C; 9510 } 9511 9512 template <typename Derived> 9513 OMPClause * 9514 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9515 // No need to rebuild this clause, no template-dependent parameters. 9516 return C; 9517 } 9518 9519 template <typename Derived> 9520 OMPClause * 9521 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9522 // No need to rebuild this clause, no template-dependent parameters. 9523 return C; 9524 } 9525 9526 template <typename Derived> 9527 OMPClause * 9528 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9529 // No need to rebuild this clause, no template-dependent parameters. 9530 return C; 9531 } 9532 9533 template <typename Derived> 9534 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9535 // No need to rebuild this clause, no template-dependent parameters. 9536 return C; 9537 } 9538 9539 template <typename Derived> 9540 OMPClause * 9541 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9542 // No need to rebuild this clause, no template-dependent parameters. 9543 return C; 9544 } 9545 9546 template <typename Derived> 9547 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9548 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9549 if (IVR.isInvalid()) 9550 return nullptr; 9551 9552 llvm::SmallVector<Expr *, 8> PrefExprs; 9553 PrefExprs.reserve(C->varlist_size() - 1); 9554 for (Expr *E : llvm::drop_begin(C->varlists())) { 9555 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9556 if (ER.isInvalid()) 9557 return nullptr; 9558 PrefExprs.push_back(ER.get()); 9559 } 9560 return getDerived().RebuildOMPInitClause( 9561 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9562 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9563 } 9564 9565 template <typename Derived> 9566 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9567 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9568 if (ER.isInvalid()) 9569 return nullptr; 9570 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9571 C->getLParenLoc(), C->getVarLoc(), 9572 C->getEndLoc()); 9573 } 9574 9575 template <typename Derived> 9576 OMPClause * 9577 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9578 ExprResult ER; 9579 if (Expr *IV = C->getInteropVar()) { 9580 ER = getDerived().TransformExpr(IV); 9581 if (ER.isInvalid()) 9582 return nullptr; 9583 } 9584 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9585 C->getLParenLoc(), C->getVarLoc(), 9586 C->getEndLoc()); 9587 } 9588 9589 template <typename Derived> 9590 OMPClause * 9591 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9592 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9593 if (Cond.isInvalid()) 9594 return nullptr; 9595 return getDerived().RebuildOMPNovariantsClause( 9596 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9597 } 9598 9599 template <typename Derived> 9600 OMPClause * 9601 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9602 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9603 if (Cond.isInvalid()) 9604 return nullptr; 9605 return getDerived().RebuildOMPNocontextClause( 9606 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9607 } 9608 9609 template <typename Derived> 9610 OMPClause * 9611 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9612 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9613 if (ThreadID.isInvalid()) 9614 return nullptr; 9615 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9616 C->getLParenLoc(), C->getEndLoc()); 9617 } 9618 9619 template <typename Derived> 9620 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 9621 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 9622 if (E.isInvalid()) 9623 return nullptr; 9624 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 9625 C->getLParenLoc(), C->getEndLoc()); 9626 } 9627 9628 template <typename Derived> 9629 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9630 OMPUnifiedAddressClause *C) { 9631 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9632 } 9633 9634 template <typename Derived> 9635 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9636 OMPUnifiedSharedMemoryClause *C) { 9637 llvm_unreachable( 9638 "unified_shared_memory clause cannot appear in dependent context"); 9639 } 9640 9641 template <typename Derived> 9642 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9643 OMPReverseOffloadClause *C) { 9644 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9645 } 9646 9647 template <typename Derived> 9648 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9649 OMPDynamicAllocatorsClause *C) { 9650 llvm_unreachable( 9651 "dynamic_allocators clause cannot appear in dependent context"); 9652 } 9653 9654 template <typename Derived> 9655 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9656 OMPAtomicDefaultMemOrderClause *C) { 9657 llvm_unreachable( 9658 "atomic_default_mem_order clause cannot appear in dependent context"); 9659 } 9660 9661 template <typename Derived> 9662 OMPClause * 9663 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9664 llvm::SmallVector<Expr *, 16> Vars; 9665 Vars.reserve(C->varlist_size()); 9666 for (auto *VE : C->varlists()) { 9667 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9668 if (EVar.isInvalid()) 9669 return nullptr; 9670 Vars.push_back(EVar.get()); 9671 } 9672 return getDerived().RebuildOMPPrivateClause( 9673 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9674 } 9675 9676 template <typename Derived> 9677 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9678 OMPFirstprivateClause *C) { 9679 llvm::SmallVector<Expr *, 16> Vars; 9680 Vars.reserve(C->varlist_size()); 9681 for (auto *VE : C->varlists()) { 9682 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9683 if (EVar.isInvalid()) 9684 return nullptr; 9685 Vars.push_back(EVar.get()); 9686 } 9687 return getDerived().RebuildOMPFirstprivateClause( 9688 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9689 } 9690 9691 template <typename Derived> 9692 OMPClause * 9693 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9694 llvm::SmallVector<Expr *, 16> Vars; 9695 Vars.reserve(C->varlist_size()); 9696 for (auto *VE : C->varlists()) { 9697 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9698 if (EVar.isInvalid()) 9699 return nullptr; 9700 Vars.push_back(EVar.get()); 9701 } 9702 return getDerived().RebuildOMPLastprivateClause( 9703 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9704 C->getLParenLoc(), C->getEndLoc()); 9705 } 9706 9707 template <typename Derived> 9708 OMPClause * 9709 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9710 llvm::SmallVector<Expr *, 16> Vars; 9711 Vars.reserve(C->varlist_size()); 9712 for (auto *VE : C->varlists()) { 9713 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9714 if (EVar.isInvalid()) 9715 return nullptr; 9716 Vars.push_back(EVar.get()); 9717 } 9718 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9719 C->getLParenLoc(), C->getEndLoc()); 9720 } 9721 9722 template <typename Derived> 9723 OMPClause * 9724 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9725 llvm::SmallVector<Expr *, 16> Vars; 9726 Vars.reserve(C->varlist_size()); 9727 for (auto *VE : C->varlists()) { 9728 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9729 if (EVar.isInvalid()) 9730 return nullptr; 9731 Vars.push_back(EVar.get()); 9732 } 9733 CXXScopeSpec ReductionIdScopeSpec; 9734 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9735 9736 DeclarationNameInfo NameInfo = C->getNameInfo(); 9737 if (NameInfo.getName()) { 9738 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9739 if (!NameInfo.getName()) 9740 return nullptr; 9741 } 9742 // Build a list of all UDR decls with the same names ranged by the Scopes. 9743 // The Scope boundary is a duplication of the previous decl. 9744 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9745 for (auto *E : C->reduction_ops()) { 9746 // Transform all the decls. 9747 if (E) { 9748 auto *ULE = cast<UnresolvedLookupExpr>(E); 9749 UnresolvedSet<8> Decls; 9750 for (auto *D : ULE->decls()) { 9751 NamedDecl *InstD = 9752 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9753 Decls.addDecl(InstD, InstD->getAccess()); 9754 } 9755 UnresolvedReductions.push_back( 9756 UnresolvedLookupExpr::Create( 9757 SemaRef.Context, /*NamingClass=*/nullptr, 9758 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9759 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9760 Decls.begin(), Decls.end())); 9761 } else 9762 UnresolvedReductions.push_back(nullptr); 9763 } 9764 return getDerived().RebuildOMPReductionClause( 9765 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9766 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9767 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9768 } 9769 9770 template <typename Derived> 9771 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9772 OMPTaskReductionClause *C) { 9773 llvm::SmallVector<Expr *, 16> Vars; 9774 Vars.reserve(C->varlist_size()); 9775 for (auto *VE : C->varlists()) { 9776 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9777 if (EVar.isInvalid()) 9778 return nullptr; 9779 Vars.push_back(EVar.get()); 9780 } 9781 CXXScopeSpec ReductionIdScopeSpec; 9782 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9783 9784 DeclarationNameInfo NameInfo = C->getNameInfo(); 9785 if (NameInfo.getName()) { 9786 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9787 if (!NameInfo.getName()) 9788 return nullptr; 9789 } 9790 // Build a list of all UDR decls with the same names ranged by the Scopes. 9791 // The Scope boundary is a duplication of the previous decl. 9792 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9793 for (auto *E : C->reduction_ops()) { 9794 // Transform all the decls. 9795 if (E) { 9796 auto *ULE = cast<UnresolvedLookupExpr>(E); 9797 UnresolvedSet<8> Decls; 9798 for (auto *D : ULE->decls()) { 9799 NamedDecl *InstD = 9800 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9801 Decls.addDecl(InstD, InstD->getAccess()); 9802 } 9803 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9804 SemaRef.Context, /*NamingClass=*/nullptr, 9805 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9806 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9807 } else 9808 UnresolvedReductions.push_back(nullptr); 9809 } 9810 return getDerived().RebuildOMPTaskReductionClause( 9811 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9812 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9813 } 9814 9815 template <typename Derived> 9816 OMPClause * 9817 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9818 llvm::SmallVector<Expr *, 16> Vars; 9819 Vars.reserve(C->varlist_size()); 9820 for (auto *VE : C->varlists()) { 9821 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9822 if (EVar.isInvalid()) 9823 return nullptr; 9824 Vars.push_back(EVar.get()); 9825 } 9826 CXXScopeSpec ReductionIdScopeSpec; 9827 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9828 9829 DeclarationNameInfo NameInfo = C->getNameInfo(); 9830 if (NameInfo.getName()) { 9831 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9832 if (!NameInfo.getName()) 9833 return nullptr; 9834 } 9835 // Build a list of all UDR decls with the same names ranged by the Scopes. 9836 // The Scope boundary is a duplication of the previous decl. 9837 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9838 for (auto *E : C->reduction_ops()) { 9839 // Transform all the decls. 9840 if (E) { 9841 auto *ULE = cast<UnresolvedLookupExpr>(E); 9842 UnresolvedSet<8> Decls; 9843 for (auto *D : ULE->decls()) { 9844 NamedDecl *InstD = 9845 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9846 Decls.addDecl(InstD, InstD->getAccess()); 9847 } 9848 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9849 SemaRef.Context, /*NamingClass=*/nullptr, 9850 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9851 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9852 } else 9853 UnresolvedReductions.push_back(nullptr); 9854 } 9855 return getDerived().RebuildOMPInReductionClause( 9856 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9857 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9858 } 9859 9860 template <typename Derived> 9861 OMPClause * 9862 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9863 llvm::SmallVector<Expr *, 16> Vars; 9864 Vars.reserve(C->varlist_size()); 9865 for (auto *VE : C->varlists()) { 9866 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9867 if (EVar.isInvalid()) 9868 return nullptr; 9869 Vars.push_back(EVar.get()); 9870 } 9871 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9872 if (Step.isInvalid()) 9873 return nullptr; 9874 return getDerived().RebuildOMPLinearClause( 9875 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9876 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9877 } 9878 9879 template <typename Derived> 9880 OMPClause * 9881 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9882 llvm::SmallVector<Expr *, 16> Vars; 9883 Vars.reserve(C->varlist_size()); 9884 for (auto *VE : C->varlists()) { 9885 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9886 if (EVar.isInvalid()) 9887 return nullptr; 9888 Vars.push_back(EVar.get()); 9889 } 9890 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9891 if (Alignment.isInvalid()) 9892 return nullptr; 9893 return getDerived().RebuildOMPAlignedClause( 9894 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9895 C->getColonLoc(), C->getEndLoc()); 9896 } 9897 9898 template <typename Derived> 9899 OMPClause * 9900 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9901 llvm::SmallVector<Expr *, 16> Vars; 9902 Vars.reserve(C->varlist_size()); 9903 for (auto *VE : C->varlists()) { 9904 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9905 if (EVar.isInvalid()) 9906 return nullptr; 9907 Vars.push_back(EVar.get()); 9908 } 9909 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9910 C->getLParenLoc(), C->getEndLoc()); 9911 } 9912 9913 template <typename Derived> 9914 OMPClause * 9915 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9916 llvm::SmallVector<Expr *, 16> Vars; 9917 Vars.reserve(C->varlist_size()); 9918 for (auto *VE : C->varlists()) { 9919 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9920 if (EVar.isInvalid()) 9921 return nullptr; 9922 Vars.push_back(EVar.get()); 9923 } 9924 return getDerived().RebuildOMPCopyprivateClause( 9925 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9926 } 9927 9928 template <typename Derived> 9929 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9930 llvm::SmallVector<Expr *, 16> Vars; 9931 Vars.reserve(C->varlist_size()); 9932 for (auto *VE : C->varlists()) { 9933 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9934 if (EVar.isInvalid()) 9935 return nullptr; 9936 Vars.push_back(EVar.get()); 9937 } 9938 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9939 C->getLParenLoc(), C->getEndLoc()); 9940 } 9941 9942 template <typename Derived> 9943 OMPClause * 9944 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9945 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9946 if (E.isInvalid()) 9947 return nullptr; 9948 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9949 C->getLParenLoc(), C->getEndLoc()); 9950 } 9951 9952 template <typename Derived> 9953 OMPClause * 9954 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9955 llvm::SmallVector<Expr *, 16> Vars; 9956 Expr *DepModifier = C->getModifier(); 9957 if (DepModifier) { 9958 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9959 if (DepModRes.isInvalid()) 9960 return nullptr; 9961 DepModifier = DepModRes.get(); 9962 } 9963 Vars.reserve(C->varlist_size()); 9964 for (auto *VE : C->varlists()) { 9965 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9966 if (EVar.isInvalid()) 9967 return nullptr; 9968 Vars.push_back(EVar.get()); 9969 } 9970 return getDerived().RebuildOMPDependClause( 9971 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9972 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9973 C->getEndLoc()); 9974 } 9975 9976 template <typename Derived> 9977 OMPClause * 9978 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9979 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9980 if (E.isInvalid()) 9981 return nullptr; 9982 return getDerived().RebuildOMPDeviceClause( 9983 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9984 C->getModifierLoc(), C->getEndLoc()); 9985 } 9986 9987 template <typename Derived, class T> 9988 bool transformOMPMappableExprListClause( 9989 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9990 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9991 DeclarationNameInfo &MapperIdInfo, 9992 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9993 // Transform expressions in the list. 9994 Vars.reserve(C->varlist_size()); 9995 for (auto *VE : C->varlists()) { 9996 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9997 if (EVar.isInvalid()) 9998 return true; 9999 Vars.push_back(EVar.get()); 10000 } 10001 // Transform mapper scope specifier and identifier. 10002 NestedNameSpecifierLoc QualifierLoc; 10003 if (C->getMapperQualifierLoc()) { 10004 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 10005 C->getMapperQualifierLoc()); 10006 if (!QualifierLoc) 10007 return true; 10008 } 10009 MapperIdScopeSpec.Adopt(QualifierLoc); 10010 MapperIdInfo = C->getMapperIdInfo(); 10011 if (MapperIdInfo.getName()) { 10012 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 10013 if (!MapperIdInfo.getName()) 10014 return true; 10015 } 10016 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 10017 // the previous user-defined mapper lookup in dependent environment. 10018 for (auto *E : C->mapperlists()) { 10019 // Transform all the decls. 10020 if (E) { 10021 auto *ULE = cast<UnresolvedLookupExpr>(E); 10022 UnresolvedSet<8> Decls; 10023 for (auto *D : ULE->decls()) { 10024 NamedDecl *InstD = 10025 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 10026 Decls.addDecl(InstD, InstD->getAccess()); 10027 } 10028 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 10029 TT.getSema().Context, /*NamingClass=*/nullptr, 10030 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 10031 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 10032 Decls.end())); 10033 } else { 10034 UnresolvedMappers.push_back(nullptr); 10035 } 10036 } 10037 return false; 10038 } 10039 10040 template <typename Derived> 10041 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 10042 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10043 llvm::SmallVector<Expr *, 16> Vars; 10044 CXXScopeSpec MapperIdScopeSpec; 10045 DeclarationNameInfo MapperIdInfo; 10046 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10047 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 10048 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10049 return nullptr; 10050 return getDerived().RebuildOMPMapClause( 10051 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 10052 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 10053 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10054 } 10055 10056 template <typename Derived> 10057 OMPClause * 10058 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10059 Expr *Allocator = C->getAllocator(); 10060 if (Allocator) { 10061 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10062 if (AllocatorRes.isInvalid()) 10063 return nullptr; 10064 Allocator = AllocatorRes.get(); 10065 } 10066 llvm::SmallVector<Expr *, 16> Vars; 10067 Vars.reserve(C->varlist_size()); 10068 for (auto *VE : C->varlists()) { 10069 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10070 if (EVar.isInvalid()) 10071 return nullptr; 10072 Vars.push_back(EVar.get()); 10073 } 10074 return getDerived().RebuildOMPAllocateClause( 10075 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10076 C->getEndLoc()); 10077 } 10078 10079 template <typename Derived> 10080 OMPClause * 10081 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10082 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10083 if (E.isInvalid()) 10084 return nullptr; 10085 return getDerived().RebuildOMPNumTeamsClause( 10086 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10087 } 10088 10089 template <typename Derived> 10090 OMPClause * 10091 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10092 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10093 if (E.isInvalid()) 10094 return nullptr; 10095 return getDerived().RebuildOMPThreadLimitClause( 10096 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10097 } 10098 10099 template <typename Derived> 10100 OMPClause * 10101 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10102 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10103 if (E.isInvalid()) 10104 return nullptr; 10105 return getDerived().RebuildOMPPriorityClause( 10106 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10107 } 10108 10109 template <typename Derived> 10110 OMPClause * 10111 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10112 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10113 if (E.isInvalid()) 10114 return nullptr; 10115 return getDerived().RebuildOMPGrainsizeClause( 10116 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10117 } 10118 10119 template <typename Derived> 10120 OMPClause * 10121 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10122 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10123 if (E.isInvalid()) 10124 return nullptr; 10125 return getDerived().RebuildOMPNumTasksClause( 10126 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10127 } 10128 10129 template <typename Derived> 10130 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10131 ExprResult E = getDerived().TransformExpr(C->getHint()); 10132 if (E.isInvalid()) 10133 return nullptr; 10134 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10135 C->getLParenLoc(), C->getEndLoc()); 10136 } 10137 10138 template <typename Derived> 10139 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10140 OMPDistScheduleClause *C) { 10141 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10142 if (E.isInvalid()) 10143 return nullptr; 10144 return getDerived().RebuildOMPDistScheduleClause( 10145 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10146 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10147 } 10148 10149 template <typename Derived> 10150 OMPClause * 10151 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10152 // Rebuild Defaultmap Clause since we need to invoke the checking of 10153 // defaultmap(none:variable-category) after template initialization. 10154 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10155 C->getDefaultmapKind(), 10156 C->getBeginLoc(), 10157 C->getLParenLoc(), 10158 C->getDefaultmapModifierLoc(), 10159 C->getDefaultmapKindLoc(), 10160 C->getEndLoc()); 10161 } 10162 10163 template <typename Derived> 10164 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10165 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10166 llvm::SmallVector<Expr *, 16> Vars; 10167 CXXScopeSpec MapperIdScopeSpec; 10168 DeclarationNameInfo MapperIdInfo; 10169 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10170 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10171 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10172 return nullptr; 10173 return getDerived().RebuildOMPToClause( 10174 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10175 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10176 } 10177 10178 template <typename Derived> 10179 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10180 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10181 llvm::SmallVector<Expr *, 16> Vars; 10182 CXXScopeSpec MapperIdScopeSpec; 10183 DeclarationNameInfo MapperIdInfo; 10184 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10185 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10186 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10187 return nullptr; 10188 return getDerived().RebuildOMPFromClause( 10189 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10190 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10191 } 10192 10193 template <typename Derived> 10194 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10195 OMPUseDevicePtrClause *C) { 10196 llvm::SmallVector<Expr *, 16> Vars; 10197 Vars.reserve(C->varlist_size()); 10198 for (auto *VE : C->varlists()) { 10199 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10200 if (EVar.isInvalid()) 10201 return nullptr; 10202 Vars.push_back(EVar.get()); 10203 } 10204 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10205 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10206 } 10207 10208 template <typename Derived> 10209 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10210 OMPUseDeviceAddrClause *C) { 10211 llvm::SmallVector<Expr *, 16> Vars; 10212 Vars.reserve(C->varlist_size()); 10213 for (auto *VE : C->varlists()) { 10214 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10215 if (EVar.isInvalid()) 10216 return nullptr; 10217 Vars.push_back(EVar.get()); 10218 } 10219 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10220 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10221 } 10222 10223 template <typename Derived> 10224 OMPClause * 10225 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10226 llvm::SmallVector<Expr *, 16> Vars; 10227 Vars.reserve(C->varlist_size()); 10228 for (auto *VE : C->varlists()) { 10229 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10230 if (EVar.isInvalid()) 10231 return nullptr; 10232 Vars.push_back(EVar.get()); 10233 } 10234 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10235 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10236 } 10237 10238 template <typename Derived> 10239 OMPClause * 10240 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10241 llvm::SmallVector<Expr *, 16> Vars; 10242 Vars.reserve(C->varlist_size()); 10243 for (auto *VE : C->varlists()) { 10244 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10245 if (EVar.isInvalid()) 10246 return nullptr; 10247 Vars.push_back(EVar.get()); 10248 } 10249 return getDerived().RebuildOMPNontemporalClause( 10250 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10251 } 10252 10253 template <typename Derived> 10254 OMPClause * 10255 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10256 llvm::SmallVector<Expr *, 16> Vars; 10257 Vars.reserve(C->varlist_size()); 10258 for (auto *VE : C->varlists()) { 10259 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10260 if (EVar.isInvalid()) 10261 return nullptr; 10262 Vars.push_back(EVar.get()); 10263 } 10264 return getDerived().RebuildOMPInclusiveClause( 10265 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10266 } 10267 10268 template <typename Derived> 10269 OMPClause * 10270 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10271 llvm::SmallVector<Expr *, 16> Vars; 10272 Vars.reserve(C->varlist_size()); 10273 for (auto *VE : C->varlists()) { 10274 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10275 if (EVar.isInvalid()) 10276 return nullptr; 10277 Vars.push_back(EVar.get()); 10278 } 10279 return getDerived().RebuildOMPExclusiveClause( 10280 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10281 } 10282 10283 template <typename Derived> 10284 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10285 OMPUsesAllocatorsClause *C) { 10286 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10287 Data.reserve(C->getNumberOfAllocators()); 10288 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10289 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10290 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10291 if (Allocator.isInvalid()) 10292 continue; 10293 ExprResult AllocatorTraits; 10294 if (Expr *AT = D.AllocatorTraits) { 10295 AllocatorTraits = getDerived().TransformExpr(AT); 10296 if (AllocatorTraits.isInvalid()) 10297 continue; 10298 } 10299 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10300 NewD.Allocator = Allocator.get(); 10301 NewD.AllocatorTraits = AllocatorTraits.get(); 10302 NewD.LParenLoc = D.LParenLoc; 10303 NewD.RParenLoc = D.RParenLoc; 10304 } 10305 return getDerived().RebuildOMPUsesAllocatorsClause( 10306 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10307 } 10308 10309 template <typename Derived> 10310 OMPClause * 10311 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10312 SmallVector<Expr *, 4> Locators; 10313 Locators.reserve(C->varlist_size()); 10314 ExprResult ModifierRes; 10315 if (Expr *Modifier = C->getModifier()) { 10316 ModifierRes = getDerived().TransformExpr(Modifier); 10317 if (ModifierRes.isInvalid()) 10318 return nullptr; 10319 } 10320 for (Expr *E : C->varlists()) { 10321 ExprResult Locator = getDerived().TransformExpr(E); 10322 if (Locator.isInvalid()) 10323 continue; 10324 Locators.push_back(Locator.get()); 10325 } 10326 return getDerived().RebuildOMPAffinityClause( 10327 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10328 ModifierRes.get(), Locators); 10329 } 10330 10331 template <typename Derived> 10332 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10333 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10334 C->getBeginLoc(), C->getLParenLoc(), 10335 C->getEndLoc()); 10336 } 10337 10338 template <typename Derived> 10339 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10340 return getDerived().RebuildOMPBindClause( 10341 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10342 C->getLParenLoc(), C->getEndLoc()); 10343 } 10344 10345 //===----------------------------------------------------------------------===// 10346 // Expression transformation 10347 //===----------------------------------------------------------------------===// 10348 template<typename Derived> 10349 ExprResult 10350 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10351 return TransformExpr(E->getSubExpr()); 10352 } 10353 10354 template <typename Derived> 10355 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10356 SYCLUniqueStableNameExpr *E) { 10357 if (!E->isTypeDependent()) 10358 return E; 10359 10360 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10361 10362 if (!NewT) 10363 return ExprError(); 10364 10365 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10366 return E; 10367 10368 return getDerived().RebuildSYCLUniqueStableNameExpr( 10369 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10370 } 10371 10372 template<typename Derived> 10373 ExprResult 10374 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10375 if (!E->isTypeDependent()) 10376 return E; 10377 10378 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10379 E->getIdentKind()); 10380 } 10381 10382 template<typename Derived> 10383 ExprResult 10384 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10385 NestedNameSpecifierLoc QualifierLoc; 10386 if (E->getQualifierLoc()) { 10387 QualifierLoc 10388 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10389 if (!QualifierLoc) 10390 return ExprError(); 10391 } 10392 10393 ValueDecl *ND 10394 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10395 E->getDecl())); 10396 if (!ND) 10397 return ExprError(); 10398 10399 NamedDecl *Found = ND; 10400 if (E->getFoundDecl() != E->getDecl()) { 10401 Found = cast_or_null<NamedDecl>( 10402 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10403 if (!Found) 10404 return ExprError(); 10405 } 10406 10407 DeclarationNameInfo NameInfo = E->getNameInfo(); 10408 if (NameInfo.getName()) { 10409 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10410 if (!NameInfo.getName()) 10411 return ExprError(); 10412 } 10413 10414 if (!getDerived().AlwaysRebuild() && 10415 QualifierLoc == E->getQualifierLoc() && 10416 ND == E->getDecl() && 10417 Found == E->getFoundDecl() && 10418 NameInfo.getName() == E->getDecl()->getDeclName() && 10419 !E->hasExplicitTemplateArgs()) { 10420 10421 // Mark it referenced in the new context regardless. 10422 // FIXME: this is a bit instantiation-specific. 10423 SemaRef.MarkDeclRefReferenced(E); 10424 10425 return E; 10426 } 10427 10428 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10429 if (E->hasExplicitTemplateArgs()) { 10430 TemplateArgs = &TransArgs; 10431 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10432 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10433 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10434 E->getNumTemplateArgs(), 10435 TransArgs)) 10436 return ExprError(); 10437 } 10438 10439 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10440 Found, TemplateArgs); 10441 } 10442 10443 template<typename Derived> 10444 ExprResult 10445 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10446 return E; 10447 } 10448 10449 template <typename Derived> 10450 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10451 FixedPointLiteral *E) { 10452 return E; 10453 } 10454 10455 template<typename Derived> 10456 ExprResult 10457 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10458 return E; 10459 } 10460 10461 template<typename Derived> 10462 ExprResult 10463 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10464 return E; 10465 } 10466 10467 template<typename Derived> 10468 ExprResult 10469 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10470 return E; 10471 } 10472 10473 template<typename Derived> 10474 ExprResult 10475 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10476 return E; 10477 } 10478 10479 template<typename Derived> 10480 ExprResult 10481 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10482 if (FunctionDecl *FD = E->getDirectCallee()) 10483 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10484 return SemaRef.MaybeBindToTemporary(E); 10485 } 10486 10487 template<typename Derived> 10488 ExprResult 10489 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10490 ExprResult ControllingExpr = 10491 getDerived().TransformExpr(E->getControllingExpr()); 10492 if (ControllingExpr.isInvalid()) 10493 return ExprError(); 10494 10495 SmallVector<Expr *, 4> AssocExprs; 10496 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10497 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10498 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10499 if (TSI) { 10500 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10501 if (!AssocType) 10502 return ExprError(); 10503 AssocTypes.push_back(AssocType); 10504 } else { 10505 AssocTypes.push_back(nullptr); 10506 } 10507 10508 ExprResult AssocExpr = 10509 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10510 if (AssocExpr.isInvalid()) 10511 return ExprError(); 10512 AssocExprs.push_back(AssocExpr.get()); 10513 } 10514 10515 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10516 E->getDefaultLoc(), 10517 E->getRParenLoc(), 10518 ControllingExpr.get(), 10519 AssocTypes, 10520 AssocExprs); 10521 } 10522 10523 template<typename Derived> 10524 ExprResult 10525 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10526 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10527 if (SubExpr.isInvalid()) 10528 return ExprError(); 10529 10530 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10531 return E; 10532 10533 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10534 E->getRParen()); 10535 } 10536 10537 /// The operand of a unary address-of operator has special rules: it's 10538 /// allowed to refer to a non-static member of a class even if there's no 'this' 10539 /// object available. 10540 template<typename Derived> 10541 ExprResult 10542 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10543 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10544 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10545 else 10546 return getDerived().TransformExpr(E); 10547 } 10548 10549 template<typename Derived> 10550 ExprResult 10551 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10552 ExprResult SubExpr; 10553 if (E->getOpcode() == UO_AddrOf) 10554 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10555 else 10556 SubExpr = TransformExpr(E->getSubExpr()); 10557 if (SubExpr.isInvalid()) 10558 return ExprError(); 10559 10560 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10561 return E; 10562 10563 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10564 E->getOpcode(), 10565 SubExpr.get()); 10566 } 10567 10568 template<typename Derived> 10569 ExprResult 10570 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10571 // Transform the type. 10572 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10573 if (!Type) 10574 return ExprError(); 10575 10576 // Transform all of the components into components similar to what the 10577 // parser uses. 10578 // FIXME: It would be slightly more efficient in the non-dependent case to 10579 // just map FieldDecls, rather than requiring the rebuilder to look for 10580 // the fields again. However, __builtin_offsetof is rare enough in 10581 // template code that we don't care. 10582 bool ExprChanged = false; 10583 typedef Sema::OffsetOfComponent Component; 10584 SmallVector<Component, 4> Components; 10585 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10586 const OffsetOfNode &ON = E->getComponent(I); 10587 Component Comp; 10588 Comp.isBrackets = true; 10589 Comp.LocStart = ON.getSourceRange().getBegin(); 10590 Comp.LocEnd = ON.getSourceRange().getEnd(); 10591 switch (ON.getKind()) { 10592 case OffsetOfNode::Array: { 10593 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10594 ExprResult Index = getDerived().TransformExpr(FromIndex); 10595 if (Index.isInvalid()) 10596 return ExprError(); 10597 10598 ExprChanged = ExprChanged || Index.get() != FromIndex; 10599 Comp.isBrackets = true; 10600 Comp.U.E = Index.get(); 10601 break; 10602 } 10603 10604 case OffsetOfNode::Field: 10605 case OffsetOfNode::Identifier: 10606 Comp.isBrackets = false; 10607 Comp.U.IdentInfo = ON.getFieldName(); 10608 if (!Comp.U.IdentInfo) 10609 continue; 10610 10611 break; 10612 10613 case OffsetOfNode::Base: 10614 // Will be recomputed during the rebuild. 10615 continue; 10616 } 10617 10618 Components.push_back(Comp); 10619 } 10620 10621 // If nothing changed, retain the existing expression. 10622 if (!getDerived().AlwaysRebuild() && 10623 Type == E->getTypeSourceInfo() && 10624 !ExprChanged) 10625 return E; 10626 10627 // Build a new offsetof expression. 10628 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10629 Components, E->getRParenLoc()); 10630 } 10631 10632 template<typename Derived> 10633 ExprResult 10634 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10635 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10636 "opaque value expression requires transformation"); 10637 return E; 10638 } 10639 10640 template<typename Derived> 10641 ExprResult 10642 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10643 return E; 10644 } 10645 10646 template <typename Derived> 10647 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10648 llvm::SmallVector<Expr *, 8> Children; 10649 bool Changed = false; 10650 for (Expr *C : E->subExpressions()) { 10651 ExprResult NewC = getDerived().TransformExpr(C); 10652 if (NewC.isInvalid()) 10653 return ExprError(); 10654 Children.push_back(NewC.get()); 10655 10656 Changed |= NewC.get() != C; 10657 } 10658 if (!getDerived().AlwaysRebuild() && !Changed) 10659 return E; 10660 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10661 Children, E->getType()); 10662 } 10663 10664 template<typename Derived> 10665 ExprResult 10666 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10667 // Rebuild the syntactic form. The original syntactic form has 10668 // opaque-value expressions in it, so strip those away and rebuild 10669 // the result. This is a really awful way of doing this, but the 10670 // better solution (rebuilding the semantic expressions and 10671 // rebinding OVEs as necessary) doesn't work; we'd need 10672 // TreeTransform to not strip away implicit conversions. 10673 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10674 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10675 if (result.isInvalid()) return ExprError(); 10676 10677 // If that gives us a pseudo-object result back, the pseudo-object 10678 // expression must have been an lvalue-to-rvalue conversion which we 10679 // should reapply. 10680 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10681 result = SemaRef.checkPseudoObjectRValue(result.get()); 10682 10683 return result; 10684 } 10685 10686 template<typename Derived> 10687 ExprResult 10688 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10689 UnaryExprOrTypeTraitExpr *E) { 10690 if (E->isArgumentType()) { 10691 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10692 10693 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10694 if (!NewT) 10695 return ExprError(); 10696 10697 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10698 return E; 10699 10700 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10701 E->getKind(), 10702 E->getSourceRange()); 10703 } 10704 10705 // C++0x [expr.sizeof]p1: 10706 // The operand is either an expression, which is an unevaluated operand 10707 // [...] 10708 EnterExpressionEvaluationContext Unevaluated( 10709 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10710 Sema::ReuseLambdaContextDecl); 10711 10712 // Try to recover if we have something like sizeof(T::X) where X is a type. 10713 // Notably, there must be *exactly* one set of parens if X is a type. 10714 TypeSourceInfo *RecoveryTSI = nullptr; 10715 ExprResult SubExpr; 10716 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10717 if (auto *DRE = 10718 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10719 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10720 PE, DRE, false, &RecoveryTSI); 10721 else 10722 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10723 10724 if (RecoveryTSI) { 10725 return getDerived().RebuildUnaryExprOrTypeTrait( 10726 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10727 } else if (SubExpr.isInvalid()) 10728 return ExprError(); 10729 10730 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10731 return E; 10732 10733 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10734 E->getOperatorLoc(), 10735 E->getKind(), 10736 E->getSourceRange()); 10737 } 10738 10739 template<typename Derived> 10740 ExprResult 10741 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10742 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10743 if (LHS.isInvalid()) 10744 return ExprError(); 10745 10746 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10747 if (RHS.isInvalid()) 10748 return ExprError(); 10749 10750 10751 if (!getDerived().AlwaysRebuild() && 10752 LHS.get() == E->getLHS() && 10753 RHS.get() == E->getRHS()) 10754 return E; 10755 10756 return getDerived().RebuildArraySubscriptExpr( 10757 LHS.get(), 10758 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10759 } 10760 10761 template <typename Derived> 10762 ExprResult 10763 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10764 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10765 if (Base.isInvalid()) 10766 return ExprError(); 10767 10768 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10769 if (RowIdx.isInvalid()) 10770 return ExprError(); 10771 10772 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10773 if (ColumnIdx.isInvalid()) 10774 return ExprError(); 10775 10776 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10777 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10778 return E; 10779 10780 return getDerived().RebuildMatrixSubscriptExpr( 10781 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10782 } 10783 10784 template <typename Derived> 10785 ExprResult 10786 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10787 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10788 if (Base.isInvalid()) 10789 return ExprError(); 10790 10791 ExprResult LowerBound; 10792 if (E->getLowerBound()) { 10793 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10794 if (LowerBound.isInvalid()) 10795 return ExprError(); 10796 } 10797 10798 ExprResult Length; 10799 if (E->getLength()) { 10800 Length = getDerived().TransformExpr(E->getLength()); 10801 if (Length.isInvalid()) 10802 return ExprError(); 10803 } 10804 10805 ExprResult Stride; 10806 if (Expr *Str = E->getStride()) { 10807 Stride = getDerived().TransformExpr(Str); 10808 if (Stride.isInvalid()) 10809 return ExprError(); 10810 } 10811 10812 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10813 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10814 return E; 10815 10816 return getDerived().RebuildOMPArraySectionExpr( 10817 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10818 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10819 E->getRBracketLoc()); 10820 } 10821 10822 template <typename Derived> 10823 ExprResult 10824 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10825 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10826 if (Base.isInvalid()) 10827 return ExprError(); 10828 10829 SmallVector<Expr *, 4> Dims; 10830 bool ErrorFound = false; 10831 for (Expr *Dim : E->getDimensions()) { 10832 ExprResult DimRes = getDerived().TransformExpr(Dim); 10833 if (DimRes.isInvalid()) { 10834 ErrorFound = true; 10835 continue; 10836 } 10837 Dims.push_back(DimRes.get()); 10838 } 10839 10840 if (ErrorFound) 10841 return ExprError(); 10842 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10843 E->getRParenLoc(), Dims, 10844 E->getBracketsRanges()); 10845 } 10846 10847 template <typename Derived> 10848 ExprResult 10849 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10850 unsigned NumIterators = E->numOfIterators(); 10851 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10852 10853 bool ErrorFound = false; 10854 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10855 for (unsigned I = 0; I < NumIterators; ++I) { 10856 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10857 Data[I].DeclIdent = D->getIdentifier(); 10858 Data[I].DeclIdentLoc = D->getLocation(); 10859 if (D->getLocation() == D->getBeginLoc()) { 10860 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10861 "Implicit type must be int."); 10862 } else { 10863 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10864 QualType DeclTy = getDerived().TransformType(D->getType()); 10865 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10866 } 10867 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10868 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10869 ExprResult End = getDerived().TransformExpr(Range.End); 10870 ExprResult Step = getDerived().TransformExpr(Range.Step); 10871 ErrorFound = ErrorFound || 10872 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10873 !Data[I].Type.get().isNull())) || 10874 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10875 if (ErrorFound) 10876 continue; 10877 Data[I].Range.Begin = Begin.get(); 10878 Data[I].Range.End = End.get(); 10879 Data[I].Range.Step = Step.get(); 10880 Data[I].AssignLoc = E->getAssignLoc(I); 10881 Data[I].ColonLoc = E->getColonLoc(I); 10882 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10883 NeedToRebuild = 10884 NeedToRebuild || 10885 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10886 D->getType().getTypePtrOrNull()) || 10887 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10888 Range.Step != Data[I].Range.Step; 10889 } 10890 if (ErrorFound) 10891 return ExprError(); 10892 if (!NeedToRebuild) 10893 return E; 10894 10895 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10896 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10897 if (!Res.isUsable()) 10898 return Res; 10899 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10900 for (unsigned I = 0; I < NumIterators; ++I) 10901 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10902 IE->getIteratorDecl(I)); 10903 return Res; 10904 } 10905 10906 template<typename Derived> 10907 ExprResult 10908 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10909 // Transform the callee. 10910 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10911 if (Callee.isInvalid()) 10912 return ExprError(); 10913 10914 // Transform arguments. 10915 bool ArgChanged = false; 10916 SmallVector<Expr*, 8> Args; 10917 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10918 &ArgChanged)) 10919 return ExprError(); 10920 10921 if (!getDerived().AlwaysRebuild() && 10922 Callee.get() == E->getCallee() && 10923 !ArgChanged) 10924 return SemaRef.MaybeBindToTemporary(E); 10925 10926 // FIXME: Wrong source location information for the '('. 10927 SourceLocation FakeLParenLoc 10928 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10929 10930 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10931 if (E->hasStoredFPFeatures()) { 10932 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10933 getSema().CurFPFeatures = 10934 NewOverrides.applyOverrides(getSema().getLangOpts()); 10935 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10936 } 10937 10938 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10939 Args, 10940 E->getRParenLoc()); 10941 } 10942 10943 template<typename Derived> 10944 ExprResult 10945 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10946 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10947 if (Base.isInvalid()) 10948 return ExprError(); 10949 10950 NestedNameSpecifierLoc QualifierLoc; 10951 if (E->hasQualifier()) { 10952 QualifierLoc 10953 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10954 10955 if (!QualifierLoc) 10956 return ExprError(); 10957 } 10958 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10959 10960 ValueDecl *Member 10961 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10962 E->getMemberDecl())); 10963 if (!Member) 10964 return ExprError(); 10965 10966 NamedDecl *FoundDecl = E->getFoundDecl(); 10967 if (FoundDecl == E->getMemberDecl()) { 10968 FoundDecl = Member; 10969 } else { 10970 FoundDecl = cast_or_null<NamedDecl>( 10971 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10972 if (!FoundDecl) 10973 return ExprError(); 10974 } 10975 10976 if (!getDerived().AlwaysRebuild() && 10977 Base.get() == E->getBase() && 10978 QualifierLoc == E->getQualifierLoc() && 10979 Member == E->getMemberDecl() && 10980 FoundDecl == E->getFoundDecl() && 10981 !E->hasExplicitTemplateArgs()) { 10982 10983 // Mark it referenced in the new context regardless. 10984 // FIXME: this is a bit instantiation-specific. 10985 SemaRef.MarkMemberReferenced(E); 10986 10987 return E; 10988 } 10989 10990 TemplateArgumentListInfo TransArgs; 10991 if (E->hasExplicitTemplateArgs()) { 10992 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10993 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10994 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10995 E->getNumTemplateArgs(), 10996 TransArgs)) 10997 return ExprError(); 10998 } 10999 11000 // FIXME: Bogus source location for the operator 11001 SourceLocation FakeOperatorLoc = 11002 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 11003 11004 // FIXME: to do this check properly, we will need to preserve the 11005 // first-qualifier-in-scope here, just in case we had a dependent 11006 // base (and therefore couldn't do the check) and a 11007 // nested-name-qualifier (and therefore could do the lookup). 11008 NamedDecl *FirstQualifierInScope = nullptr; 11009 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 11010 if (MemberNameInfo.getName()) { 11011 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 11012 if (!MemberNameInfo.getName()) 11013 return ExprError(); 11014 } 11015 11016 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 11017 E->isArrow(), 11018 QualifierLoc, 11019 TemplateKWLoc, 11020 MemberNameInfo, 11021 Member, 11022 FoundDecl, 11023 (E->hasExplicitTemplateArgs() 11024 ? &TransArgs : nullptr), 11025 FirstQualifierInScope); 11026 } 11027 11028 template<typename Derived> 11029 ExprResult 11030 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 11031 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11032 if (LHS.isInvalid()) 11033 return ExprError(); 11034 11035 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11036 if (RHS.isInvalid()) 11037 return ExprError(); 11038 11039 if (!getDerived().AlwaysRebuild() && 11040 LHS.get() == E->getLHS() && 11041 RHS.get() == E->getRHS()) 11042 return E; 11043 11044 if (E->isCompoundAssignmentOp()) 11045 // FPFeatures has already been established from trailing storage 11046 return getDerived().RebuildBinaryOperator( 11047 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 11048 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11049 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11050 getSema().CurFPFeatures = 11051 NewOverrides.applyOverrides(getSema().getLangOpts()); 11052 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11053 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 11054 LHS.get(), RHS.get()); 11055 } 11056 11057 template <typename Derived> 11058 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11059 CXXRewrittenBinaryOperator *E) { 11060 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11061 11062 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11063 if (LHS.isInvalid()) 11064 return ExprError(); 11065 11066 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11067 if (RHS.isInvalid()) 11068 return ExprError(); 11069 11070 // Extract the already-resolved callee declarations so that we can restrict 11071 // ourselves to using them as the unqualified lookup results when rebuilding. 11072 UnresolvedSet<2> UnqualLookups; 11073 bool ChangedAnyLookups = false; 11074 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11075 const_cast<Expr *>(Decomp.InnerBinOp)}; 11076 for (Expr *PossibleBinOp : PossibleBinOps) { 11077 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11078 if (!Op) 11079 continue; 11080 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11081 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11082 continue; 11083 11084 // Transform the callee in case we built a call to a local extern 11085 // declaration. 11086 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11087 E->getOperatorLoc(), Callee->getFoundDecl())); 11088 if (!Found) 11089 return ExprError(); 11090 if (Found != Callee->getFoundDecl()) 11091 ChangedAnyLookups = true; 11092 UnqualLookups.addDecl(Found); 11093 } 11094 11095 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11096 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11097 // Mark all functions used in the rewrite as referenced. Note that when 11098 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11099 // function calls, and/or there might be a user-defined conversion sequence 11100 // applied to the operands of the <. 11101 // FIXME: this is a bit instantiation-specific. 11102 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11103 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11104 return E; 11105 } 11106 11107 return getDerived().RebuildCXXRewrittenBinaryOperator( 11108 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11109 } 11110 11111 template<typename Derived> 11112 ExprResult 11113 TreeTransform<Derived>::TransformCompoundAssignOperator( 11114 CompoundAssignOperator *E) { 11115 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11116 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11117 getSema().CurFPFeatures = 11118 NewOverrides.applyOverrides(getSema().getLangOpts()); 11119 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11120 return getDerived().TransformBinaryOperator(E); 11121 } 11122 11123 template<typename Derived> 11124 ExprResult TreeTransform<Derived>:: 11125 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11126 // Just rebuild the common and RHS expressions and see whether we 11127 // get any changes. 11128 11129 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11130 if (commonExpr.isInvalid()) 11131 return ExprError(); 11132 11133 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11134 if (rhs.isInvalid()) 11135 return ExprError(); 11136 11137 if (!getDerived().AlwaysRebuild() && 11138 commonExpr.get() == e->getCommon() && 11139 rhs.get() == e->getFalseExpr()) 11140 return e; 11141 11142 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11143 e->getQuestionLoc(), 11144 nullptr, 11145 e->getColonLoc(), 11146 rhs.get()); 11147 } 11148 11149 template<typename Derived> 11150 ExprResult 11151 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11152 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11153 if (Cond.isInvalid()) 11154 return ExprError(); 11155 11156 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11157 if (LHS.isInvalid()) 11158 return ExprError(); 11159 11160 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11161 if (RHS.isInvalid()) 11162 return ExprError(); 11163 11164 if (!getDerived().AlwaysRebuild() && 11165 Cond.get() == E->getCond() && 11166 LHS.get() == E->getLHS() && 11167 RHS.get() == E->getRHS()) 11168 return E; 11169 11170 return getDerived().RebuildConditionalOperator(Cond.get(), 11171 E->getQuestionLoc(), 11172 LHS.get(), 11173 E->getColonLoc(), 11174 RHS.get()); 11175 } 11176 11177 template<typename Derived> 11178 ExprResult 11179 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11180 // Implicit casts are eliminated during transformation, since they 11181 // will be recomputed by semantic analysis after transformation. 11182 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11183 } 11184 11185 template<typename Derived> 11186 ExprResult 11187 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11188 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11189 if (!Type) 11190 return ExprError(); 11191 11192 ExprResult SubExpr 11193 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11194 if (SubExpr.isInvalid()) 11195 return ExprError(); 11196 11197 if (!getDerived().AlwaysRebuild() && 11198 Type == E->getTypeInfoAsWritten() && 11199 SubExpr.get() == E->getSubExpr()) 11200 return E; 11201 11202 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11203 Type, 11204 E->getRParenLoc(), 11205 SubExpr.get()); 11206 } 11207 11208 template<typename Derived> 11209 ExprResult 11210 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11211 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11212 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11213 if (!NewT) 11214 return ExprError(); 11215 11216 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11217 if (Init.isInvalid()) 11218 return ExprError(); 11219 11220 if (!getDerived().AlwaysRebuild() && 11221 OldT == NewT && 11222 Init.get() == E->getInitializer()) 11223 return SemaRef.MaybeBindToTemporary(E); 11224 11225 // Note: the expression type doesn't necessarily match the 11226 // type-as-written, but that's okay, because it should always be 11227 // derivable from the initializer. 11228 11229 return getDerived().RebuildCompoundLiteralExpr( 11230 E->getLParenLoc(), NewT, 11231 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11232 } 11233 11234 template<typename Derived> 11235 ExprResult 11236 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11237 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11238 if (Base.isInvalid()) 11239 return ExprError(); 11240 11241 if (!getDerived().AlwaysRebuild() && 11242 Base.get() == E->getBase()) 11243 return E; 11244 11245 // FIXME: Bad source location 11246 SourceLocation FakeOperatorLoc = 11247 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11248 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11249 E->getAccessorLoc(), 11250 E->getAccessor()); 11251 } 11252 11253 template<typename Derived> 11254 ExprResult 11255 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11256 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11257 E = Syntactic; 11258 11259 bool InitChanged = false; 11260 11261 EnterExpressionEvaluationContext Context( 11262 getSema(), EnterExpressionEvaluationContext::InitList); 11263 11264 SmallVector<Expr*, 4> Inits; 11265 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11266 Inits, &InitChanged)) 11267 return ExprError(); 11268 11269 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11270 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11271 // in some cases. We can't reuse it in general, because the syntactic and 11272 // semantic forms are linked, and we can't know that semantic form will 11273 // match even if the syntactic form does. 11274 } 11275 11276 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11277 E->getRBraceLoc()); 11278 } 11279 11280 template<typename Derived> 11281 ExprResult 11282 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11283 Designation Desig; 11284 11285 // transform the initializer value 11286 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11287 if (Init.isInvalid()) 11288 return ExprError(); 11289 11290 // transform the designators. 11291 SmallVector<Expr*, 4> ArrayExprs; 11292 bool ExprChanged = false; 11293 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11294 if (D.isFieldDesignator()) { 11295 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11296 D.getDotLoc(), 11297 D.getFieldLoc())); 11298 if (D.getField()) { 11299 FieldDecl *Field = cast_or_null<FieldDecl>( 11300 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11301 if (Field != D.getField()) 11302 // Rebuild the expression when the transformed FieldDecl is 11303 // different to the already assigned FieldDecl. 11304 ExprChanged = true; 11305 } else { 11306 // Ensure that the designator expression is rebuilt when there isn't 11307 // a resolved FieldDecl in the designator as we don't want to assign 11308 // a FieldDecl to a pattern designator that will be instantiated again. 11309 ExprChanged = true; 11310 } 11311 continue; 11312 } 11313 11314 if (D.isArrayDesignator()) { 11315 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11316 if (Index.isInvalid()) 11317 return ExprError(); 11318 11319 Desig.AddDesignator( 11320 Designator::getArray(Index.get(), D.getLBracketLoc())); 11321 11322 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11323 ArrayExprs.push_back(Index.get()); 11324 continue; 11325 } 11326 11327 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11328 ExprResult Start 11329 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11330 if (Start.isInvalid()) 11331 return ExprError(); 11332 11333 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11334 if (End.isInvalid()) 11335 return ExprError(); 11336 11337 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11338 End.get(), 11339 D.getLBracketLoc(), 11340 D.getEllipsisLoc())); 11341 11342 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11343 End.get() != E->getArrayRangeEnd(D); 11344 11345 ArrayExprs.push_back(Start.get()); 11346 ArrayExprs.push_back(End.get()); 11347 } 11348 11349 if (!getDerived().AlwaysRebuild() && 11350 Init.get() == E->getInit() && 11351 !ExprChanged) 11352 return E; 11353 11354 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11355 E->getEqualOrColonLoc(), 11356 E->usesGNUSyntax(), Init.get()); 11357 } 11358 11359 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11360 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11361 template<typename Derived> 11362 ExprResult 11363 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11364 DesignatedInitUpdateExpr *E) { 11365 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11366 "initializer"); 11367 return ExprError(); 11368 } 11369 11370 template<typename Derived> 11371 ExprResult 11372 TreeTransform<Derived>::TransformNoInitExpr( 11373 NoInitExpr *E) { 11374 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11375 return ExprError(); 11376 } 11377 11378 template<typename Derived> 11379 ExprResult 11380 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11381 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11382 return ExprError(); 11383 } 11384 11385 template<typename Derived> 11386 ExprResult 11387 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11388 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11389 return ExprError(); 11390 } 11391 11392 template<typename Derived> 11393 ExprResult 11394 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11395 ImplicitValueInitExpr *E) { 11396 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11397 11398 // FIXME: Will we ever have proper type location here? Will we actually 11399 // need to transform the type? 11400 QualType T = getDerived().TransformType(E->getType()); 11401 if (T.isNull()) 11402 return ExprError(); 11403 11404 if (!getDerived().AlwaysRebuild() && 11405 T == E->getType()) 11406 return E; 11407 11408 return getDerived().RebuildImplicitValueInitExpr(T); 11409 } 11410 11411 template<typename Derived> 11412 ExprResult 11413 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11414 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11415 if (!TInfo) 11416 return ExprError(); 11417 11418 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11419 if (SubExpr.isInvalid()) 11420 return ExprError(); 11421 11422 if (!getDerived().AlwaysRebuild() && 11423 TInfo == E->getWrittenTypeInfo() && 11424 SubExpr.get() == E->getSubExpr()) 11425 return E; 11426 11427 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11428 TInfo, E->getRParenLoc()); 11429 } 11430 11431 template<typename Derived> 11432 ExprResult 11433 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11434 bool ArgumentChanged = false; 11435 SmallVector<Expr*, 4> Inits; 11436 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11437 &ArgumentChanged)) 11438 return ExprError(); 11439 11440 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11441 Inits, 11442 E->getRParenLoc()); 11443 } 11444 11445 /// Transform an address-of-label expression. 11446 /// 11447 /// By default, the transformation of an address-of-label expression always 11448 /// rebuilds the expression, so that the label identifier can be resolved to 11449 /// the corresponding label statement by semantic analysis. 11450 template<typename Derived> 11451 ExprResult 11452 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11453 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11454 E->getLabel()); 11455 if (!LD) 11456 return ExprError(); 11457 11458 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11459 cast<LabelDecl>(LD)); 11460 } 11461 11462 template<typename Derived> 11463 ExprResult 11464 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11465 SemaRef.ActOnStartStmtExpr(); 11466 StmtResult SubStmt 11467 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11468 if (SubStmt.isInvalid()) { 11469 SemaRef.ActOnStmtExprError(); 11470 return ExprError(); 11471 } 11472 11473 unsigned OldDepth = E->getTemplateDepth(); 11474 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11475 11476 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11477 SubStmt.get() == E->getSubStmt()) { 11478 // Calling this an 'error' is unintuitive, but it does the right thing. 11479 SemaRef.ActOnStmtExprError(); 11480 return SemaRef.MaybeBindToTemporary(E); 11481 } 11482 11483 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11484 E->getRParenLoc(), NewDepth); 11485 } 11486 11487 template<typename Derived> 11488 ExprResult 11489 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11490 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11491 if (Cond.isInvalid()) 11492 return ExprError(); 11493 11494 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11495 if (LHS.isInvalid()) 11496 return ExprError(); 11497 11498 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11499 if (RHS.isInvalid()) 11500 return ExprError(); 11501 11502 if (!getDerived().AlwaysRebuild() && 11503 Cond.get() == E->getCond() && 11504 LHS.get() == E->getLHS() && 11505 RHS.get() == E->getRHS()) 11506 return E; 11507 11508 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11509 Cond.get(), LHS.get(), RHS.get(), 11510 E->getRParenLoc()); 11511 } 11512 11513 template<typename Derived> 11514 ExprResult 11515 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11516 return E; 11517 } 11518 11519 template<typename Derived> 11520 ExprResult 11521 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11522 switch (E->getOperator()) { 11523 case OO_New: 11524 case OO_Delete: 11525 case OO_Array_New: 11526 case OO_Array_Delete: 11527 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11528 11529 case OO_Subscript: 11530 case OO_Call: { 11531 // This is a call to an object's operator(). 11532 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11533 11534 // Transform the object itself. 11535 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11536 if (Object.isInvalid()) 11537 return ExprError(); 11538 11539 // FIXME: Poor location information 11540 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11541 static_cast<Expr *>(Object.get())->getEndLoc()); 11542 11543 // Transform the call arguments. 11544 SmallVector<Expr*, 8> Args; 11545 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11546 Args)) 11547 return ExprError(); 11548 11549 if (E->getOperator() == OO_Subscript) 11550 return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc, 11551 Args, E->getEndLoc()); 11552 11553 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11554 E->getEndLoc()); 11555 } 11556 11557 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 11558 case OO_##Name: \ 11559 break; 11560 11561 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11562 #include "clang/Basic/OperatorKinds.def" 11563 11564 case OO_Conditional: 11565 llvm_unreachable("conditional operator is not actually overloadable"); 11566 11567 case OO_None: 11568 case NUM_OVERLOADED_OPERATORS: 11569 llvm_unreachable("not an overloaded operator?"); 11570 } 11571 11572 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11573 if (Callee.isInvalid()) 11574 return ExprError(); 11575 11576 ExprResult First; 11577 if (E->getOperator() == OO_Amp) 11578 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11579 else 11580 First = getDerived().TransformExpr(E->getArg(0)); 11581 if (First.isInvalid()) 11582 return ExprError(); 11583 11584 ExprResult Second; 11585 if (E->getNumArgs() == 2) { 11586 Second = getDerived().TransformExpr(E->getArg(1)); 11587 if (Second.isInvalid()) 11588 return ExprError(); 11589 } 11590 11591 if (!getDerived().AlwaysRebuild() && 11592 Callee.get() == E->getCallee() && 11593 First.get() == E->getArg(0) && 11594 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11595 return SemaRef.MaybeBindToTemporary(E); 11596 11597 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11598 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11599 getSema().CurFPFeatures = 11600 NewOverrides.applyOverrides(getSema().getLangOpts()); 11601 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11602 11603 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11604 E->getOperatorLoc(), 11605 Callee.get(), 11606 First.get(), 11607 Second.get()); 11608 } 11609 11610 template<typename Derived> 11611 ExprResult 11612 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11613 return getDerived().TransformCallExpr(E); 11614 } 11615 11616 template <typename Derived> 11617 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11618 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11619 getSema().CurContext != E->getParentContext(); 11620 11621 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11622 return E; 11623 11624 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11625 E->getEndLoc(), 11626 getSema().CurContext); 11627 } 11628 11629 template<typename Derived> 11630 ExprResult 11631 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11632 // Transform the callee. 11633 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11634 if (Callee.isInvalid()) 11635 return ExprError(); 11636 11637 // Transform exec config. 11638 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11639 if (EC.isInvalid()) 11640 return ExprError(); 11641 11642 // Transform arguments. 11643 bool ArgChanged = false; 11644 SmallVector<Expr*, 8> Args; 11645 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11646 &ArgChanged)) 11647 return ExprError(); 11648 11649 if (!getDerived().AlwaysRebuild() && 11650 Callee.get() == E->getCallee() && 11651 !ArgChanged) 11652 return SemaRef.MaybeBindToTemporary(E); 11653 11654 // FIXME: Wrong source location information for the '('. 11655 SourceLocation FakeLParenLoc 11656 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11657 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11658 Args, 11659 E->getRParenLoc(), EC.get()); 11660 } 11661 11662 template<typename Derived> 11663 ExprResult 11664 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11665 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11666 if (!Type) 11667 return ExprError(); 11668 11669 ExprResult SubExpr 11670 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11671 if (SubExpr.isInvalid()) 11672 return ExprError(); 11673 11674 if (!getDerived().AlwaysRebuild() && 11675 Type == E->getTypeInfoAsWritten() && 11676 SubExpr.get() == E->getSubExpr()) 11677 return E; 11678 return getDerived().RebuildCXXNamedCastExpr( 11679 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11680 Type, E->getAngleBrackets().getEnd(), 11681 // FIXME. this should be '(' location 11682 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11683 } 11684 11685 template<typename Derived> 11686 ExprResult 11687 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11688 TypeSourceInfo *TSI = 11689 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11690 if (!TSI) 11691 return ExprError(); 11692 11693 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11694 if (Sub.isInvalid()) 11695 return ExprError(); 11696 11697 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11698 Sub.get(), BCE->getEndLoc()); 11699 } 11700 11701 template<typename Derived> 11702 ExprResult 11703 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11704 return getDerived().TransformCXXNamedCastExpr(E); 11705 } 11706 11707 template<typename Derived> 11708 ExprResult 11709 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11710 return getDerived().TransformCXXNamedCastExpr(E); 11711 } 11712 11713 template<typename Derived> 11714 ExprResult 11715 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11716 CXXReinterpretCastExpr *E) { 11717 return getDerived().TransformCXXNamedCastExpr(E); 11718 } 11719 11720 template<typename Derived> 11721 ExprResult 11722 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11723 return getDerived().TransformCXXNamedCastExpr(E); 11724 } 11725 11726 template<typename Derived> 11727 ExprResult 11728 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11729 return getDerived().TransformCXXNamedCastExpr(E); 11730 } 11731 11732 template<typename Derived> 11733 ExprResult 11734 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11735 CXXFunctionalCastExpr *E) { 11736 TypeSourceInfo *Type = 11737 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11738 if (!Type) 11739 return ExprError(); 11740 11741 ExprResult SubExpr 11742 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11743 if (SubExpr.isInvalid()) 11744 return ExprError(); 11745 11746 if (!getDerived().AlwaysRebuild() && 11747 Type == E->getTypeInfoAsWritten() && 11748 SubExpr.get() == E->getSubExpr()) 11749 return E; 11750 11751 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11752 E->getLParenLoc(), 11753 SubExpr.get(), 11754 E->getRParenLoc(), 11755 E->isListInitialization()); 11756 } 11757 11758 template<typename Derived> 11759 ExprResult 11760 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11761 if (E->isTypeOperand()) { 11762 TypeSourceInfo *TInfo 11763 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11764 if (!TInfo) 11765 return ExprError(); 11766 11767 if (!getDerived().AlwaysRebuild() && 11768 TInfo == E->getTypeOperandSourceInfo()) 11769 return E; 11770 11771 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11772 TInfo, E->getEndLoc()); 11773 } 11774 11775 // Typeid's operand is an unevaluated context, unless it's a polymorphic 11776 // type. We must not unilaterally enter unevaluated context here, as then 11777 // semantic processing can re-transform an already transformed operand. 11778 Expr *Op = E->getExprOperand(); 11779 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 11780 if (E->isGLValue()) 11781 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 11782 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 11783 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 11784 11785 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 11786 Sema::ReuseLambdaContextDecl); 11787 11788 ExprResult SubExpr = getDerived().TransformExpr(Op); 11789 if (SubExpr.isInvalid()) 11790 return ExprError(); 11791 11792 if (!getDerived().AlwaysRebuild() && 11793 SubExpr.get() == E->getExprOperand()) 11794 return E; 11795 11796 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11797 SubExpr.get(), E->getEndLoc()); 11798 } 11799 11800 template<typename Derived> 11801 ExprResult 11802 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11803 if (E->isTypeOperand()) { 11804 TypeSourceInfo *TInfo 11805 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11806 if (!TInfo) 11807 return ExprError(); 11808 11809 if (!getDerived().AlwaysRebuild() && 11810 TInfo == E->getTypeOperandSourceInfo()) 11811 return E; 11812 11813 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11814 TInfo, E->getEndLoc()); 11815 } 11816 11817 EnterExpressionEvaluationContext Unevaluated( 11818 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11819 11820 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11821 if (SubExpr.isInvalid()) 11822 return ExprError(); 11823 11824 if (!getDerived().AlwaysRebuild() && 11825 SubExpr.get() == E->getExprOperand()) 11826 return E; 11827 11828 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11829 SubExpr.get(), E->getEndLoc()); 11830 } 11831 11832 template<typename Derived> 11833 ExprResult 11834 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11835 return E; 11836 } 11837 11838 template<typename Derived> 11839 ExprResult 11840 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11841 CXXNullPtrLiteralExpr *E) { 11842 return E; 11843 } 11844 11845 template<typename Derived> 11846 ExprResult 11847 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11848 QualType T = getSema().getCurrentThisType(); 11849 11850 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11851 // Mark it referenced in the new context regardless. 11852 // FIXME: this is a bit instantiation-specific. 11853 getSema().MarkThisReferenced(E); 11854 return E; 11855 } 11856 11857 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11858 } 11859 11860 template<typename Derived> 11861 ExprResult 11862 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11863 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11864 if (SubExpr.isInvalid()) 11865 return ExprError(); 11866 11867 if (!getDerived().AlwaysRebuild() && 11868 SubExpr.get() == E->getSubExpr()) 11869 return E; 11870 11871 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11872 E->isThrownVariableInScope()); 11873 } 11874 11875 template<typename Derived> 11876 ExprResult 11877 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11878 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11879 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11880 if (!Param) 11881 return ExprError(); 11882 11883 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11884 E->getUsedContext() == SemaRef.CurContext) 11885 return E; 11886 11887 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11888 } 11889 11890 template<typename Derived> 11891 ExprResult 11892 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11893 FieldDecl *Field = cast_or_null<FieldDecl>( 11894 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11895 if (!Field) 11896 return ExprError(); 11897 11898 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11899 E->getUsedContext() == SemaRef.CurContext) 11900 return E; 11901 11902 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11903 } 11904 11905 template<typename Derived> 11906 ExprResult 11907 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11908 CXXScalarValueInitExpr *E) { 11909 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11910 if (!T) 11911 return ExprError(); 11912 11913 if (!getDerived().AlwaysRebuild() && 11914 T == E->getTypeSourceInfo()) 11915 return E; 11916 11917 return getDerived().RebuildCXXScalarValueInitExpr(T, 11918 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11919 E->getRParenLoc()); 11920 } 11921 11922 template<typename Derived> 11923 ExprResult 11924 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11925 // Transform the type that we're allocating 11926 TypeSourceInfo *AllocTypeInfo = 11927 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11928 if (!AllocTypeInfo) 11929 return ExprError(); 11930 11931 // Transform the size of the array we're allocating (if any). 11932 Optional<Expr *> ArraySize; 11933 if (E->isArray()) { 11934 ExprResult NewArraySize; 11935 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11936 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11937 if (NewArraySize.isInvalid()) 11938 return ExprError(); 11939 } 11940 ArraySize = NewArraySize.get(); 11941 } 11942 11943 // Transform the placement arguments (if any). 11944 bool ArgumentChanged = false; 11945 SmallVector<Expr*, 8> PlacementArgs; 11946 if (getDerived().TransformExprs(E->getPlacementArgs(), 11947 E->getNumPlacementArgs(), true, 11948 PlacementArgs, &ArgumentChanged)) 11949 return ExprError(); 11950 11951 // Transform the initializer (if any). 11952 Expr *OldInit = E->getInitializer(); 11953 ExprResult NewInit; 11954 if (OldInit) 11955 NewInit = getDerived().TransformInitializer(OldInit, true); 11956 if (NewInit.isInvalid()) 11957 return ExprError(); 11958 11959 // Transform new operator and delete operator. 11960 FunctionDecl *OperatorNew = nullptr; 11961 if (E->getOperatorNew()) { 11962 OperatorNew = cast_or_null<FunctionDecl>( 11963 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11964 if (!OperatorNew) 11965 return ExprError(); 11966 } 11967 11968 FunctionDecl *OperatorDelete = nullptr; 11969 if (E->getOperatorDelete()) { 11970 OperatorDelete = cast_or_null<FunctionDecl>( 11971 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11972 if (!OperatorDelete) 11973 return ExprError(); 11974 } 11975 11976 if (!getDerived().AlwaysRebuild() && 11977 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11978 ArraySize == E->getArraySize() && 11979 NewInit.get() == OldInit && 11980 OperatorNew == E->getOperatorNew() && 11981 OperatorDelete == E->getOperatorDelete() && 11982 !ArgumentChanged) { 11983 // Mark any declarations we need as referenced. 11984 // FIXME: instantiation-specific. 11985 if (OperatorNew) 11986 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11987 if (OperatorDelete) 11988 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11989 11990 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11991 QualType ElementType 11992 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11993 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11994 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11995 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11996 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11997 } 11998 } 11999 } 12000 12001 return E; 12002 } 12003 12004 QualType AllocType = AllocTypeInfo->getType(); 12005 if (!ArraySize) { 12006 // If no array size was specified, but the new expression was 12007 // instantiated with an array type (e.g., "new T" where T is 12008 // instantiated with "int[4]"), extract the outer bound from the 12009 // array type as our array size. We do this with constant and 12010 // dependently-sized array types. 12011 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 12012 if (!ArrayT) { 12013 // Do nothing 12014 } else if (const ConstantArrayType *ConsArrayT 12015 = dyn_cast<ConstantArrayType>(ArrayT)) { 12016 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 12017 SemaRef.Context.getSizeType(), 12018 /*FIXME:*/ E->getBeginLoc()); 12019 AllocType = ConsArrayT->getElementType(); 12020 } else if (const DependentSizedArrayType *DepArrayT 12021 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 12022 if (DepArrayT->getSizeExpr()) { 12023 ArraySize = DepArrayT->getSizeExpr(); 12024 AllocType = DepArrayT->getElementType(); 12025 } 12026 } 12027 } 12028 12029 return getDerived().RebuildCXXNewExpr( 12030 E->getBeginLoc(), E->isGlobalNew(), 12031 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 12032 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 12033 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 12034 } 12035 12036 template<typename Derived> 12037 ExprResult 12038 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 12039 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 12040 if (Operand.isInvalid()) 12041 return ExprError(); 12042 12043 // Transform the delete operator, if known. 12044 FunctionDecl *OperatorDelete = nullptr; 12045 if (E->getOperatorDelete()) { 12046 OperatorDelete = cast_or_null<FunctionDecl>( 12047 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12048 if (!OperatorDelete) 12049 return ExprError(); 12050 } 12051 12052 if (!getDerived().AlwaysRebuild() && 12053 Operand.get() == E->getArgument() && 12054 OperatorDelete == E->getOperatorDelete()) { 12055 // Mark any declarations we need as referenced. 12056 // FIXME: instantiation-specific. 12057 if (OperatorDelete) 12058 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12059 12060 if (!E->getArgument()->isTypeDependent()) { 12061 QualType Destroyed = SemaRef.Context.getBaseElementType( 12062 E->getDestroyedType()); 12063 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12064 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12065 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12066 SemaRef.LookupDestructor(Record)); 12067 } 12068 } 12069 12070 return E; 12071 } 12072 12073 return getDerived().RebuildCXXDeleteExpr( 12074 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12075 } 12076 12077 template<typename Derived> 12078 ExprResult 12079 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12080 CXXPseudoDestructorExpr *E) { 12081 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12082 if (Base.isInvalid()) 12083 return ExprError(); 12084 12085 ParsedType ObjectTypePtr; 12086 bool MayBePseudoDestructor = false; 12087 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12088 E->getOperatorLoc(), 12089 E->isArrow()? tok::arrow : tok::period, 12090 ObjectTypePtr, 12091 MayBePseudoDestructor); 12092 if (Base.isInvalid()) 12093 return ExprError(); 12094 12095 QualType ObjectType = ObjectTypePtr.get(); 12096 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12097 if (QualifierLoc) { 12098 QualifierLoc 12099 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12100 if (!QualifierLoc) 12101 return ExprError(); 12102 } 12103 CXXScopeSpec SS; 12104 SS.Adopt(QualifierLoc); 12105 12106 PseudoDestructorTypeStorage Destroyed; 12107 if (E->getDestroyedTypeInfo()) { 12108 TypeSourceInfo *DestroyedTypeInfo 12109 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12110 ObjectType, nullptr, SS); 12111 if (!DestroyedTypeInfo) 12112 return ExprError(); 12113 Destroyed = DestroyedTypeInfo; 12114 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12115 // We aren't likely to be able to resolve the identifier down to a type 12116 // now anyway, so just retain the identifier. 12117 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12118 E->getDestroyedTypeLoc()); 12119 } else { 12120 // Look for a destructor known with the given name. 12121 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 12122 *E->getDestroyedTypeIdentifier(), 12123 E->getDestroyedTypeLoc(), 12124 /*Scope=*/nullptr, 12125 SS, ObjectTypePtr, 12126 false); 12127 if (!T) 12128 return ExprError(); 12129 12130 Destroyed 12131 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12132 E->getDestroyedTypeLoc()); 12133 } 12134 12135 TypeSourceInfo *ScopeTypeInfo = nullptr; 12136 if (E->getScopeTypeInfo()) { 12137 CXXScopeSpec EmptySS; 12138 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12139 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12140 if (!ScopeTypeInfo) 12141 return ExprError(); 12142 } 12143 12144 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12145 E->getOperatorLoc(), 12146 E->isArrow(), 12147 SS, 12148 ScopeTypeInfo, 12149 E->getColonColonLoc(), 12150 E->getTildeLoc(), 12151 Destroyed); 12152 } 12153 12154 template <typename Derived> 12155 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12156 bool RequiresADL, 12157 LookupResult &R) { 12158 // Transform all the decls. 12159 bool AllEmptyPacks = true; 12160 for (auto *OldD : Old->decls()) { 12161 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12162 if (!InstD) { 12163 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12164 // This can happen because of dependent hiding. 12165 if (isa<UsingShadowDecl>(OldD)) 12166 continue; 12167 else { 12168 R.clear(); 12169 return true; 12170 } 12171 } 12172 12173 // Expand using pack declarations. 12174 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12175 ArrayRef<NamedDecl*> Decls = SingleDecl; 12176 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12177 Decls = UPD->expansions(); 12178 12179 // Expand using declarations. 12180 for (auto *D : Decls) { 12181 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12182 for (auto *SD : UD->shadows()) 12183 R.addDecl(SD); 12184 } else { 12185 R.addDecl(D); 12186 } 12187 } 12188 12189 AllEmptyPacks &= Decls.empty(); 12190 }; 12191 12192 // C++ [temp.res]/8.4.2: 12193 // The program is ill-formed, no diagnostic required, if [...] lookup for 12194 // a name in the template definition found a using-declaration, but the 12195 // lookup in the corresponding scope in the instantiation odoes not find 12196 // any declarations because the using-declaration was a pack expansion and 12197 // the corresponding pack is empty 12198 if (AllEmptyPacks && !RequiresADL) { 12199 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12200 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12201 return true; 12202 } 12203 12204 // Resolve a kind, but don't do any further analysis. If it's 12205 // ambiguous, the callee needs to deal with it. 12206 R.resolveKind(); 12207 return false; 12208 } 12209 12210 template<typename Derived> 12211 ExprResult 12212 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12213 UnresolvedLookupExpr *Old) { 12214 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12215 Sema::LookupOrdinaryName); 12216 12217 // Transform the declaration set. 12218 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12219 return ExprError(); 12220 12221 // Rebuild the nested-name qualifier, if present. 12222 CXXScopeSpec SS; 12223 if (Old->getQualifierLoc()) { 12224 NestedNameSpecifierLoc QualifierLoc 12225 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12226 if (!QualifierLoc) 12227 return ExprError(); 12228 12229 SS.Adopt(QualifierLoc); 12230 } 12231 12232 if (Old->getNamingClass()) { 12233 CXXRecordDecl *NamingClass 12234 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12235 Old->getNameLoc(), 12236 Old->getNamingClass())); 12237 if (!NamingClass) { 12238 R.clear(); 12239 return ExprError(); 12240 } 12241 12242 R.setNamingClass(NamingClass); 12243 } 12244 12245 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12246 12247 // If we have neither explicit template arguments, nor the template keyword, 12248 // it's a normal declaration name or member reference. 12249 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12250 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12251 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12252 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12253 // give a good diagnostic. 12254 if (D && D->isCXXInstanceMember()) { 12255 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12256 /*TemplateArgs=*/nullptr, 12257 /*Scope=*/nullptr); 12258 } 12259 12260 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12261 } 12262 12263 // If we have template arguments, rebuild them, then rebuild the 12264 // templateid expression. 12265 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12266 if (Old->hasExplicitTemplateArgs() && 12267 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12268 Old->getNumTemplateArgs(), 12269 TransArgs)) { 12270 R.clear(); 12271 return ExprError(); 12272 } 12273 12274 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12275 Old->requiresADL(), &TransArgs); 12276 } 12277 12278 template<typename Derived> 12279 ExprResult 12280 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12281 bool ArgChanged = false; 12282 SmallVector<TypeSourceInfo *, 4> Args; 12283 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12284 TypeSourceInfo *From = E->getArg(I); 12285 TypeLoc FromTL = From->getTypeLoc(); 12286 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12287 TypeLocBuilder TLB; 12288 TLB.reserve(FromTL.getFullDataSize()); 12289 QualType To = getDerived().TransformType(TLB, FromTL); 12290 if (To.isNull()) 12291 return ExprError(); 12292 12293 if (To == From->getType()) 12294 Args.push_back(From); 12295 else { 12296 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12297 ArgChanged = true; 12298 } 12299 continue; 12300 } 12301 12302 ArgChanged = true; 12303 12304 // We have a pack expansion. Instantiate it. 12305 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12306 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12307 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12308 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12309 12310 // Determine whether the set of unexpanded parameter packs can and should 12311 // be expanded. 12312 bool Expand = true; 12313 bool RetainExpansion = false; 12314 Optional<unsigned> OrigNumExpansions = 12315 ExpansionTL.getTypePtr()->getNumExpansions(); 12316 Optional<unsigned> NumExpansions = OrigNumExpansions; 12317 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12318 PatternTL.getSourceRange(), 12319 Unexpanded, 12320 Expand, RetainExpansion, 12321 NumExpansions)) 12322 return ExprError(); 12323 12324 if (!Expand) { 12325 // The transform has determined that we should perform a simple 12326 // transformation on the pack expansion, producing another pack 12327 // expansion. 12328 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12329 12330 TypeLocBuilder TLB; 12331 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12332 12333 QualType To = getDerived().TransformType(TLB, PatternTL); 12334 if (To.isNull()) 12335 return ExprError(); 12336 12337 To = getDerived().RebuildPackExpansionType(To, 12338 PatternTL.getSourceRange(), 12339 ExpansionTL.getEllipsisLoc(), 12340 NumExpansions); 12341 if (To.isNull()) 12342 return ExprError(); 12343 12344 PackExpansionTypeLoc ToExpansionTL 12345 = TLB.push<PackExpansionTypeLoc>(To); 12346 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12347 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12348 continue; 12349 } 12350 12351 // Expand the pack expansion by substituting for each argument in the 12352 // pack(s). 12353 for (unsigned I = 0; I != *NumExpansions; ++I) { 12354 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12355 TypeLocBuilder TLB; 12356 TLB.reserve(PatternTL.getFullDataSize()); 12357 QualType To = getDerived().TransformType(TLB, PatternTL); 12358 if (To.isNull()) 12359 return ExprError(); 12360 12361 if (To->containsUnexpandedParameterPack()) { 12362 To = getDerived().RebuildPackExpansionType(To, 12363 PatternTL.getSourceRange(), 12364 ExpansionTL.getEllipsisLoc(), 12365 NumExpansions); 12366 if (To.isNull()) 12367 return ExprError(); 12368 12369 PackExpansionTypeLoc ToExpansionTL 12370 = TLB.push<PackExpansionTypeLoc>(To); 12371 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12372 } 12373 12374 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12375 } 12376 12377 if (!RetainExpansion) 12378 continue; 12379 12380 // If we're supposed to retain a pack expansion, do so by temporarily 12381 // forgetting the partially-substituted parameter pack. 12382 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12383 12384 TypeLocBuilder TLB; 12385 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12386 12387 QualType To = getDerived().TransformType(TLB, PatternTL); 12388 if (To.isNull()) 12389 return ExprError(); 12390 12391 To = getDerived().RebuildPackExpansionType(To, 12392 PatternTL.getSourceRange(), 12393 ExpansionTL.getEllipsisLoc(), 12394 NumExpansions); 12395 if (To.isNull()) 12396 return ExprError(); 12397 12398 PackExpansionTypeLoc ToExpansionTL 12399 = TLB.push<PackExpansionTypeLoc>(To); 12400 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12401 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12402 } 12403 12404 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12405 return E; 12406 12407 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12408 E->getEndLoc()); 12409 } 12410 12411 template<typename Derived> 12412 ExprResult 12413 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12414 ConceptSpecializationExpr *E) { 12415 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12416 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12417 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12418 Old->NumTemplateArgs, TransArgs)) 12419 return ExprError(); 12420 12421 return getDerived().RebuildConceptSpecializationExpr( 12422 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12423 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12424 &TransArgs); 12425 } 12426 12427 template<typename Derived> 12428 ExprResult 12429 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12430 SmallVector<ParmVarDecl*, 4> TransParams; 12431 SmallVector<QualType, 4> TransParamTypes; 12432 Sema::ExtParameterInfoBuilder ExtParamInfos; 12433 12434 // C++2a [expr.prim.req]p2 12435 // Expressions appearing within a requirement-body are unevaluated operands. 12436 EnterExpressionEvaluationContext Ctx( 12437 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12438 12439 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12440 getSema().Context, getSema().CurContext, 12441 E->getBody()->getBeginLoc()); 12442 12443 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12444 12445 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12446 E->getLocalParameters(), 12447 /*ParamTypes=*/nullptr, 12448 /*ParamInfos=*/nullptr, 12449 TransParamTypes, &TransParams, 12450 ExtParamInfos)) 12451 return ExprError(); 12452 12453 for (ParmVarDecl *Param : TransParams) 12454 Param->setDeclContext(Body); 12455 12456 SmallVector<concepts::Requirement *, 4> TransReqs; 12457 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12458 TransReqs)) 12459 return ExprError(); 12460 12461 for (concepts::Requirement *Req : TransReqs) { 12462 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12463 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12464 ER->getReturnTypeRequirement() 12465 .getTypeConstraintTemplateParameterList()->getParam(0) 12466 ->setDeclContext(Body); 12467 } 12468 } 12469 } 12470 12471 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12472 TransParams, TransReqs, 12473 E->getRBraceLoc()); 12474 } 12475 12476 template<typename Derived> 12477 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12478 ArrayRef<concepts::Requirement *> Reqs, 12479 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12480 for (concepts::Requirement *Req : Reqs) { 12481 concepts::Requirement *TransReq = nullptr; 12482 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12483 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12484 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12485 TransReq = getDerived().TransformExprRequirement(ExprReq); 12486 else 12487 TransReq = getDerived().TransformNestedRequirement( 12488 cast<concepts::NestedRequirement>(Req)); 12489 if (!TransReq) 12490 return true; 12491 Transformed.push_back(TransReq); 12492 } 12493 return false; 12494 } 12495 12496 template<typename Derived> 12497 concepts::TypeRequirement * 12498 TreeTransform<Derived>::TransformTypeRequirement( 12499 concepts::TypeRequirement *Req) { 12500 if (Req->isSubstitutionFailure()) { 12501 if (getDerived().AlwaysRebuild()) 12502 return getDerived().RebuildTypeRequirement( 12503 Req->getSubstitutionDiagnostic()); 12504 return Req; 12505 } 12506 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12507 if (!TransType) 12508 return nullptr; 12509 return getDerived().RebuildTypeRequirement(TransType); 12510 } 12511 12512 template<typename Derived> 12513 concepts::ExprRequirement * 12514 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12515 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12516 if (Req->isExprSubstitutionFailure()) 12517 TransExpr = Req->getExprSubstitutionDiagnostic(); 12518 else { 12519 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12520 if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType()) 12521 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get()); 12522 if (TransExprRes.isInvalid()) 12523 return nullptr; 12524 TransExpr = TransExprRes.get(); 12525 } 12526 12527 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12528 const auto &RetReq = Req->getReturnTypeRequirement(); 12529 if (RetReq.isEmpty()) 12530 TransRetReq.emplace(); 12531 else if (RetReq.isSubstitutionFailure()) 12532 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12533 else if (RetReq.isTypeConstraint()) { 12534 TemplateParameterList *OrigTPL = 12535 RetReq.getTypeConstraintTemplateParameterList(); 12536 TemplateParameterList *TPL = 12537 getDerived().TransformTemplateParameterList(OrigTPL); 12538 if (!TPL) 12539 return nullptr; 12540 TransRetReq.emplace(TPL); 12541 } 12542 assert(TransRetReq.hasValue() && 12543 "All code paths leading here must set TransRetReq"); 12544 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12545 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12546 Req->getNoexceptLoc(), 12547 std::move(*TransRetReq)); 12548 return getDerived().RebuildExprRequirement( 12549 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12550 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12551 } 12552 12553 template<typename Derived> 12554 concepts::NestedRequirement * 12555 TreeTransform<Derived>::TransformNestedRequirement( 12556 concepts::NestedRequirement *Req) { 12557 if (Req->isSubstitutionFailure()) { 12558 if (getDerived().AlwaysRebuild()) 12559 return getDerived().RebuildNestedRequirement( 12560 Req->getSubstitutionDiagnostic()); 12561 return Req; 12562 } 12563 ExprResult TransConstraint = 12564 getDerived().TransformExpr(Req->getConstraintExpr()); 12565 if (TransConstraint.isInvalid()) 12566 return nullptr; 12567 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12568 } 12569 12570 template<typename Derived> 12571 ExprResult 12572 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12573 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12574 if (!T) 12575 return ExprError(); 12576 12577 if (!getDerived().AlwaysRebuild() && 12578 T == E->getQueriedTypeSourceInfo()) 12579 return E; 12580 12581 ExprResult SubExpr; 12582 { 12583 EnterExpressionEvaluationContext Unevaluated( 12584 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12585 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12586 if (SubExpr.isInvalid()) 12587 return ExprError(); 12588 12589 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12590 return E; 12591 } 12592 12593 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12594 SubExpr.get(), E->getEndLoc()); 12595 } 12596 12597 template<typename Derived> 12598 ExprResult 12599 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12600 ExprResult SubExpr; 12601 { 12602 EnterExpressionEvaluationContext Unevaluated( 12603 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12604 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12605 if (SubExpr.isInvalid()) 12606 return ExprError(); 12607 12608 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12609 return E; 12610 } 12611 12612 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12613 SubExpr.get(), E->getEndLoc()); 12614 } 12615 12616 template <typename Derived> 12617 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12618 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12619 TypeSourceInfo **RecoveryTSI) { 12620 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12621 DRE, AddrTaken, RecoveryTSI); 12622 12623 // Propagate both errors and recovered types, which return ExprEmpty. 12624 if (!NewDRE.isUsable()) 12625 return NewDRE; 12626 12627 // We got an expr, wrap it up in parens. 12628 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12629 return PE; 12630 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12631 PE->getRParen()); 12632 } 12633 12634 template <typename Derived> 12635 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12636 DependentScopeDeclRefExpr *E) { 12637 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12638 nullptr); 12639 } 12640 12641 template <typename Derived> 12642 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12643 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 12644 TypeSourceInfo **RecoveryTSI) { 12645 assert(E->getQualifierLoc()); 12646 NestedNameSpecifierLoc QualifierLoc = 12647 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12648 if (!QualifierLoc) 12649 return ExprError(); 12650 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12651 12652 // TODO: If this is a conversion-function-id, verify that the 12653 // destination type name (if present) resolves the same way after 12654 // instantiation as it did in the local scope. 12655 12656 DeclarationNameInfo NameInfo = 12657 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12658 if (!NameInfo.getName()) 12659 return ExprError(); 12660 12661 if (!E->hasExplicitTemplateArgs()) { 12662 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 12663 // Note: it is sufficient to compare the Name component of NameInfo: 12664 // if name has not changed, DNLoc has not changed either. 12665 NameInfo.getName() == E->getDeclName()) 12666 return E; 12667 12668 return getDerived().RebuildDependentScopeDeclRefExpr( 12669 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12670 IsAddressOfOperand, RecoveryTSI); 12671 } 12672 12673 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12674 if (getDerived().TransformTemplateArguments( 12675 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 12676 return ExprError(); 12677 12678 return getDerived().RebuildDependentScopeDeclRefExpr( 12679 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12680 RecoveryTSI); 12681 } 12682 12683 template<typename Derived> 12684 ExprResult 12685 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12686 // CXXConstructExprs other than for list-initialization and 12687 // CXXTemporaryObjectExpr are always implicit, so when we have 12688 // a 1-argument construction we just transform that argument. 12689 if (getDerived().AllowSkippingCXXConstructExpr() && 12690 ((E->getNumArgs() == 1 || 12691 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12692 (!getDerived().DropCallArgument(E->getArg(0))) && 12693 !E->isListInitialization())) 12694 return getDerived().TransformInitializer(E->getArg(0), 12695 /*DirectInit*/ false); 12696 12697 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12698 12699 QualType T = getDerived().TransformType(E->getType()); 12700 if (T.isNull()) 12701 return ExprError(); 12702 12703 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12704 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12705 if (!Constructor) 12706 return ExprError(); 12707 12708 bool ArgumentChanged = false; 12709 SmallVector<Expr*, 8> Args; 12710 { 12711 EnterExpressionEvaluationContext Context( 12712 getSema(), EnterExpressionEvaluationContext::InitList, 12713 E->isListInitialization()); 12714 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12715 &ArgumentChanged)) 12716 return ExprError(); 12717 } 12718 12719 if (!getDerived().AlwaysRebuild() && 12720 T == E->getType() && 12721 Constructor == E->getConstructor() && 12722 !ArgumentChanged) { 12723 // Mark the constructor as referenced. 12724 // FIXME: Instantiation-specific 12725 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12726 return E; 12727 } 12728 12729 return getDerived().RebuildCXXConstructExpr( 12730 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12731 E->hadMultipleCandidates(), E->isListInitialization(), 12732 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12733 E->getConstructionKind(), E->getParenOrBraceRange()); 12734 } 12735 12736 template<typename Derived> 12737 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12738 CXXInheritedCtorInitExpr *E) { 12739 QualType T = getDerived().TransformType(E->getType()); 12740 if (T.isNull()) 12741 return ExprError(); 12742 12743 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12744 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12745 if (!Constructor) 12746 return ExprError(); 12747 12748 if (!getDerived().AlwaysRebuild() && 12749 T == E->getType() && 12750 Constructor == E->getConstructor()) { 12751 // Mark the constructor as referenced. 12752 // FIXME: Instantiation-specific 12753 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12754 return E; 12755 } 12756 12757 return getDerived().RebuildCXXInheritedCtorInitExpr( 12758 T, E->getLocation(), Constructor, 12759 E->constructsVBase(), E->inheritedFromVBase()); 12760 } 12761 12762 /// Transform a C++ temporary-binding expression. 12763 /// 12764 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12765 /// transform the subexpression and return that. 12766 template<typename Derived> 12767 ExprResult 12768 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12769 if (auto *Dtor = E->getTemporary()->getDestructor()) 12770 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12771 const_cast<CXXDestructorDecl *>(Dtor)); 12772 return getDerived().TransformExpr(E->getSubExpr()); 12773 } 12774 12775 /// Transform a C++ expression that contains cleanups that should 12776 /// be run after the expression is evaluated. 12777 /// 12778 /// Since ExprWithCleanups nodes are implicitly generated, we 12779 /// just transform the subexpression and return that. 12780 template<typename Derived> 12781 ExprResult 12782 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12783 return getDerived().TransformExpr(E->getSubExpr()); 12784 } 12785 12786 template<typename Derived> 12787 ExprResult 12788 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12789 CXXTemporaryObjectExpr *E) { 12790 TypeSourceInfo *T = 12791 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12792 if (!T) 12793 return ExprError(); 12794 12795 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12796 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12797 if (!Constructor) 12798 return ExprError(); 12799 12800 bool ArgumentChanged = false; 12801 SmallVector<Expr*, 8> Args; 12802 Args.reserve(E->getNumArgs()); 12803 { 12804 EnterExpressionEvaluationContext Context( 12805 getSema(), EnterExpressionEvaluationContext::InitList, 12806 E->isListInitialization()); 12807 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12808 &ArgumentChanged)) 12809 return ExprError(); 12810 } 12811 12812 if (!getDerived().AlwaysRebuild() && 12813 T == E->getTypeSourceInfo() && 12814 Constructor == E->getConstructor() && 12815 !ArgumentChanged) { 12816 // FIXME: Instantiation-specific 12817 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12818 return SemaRef.MaybeBindToTemporary(E); 12819 } 12820 12821 // FIXME: We should just pass E->isListInitialization(), but we're not 12822 // prepared to handle list-initialization without a child InitListExpr. 12823 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12824 return getDerived().RebuildCXXTemporaryObjectExpr( 12825 T, LParenLoc, Args, E->getEndLoc(), 12826 /*ListInitialization=*/LParenLoc.isInvalid()); 12827 } 12828 12829 template<typename Derived> 12830 ExprResult 12831 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12832 // Transform any init-capture expressions before entering the scope of the 12833 // lambda body, because they are not semantically within that scope. 12834 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12835 struct TransformedInitCapture { 12836 // The location of the ... if the result is retaining a pack expansion. 12837 SourceLocation EllipsisLoc; 12838 // Zero or more expansions of the init-capture. 12839 SmallVector<InitCaptureInfoTy, 4> Expansions; 12840 }; 12841 SmallVector<TransformedInitCapture, 4> InitCaptures; 12842 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12843 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12844 CEnd = E->capture_end(); 12845 C != CEnd; ++C) { 12846 if (!E->isInitCapture(C)) 12847 continue; 12848 12849 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12850 VarDecl *OldVD = C->getCapturedVar(); 12851 12852 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12853 Optional<unsigned> NumExpansions) { 12854 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12855 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12856 12857 if (NewExprInitResult.isInvalid()) { 12858 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12859 return; 12860 } 12861 Expr *NewExprInit = NewExprInitResult.get(); 12862 12863 QualType NewInitCaptureType = 12864 getSema().buildLambdaInitCaptureInitialization( 12865 C->getLocation(), OldVD->getType()->isReferenceType(), 12866 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12867 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12868 NewExprInit); 12869 Result.Expansions.push_back( 12870 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12871 }; 12872 12873 // If this is an init-capture pack, consider expanding the pack now. 12874 if (OldVD->isParameterPack()) { 12875 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12876 ->getTypeLoc() 12877 .castAs<PackExpansionTypeLoc>(); 12878 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12879 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12880 12881 // Determine whether the set of unexpanded parameter packs can and should 12882 // be expanded. 12883 bool Expand = true; 12884 bool RetainExpansion = false; 12885 Optional<unsigned> OrigNumExpansions = 12886 ExpansionTL.getTypePtr()->getNumExpansions(); 12887 Optional<unsigned> NumExpansions = OrigNumExpansions; 12888 if (getDerived().TryExpandParameterPacks( 12889 ExpansionTL.getEllipsisLoc(), 12890 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12891 RetainExpansion, NumExpansions)) 12892 return ExprError(); 12893 if (Expand) { 12894 for (unsigned I = 0; I != *NumExpansions; ++I) { 12895 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12896 SubstInitCapture(SourceLocation(), None); 12897 } 12898 } 12899 if (!Expand || RetainExpansion) { 12900 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12901 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12902 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12903 } 12904 } else { 12905 SubstInitCapture(SourceLocation(), None); 12906 } 12907 } 12908 12909 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12910 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12911 12912 // Transform the template parameters, and add them to the current 12913 // instantiation scope. The null case is handled correctly. 12914 auto TPL = getDerived().TransformTemplateParameterList( 12915 E->getTemplateParameterList()); 12916 LSI->GLTemplateParameterList = TPL; 12917 12918 // Transform the type of the original lambda's call operator. 12919 // The transformation MUST be done in the CurrentInstantiationScope since 12920 // it introduces a mapping of the original to the newly created 12921 // transformed parameters. 12922 TypeSourceInfo *NewCallOpTSI = nullptr; 12923 { 12924 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12925 FunctionProtoTypeLoc OldCallOpFPTL = 12926 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12927 12928 TypeLocBuilder NewCallOpTLBuilder; 12929 SmallVector<QualType, 4> ExceptionStorage; 12930 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12931 QualType NewCallOpType = TransformFunctionProtoType( 12932 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12933 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12934 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12935 ExceptionStorage, Changed); 12936 }); 12937 if (NewCallOpType.isNull()) 12938 return ExprError(); 12939 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12940 NewCallOpType); 12941 } 12942 12943 // Transform the trailing requires clause 12944 ExprResult NewTrailingRequiresClause; 12945 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12946 // FIXME: Concepts: Substitution into requires clause should only happen 12947 // when checking satisfaction. 12948 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12949 12950 // Create the local class that will describe the lambda. 12951 // FIXME: KnownDependent below is wrong when substituting inside a templated 12952 // context that isn't a DeclContext (such as a variable template). 12953 CXXRecordDecl *OldClass = E->getLambdaClass(); 12954 CXXRecordDecl *Class 12955 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12956 NewCallOpTSI, 12957 /*KnownDependent=*/false, 12958 E->getCaptureDefault()); 12959 getDerived().transformedLocalDecl(OldClass, {Class}); 12960 12961 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12962 if (getDerived().ReplacingOriginal()) 12963 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12964 OldClass->getLambdaManglingNumber(), 12965 OldClass->getDeviceLambdaManglingNumber(), 12966 OldClass->getLambdaContextDecl()); 12967 12968 // Build the call operator. 12969 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12970 Class, E->getIntroducerRange(), NewCallOpTSI, 12971 E->getCallOperator()->getEndLoc(), 12972 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12973 E->getCallOperator()->getConstexprKind(), 12974 NewTrailingRequiresClause.get()); 12975 12976 LSI->CallOperator = NewCallOperator; 12977 12978 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12979 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12980 12981 // Number the lambda for linkage purposes if necessary. 12982 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12983 12984 // Introduce the context of the call operator. 12985 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12986 /*NewThisContext*/false); 12987 12988 // Enter the scope of the lambda. 12989 getSema().buildLambdaScope(LSI, NewCallOperator, 12990 E->getIntroducerRange(), 12991 E->getCaptureDefault(), 12992 E->getCaptureDefaultLoc(), 12993 E->hasExplicitParameters(), 12994 E->hasExplicitResultType(), 12995 E->isMutable()); 12996 12997 bool Invalid = false; 12998 12999 // Transform captures. 13000 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13001 CEnd = E->capture_end(); 13002 C != CEnd; ++C) { 13003 // When we hit the first implicit capture, tell Sema that we've finished 13004 // the list of explicit captures. 13005 if (C->isImplicit()) 13006 break; 13007 13008 // Capturing 'this' is trivial. 13009 if (C->capturesThis()) { 13010 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13011 /*BuildAndDiagnose*/ true, nullptr, 13012 C->getCaptureKind() == LCK_StarThis); 13013 continue; 13014 } 13015 // Captured expression will be recaptured during captured variables 13016 // rebuilding. 13017 if (C->capturesVLAType()) 13018 continue; 13019 13020 // Rebuild init-captures, including the implied field declaration. 13021 if (E->isInitCapture(C)) { 13022 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 13023 13024 VarDecl *OldVD = C->getCapturedVar(); 13025 llvm::SmallVector<Decl*, 4> NewVDs; 13026 13027 for (InitCaptureInfoTy &Info : NewC.Expansions) { 13028 ExprResult Init = Info.first; 13029 QualType InitQualType = Info.second; 13030 if (Init.isInvalid() || InitQualType.isNull()) { 13031 Invalid = true; 13032 break; 13033 } 13034 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 13035 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 13036 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 13037 if (!NewVD) { 13038 Invalid = true; 13039 break; 13040 } 13041 NewVDs.push_back(NewVD); 13042 getSema().addInitCapture(LSI, NewVD); 13043 } 13044 13045 if (Invalid) 13046 break; 13047 13048 getDerived().transformedLocalDecl(OldVD, NewVDs); 13049 continue; 13050 } 13051 13052 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13053 13054 // Determine the capture kind for Sema. 13055 Sema::TryCaptureKind Kind 13056 = C->isImplicit()? Sema::TryCapture_Implicit 13057 : C->getCaptureKind() == LCK_ByCopy 13058 ? Sema::TryCapture_ExplicitByVal 13059 : Sema::TryCapture_ExplicitByRef; 13060 SourceLocation EllipsisLoc; 13061 if (C->isPackExpansion()) { 13062 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 13063 bool ShouldExpand = false; 13064 bool RetainExpansion = false; 13065 Optional<unsigned> NumExpansions; 13066 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 13067 C->getLocation(), 13068 Unexpanded, 13069 ShouldExpand, RetainExpansion, 13070 NumExpansions)) { 13071 Invalid = true; 13072 continue; 13073 } 13074 13075 if (ShouldExpand) { 13076 // The transform has determined that we should perform an expansion; 13077 // transform and capture each of the arguments. 13078 // expansion of the pattern. Do so. 13079 VarDecl *Pack = C->getCapturedVar(); 13080 for (unsigned I = 0; I != *NumExpansions; ++I) { 13081 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13082 VarDecl *CapturedVar 13083 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13084 Pack)); 13085 if (!CapturedVar) { 13086 Invalid = true; 13087 continue; 13088 } 13089 13090 // Capture the transformed variable. 13091 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13092 } 13093 13094 // FIXME: Retain a pack expansion if RetainExpansion is true. 13095 13096 continue; 13097 } 13098 13099 EllipsisLoc = C->getEllipsisLoc(); 13100 } 13101 13102 // Transform the captured variable. 13103 VarDecl *CapturedVar 13104 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13105 C->getCapturedVar())); 13106 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13107 Invalid = true; 13108 continue; 13109 } 13110 13111 // Capture the transformed variable. 13112 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13113 EllipsisLoc); 13114 } 13115 getSema().finishLambdaExplicitCaptures(LSI); 13116 13117 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13118 // evaluation context even if we're not transforming the function body. 13119 getSema().PushExpressionEvaluationContext( 13120 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13121 13122 // Instantiate the body of the lambda expression. 13123 StmtResult Body = 13124 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13125 13126 // ActOnLambda* will pop the function scope for us. 13127 FuncScopeCleanup.disable(); 13128 13129 if (Body.isInvalid()) { 13130 SavedContext.pop(); 13131 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13132 /*IsInstantiation=*/true); 13133 return ExprError(); 13134 } 13135 13136 // Copy the LSI before ActOnFinishFunctionBody removes it. 13137 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13138 // the call operator. 13139 auto LSICopy = *LSI; 13140 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13141 /*IsInstantiation*/ true); 13142 SavedContext.pop(); 13143 13144 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13145 &LSICopy); 13146 } 13147 13148 template<typename Derived> 13149 StmtResult 13150 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13151 return TransformStmt(S); 13152 } 13153 13154 template<typename Derived> 13155 StmtResult 13156 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13157 // Transform captures. 13158 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13159 CEnd = E->capture_end(); 13160 C != CEnd; ++C) { 13161 // When we hit the first implicit capture, tell Sema that we've finished 13162 // the list of explicit captures. 13163 if (!C->isImplicit()) 13164 continue; 13165 13166 // Capturing 'this' is trivial. 13167 if (C->capturesThis()) { 13168 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13169 /*BuildAndDiagnose*/ true, nullptr, 13170 C->getCaptureKind() == LCK_StarThis); 13171 continue; 13172 } 13173 // Captured expression will be recaptured during captured variables 13174 // rebuilding. 13175 if (C->capturesVLAType()) 13176 continue; 13177 13178 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13179 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13180 13181 // Transform the captured variable. 13182 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13183 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13184 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13185 return StmtError(); 13186 13187 // Capture the transformed variable. 13188 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13189 } 13190 13191 return S; 13192 } 13193 13194 template<typename Derived> 13195 ExprResult 13196 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13197 CXXUnresolvedConstructExpr *E) { 13198 TypeSourceInfo *T = 13199 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13200 if (!T) 13201 return ExprError(); 13202 13203 bool ArgumentChanged = false; 13204 SmallVector<Expr*, 8> Args; 13205 Args.reserve(E->getNumArgs()); 13206 { 13207 EnterExpressionEvaluationContext Context( 13208 getSema(), EnterExpressionEvaluationContext::InitList, 13209 E->isListInitialization()); 13210 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13211 &ArgumentChanged)) 13212 return ExprError(); 13213 } 13214 13215 if (!getDerived().AlwaysRebuild() && 13216 T == E->getTypeSourceInfo() && 13217 !ArgumentChanged) 13218 return E; 13219 13220 // FIXME: we're faking the locations of the commas 13221 return getDerived().RebuildCXXUnresolvedConstructExpr( 13222 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13223 } 13224 13225 template<typename Derived> 13226 ExprResult 13227 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13228 CXXDependentScopeMemberExpr *E) { 13229 // Transform the base of the expression. 13230 ExprResult Base((Expr*) nullptr); 13231 Expr *OldBase; 13232 QualType BaseType; 13233 QualType ObjectType; 13234 if (!E->isImplicitAccess()) { 13235 OldBase = E->getBase(); 13236 Base = getDerived().TransformExpr(OldBase); 13237 if (Base.isInvalid()) 13238 return ExprError(); 13239 13240 // Start the member reference and compute the object's type. 13241 ParsedType ObjectTy; 13242 bool MayBePseudoDestructor = false; 13243 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13244 E->getOperatorLoc(), 13245 E->isArrow()? tok::arrow : tok::period, 13246 ObjectTy, 13247 MayBePseudoDestructor); 13248 if (Base.isInvalid()) 13249 return ExprError(); 13250 13251 ObjectType = ObjectTy.get(); 13252 BaseType = ((Expr*) Base.get())->getType(); 13253 } else { 13254 OldBase = nullptr; 13255 BaseType = getDerived().TransformType(E->getBaseType()); 13256 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13257 } 13258 13259 // Transform the first part of the nested-name-specifier that qualifies 13260 // the member name. 13261 NamedDecl *FirstQualifierInScope 13262 = getDerived().TransformFirstQualifierInScope( 13263 E->getFirstQualifierFoundInScope(), 13264 E->getQualifierLoc().getBeginLoc()); 13265 13266 NestedNameSpecifierLoc QualifierLoc; 13267 if (E->getQualifier()) { 13268 QualifierLoc 13269 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13270 ObjectType, 13271 FirstQualifierInScope); 13272 if (!QualifierLoc) 13273 return ExprError(); 13274 } 13275 13276 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13277 13278 // TODO: If this is a conversion-function-id, verify that the 13279 // destination type name (if present) resolves the same way after 13280 // instantiation as it did in the local scope. 13281 13282 DeclarationNameInfo NameInfo 13283 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13284 if (!NameInfo.getName()) 13285 return ExprError(); 13286 13287 if (!E->hasExplicitTemplateArgs()) { 13288 // This is a reference to a member without an explicitly-specified 13289 // template argument list. Optimize for this common case. 13290 if (!getDerived().AlwaysRebuild() && 13291 Base.get() == OldBase && 13292 BaseType == E->getBaseType() && 13293 QualifierLoc == E->getQualifierLoc() && 13294 NameInfo.getName() == E->getMember() && 13295 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13296 return E; 13297 13298 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13299 BaseType, 13300 E->isArrow(), 13301 E->getOperatorLoc(), 13302 QualifierLoc, 13303 TemplateKWLoc, 13304 FirstQualifierInScope, 13305 NameInfo, 13306 /*TemplateArgs*/nullptr); 13307 } 13308 13309 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13310 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13311 E->getNumTemplateArgs(), 13312 TransArgs)) 13313 return ExprError(); 13314 13315 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13316 BaseType, 13317 E->isArrow(), 13318 E->getOperatorLoc(), 13319 QualifierLoc, 13320 TemplateKWLoc, 13321 FirstQualifierInScope, 13322 NameInfo, 13323 &TransArgs); 13324 } 13325 13326 template <typename Derived> 13327 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13328 UnresolvedMemberExpr *Old) { 13329 // Transform the base of the expression. 13330 ExprResult Base((Expr *)nullptr); 13331 QualType BaseType; 13332 if (!Old->isImplicitAccess()) { 13333 Base = getDerived().TransformExpr(Old->getBase()); 13334 if (Base.isInvalid()) 13335 return ExprError(); 13336 Base = 13337 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13338 if (Base.isInvalid()) 13339 return ExprError(); 13340 BaseType = Base.get()->getType(); 13341 } else { 13342 BaseType = getDerived().TransformType(Old->getBaseType()); 13343 } 13344 13345 NestedNameSpecifierLoc QualifierLoc; 13346 if (Old->getQualifierLoc()) { 13347 QualifierLoc = 13348 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13349 if (!QualifierLoc) 13350 return ExprError(); 13351 } 13352 13353 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13354 13355 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13356 13357 // Transform the declaration set. 13358 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13359 return ExprError(); 13360 13361 // Determine the naming class. 13362 if (Old->getNamingClass()) { 13363 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13364 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13365 if (!NamingClass) 13366 return ExprError(); 13367 13368 R.setNamingClass(NamingClass); 13369 } 13370 13371 TemplateArgumentListInfo TransArgs; 13372 if (Old->hasExplicitTemplateArgs()) { 13373 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13374 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13375 if (getDerived().TransformTemplateArguments( 13376 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13377 return ExprError(); 13378 } 13379 13380 // FIXME: to do this check properly, we will need to preserve the 13381 // first-qualifier-in-scope here, just in case we had a dependent 13382 // base (and therefore couldn't do the check) and a 13383 // nested-name-qualifier (and therefore could do the lookup). 13384 NamedDecl *FirstQualifierInScope = nullptr; 13385 13386 return getDerived().RebuildUnresolvedMemberExpr( 13387 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13388 TemplateKWLoc, FirstQualifierInScope, R, 13389 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13390 } 13391 13392 template<typename Derived> 13393 ExprResult 13394 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13395 EnterExpressionEvaluationContext Unevaluated( 13396 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13397 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13398 if (SubExpr.isInvalid()) 13399 return ExprError(); 13400 13401 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13402 return E; 13403 13404 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13405 } 13406 13407 template<typename Derived> 13408 ExprResult 13409 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13410 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13411 if (Pattern.isInvalid()) 13412 return ExprError(); 13413 13414 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13415 return E; 13416 13417 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13418 E->getNumExpansions()); 13419 } 13420 13421 template<typename Derived> 13422 ExprResult 13423 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13424 // If E is not value-dependent, then nothing will change when we transform it. 13425 // Note: This is an instantiation-centric view. 13426 if (!E->isValueDependent()) 13427 return E; 13428 13429 EnterExpressionEvaluationContext Unevaluated( 13430 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13431 13432 ArrayRef<TemplateArgument> PackArgs; 13433 TemplateArgument ArgStorage; 13434 13435 // Find the argument list to transform. 13436 if (E->isPartiallySubstituted()) { 13437 PackArgs = E->getPartialArguments(); 13438 } else if (E->isValueDependent()) { 13439 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13440 bool ShouldExpand = false; 13441 bool RetainExpansion = false; 13442 Optional<unsigned> NumExpansions; 13443 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13444 Unexpanded, 13445 ShouldExpand, RetainExpansion, 13446 NumExpansions)) 13447 return ExprError(); 13448 13449 // If we need to expand the pack, build a template argument from it and 13450 // expand that. 13451 if (ShouldExpand) { 13452 auto *Pack = E->getPack(); 13453 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13454 ArgStorage = getSema().Context.getPackExpansionType( 13455 getSema().Context.getTypeDeclType(TTPD), None); 13456 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13457 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13458 } else { 13459 auto *VD = cast<ValueDecl>(Pack); 13460 ExprResult DRE = getSema().BuildDeclRefExpr( 13461 VD, VD->getType().getNonLValueExprType(getSema().Context), 13462 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 13463 E->getPackLoc()); 13464 if (DRE.isInvalid()) 13465 return ExprError(); 13466 ArgStorage = new (getSema().Context) PackExpansionExpr( 13467 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13468 } 13469 PackArgs = ArgStorage; 13470 } 13471 } 13472 13473 // If we're not expanding the pack, just transform the decl. 13474 if (!PackArgs.size()) { 13475 auto *Pack = cast_or_null<NamedDecl>( 13476 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13477 if (!Pack) 13478 return ExprError(); 13479 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13480 E->getPackLoc(), 13481 E->getRParenLoc(), None, None); 13482 } 13483 13484 // Try to compute the result without performing a partial substitution. 13485 Optional<unsigned> Result = 0; 13486 for (const TemplateArgument &Arg : PackArgs) { 13487 if (!Arg.isPackExpansion()) { 13488 Result = *Result + 1; 13489 continue; 13490 } 13491 13492 TemplateArgumentLoc ArgLoc; 13493 InventTemplateArgumentLoc(Arg, ArgLoc); 13494 13495 // Find the pattern of the pack expansion. 13496 SourceLocation Ellipsis; 13497 Optional<unsigned> OrigNumExpansions; 13498 TemplateArgumentLoc Pattern = 13499 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13500 OrigNumExpansions); 13501 13502 // Substitute under the pack expansion. Do not expand the pack (yet). 13503 TemplateArgumentLoc OutPattern; 13504 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13505 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13506 /*Uneval*/ true)) 13507 return true; 13508 13509 // See if we can determine the number of arguments from the result. 13510 Optional<unsigned> NumExpansions = 13511 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13512 if (!NumExpansions) { 13513 // No: we must be in an alias template expansion, and we're going to need 13514 // to actually expand the packs. 13515 Result = None; 13516 break; 13517 } 13518 13519 Result = *Result + *NumExpansions; 13520 } 13521 13522 // Common case: we could determine the number of expansions without 13523 // substituting. 13524 if (Result) 13525 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13526 E->getPackLoc(), 13527 E->getRParenLoc(), *Result, None); 13528 13529 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13530 E->getPackLoc()); 13531 { 13532 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13533 typedef TemplateArgumentLocInventIterator< 13534 Derived, const TemplateArgument*> PackLocIterator; 13535 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13536 PackLocIterator(*this, PackArgs.end()), 13537 TransformedPackArgs, /*Uneval*/true)) 13538 return ExprError(); 13539 } 13540 13541 // Check whether we managed to fully-expand the pack. 13542 // FIXME: Is it possible for us to do so and not hit the early exit path? 13543 SmallVector<TemplateArgument, 8> Args; 13544 bool PartialSubstitution = false; 13545 for (auto &Loc : TransformedPackArgs.arguments()) { 13546 Args.push_back(Loc.getArgument()); 13547 if (Loc.getArgument().isPackExpansion()) 13548 PartialSubstitution = true; 13549 } 13550 13551 if (PartialSubstitution) 13552 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13553 E->getPackLoc(), 13554 E->getRParenLoc(), None, Args); 13555 13556 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13557 E->getPackLoc(), E->getRParenLoc(), 13558 Args.size(), None); 13559 } 13560 13561 template<typename Derived> 13562 ExprResult 13563 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13564 SubstNonTypeTemplateParmPackExpr *E) { 13565 // Default behavior is to do nothing with this transformation. 13566 return E; 13567 } 13568 13569 template<typename Derived> 13570 ExprResult 13571 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13572 SubstNonTypeTemplateParmExpr *E) { 13573 // Default behavior is to do nothing with this transformation. 13574 return E; 13575 } 13576 13577 template<typename Derived> 13578 ExprResult 13579 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13580 // Default behavior is to do nothing with this transformation. 13581 return E; 13582 } 13583 13584 template<typename Derived> 13585 ExprResult 13586 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13587 MaterializeTemporaryExpr *E) { 13588 return getDerived().TransformExpr(E->getSubExpr()); 13589 } 13590 13591 template<typename Derived> 13592 ExprResult 13593 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13594 UnresolvedLookupExpr *Callee = nullptr; 13595 if (Expr *OldCallee = E->getCallee()) { 13596 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13597 if (CalleeResult.isInvalid()) 13598 return ExprError(); 13599 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13600 } 13601 13602 Expr *Pattern = E->getPattern(); 13603 13604 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13605 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13606 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13607 13608 // Determine whether the set of unexpanded parameter packs can and should 13609 // be expanded. 13610 bool Expand = true; 13611 bool RetainExpansion = false; 13612 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13613 NumExpansions = OrigNumExpansions; 13614 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13615 Pattern->getSourceRange(), 13616 Unexpanded, 13617 Expand, RetainExpansion, 13618 NumExpansions)) 13619 return true; 13620 13621 if (!Expand) { 13622 // Do not expand any packs here, just transform and rebuild a fold 13623 // expression. 13624 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13625 13626 ExprResult LHS = 13627 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13628 if (LHS.isInvalid()) 13629 return true; 13630 13631 ExprResult RHS = 13632 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13633 if (RHS.isInvalid()) 13634 return true; 13635 13636 if (!getDerived().AlwaysRebuild() && 13637 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13638 return E; 13639 13640 return getDerived().RebuildCXXFoldExpr( 13641 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13642 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13643 } 13644 13645 // Formally a fold expression expands to nested parenthesized expressions. 13646 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13647 // them. 13648 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13649 SemaRef.Diag(E->getEllipsisLoc(), 13650 clang::diag::err_fold_expression_limit_exceeded) 13651 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13652 << E->getSourceRange(); 13653 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13654 return ExprError(); 13655 } 13656 13657 // The transform has determined that we should perform an elementwise 13658 // expansion of the pattern. Do so. 13659 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13660 if (Result.isInvalid()) 13661 return true; 13662 bool LeftFold = E->isLeftFold(); 13663 13664 // If we're retaining an expansion for a right fold, it is the innermost 13665 // component and takes the init (if any). 13666 if (!LeftFold && RetainExpansion) { 13667 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13668 13669 ExprResult Out = getDerived().TransformExpr(Pattern); 13670 if (Out.isInvalid()) 13671 return true; 13672 13673 Result = getDerived().RebuildCXXFoldExpr( 13674 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13675 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13676 if (Result.isInvalid()) 13677 return true; 13678 } 13679 13680 for (unsigned I = 0; I != *NumExpansions; ++I) { 13681 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13682 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13683 ExprResult Out = getDerived().TransformExpr(Pattern); 13684 if (Out.isInvalid()) 13685 return true; 13686 13687 if (Out.get()->containsUnexpandedParameterPack()) { 13688 // We still have a pack; retain a pack expansion for this slice. 13689 Result = getDerived().RebuildCXXFoldExpr( 13690 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13691 E->getOperator(), E->getEllipsisLoc(), 13692 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13693 OrigNumExpansions); 13694 } else if (Result.isUsable()) { 13695 // We've got down to a single element; build a binary operator. 13696 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13697 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13698 if (Callee) 13699 Result = getDerived().RebuildCXXOperatorCallExpr( 13700 BinaryOperator::getOverloadedOperator(E->getOperator()), 13701 E->getEllipsisLoc(), Callee, LHS, RHS); 13702 else 13703 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13704 E->getOperator(), LHS, RHS); 13705 } else 13706 Result = Out; 13707 13708 if (Result.isInvalid()) 13709 return true; 13710 } 13711 13712 // If we're retaining an expansion for a left fold, it is the outermost 13713 // component and takes the complete expansion so far as its init (if any). 13714 if (LeftFold && RetainExpansion) { 13715 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13716 13717 ExprResult Out = getDerived().TransformExpr(Pattern); 13718 if (Out.isInvalid()) 13719 return true; 13720 13721 Result = getDerived().RebuildCXXFoldExpr( 13722 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13723 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13724 if (Result.isInvalid()) 13725 return true; 13726 } 13727 13728 // If we had no init and an empty pack, and we're not retaining an expansion, 13729 // then produce a fallback value or error. 13730 if (Result.isUnset()) 13731 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13732 E->getOperator()); 13733 13734 return Result; 13735 } 13736 13737 template<typename Derived> 13738 ExprResult 13739 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13740 CXXStdInitializerListExpr *E) { 13741 return getDerived().TransformExpr(E->getSubExpr()); 13742 } 13743 13744 template<typename Derived> 13745 ExprResult 13746 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13747 return SemaRef.MaybeBindToTemporary(E); 13748 } 13749 13750 template<typename Derived> 13751 ExprResult 13752 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13753 return E; 13754 } 13755 13756 template<typename Derived> 13757 ExprResult 13758 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13759 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13760 if (SubExpr.isInvalid()) 13761 return ExprError(); 13762 13763 if (!getDerived().AlwaysRebuild() && 13764 SubExpr.get() == E->getSubExpr()) 13765 return E; 13766 13767 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13768 } 13769 13770 template<typename Derived> 13771 ExprResult 13772 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13773 // Transform each of the elements. 13774 SmallVector<Expr *, 8> Elements; 13775 bool ArgChanged = false; 13776 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13777 /*IsCall=*/false, Elements, &ArgChanged)) 13778 return ExprError(); 13779 13780 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13781 return SemaRef.MaybeBindToTemporary(E); 13782 13783 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13784 Elements.data(), 13785 Elements.size()); 13786 } 13787 13788 template<typename Derived> 13789 ExprResult 13790 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13791 ObjCDictionaryLiteral *E) { 13792 // Transform each of the elements. 13793 SmallVector<ObjCDictionaryElement, 8> Elements; 13794 bool ArgChanged = false; 13795 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13796 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13797 13798 if (OrigElement.isPackExpansion()) { 13799 // This key/value element is a pack expansion. 13800 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13801 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13802 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13803 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13804 13805 // Determine whether the set of unexpanded parameter packs can 13806 // and should be expanded. 13807 bool Expand = true; 13808 bool RetainExpansion = false; 13809 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13810 Optional<unsigned> NumExpansions = OrigNumExpansions; 13811 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13812 OrigElement.Value->getEndLoc()); 13813 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13814 PatternRange, Unexpanded, Expand, 13815 RetainExpansion, NumExpansions)) 13816 return ExprError(); 13817 13818 if (!Expand) { 13819 // The transform has determined that we should perform a simple 13820 // transformation on the pack expansion, producing another pack 13821 // expansion. 13822 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13823 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13824 if (Key.isInvalid()) 13825 return ExprError(); 13826 13827 if (Key.get() != OrigElement.Key) 13828 ArgChanged = true; 13829 13830 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13831 if (Value.isInvalid()) 13832 return ExprError(); 13833 13834 if (Value.get() != OrigElement.Value) 13835 ArgChanged = true; 13836 13837 ObjCDictionaryElement Expansion = { 13838 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13839 }; 13840 Elements.push_back(Expansion); 13841 continue; 13842 } 13843 13844 // Record right away that the argument was changed. This needs 13845 // to happen even if the array expands to nothing. 13846 ArgChanged = true; 13847 13848 // The transform has determined that we should perform an elementwise 13849 // expansion of the pattern. Do so. 13850 for (unsigned I = 0; I != *NumExpansions; ++I) { 13851 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13852 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13853 if (Key.isInvalid()) 13854 return ExprError(); 13855 13856 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13857 if (Value.isInvalid()) 13858 return ExprError(); 13859 13860 ObjCDictionaryElement Element = { 13861 Key.get(), Value.get(), SourceLocation(), NumExpansions 13862 }; 13863 13864 // If any unexpanded parameter packs remain, we still have a 13865 // pack expansion. 13866 // FIXME: Can this really happen? 13867 if (Key.get()->containsUnexpandedParameterPack() || 13868 Value.get()->containsUnexpandedParameterPack()) 13869 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13870 13871 Elements.push_back(Element); 13872 } 13873 13874 // FIXME: Retain a pack expansion if RetainExpansion is true. 13875 13876 // We've finished with this pack expansion. 13877 continue; 13878 } 13879 13880 // Transform and check key. 13881 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13882 if (Key.isInvalid()) 13883 return ExprError(); 13884 13885 if (Key.get() != OrigElement.Key) 13886 ArgChanged = true; 13887 13888 // Transform and check value. 13889 ExprResult Value 13890 = getDerived().TransformExpr(OrigElement.Value); 13891 if (Value.isInvalid()) 13892 return ExprError(); 13893 13894 if (Value.get() != OrigElement.Value) 13895 ArgChanged = true; 13896 13897 ObjCDictionaryElement Element = { 13898 Key.get(), Value.get(), SourceLocation(), None 13899 }; 13900 Elements.push_back(Element); 13901 } 13902 13903 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13904 return SemaRef.MaybeBindToTemporary(E); 13905 13906 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13907 Elements); 13908 } 13909 13910 template<typename Derived> 13911 ExprResult 13912 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13913 TypeSourceInfo *EncodedTypeInfo 13914 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13915 if (!EncodedTypeInfo) 13916 return ExprError(); 13917 13918 if (!getDerived().AlwaysRebuild() && 13919 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13920 return E; 13921 13922 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13923 EncodedTypeInfo, 13924 E->getRParenLoc()); 13925 } 13926 13927 template<typename Derived> 13928 ExprResult TreeTransform<Derived>:: 13929 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13930 // This is a kind of implicit conversion, and it needs to get dropped 13931 // and recomputed for the same general reasons that ImplicitCastExprs 13932 // do, as well a more specific one: this expression is only valid when 13933 // it appears *immediately* as an argument expression. 13934 return getDerived().TransformExpr(E->getSubExpr()); 13935 } 13936 13937 template<typename Derived> 13938 ExprResult TreeTransform<Derived>:: 13939 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13940 TypeSourceInfo *TSInfo 13941 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13942 if (!TSInfo) 13943 return ExprError(); 13944 13945 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13946 if (Result.isInvalid()) 13947 return ExprError(); 13948 13949 if (!getDerived().AlwaysRebuild() && 13950 TSInfo == E->getTypeInfoAsWritten() && 13951 Result.get() == E->getSubExpr()) 13952 return E; 13953 13954 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13955 E->getBridgeKeywordLoc(), TSInfo, 13956 Result.get()); 13957 } 13958 13959 template <typename Derived> 13960 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13961 ObjCAvailabilityCheckExpr *E) { 13962 return E; 13963 } 13964 13965 template<typename Derived> 13966 ExprResult 13967 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13968 // Transform arguments. 13969 bool ArgChanged = false; 13970 SmallVector<Expr*, 8> Args; 13971 Args.reserve(E->getNumArgs()); 13972 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13973 &ArgChanged)) 13974 return ExprError(); 13975 13976 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13977 // Class message: transform the receiver type. 13978 TypeSourceInfo *ReceiverTypeInfo 13979 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13980 if (!ReceiverTypeInfo) 13981 return ExprError(); 13982 13983 // If nothing changed, just retain the existing message send. 13984 if (!getDerived().AlwaysRebuild() && 13985 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13986 return SemaRef.MaybeBindToTemporary(E); 13987 13988 // Build a new class message send. 13989 SmallVector<SourceLocation, 16> SelLocs; 13990 E->getSelectorLocs(SelLocs); 13991 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13992 E->getSelector(), 13993 SelLocs, 13994 E->getMethodDecl(), 13995 E->getLeftLoc(), 13996 Args, 13997 E->getRightLoc()); 13998 } 13999 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 14000 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 14001 if (!E->getMethodDecl()) 14002 return ExprError(); 14003 14004 // Build a new class message send to 'super'. 14005 SmallVector<SourceLocation, 16> SelLocs; 14006 E->getSelectorLocs(SelLocs); 14007 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 14008 E->getSelector(), 14009 SelLocs, 14010 E->getReceiverType(), 14011 E->getMethodDecl(), 14012 E->getLeftLoc(), 14013 Args, 14014 E->getRightLoc()); 14015 } 14016 14017 // Instance message: transform the receiver 14018 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 14019 "Only class and instance messages may be instantiated"); 14020 ExprResult Receiver 14021 = getDerived().TransformExpr(E->getInstanceReceiver()); 14022 if (Receiver.isInvalid()) 14023 return ExprError(); 14024 14025 // If nothing changed, just retain the existing message send. 14026 if (!getDerived().AlwaysRebuild() && 14027 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 14028 return SemaRef.MaybeBindToTemporary(E); 14029 14030 // Build a new instance message send. 14031 SmallVector<SourceLocation, 16> SelLocs; 14032 E->getSelectorLocs(SelLocs); 14033 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 14034 E->getSelector(), 14035 SelLocs, 14036 E->getMethodDecl(), 14037 E->getLeftLoc(), 14038 Args, 14039 E->getRightLoc()); 14040 } 14041 14042 template<typename Derived> 14043 ExprResult 14044 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 14045 return E; 14046 } 14047 14048 template<typename Derived> 14049 ExprResult 14050 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 14051 return E; 14052 } 14053 14054 template<typename Derived> 14055 ExprResult 14056 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 14057 // Transform the base expression. 14058 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14059 if (Base.isInvalid()) 14060 return ExprError(); 14061 14062 // We don't need to transform the ivar; it will never change. 14063 14064 // If nothing changed, just retain the existing expression. 14065 if (!getDerived().AlwaysRebuild() && 14066 Base.get() == E->getBase()) 14067 return E; 14068 14069 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14070 E->getLocation(), 14071 E->isArrow(), E->isFreeIvar()); 14072 } 14073 14074 template<typename Derived> 14075 ExprResult 14076 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14077 // 'super' and types never change. Property never changes. Just 14078 // retain the existing expression. 14079 if (!E->isObjectReceiver()) 14080 return E; 14081 14082 // Transform the base expression. 14083 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14084 if (Base.isInvalid()) 14085 return ExprError(); 14086 14087 // We don't need to transform the property; it will never change. 14088 14089 // If nothing changed, just retain the existing expression. 14090 if (!getDerived().AlwaysRebuild() && 14091 Base.get() == E->getBase()) 14092 return E; 14093 14094 if (E->isExplicitProperty()) 14095 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14096 E->getExplicitProperty(), 14097 E->getLocation()); 14098 14099 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14100 SemaRef.Context.PseudoObjectTy, 14101 E->getImplicitPropertyGetter(), 14102 E->getImplicitPropertySetter(), 14103 E->getLocation()); 14104 } 14105 14106 template<typename Derived> 14107 ExprResult 14108 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14109 // Transform the base expression. 14110 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14111 if (Base.isInvalid()) 14112 return ExprError(); 14113 14114 // Transform the key expression. 14115 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14116 if (Key.isInvalid()) 14117 return ExprError(); 14118 14119 // If nothing changed, just retain the existing expression. 14120 if (!getDerived().AlwaysRebuild() && 14121 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14122 return E; 14123 14124 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14125 Base.get(), Key.get(), 14126 E->getAtIndexMethodDecl(), 14127 E->setAtIndexMethodDecl()); 14128 } 14129 14130 template<typename Derived> 14131 ExprResult 14132 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14133 // Transform the base expression. 14134 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14135 if (Base.isInvalid()) 14136 return ExprError(); 14137 14138 // If nothing changed, just retain the existing expression. 14139 if (!getDerived().AlwaysRebuild() && 14140 Base.get() == E->getBase()) 14141 return E; 14142 14143 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14144 E->getOpLoc(), 14145 E->isArrow()); 14146 } 14147 14148 template<typename Derived> 14149 ExprResult 14150 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14151 bool ArgumentChanged = false; 14152 SmallVector<Expr*, 8> SubExprs; 14153 SubExprs.reserve(E->getNumSubExprs()); 14154 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14155 SubExprs, &ArgumentChanged)) 14156 return ExprError(); 14157 14158 if (!getDerived().AlwaysRebuild() && 14159 !ArgumentChanged) 14160 return E; 14161 14162 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14163 SubExprs, 14164 E->getRParenLoc()); 14165 } 14166 14167 template<typename Derived> 14168 ExprResult 14169 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14170 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14171 if (SrcExpr.isInvalid()) 14172 return ExprError(); 14173 14174 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14175 if (!Type) 14176 return ExprError(); 14177 14178 if (!getDerived().AlwaysRebuild() && 14179 Type == E->getTypeSourceInfo() && 14180 SrcExpr.get() == E->getSrcExpr()) 14181 return E; 14182 14183 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14184 SrcExpr.get(), Type, 14185 E->getRParenLoc()); 14186 } 14187 14188 template<typename Derived> 14189 ExprResult 14190 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14191 BlockDecl *oldBlock = E->getBlockDecl(); 14192 14193 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14194 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14195 14196 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14197 blockScope->TheDecl->setBlockMissingReturnType( 14198 oldBlock->blockMissingReturnType()); 14199 14200 SmallVector<ParmVarDecl*, 4> params; 14201 SmallVector<QualType, 4> paramTypes; 14202 14203 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14204 14205 // Parameter substitution. 14206 Sema::ExtParameterInfoBuilder extParamInfos; 14207 if (getDerived().TransformFunctionTypeParams( 14208 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14209 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14210 extParamInfos)) { 14211 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14212 return ExprError(); 14213 } 14214 14215 QualType exprResultType = 14216 getDerived().TransformType(exprFunctionType->getReturnType()); 14217 14218 auto epi = exprFunctionType->getExtProtoInfo(); 14219 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14220 14221 QualType functionType = 14222 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14223 blockScope->FunctionType = functionType; 14224 14225 // Set the parameters on the block decl. 14226 if (!params.empty()) 14227 blockScope->TheDecl->setParams(params); 14228 14229 if (!oldBlock->blockMissingReturnType()) { 14230 blockScope->HasImplicitReturnType = false; 14231 blockScope->ReturnType = exprResultType; 14232 } 14233 14234 // Transform the body 14235 StmtResult body = getDerived().TransformStmt(E->getBody()); 14236 if (body.isInvalid()) { 14237 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14238 return ExprError(); 14239 } 14240 14241 #ifndef NDEBUG 14242 // In builds with assertions, make sure that we captured everything we 14243 // captured before. 14244 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14245 for (const auto &I : oldBlock->captures()) { 14246 VarDecl *oldCapture = I.getVariable(); 14247 14248 // Ignore parameter packs. 14249 if (oldCapture->isParameterPack()) 14250 continue; 14251 14252 VarDecl *newCapture = 14253 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14254 oldCapture)); 14255 assert(blockScope->CaptureMap.count(newCapture)); 14256 } 14257 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14258 } 14259 #endif 14260 14261 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14262 /*Scope=*/nullptr); 14263 } 14264 14265 template<typename Derived> 14266 ExprResult 14267 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14268 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14269 if (SrcExpr.isInvalid()) 14270 return ExprError(); 14271 14272 QualType Type = getDerived().TransformType(E->getType()); 14273 14274 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14275 E->getRParenLoc()); 14276 } 14277 14278 template<typename Derived> 14279 ExprResult 14280 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14281 bool ArgumentChanged = false; 14282 SmallVector<Expr*, 8> SubExprs; 14283 SubExprs.reserve(E->getNumSubExprs()); 14284 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14285 SubExprs, &ArgumentChanged)) 14286 return ExprError(); 14287 14288 if (!getDerived().AlwaysRebuild() && 14289 !ArgumentChanged) 14290 return E; 14291 14292 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14293 E->getOp(), E->getRParenLoc()); 14294 } 14295 14296 //===----------------------------------------------------------------------===// 14297 // Type reconstruction 14298 //===----------------------------------------------------------------------===// 14299 14300 template<typename Derived> 14301 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14302 SourceLocation Star) { 14303 return SemaRef.BuildPointerType(PointeeType, Star, 14304 getDerived().getBaseEntity()); 14305 } 14306 14307 template<typename Derived> 14308 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14309 SourceLocation Star) { 14310 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14311 getDerived().getBaseEntity()); 14312 } 14313 14314 template<typename Derived> 14315 QualType 14316 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14317 bool WrittenAsLValue, 14318 SourceLocation Sigil) { 14319 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14320 Sigil, getDerived().getBaseEntity()); 14321 } 14322 14323 template<typename Derived> 14324 QualType 14325 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14326 QualType ClassType, 14327 SourceLocation Sigil) { 14328 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14329 getDerived().getBaseEntity()); 14330 } 14331 14332 template<typename Derived> 14333 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14334 const ObjCTypeParamDecl *Decl, 14335 SourceLocation ProtocolLAngleLoc, 14336 ArrayRef<ObjCProtocolDecl *> Protocols, 14337 ArrayRef<SourceLocation> ProtocolLocs, 14338 SourceLocation ProtocolRAngleLoc) { 14339 return SemaRef.BuildObjCTypeParamType(Decl, 14340 ProtocolLAngleLoc, Protocols, 14341 ProtocolLocs, ProtocolRAngleLoc, 14342 /*FailOnError=*/true); 14343 } 14344 14345 template<typename Derived> 14346 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14347 QualType BaseType, 14348 SourceLocation Loc, 14349 SourceLocation TypeArgsLAngleLoc, 14350 ArrayRef<TypeSourceInfo *> TypeArgs, 14351 SourceLocation TypeArgsRAngleLoc, 14352 SourceLocation ProtocolLAngleLoc, 14353 ArrayRef<ObjCProtocolDecl *> Protocols, 14354 ArrayRef<SourceLocation> ProtocolLocs, 14355 SourceLocation ProtocolRAngleLoc) { 14356 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14357 TypeArgs, TypeArgsRAngleLoc, 14358 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14359 ProtocolRAngleLoc, 14360 /*FailOnError=*/true); 14361 } 14362 14363 template<typename Derived> 14364 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14365 QualType PointeeType, 14366 SourceLocation Star) { 14367 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14368 } 14369 14370 template<typename Derived> 14371 QualType 14372 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14373 ArrayType::ArraySizeModifier SizeMod, 14374 const llvm::APInt *Size, 14375 Expr *SizeExpr, 14376 unsigned IndexTypeQuals, 14377 SourceRange BracketsRange) { 14378 if (SizeExpr || !Size) 14379 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14380 IndexTypeQuals, BracketsRange, 14381 getDerived().getBaseEntity()); 14382 14383 QualType Types[] = { 14384 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14385 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14386 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14387 }; 14388 const unsigned NumTypes = llvm::array_lengthof(Types); 14389 QualType SizeType; 14390 for (unsigned I = 0; I != NumTypes; ++I) 14391 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14392 SizeType = Types[I]; 14393 break; 14394 } 14395 14396 // Note that we can return a VariableArrayType here in the case where 14397 // the element type was a dependent VariableArrayType. 14398 IntegerLiteral *ArraySize 14399 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14400 /*FIXME*/BracketsRange.getBegin()); 14401 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14402 IndexTypeQuals, BracketsRange, 14403 getDerived().getBaseEntity()); 14404 } 14405 14406 template<typename Derived> 14407 QualType 14408 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14409 ArrayType::ArraySizeModifier SizeMod, 14410 const llvm::APInt &Size, 14411 Expr *SizeExpr, 14412 unsigned IndexTypeQuals, 14413 SourceRange BracketsRange) { 14414 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14415 IndexTypeQuals, BracketsRange); 14416 } 14417 14418 template<typename Derived> 14419 QualType 14420 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14421 ArrayType::ArraySizeModifier SizeMod, 14422 unsigned IndexTypeQuals, 14423 SourceRange BracketsRange) { 14424 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14425 IndexTypeQuals, BracketsRange); 14426 } 14427 14428 template<typename Derived> 14429 QualType 14430 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14431 ArrayType::ArraySizeModifier SizeMod, 14432 Expr *SizeExpr, 14433 unsigned IndexTypeQuals, 14434 SourceRange BracketsRange) { 14435 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14436 SizeExpr, 14437 IndexTypeQuals, BracketsRange); 14438 } 14439 14440 template<typename Derived> 14441 QualType 14442 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14443 ArrayType::ArraySizeModifier SizeMod, 14444 Expr *SizeExpr, 14445 unsigned IndexTypeQuals, 14446 SourceRange BracketsRange) { 14447 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14448 SizeExpr, 14449 IndexTypeQuals, BracketsRange); 14450 } 14451 14452 template <typename Derived> 14453 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14454 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14455 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14456 AttributeLoc); 14457 } 14458 14459 template <typename Derived> 14460 QualType 14461 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14462 unsigned NumElements, 14463 VectorType::VectorKind VecKind) { 14464 // FIXME: semantic checking! 14465 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14466 } 14467 14468 template <typename Derived> 14469 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14470 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14471 VectorType::VectorKind VecKind) { 14472 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14473 } 14474 14475 template<typename Derived> 14476 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14477 unsigned NumElements, 14478 SourceLocation AttributeLoc) { 14479 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14480 NumElements, true); 14481 IntegerLiteral *VectorSize 14482 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14483 AttributeLoc); 14484 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14485 } 14486 14487 template<typename Derived> 14488 QualType 14489 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14490 Expr *SizeExpr, 14491 SourceLocation AttributeLoc) { 14492 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14493 } 14494 14495 template <typename Derived> 14496 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14497 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14498 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14499 NumColumns); 14500 } 14501 14502 template <typename Derived> 14503 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14504 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14505 SourceLocation AttributeLoc) { 14506 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14507 AttributeLoc); 14508 } 14509 14510 template<typename Derived> 14511 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14512 QualType T, 14513 MutableArrayRef<QualType> ParamTypes, 14514 const FunctionProtoType::ExtProtoInfo &EPI) { 14515 return SemaRef.BuildFunctionType(T, ParamTypes, 14516 getDerived().getBaseLocation(), 14517 getDerived().getBaseEntity(), 14518 EPI); 14519 } 14520 14521 template<typename Derived> 14522 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14523 return SemaRef.Context.getFunctionNoProtoType(T); 14524 } 14525 14526 template<typename Derived> 14527 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14528 Decl *D) { 14529 assert(D && "no decl found"); 14530 if (D->isInvalidDecl()) return QualType(); 14531 14532 // FIXME: Doesn't account for ObjCInterfaceDecl! 14533 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14534 // A valid resolved using typename pack expansion decl can have multiple 14535 // UsingDecls, but they must each have exactly one type, and it must be 14536 // the same type in every case. But we must have at least one expansion! 14537 if (UPD->expansions().empty()) { 14538 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14539 << UPD->isCXXClassMember() << UPD; 14540 return QualType(); 14541 } 14542 14543 // We might still have some unresolved types. Try to pick a resolved type 14544 // if we can. The final instantiation will check that the remaining 14545 // unresolved types instantiate to the type we pick. 14546 QualType FallbackT; 14547 QualType T; 14548 for (auto *E : UPD->expansions()) { 14549 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14550 if (ThisT.isNull()) 14551 continue; 14552 else if (ThisT->getAs<UnresolvedUsingType>()) 14553 FallbackT = ThisT; 14554 else if (T.isNull()) 14555 T = ThisT; 14556 else 14557 assert(getSema().Context.hasSameType(ThisT, T) && 14558 "mismatched resolved types in using pack expansion"); 14559 } 14560 return T.isNull() ? FallbackT : T; 14561 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14562 assert(Using->hasTypename() && 14563 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14564 14565 // A valid resolved using typename decl points to exactly one type decl. 14566 assert(++Using->shadow_begin() == Using->shadow_end()); 14567 14568 UsingShadowDecl *Shadow = *Using->shadow_begin(); 14569 if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc)) 14570 return QualType(); 14571 return SemaRef.Context.getUsingType( 14572 Shadow, SemaRef.Context.getTypeDeclType( 14573 cast<TypeDecl>(Shadow->getTargetDecl()))); 14574 } else { 14575 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14576 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14577 return SemaRef.Context.getTypeDeclType( 14578 cast<UnresolvedUsingTypenameDecl>(D)); 14579 } 14580 } 14581 14582 template <typename Derived> 14583 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14584 SourceLocation) { 14585 return SemaRef.BuildTypeofExprType(E); 14586 } 14587 14588 template<typename Derived> 14589 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14590 return SemaRef.Context.getTypeOfType(Underlying); 14591 } 14592 14593 template <typename Derived> 14594 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 14595 return SemaRef.BuildDecltypeType(E); 14596 } 14597 14598 template<typename Derived> 14599 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14600 UnaryTransformType::UTTKind UKind, 14601 SourceLocation Loc) { 14602 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14603 } 14604 14605 template<typename Derived> 14606 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14607 TemplateName Template, 14608 SourceLocation TemplateNameLoc, 14609 TemplateArgumentListInfo &TemplateArgs) { 14610 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14611 } 14612 14613 template<typename Derived> 14614 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14615 SourceLocation KWLoc) { 14616 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14617 } 14618 14619 template<typename Derived> 14620 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14621 SourceLocation KWLoc, 14622 bool isReadPipe) { 14623 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14624 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14625 } 14626 14627 template <typename Derived> 14628 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned, 14629 unsigned NumBits, 14630 SourceLocation Loc) { 14631 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14632 NumBits, true); 14633 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14634 SemaRef.Context.IntTy, Loc); 14635 return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc); 14636 } 14637 14638 template <typename Derived> 14639 QualType TreeTransform<Derived>::RebuildDependentBitIntType( 14640 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14641 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc); 14642 } 14643 14644 template<typename Derived> 14645 TemplateName 14646 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14647 bool TemplateKW, 14648 TemplateDecl *Template) { 14649 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14650 Template); 14651 } 14652 14653 template<typename Derived> 14654 TemplateName 14655 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14656 SourceLocation TemplateKWLoc, 14657 const IdentifierInfo &Name, 14658 SourceLocation NameLoc, 14659 QualType ObjectType, 14660 NamedDecl *FirstQualifierInScope, 14661 bool AllowInjectedClassName) { 14662 UnqualifiedId TemplateName; 14663 TemplateName.setIdentifier(&Name, NameLoc); 14664 Sema::TemplateTy Template; 14665 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14666 TemplateName, ParsedType::make(ObjectType), 14667 /*EnteringContext=*/false, Template, 14668 AllowInjectedClassName); 14669 return Template.get(); 14670 } 14671 14672 template<typename Derived> 14673 TemplateName 14674 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14675 SourceLocation TemplateKWLoc, 14676 OverloadedOperatorKind Operator, 14677 SourceLocation NameLoc, 14678 QualType ObjectType, 14679 bool AllowInjectedClassName) { 14680 UnqualifiedId Name; 14681 // FIXME: Bogus location information. 14682 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14683 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14684 Sema::TemplateTy Template; 14685 getSema().ActOnTemplateName( 14686 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14687 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14688 return Template.get(); 14689 } 14690 14691 template<typename Derived> 14692 ExprResult 14693 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14694 SourceLocation OpLoc, 14695 Expr *OrigCallee, 14696 Expr *First, 14697 Expr *Second) { 14698 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14699 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14700 14701 if (First->getObjectKind() == OK_ObjCProperty) { 14702 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14703 if (BinaryOperator::isAssignmentOp(Opc)) 14704 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14705 First, Second); 14706 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14707 if (Result.isInvalid()) 14708 return ExprError(); 14709 First = Result.get(); 14710 } 14711 14712 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14713 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14714 if (Result.isInvalid()) 14715 return ExprError(); 14716 Second = Result.get(); 14717 } 14718 14719 // Determine whether this should be a builtin operation. 14720 if (Op == OO_Subscript) { 14721 if (!First->getType()->isOverloadableType() && 14722 !Second->getType()->isOverloadableType()) 14723 return getSema().CreateBuiltinArraySubscriptExpr( 14724 First, Callee->getBeginLoc(), Second, OpLoc); 14725 } else if (Op == OO_Arrow) { 14726 // -> is never a builtin operation. 14727 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14728 } else if (Second == nullptr || isPostIncDec) { 14729 if (!First->getType()->isOverloadableType() || 14730 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14731 // The argument is not of overloadable type, or this is an expression 14732 // of the form &Class::member, so try to create a built-in unary 14733 // operation. 14734 UnaryOperatorKind Opc 14735 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14736 14737 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14738 } 14739 } else { 14740 if (!First->getType()->isOverloadableType() && 14741 !Second->getType()->isOverloadableType()) { 14742 // Neither of the arguments is an overloadable type, so try to 14743 // create a built-in binary operation. 14744 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14745 ExprResult Result 14746 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14747 if (Result.isInvalid()) 14748 return ExprError(); 14749 14750 return Result; 14751 } 14752 } 14753 14754 // Compute the transformed set of functions (and function templates) to be 14755 // used during overload resolution. 14756 UnresolvedSet<16> Functions; 14757 bool RequiresADL; 14758 14759 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14760 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14761 // If the overload could not be resolved in the template definition 14762 // (because we had a dependent argument), ADL is performed as part of 14763 // template instantiation. 14764 RequiresADL = ULE->requiresADL(); 14765 } else { 14766 // If we've resolved this to a particular non-member function, just call 14767 // that function. If we resolved it to a member function, 14768 // CreateOverloaded* will find that function for us. 14769 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14770 if (!isa<CXXMethodDecl>(ND)) 14771 Functions.addDecl(ND); 14772 RequiresADL = false; 14773 } 14774 14775 // Add any functions found via argument-dependent lookup. 14776 Expr *Args[2] = { First, Second }; 14777 unsigned NumArgs = 1 + (Second != nullptr); 14778 14779 // Create the overloaded operator invocation for unary operators. 14780 if (NumArgs == 1 || isPostIncDec) { 14781 UnaryOperatorKind Opc 14782 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14783 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14784 RequiresADL); 14785 } 14786 14787 if (Op == OO_Subscript) { 14788 SourceLocation LBrace; 14789 SourceLocation RBrace; 14790 14791 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14792 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14793 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14794 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14795 } else { 14796 LBrace = Callee->getBeginLoc(); 14797 RBrace = OpLoc; 14798 } 14799 14800 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14801 First, Second); 14802 } 14803 14804 // Create the overloaded operator invocation for binary operators. 14805 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14806 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14807 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14808 if (Result.isInvalid()) 14809 return ExprError(); 14810 14811 return Result; 14812 } 14813 14814 template<typename Derived> 14815 ExprResult 14816 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14817 SourceLocation OperatorLoc, 14818 bool isArrow, 14819 CXXScopeSpec &SS, 14820 TypeSourceInfo *ScopeType, 14821 SourceLocation CCLoc, 14822 SourceLocation TildeLoc, 14823 PseudoDestructorTypeStorage Destroyed) { 14824 QualType BaseType = Base->getType(); 14825 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14826 (!isArrow && !BaseType->getAs<RecordType>()) || 14827 (isArrow && BaseType->getAs<PointerType>() && 14828 !BaseType->castAs<PointerType>()->getPointeeType() 14829 ->template getAs<RecordType>())){ 14830 // This pseudo-destructor expression is still a pseudo-destructor. 14831 return SemaRef.BuildPseudoDestructorExpr( 14832 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14833 CCLoc, TildeLoc, Destroyed); 14834 } 14835 14836 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14837 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14838 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14839 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14840 NameInfo.setNamedTypeInfo(DestroyedType); 14841 14842 // The scope type is now known to be a valid nested name specifier 14843 // component. Tack it on to the end of the nested name specifier. 14844 if (ScopeType) { 14845 if (!ScopeType->getType()->getAs<TagType>()) { 14846 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14847 diag::err_expected_class_or_namespace) 14848 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14849 return ExprError(); 14850 } 14851 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14852 CCLoc); 14853 } 14854 14855 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14856 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14857 OperatorLoc, isArrow, 14858 SS, TemplateKWLoc, 14859 /*FIXME: FirstQualifier*/ nullptr, 14860 NameInfo, 14861 /*TemplateArgs*/ nullptr, 14862 /*S*/nullptr); 14863 } 14864 14865 template<typename Derived> 14866 StmtResult 14867 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14868 SourceLocation Loc = S->getBeginLoc(); 14869 CapturedDecl *CD = S->getCapturedDecl(); 14870 unsigned NumParams = CD->getNumParams(); 14871 unsigned ContextParamPos = CD->getContextParamPosition(); 14872 SmallVector<Sema::CapturedParamNameType, 4> Params; 14873 for (unsigned I = 0; I < NumParams; ++I) { 14874 if (I != ContextParamPos) { 14875 Params.push_back( 14876 std::make_pair( 14877 CD->getParam(I)->getName(), 14878 getDerived().TransformType(CD->getParam(I)->getType()))); 14879 } else { 14880 Params.push_back(std::make_pair(StringRef(), QualType())); 14881 } 14882 } 14883 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14884 S->getCapturedRegionKind(), Params); 14885 StmtResult Body; 14886 { 14887 Sema::CompoundScopeRAII CompoundScope(getSema()); 14888 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14889 } 14890 14891 if (Body.isInvalid()) { 14892 getSema().ActOnCapturedRegionError(); 14893 return StmtError(); 14894 } 14895 14896 return getSema().ActOnCapturedRegionEnd(Body.get()); 14897 } 14898 14899 } // end namespace clang 14900 14901 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14902