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 usefull 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. Sublcasses 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 typedef type. 937 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 938 return SemaRef.Context.getTypeDeclType(Typedef); 939 } 940 941 /// Build a new MacroDefined type. 942 QualType RebuildMacroQualifiedType(QualType T, 943 const IdentifierInfo *MacroII) { 944 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 945 } 946 947 /// Build a new class/struct/union type. 948 QualType RebuildRecordType(RecordDecl *Record) { 949 return SemaRef.Context.getTypeDeclType(Record); 950 } 951 952 /// Build a new Enum type. 953 QualType RebuildEnumType(EnumDecl *Enum) { 954 return SemaRef.Context.getTypeDeclType(Enum); 955 } 956 957 /// Build a new typeof(expr) type. 958 /// 959 /// By default, performs semantic analysis when building the typeof type. 960 /// Subclasses may override this routine to provide different behavior. 961 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 962 963 /// Build a new typeof(type) type. 964 /// 965 /// By default, builds a new TypeOfType with the given underlying type. 966 QualType RebuildTypeOfType(QualType Underlying); 967 968 /// Build a new unary transform type. 969 QualType RebuildUnaryTransformType(QualType BaseType, 970 UnaryTransformType::UTTKind UKind, 971 SourceLocation Loc); 972 973 /// Build a new C++11 decltype type. 974 /// 975 /// By default, performs semantic analysis when building the decltype type. 976 /// Subclasses may override this routine to provide different behavior. 977 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 978 979 /// Build a new C++11 auto type. 980 /// 981 /// By default, builds a new AutoType with the given deduced type. 982 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 983 ConceptDecl *TypeConstraintConcept, 984 ArrayRef<TemplateArgument> TypeConstraintArgs) { 985 // Note, IsDependent is always false here: we implicitly convert an 'auto' 986 // which has been deduced to a dependent type into an undeduced 'auto', so 987 // that we'll retry deduction after the transformation. 988 return SemaRef.Context.getAutoType(Deduced, Keyword, 989 /*IsDependent*/ false, /*IsPack=*/false, 990 TypeConstraintConcept, 991 TypeConstraintArgs); 992 } 993 994 /// By default, builds a new DeducedTemplateSpecializationType with the given 995 /// deduced type. 996 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 997 QualType Deduced) { 998 return SemaRef.Context.getDeducedTemplateSpecializationType( 999 Template, Deduced, /*IsDependent*/ false); 1000 } 1001 1002 /// Build a new template specialization type. 1003 /// 1004 /// By default, performs semantic analysis when building the template 1005 /// specialization type. Subclasses may override this routine to provide 1006 /// different behavior. 1007 QualType RebuildTemplateSpecializationType(TemplateName Template, 1008 SourceLocation TemplateLoc, 1009 TemplateArgumentListInfo &Args); 1010 1011 /// Build a new parenthesized type. 1012 /// 1013 /// By default, builds a new ParenType type from the inner type. 1014 /// Subclasses may override this routine to provide different behavior. 1015 QualType RebuildParenType(QualType InnerType) { 1016 return SemaRef.BuildParenType(InnerType); 1017 } 1018 1019 /// Build a new qualified name type. 1020 /// 1021 /// By default, builds a new ElaboratedType type from the keyword, 1022 /// the nested-name-specifier and the named type. 1023 /// Subclasses may override this routine to provide different behavior. 1024 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1025 ElaboratedTypeKeyword Keyword, 1026 NestedNameSpecifierLoc QualifierLoc, 1027 QualType Named) { 1028 return SemaRef.Context.getElaboratedType(Keyword, 1029 QualifierLoc.getNestedNameSpecifier(), 1030 Named); 1031 } 1032 1033 /// Build a new typename type that refers to a template-id. 1034 /// 1035 /// By default, builds a new DependentNameType type from the 1036 /// nested-name-specifier and the given type. Subclasses may override 1037 /// this routine to provide different behavior. 1038 QualType RebuildDependentTemplateSpecializationType( 1039 ElaboratedTypeKeyword Keyword, 1040 NestedNameSpecifierLoc QualifierLoc, 1041 SourceLocation TemplateKWLoc, 1042 const IdentifierInfo *Name, 1043 SourceLocation NameLoc, 1044 TemplateArgumentListInfo &Args, 1045 bool AllowInjectedClassName) { 1046 // Rebuild the template name. 1047 // TODO: avoid TemplateName abstraction 1048 CXXScopeSpec SS; 1049 SS.Adopt(QualifierLoc); 1050 TemplateName InstName = getDerived().RebuildTemplateName( 1051 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1052 AllowInjectedClassName); 1053 1054 if (InstName.isNull()) 1055 return QualType(); 1056 1057 // If it's still dependent, make a dependent specialization. 1058 if (InstName.getAsDependentTemplateName()) 1059 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1060 QualifierLoc.getNestedNameSpecifier(), 1061 Name, 1062 Args); 1063 1064 // Otherwise, make an elaborated type wrapping a non-dependent 1065 // specialization. 1066 QualType T = 1067 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1068 if (T.isNull()) return QualType(); 1069 1070 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1071 return T; 1072 1073 return SemaRef.Context.getElaboratedType(Keyword, 1074 QualifierLoc.getNestedNameSpecifier(), 1075 T); 1076 } 1077 1078 /// Build a new typename type that refers to an identifier. 1079 /// 1080 /// By default, performs semantic analysis when building the typename type 1081 /// (or elaborated type). Subclasses may override this routine to provide 1082 /// different behavior. 1083 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1084 SourceLocation KeywordLoc, 1085 NestedNameSpecifierLoc QualifierLoc, 1086 const IdentifierInfo *Id, 1087 SourceLocation IdLoc, 1088 bool DeducedTSTContext) { 1089 CXXScopeSpec SS; 1090 SS.Adopt(QualifierLoc); 1091 1092 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1093 // If the name is still dependent, just build a new dependent name type. 1094 if (!SemaRef.computeDeclContext(SS)) 1095 return SemaRef.Context.getDependentNameType(Keyword, 1096 QualifierLoc.getNestedNameSpecifier(), 1097 Id); 1098 } 1099 1100 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1101 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1102 *Id, IdLoc, DeducedTSTContext); 1103 } 1104 1105 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1106 1107 // We had a dependent elaborated-type-specifier that has been transformed 1108 // into a non-dependent elaborated-type-specifier. Find the tag we're 1109 // referring to. 1110 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1111 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1112 if (!DC) 1113 return QualType(); 1114 1115 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1116 return QualType(); 1117 1118 TagDecl *Tag = nullptr; 1119 SemaRef.LookupQualifiedName(Result, DC); 1120 switch (Result.getResultKind()) { 1121 case LookupResult::NotFound: 1122 case LookupResult::NotFoundInCurrentInstantiation: 1123 break; 1124 1125 case LookupResult::Found: 1126 Tag = Result.getAsSingle<TagDecl>(); 1127 break; 1128 1129 case LookupResult::FoundOverloaded: 1130 case LookupResult::FoundUnresolvedValue: 1131 llvm_unreachable("Tag lookup cannot find non-tags"); 1132 1133 case LookupResult::Ambiguous: 1134 // Let the LookupResult structure handle ambiguities. 1135 return QualType(); 1136 } 1137 1138 if (!Tag) { 1139 // Check where the name exists but isn't a tag type and use that to emit 1140 // better diagnostics. 1141 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1142 SemaRef.LookupQualifiedName(Result, DC); 1143 switch (Result.getResultKind()) { 1144 case LookupResult::Found: 1145 case LookupResult::FoundOverloaded: 1146 case LookupResult::FoundUnresolvedValue: { 1147 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1148 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1149 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1150 << NTK << Kind; 1151 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1152 break; 1153 } 1154 default: 1155 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1156 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1157 break; 1158 } 1159 return QualType(); 1160 } 1161 1162 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1163 IdLoc, Id)) { 1164 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1165 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1166 return QualType(); 1167 } 1168 1169 // Build the elaborated-type-specifier type. 1170 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1171 return SemaRef.Context.getElaboratedType(Keyword, 1172 QualifierLoc.getNestedNameSpecifier(), 1173 T); 1174 } 1175 1176 /// Build a new pack expansion type. 1177 /// 1178 /// By default, builds a new PackExpansionType type from the given pattern. 1179 /// Subclasses may override this routine to provide different behavior. 1180 QualType RebuildPackExpansionType(QualType Pattern, 1181 SourceRange PatternRange, 1182 SourceLocation EllipsisLoc, 1183 Optional<unsigned> NumExpansions) { 1184 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1185 NumExpansions); 1186 } 1187 1188 /// Build a new atomic type given its value type. 1189 /// 1190 /// By default, performs semantic analysis when building the atomic type. 1191 /// Subclasses may override this routine to provide different behavior. 1192 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1193 1194 /// Build a new pipe type given its value type. 1195 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1196 bool isReadPipe); 1197 1198 /// Build an extended int given its value type. 1199 QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits, 1200 SourceLocation Loc); 1201 1202 /// Build a dependent extended int given its value type. 1203 QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr, 1204 SourceLocation Loc); 1205 1206 /// Build a new template name given a nested name specifier, a flag 1207 /// indicating whether the "template" keyword was provided, and the template 1208 /// that the template name refers to. 1209 /// 1210 /// By default, builds the new template name directly. Subclasses may override 1211 /// this routine to provide different behavior. 1212 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1213 bool TemplateKW, 1214 TemplateDecl *Template); 1215 1216 /// Build a new template name given a nested name specifier and the 1217 /// name that is referred to as a template. 1218 /// 1219 /// By default, performs semantic analysis to determine whether the name can 1220 /// be resolved to a specific template, then builds the appropriate kind of 1221 /// template name. Subclasses may override this routine to provide different 1222 /// behavior. 1223 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1224 SourceLocation TemplateKWLoc, 1225 const IdentifierInfo &Name, 1226 SourceLocation NameLoc, QualType ObjectType, 1227 NamedDecl *FirstQualifierInScope, 1228 bool AllowInjectedClassName); 1229 1230 /// Build a new template name given a nested name specifier and the 1231 /// overloaded operator name that is referred to as a template. 1232 /// 1233 /// By default, performs semantic analysis to determine whether the name can 1234 /// be resolved to a specific template, then builds the appropriate kind of 1235 /// template name. Subclasses may override this routine to provide different 1236 /// behavior. 1237 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1238 SourceLocation TemplateKWLoc, 1239 OverloadedOperatorKind Operator, 1240 SourceLocation NameLoc, QualType ObjectType, 1241 bool AllowInjectedClassName); 1242 1243 /// Build a new template name given a template template parameter pack 1244 /// and the 1245 /// 1246 /// By default, performs semantic analysis to determine whether the name can 1247 /// be resolved to a specific template, then builds the appropriate kind of 1248 /// template name. Subclasses may override this routine to provide different 1249 /// behavior. 1250 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1251 const TemplateArgument &ArgPack) { 1252 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1253 } 1254 1255 /// Build a new compound statement. 1256 /// 1257 /// By default, performs semantic analysis to build the new statement. 1258 /// Subclasses may override this routine to provide different behavior. 1259 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1260 MultiStmtArg Statements, 1261 SourceLocation RBraceLoc, 1262 bool IsStmtExpr) { 1263 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1264 IsStmtExpr); 1265 } 1266 1267 /// Build a new case statement. 1268 /// 1269 /// By default, performs semantic analysis to build the new statement. 1270 /// Subclasses may override this routine to provide different behavior. 1271 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1272 Expr *LHS, 1273 SourceLocation EllipsisLoc, 1274 Expr *RHS, 1275 SourceLocation ColonLoc) { 1276 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1277 ColonLoc); 1278 } 1279 1280 /// Attach the body to a new case statement. 1281 /// 1282 /// By default, performs semantic analysis to build the new statement. 1283 /// Subclasses may override this routine to provide different behavior. 1284 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1285 getSema().ActOnCaseStmtBody(S, Body); 1286 return S; 1287 } 1288 1289 /// Build a new default statement. 1290 /// 1291 /// By default, performs semantic analysis to build the new statement. 1292 /// Subclasses may override this routine to provide different behavior. 1293 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1294 SourceLocation ColonLoc, 1295 Stmt *SubStmt) { 1296 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1297 /*CurScope=*/nullptr); 1298 } 1299 1300 /// Build a new label statement. 1301 /// 1302 /// By default, performs semantic analysis to build the new statement. 1303 /// Subclasses may override this routine to provide different behavior. 1304 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1305 SourceLocation ColonLoc, Stmt *SubStmt) { 1306 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1307 } 1308 1309 /// Build a new attributed statement. 1310 /// 1311 /// By default, performs semantic analysis to build the new statement. 1312 /// Subclasses may override this routine to provide different behavior. 1313 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1314 ArrayRef<const Attr *> Attrs, 1315 Stmt *SubStmt) { 1316 return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt); 1317 } 1318 1319 /// Build a new "if" statement. 1320 /// 1321 /// By default, performs semantic analysis to build the new statement. 1322 /// Subclasses may override this routine to provide different behavior. 1323 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1324 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1325 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1326 SourceLocation ElseLoc, Stmt *Else) { 1327 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond, 1328 RParenLoc, Then, ElseLoc, Else); 1329 } 1330 1331 /// Start building a new switch statement. 1332 /// 1333 /// By default, performs semantic analysis to build the new statement. 1334 /// Subclasses may override this routine to provide different behavior. 1335 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1336 SourceLocation LParenLoc, Stmt *Init, 1337 Sema::ConditionResult Cond, 1338 SourceLocation RParenLoc) { 1339 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1340 RParenLoc); 1341 } 1342 1343 /// Attach the body to the switch statement. 1344 /// 1345 /// By default, performs semantic analysis to build the new statement. 1346 /// Subclasses may override this routine to provide different behavior. 1347 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1348 Stmt *Switch, Stmt *Body) { 1349 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1350 } 1351 1352 /// Build a new while statement. 1353 /// 1354 /// By default, performs semantic analysis to build the new statement. 1355 /// Subclasses may override this routine to provide different behavior. 1356 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1357 Sema::ConditionResult Cond, 1358 SourceLocation RParenLoc, Stmt *Body) { 1359 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1360 } 1361 1362 /// Build a new do-while statement. 1363 /// 1364 /// By default, performs semantic analysis to build the new statement. 1365 /// Subclasses may override this routine to provide different behavior. 1366 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1367 SourceLocation WhileLoc, SourceLocation LParenLoc, 1368 Expr *Cond, SourceLocation RParenLoc) { 1369 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1370 Cond, RParenLoc); 1371 } 1372 1373 /// Build a new for statement. 1374 /// 1375 /// By default, performs semantic analysis to build the new statement. 1376 /// Subclasses may override this routine to provide different behavior. 1377 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1378 Stmt *Init, Sema::ConditionResult Cond, 1379 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1380 Stmt *Body) { 1381 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1382 Inc, RParenLoc, Body); 1383 } 1384 1385 /// Build a new goto statement. 1386 /// 1387 /// By default, performs semantic analysis to build the new statement. 1388 /// Subclasses may override this routine to provide different behavior. 1389 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1390 LabelDecl *Label) { 1391 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1392 } 1393 1394 /// Build a new indirect goto statement. 1395 /// 1396 /// By default, performs semantic analysis to build the new statement. 1397 /// Subclasses may override this routine to provide different behavior. 1398 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1399 SourceLocation StarLoc, 1400 Expr *Target) { 1401 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1402 } 1403 1404 /// Build a new return statement. 1405 /// 1406 /// By default, performs semantic analysis to build the new statement. 1407 /// Subclasses may override this routine to provide different behavior. 1408 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1409 return getSema().BuildReturnStmt(ReturnLoc, Result); 1410 } 1411 1412 /// Build a new declaration statement. 1413 /// 1414 /// By default, performs semantic analysis to build the new statement. 1415 /// Subclasses may override this routine to provide different behavior. 1416 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1417 SourceLocation StartLoc, SourceLocation EndLoc) { 1418 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1419 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1420 } 1421 1422 /// Build a new inline asm statement. 1423 /// 1424 /// By default, performs semantic analysis to build the new statement. 1425 /// Subclasses may override this routine to provide different behavior. 1426 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1427 bool IsVolatile, unsigned NumOutputs, 1428 unsigned NumInputs, IdentifierInfo **Names, 1429 MultiExprArg Constraints, MultiExprArg Exprs, 1430 Expr *AsmString, MultiExprArg Clobbers, 1431 unsigned NumLabels, 1432 SourceLocation RParenLoc) { 1433 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1434 NumInputs, Names, Constraints, Exprs, 1435 AsmString, Clobbers, NumLabels, RParenLoc); 1436 } 1437 1438 /// Build a new MS style inline asm statement. 1439 /// 1440 /// By default, performs semantic analysis to build the new statement. 1441 /// Subclasses may override this routine to provide different behavior. 1442 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1443 ArrayRef<Token> AsmToks, 1444 StringRef AsmString, 1445 unsigned NumOutputs, unsigned NumInputs, 1446 ArrayRef<StringRef> Constraints, 1447 ArrayRef<StringRef> Clobbers, 1448 ArrayRef<Expr*> Exprs, 1449 SourceLocation EndLoc) { 1450 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1451 NumOutputs, NumInputs, 1452 Constraints, Clobbers, Exprs, EndLoc); 1453 } 1454 1455 /// Build a new co_return statement. 1456 /// 1457 /// By default, performs semantic analysis to build the new statement. 1458 /// Subclasses may override this routine to provide different behavior. 1459 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1460 bool IsImplicit) { 1461 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1462 } 1463 1464 /// Build a new co_await expression. 1465 /// 1466 /// By default, performs semantic analysis to build the new expression. 1467 /// Subclasses may override this routine to provide different behavior. 1468 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1469 bool IsImplicit) { 1470 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1471 } 1472 1473 /// Build a new co_await expression. 1474 /// 1475 /// By default, performs semantic analysis to build the new expression. 1476 /// Subclasses may override this routine to provide different behavior. 1477 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1478 Expr *Result, 1479 UnresolvedLookupExpr *Lookup) { 1480 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1481 } 1482 1483 /// Build a new co_yield expression. 1484 /// 1485 /// By default, performs semantic analysis to build the new expression. 1486 /// Subclasses may override this routine to provide different behavior. 1487 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1488 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1489 } 1490 1491 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1492 return getSema().BuildCoroutineBodyStmt(Args); 1493 } 1494 1495 /// Build a new Objective-C \@try statement. 1496 /// 1497 /// By default, performs semantic analysis to build the new statement. 1498 /// Subclasses may override this routine to provide different behavior. 1499 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1500 Stmt *TryBody, 1501 MultiStmtArg CatchStmts, 1502 Stmt *Finally) { 1503 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1504 Finally); 1505 } 1506 1507 /// Rebuild an Objective-C exception declaration. 1508 /// 1509 /// By default, performs semantic analysis to build the new declaration. 1510 /// Subclasses may override this routine to provide different behavior. 1511 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1512 TypeSourceInfo *TInfo, QualType T) { 1513 return getSema().BuildObjCExceptionDecl(TInfo, T, 1514 ExceptionDecl->getInnerLocStart(), 1515 ExceptionDecl->getLocation(), 1516 ExceptionDecl->getIdentifier()); 1517 } 1518 1519 /// Build a new Objective-C \@catch statement. 1520 /// 1521 /// By default, performs semantic analysis to build the new statement. 1522 /// Subclasses may override this routine to provide different behavior. 1523 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1524 SourceLocation RParenLoc, 1525 VarDecl *Var, 1526 Stmt *Body) { 1527 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1528 Var, Body); 1529 } 1530 1531 /// Build a new Objective-C \@finally statement. 1532 /// 1533 /// By default, performs semantic analysis to build the new statement. 1534 /// Subclasses may override this routine to provide different behavior. 1535 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1536 Stmt *Body) { 1537 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1538 } 1539 1540 /// Build a new Objective-C \@throw statement. 1541 /// 1542 /// By default, performs semantic analysis to build the new statement. 1543 /// Subclasses may override this routine to provide different behavior. 1544 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1545 Expr *Operand) { 1546 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1547 } 1548 1549 /// Build a new OpenMP Canonical loop. 1550 /// 1551 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1552 /// OMPCanonicalLoop. 1553 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1554 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1555 } 1556 1557 /// Build a new OpenMP executable directive. 1558 /// 1559 /// By default, performs semantic analysis to build the new statement. 1560 /// Subclasses may override this routine to provide different behavior. 1561 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1562 DeclarationNameInfo DirName, 1563 OpenMPDirectiveKind CancelRegion, 1564 ArrayRef<OMPClause *> Clauses, 1565 Stmt *AStmt, SourceLocation StartLoc, 1566 SourceLocation EndLoc) { 1567 return getSema().ActOnOpenMPExecutableDirective( 1568 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1569 } 1570 1571 /// Build a new OpenMP 'if' clause. 1572 /// 1573 /// By default, performs semantic analysis to build the new OpenMP clause. 1574 /// Subclasses may override this routine to provide different behavior. 1575 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1576 Expr *Condition, SourceLocation StartLoc, 1577 SourceLocation LParenLoc, 1578 SourceLocation NameModifierLoc, 1579 SourceLocation ColonLoc, 1580 SourceLocation EndLoc) { 1581 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1582 LParenLoc, NameModifierLoc, ColonLoc, 1583 EndLoc); 1584 } 1585 1586 /// Build a new OpenMP 'final' clause. 1587 /// 1588 /// By default, performs semantic analysis to build the new OpenMP clause. 1589 /// Subclasses may override this routine to provide different behavior. 1590 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1591 SourceLocation LParenLoc, 1592 SourceLocation EndLoc) { 1593 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1594 EndLoc); 1595 } 1596 1597 /// Build a new OpenMP 'num_threads' clause. 1598 /// 1599 /// By default, performs semantic analysis to build the new OpenMP clause. 1600 /// Subclasses may override this routine to provide different behavior. 1601 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1602 SourceLocation StartLoc, 1603 SourceLocation LParenLoc, 1604 SourceLocation EndLoc) { 1605 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1606 LParenLoc, EndLoc); 1607 } 1608 1609 /// Build a new OpenMP 'safelen' clause. 1610 /// 1611 /// By default, performs semantic analysis to build the new OpenMP clause. 1612 /// Subclasses may override this routine to provide different behavior. 1613 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1614 SourceLocation LParenLoc, 1615 SourceLocation EndLoc) { 1616 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1617 } 1618 1619 /// Build a new OpenMP 'simdlen' clause. 1620 /// 1621 /// By default, performs semantic analysis to build the new OpenMP clause. 1622 /// Subclasses may override this routine to provide different behavior. 1623 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1624 SourceLocation LParenLoc, 1625 SourceLocation EndLoc) { 1626 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1627 } 1628 1629 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1630 SourceLocation StartLoc, 1631 SourceLocation LParenLoc, 1632 SourceLocation EndLoc) { 1633 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1634 } 1635 1636 /// Build a new OpenMP 'allocator' clause. 1637 /// 1638 /// By default, performs semantic analysis to build the new OpenMP clause. 1639 /// Subclasses may override this routine to provide different behavior. 1640 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1641 SourceLocation LParenLoc, 1642 SourceLocation EndLoc) { 1643 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1644 } 1645 1646 /// Build a new OpenMP 'collapse' clause. 1647 /// 1648 /// By default, performs semantic analysis to build the new OpenMP clause. 1649 /// Subclasses may override this routine to provide different behavior. 1650 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1651 SourceLocation LParenLoc, 1652 SourceLocation EndLoc) { 1653 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1654 EndLoc); 1655 } 1656 1657 /// Build a new OpenMP 'default' clause. 1658 /// 1659 /// By default, performs semantic analysis to build the new OpenMP clause. 1660 /// Subclasses may override this routine to provide different behavior. 1661 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1662 SourceLocation StartLoc, 1663 SourceLocation LParenLoc, 1664 SourceLocation EndLoc) { 1665 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1666 StartLoc, LParenLoc, EndLoc); 1667 } 1668 1669 /// Build a new OpenMP 'proc_bind' clause. 1670 /// 1671 /// By default, performs semantic analysis to build the new OpenMP clause. 1672 /// Subclasses may override this routine to provide different behavior. 1673 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1674 SourceLocation KindKwLoc, 1675 SourceLocation StartLoc, 1676 SourceLocation LParenLoc, 1677 SourceLocation EndLoc) { 1678 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1679 StartLoc, LParenLoc, EndLoc); 1680 } 1681 1682 /// Build a new OpenMP 'schedule' clause. 1683 /// 1684 /// By default, performs semantic analysis to build the new OpenMP clause. 1685 /// Subclasses may override this routine to provide different behavior. 1686 OMPClause *RebuildOMPScheduleClause( 1687 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1688 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1689 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1690 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1691 return getSema().ActOnOpenMPScheduleClause( 1692 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1693 CommaLoc, EndLoc); 1694 } 1695 1696 /// Build a new OpenMP 'ordered' clause. 1697 /// 1698 /// By default, performs semantic analysis to build the new OpenMP clause. 1699 /// Subclasses may override this routine to provide different behavior. 1700 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1701 SourceLocation EndLoc, 1702 SourceLocation LParenLoc, Expr *Num) { 1703 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1704 } 1705 1706 /// Build a new OpenMP 'private' clause. 1707 /// 1708 /// By default, performs semantic analysis to build the new OpenMP clause. 1709 /// Subclasses may override this routine to provide different behavior. 1710 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1711 SourceLocation StartLoc, 1712 SourceLocation LParenLoc, 1713 SourceLocation EndLoc) { 1714 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1715 EndLoc); 1716 } 1717 1718 /// Build a new OpenMP 'firstprivate' clause. 1719 /// 1720 /// By default, performs semantic analysis to build the new OpenMP clause. 1721 /// Subclasses may override this routine to provide different behavior. 1722 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1723 SourceLocation StartLoc, 1724 SourceLocation LParenLoc, 1725 SourceLocation EndLoc) { 1726 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1727 EndLoc); 1728 } 1729 1730 /// Build a new OpenMP 'lastprivate' clause. 1731 /// 1732 /// By default, performs semantic analysis to build the new OpenMP clause. 1733 /// Subclasses may override this routine to provide different behavior. 1734 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1735 OpenMPLastprivateModifier LPKind, 1736 SourceLocation LPKindLoc, 1737 SourceLocation ColonLoc, 1738 SourceLocation StartLoc, 1739 SourceLocation LParenLoc, 1740 SourceLocation EndLoc) { 1741 return getSema().ActOnOpenMPLastprivateClause( 1742 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1743 } 1744 1745 /// Build a new OpenMP 'shared' clause. 1746 /// 1747 /// By default, performs semantic analysis to build the new OpenMP clause. 1748 /// Subclasses may override this routine to provide different behavior. 1749 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1750 SourceLocation StartLoc, 1751 SourceLocation LParenLoc, 1752 SourceLocation EndLoc) { 1753 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1754 EndLoc); 1755 } 1756 1757 /// Build a new OpenMP 'reduction' clause. 1758 /// 1759 /// By default, performs semantic analysis to build the new statement. 1760 /// Subclasses may override this routine to provide different behavior. 1761 OMPClause *RebuildOMPReductionClause( 1762 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1763 SourceLocation StartLoc, SourceLocation LParenLoc, 1764 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1765 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1766 const DeclarationNameInfo &ReductionId, 1767 ArrayRef<Expr *> UnresolvedReductions) { 1768 return getSema().ActOnOpenMPReductionClause( 1769 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1770 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1771 } 1772 1773 /// Build a new OpenMP 'task_reduction' clause. 1774 /// 1775 /// By default, performs semantic analysis to build the new statement. 1776 /// Subclasses may override this routine to provide different behavior. 1777 OMPClause *RebuildOMPTaskReductionClause( 1778 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1779 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1780 CXXScopeSpec &ReductionIdScopeSpec, 1781 const DeclarationNameInfo &ReductionId, 1782 ArrayRef<Expr *> UnresolvedReductions) { 1783 return getSema().ActOnOpenMPTaskReductionClause( 1784 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1785 ReductionId, UnresolvedReductions); 1786 } 1787 1788 /// Build a new OpenMP 'in_reduction' clause. 1789 /// 1790 /// By default, performs semantic analysis to build the new statement. 1791 /// Subclasses may override this routine to provide different behavior. 1792 OMPClause * 1793 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1794 SourceLocation LParenLoc, SourceLocation ColonLoc, 1795 SourceLocation EndLoc, 1796 CXXScopeSpec &ReductionIdScopeSpec, 1797 const DeclarationNameInfo &ReductionId, 1798 ArrayRef<Expr *> UnresolvedReductions) { 1799 return getSema().ActOnOpenMPInReductionClause( 1800 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1801 ReductionId, UnresolvedReductions); 1802 } 1803 1804 /// Build a new OpenMP 'linear' clause. 1805 /// 1806 /// By default, performs semantic analysis to build the new OpenMP clause. 1807 /// Subclasses may override this routine to provide different behavior. 1808 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1809 SourceLocation StartLoc, 1810 SourceLocation LParenLoc, 1811 OpenMPLinearClauseKind Modifier, 1812 SourceLocation ModifierLoc, 1813 SourceLocation ColonLoc, 1814 SourceLocation EndLoc) { 1815 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1816 Modifier, ModifierLoc, ColonLoc, 1817 EndLoc); 1818 } 1819 1820 /// Build a new OpenMP 'aligned' clause. 1821 /// 1822 /// By default, performs semantic analysis to build the new OpenMP clause. 1823 /// Subclasses may override this routine to provide different behavior. 1824 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1825 SourceLocation StartLoc, 1826 SourceLocation LParenLoc, 1827 SourceLocation ColonLoc, 1828 SourceLocation EndLoc) { 1829 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1830 LParenLoc, ColonLoc, EndLoc); 1831 } 1832 1833 /// Build a new OpenMP 'copyin' clause. 1834 /// 1835 /// By default, performs semantic analysis to build the new OpenMP clause. 1836 /// Subclasses may override this routine to provide different behavior. 1837 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1838 SourceLocation StartLoc, 1839 SourceLocation LParenLoc, 1840 SourceLocation EndLoc) { 1841 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1842 EndLoc); 1843 } 1844 1845 /// Build a new OpenMP 'copyprivate' clause. 1846 /// 1847 /// By default, performs semantic analysis to build the new OpenMP clause. 1848 /// Subclasses may override this routine to provide different behavior. 1849 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1850 SourceLocation StartLoc, 1851 SourceLocation LParenLoc, 1852 SourceLocation EndLoc) { 1853 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1854 EndLoc); 1855 } 1856 1857 /// Build a new OpenMP 'flush' pseudo clause. 1858 /// 1859 /// By default, performs semantic analysis to build the new OpenMP clause. 1860 /// Subclasses may override this routine to provide different behavior. 1861 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1862 SourceLocation StartLoc, 1863 SourceLocation LParenLoc, 1864 SourceLocation EndLoc) { 1865 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1866 EndLoc); 1867 } 1868 1869 /// Build a new OpenMP 'depobj' pseudo clause. 1870 /// 1871 /// By default, performs semantic analysis to build the new OpenMP clause. 1872 /// Subclasses may override this routine to provide different behavior. 1873 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1874 SourceLocation LParenLoc, 1875 SourceLocation EndLoc) { 1876 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1877 EndLoc); 1878 } 1879 1880 /// Build a new OpenMP 'depend' pseudo clause. 1881 /// 1882 /// By default, performs semantic analysis to build the new OpenMP clause. 1883 /// Subclasses may override this routine to provide different behavior. 1884 OMPClause * 1885 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1886 SourceLocation DepLoc, SourceLocation ColonLoc, 1887 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1888 SourceLocation LParenLoc, SourceLocation EndLoc) { 1889 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1890 ColonLoc, VarList, StartLoc, 1891 LParenLoc, EndLoc); 1892 } 1893 1894 /// Build a new OpenMP 'device' clause. 1895 /// 1896 /// By default, performs semantic analysis to build the new statement. 1897 /// Subclasses may override this routine to provide different behavior. 1898 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1899 Expr *Device, SourceLocation StartLoc, 1900 SourceLocation LParenLoc, 1901 SourceLocation ModifierLoc, 1902 SourceLocation EndLoc) { 1903 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1904 LParenLoc, ModifierLoc, EndLoc); 1905 } 1906 1907 /// Build a new OpenMP 'map' clause. 1908 /// 1909 /// By default, performs semantic analysis to build the new OpenMP clause. 1910 /// Subclasses may override this routine to provide different behavior. 1911 OMPClause *RebuildOMPMapClause( 1912 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1913 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1914 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1915 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1916 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1917 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1918 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1919 MapperIdScopeSpec, MapperId, MapType, 1920 IsMapTypeImplicit, MapLoc, ColonLoc, 1921 VarList, Locs, UnresolvedMappers); 1922 } 1923 1924 /// Build a new OpenMP 'allocate' clause. 1925 /// 1926 /// By default, performs semantic analysis to build the new OpenMP clause. 1927 /// Subclasses may override this routine to provide different behavior. 1928 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1929 SourceLocation StartLoc, 1930 SourceLocation LParenLoc, 1931 SourceLocation ColonLoc, 1932 SourceLocation EndLoc) { 1933 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1934 LParenLoc, ColonLoc, EndLoc); 1935 } 1936 1937 /// Build a new OpenMP 'num_teams' clause. 1938 /// 1939 /// By default, performs semantic analysis to build the new statement. 1940 /// Subclasses may override this routine to provide different behavior. 1941 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1942 SourceLocation LParenLoc, 1943 SourceLocation EndLoc) { 1944 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1945 EndLoc); 1946 } 1947 1948 /// Build a new OpenMP 'thread_limit' clause. 1949 /// 1950 /// By default, performs semantic analysis to build the new statement. 1951 /// Subclasses may override this routine to provide different behavior. 1952 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1953 SourceLocation StartLoc, 1954 SourceLocation LParenLoc, 1955 SourceLocation EndLoc) { 1956 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1957 LParenLoc, EndLoc); 1958 } 1959 1960 /// Build a new OpenMP 'priority' clause. 1961 /// 1962 /// By default, performs semantic analysis to build the new statement. 1963 /// Subclasses may override this routine to provide different behavior. 1964 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1965 SourceLocation LParenLoc, 1966 SourceLocation EndLoc) { 1967 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1968 EndLoc); 1969 } 1970 1971 /// Build a new OpenMP 'grainsize' clause. 1972 /// 1973 /// By default, performs semantic analysis to build the new statement. 1974 /// Subclasses may override this routine to provide different behavior. 1975 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1976 SourceLocation LParenLoc, 1977 SourceLocation EndLoc) { 1978 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1979 EndLoc); 1980 } 1981 1982 /// Build a new OpenMP 'num_tasks' clause. 1983 /// 1984 /// By default, performs semantic analysis to build the new statement. 1985 /// Subclasses may override this routine to provide different behavior. 1986 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1987 SourceLocation LParenLoc, 1988 SourceLocation EndLoc) { 1989 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1990 EndLoc); 1991 } 1992 1993 /// Build a new OpenMP 'hint' clause. 1994 /// 1995 /// By default, performs semantic analysis to build the new statement. 1996 /// Subclasses may override this routine to provide different behavior. 1997 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1998 SourceLocation LParenLoc, 1999 SourceLocation EndLoc) { 2000 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2001 } 2002 2003 /// Build a new OpenMP 'detach' clause. 2004 /// 2005 /// By default, performs semantic analysis to build the new statement. 2006 /// Subclasses may override this routine to provide different behavior. 2007 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2008 SourceLocation LParenLoc, 2009 SourceLocation EndLoc) { 2010 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2011 } 2012 2013 /// Build a new OpenMP 'dist_schedule' clause. 2014 /// 2015 /// By default, performs semantic analysis to build the new OpenMP clause. 2016 /// Subclasses may override this routine to provide different behavior. 2017 OMPClause * 2018 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2019 Expr *ChunkSize, SourceLocation StartLoc, 2020 SourceLocation LParenLoc, SourceLocation KindLoc, 2021 SourceLocation CommaLoc, SourceLocation EndLoc) { 2022 return getSema().ActOnOpenMPDistScheduleClause( 2023 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2024 } 2025 2026 /// Build a new OpenMP 'to' clause. 2027 /// 2028 /// By default, performs semantic analysis to build the new statement. 2029 /// Subclasses may override this routine to provide different behavior. 2030 OMPClause * 2031 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2032 ArrayRef<SourceLocation> MotionModifiersLoc, 2033 CXXScopeSpec &MapperIdScopeSpec, 2034 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2035 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2036 ArrayRef<Expr *> UnresolvedMappers) { 2037 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2038 MapperIdScopeSpec, MapperId, ColonLoc, 2039 VarList, Locs, UnresolvedMappers); 2040 } 2041 2042 /// Build a new OpenMP 'from' clause. 2043 /// 2044 /// By default, performs semantic analysis to build the new statement. 2045 /// Subclasses may override this routine to provide different behavior. 2046 OMPClause * 2047 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2048 ArrayRef<SourceLocation> MotionModifiersLoc, 2049 CXXScopeSpec &MapperIdScopeSpec, 2050 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2051 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2052 ArrayRef<Expr *> UnresolvedMappers) { 2053 return getSema().ActOnOpenMPFromClause( 2054 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2055 ColonLoc, VarList, Locs, UnresolvedMappers); 2056 } 2057 2058 /// Build a new OpenMP 'use_device_ptr' clause. 2059 /// 2060 /// By default, performs semantic analysis to build the new OpenMP clause. 2061 /// Subclasses may override this routine to provide different behavior. 2062 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2063 const OMPVarListLocTy &Locs) { 2064 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2065 } 2066 2067 /// Build a new OpenMP 'use_device_addr' clause. 2068 /// 2069 /// By default, performs semantic analysis to build the new OpenMP clause. 2070 /// Subclasses may override this routine to provide different behavior. 2071 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2072 const OMPVarListLocTy &Locs) { 2073 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2074 } 2075 2076 /// Build a new OpenMP 'is_device_ptr' clause. 2077 /// 2078 /// By default, performs semantic analysis to build the new OpenMP clause. 2079 /// Subclasses may override this routine to provide different behavior. 2080 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2081 const OMPVarListLocTy &Locs) { 2082 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2083 } 2084 2085 /// Build a new OpenMP 'defaultmap' clause. 2086 /// 2087 /// By default, performs semantic analysis to build the new OpenMP clause. 2088 /// Subclasses may override this routine to provide different behavior. 2089 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2090 OpenMPDefaultmapClauseKind Kind, 2091 SourceLocation StartLoc, 2092 SourceLocation LParenLoc, 2093 SourceLocation MLoc, 2094 SourceLocation KindLoc, 2095 SourceLocation EndLoc) { 2096 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2097 MLoc, KindLoc, EndLoc); 2098 } 2099 2100 /// Build a new OpenMP 'nontemporal' clause. 2101 /// 2102 /// By default, performs semantic analysis to build the new OpenMP clause. 2103 /// Subclasses may override this routine to provide different behavior. 2104 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2105 SourceLocation StartLoc, 2106 SourceLocation LParenLoc, 2107 SourceLocation EndLoc) { 2108 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2109 EndLoc); 2110 } 2111 2112 /// Build a new OpenMP 'inclusive' clause. 2113 /// 2114 /// By default, performs semantic analysis to build the new OpenMP clause. 2115 /// Subclasses may override this routine to provide different behavior. 2116 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2117 SourceLocation StartLoc, 2118 SourceLocation LParenLoc, 2119 SourceLocation EndLoc) { 2120 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2121 EndLoc); 2122 } 2123 2124 /// Build a new OpenMP 'exclusive' clause. 2125 /// 2126 /// By default, performs semantic analysis to build the new OpenMP clause. 2127 /// Subclasses may override this routine to provide different behavior. 2128 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2129 SourceLocation StartLoc, 2130 SourceLocation LParenLoc, 2131 SourceLocation EndLoc) { 2132 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2133 EndLoc); 2134 } 2135 2136 /// Build a new OpenMP 'uses_allocators' clause. 2137 /// 2138 /// By default, performs semantic analysis to build the new OpenMP clause. 2139 /// Subclasses may override this routine to provide different behavior. 2140 OMPClause *RebuildOMPUsesAllocatorsClause( 2141 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2142 SourceLocation LParenLoc, SourceLocation EndLoc) { 2143 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2144 Data); 2145 } 2146 2147 /// Build a new OpenMP 'affinity' clause. 2148 /// 2149 /// By default, performs semantic analysis to build the new OpenMP clause. 2150 /// Subclasses may override this routine to provide different behavior. 2151 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2152 SourceLocation LParenLoc, 2153 SourceLocation ColonLoc, 2154 SourceLocation EndLoc, Expr *Modifier, 2155 ArrayRef<Expr *> Locators) { 2156 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2157 EndLoc, Modifier, Locators); 2158 } 2159 2160 /// Build a new OpenMP 'order' clause. 2161 /// 2162 /// By default, performs semantic analysis to build the new OpenMP clause. 2163 /// Subclasses may override this routine to provide different behavior. 2164 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2165 SourceLocation KindKwLoc, 2166 SourceLocation StartLoc, 2167 SourceLocation LParenLoc, 2168 SourceLocation EndLoc) { 2169 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2170 LParenLoc, EndLoc); 2171 } 2172 2173 /// Build a new OpenMP 'init' clause. 2174 /// 2175 /// By default, performs semantic analysis to build the new OpenMP clause. 2176 /// Subclasses may override this routine to provide different behavior. 2177 OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2178 bool IsTarget, bool IsTargetSync, 2179 SourceLocation StartLoc, 2180 SourceLocation LParenLoc, 2181 SourceLocation VarLoc, 2182 SourceLocation EndLoc) { 2183 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2184 IsTargetSync, StartLoc, LParenLoc, 2185 VarLoc, EndLoc); 2186 } 2187 2188 /// Build a new OpenMP 'use' clause. 2189 /// 2190 /// By default, performs semantic analysis to build the new OpenMP clause. 2191 /// Subclasses may override this routine to provide different behavior. 2192 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2193 SourceLocation LParenLoc, 2194 SourceLocation VarLoc, SourceLocation EndLoc) { 2195 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2196 VarLoc, EndLoc); 2197 } 2198 2199 /// Build a new OpenMP 'destroy' clause. 2200 /// 2201 /// By default, performs semantic analysis to build the new OpenMP clause. 2202 /// Subclasses may override this routine to provide different behavior. 2203 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2204 SourceLocation LParenLoc, 2205 SourceLocation VarLoc, 2206 SourceLocation EndLoc) { 2207 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2208 VarLoc, EndLoc); 2209 } 2210 2211 /// Build a new OpenMP 'novariants' clause. 2212 /// 2213 /// By default, performs semantic analysis to build the new OpenMP clause. 2214 /// Subclasses may override this routine to provide different behavior. 2215 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2216 SourceLocation StartLoc, 2217 SourceLocation LParenLoc, 2218 SourceLocation EndLoc) { 2219 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2220 EndLoc); 2221 } 2222 2223 /// Build a new OpenMP 'nocontext' clause. 2224 /// 2225 /// By default, performs semantic analysis to build the new OpenMP clause. 2226 /// Subclasses may override this routine to provide different behavior. 2227 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2228 SourceLocation LParenLoc, 2229 SourceLocation EndLoc) { 2230 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2231 EndLoc); 2232 } 2233 2234 /// Build a new OpenMP 'filter' clause. 2235 /// 2236 /// By default, performs semantic analysis to build the new OpenMP clause. 2237 /// Subclasses may override this routine to provide different behavior. 2238 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2239 SourceLocation LParenLoc, 2240 SourceLocation EndLoc) { 2241 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2242 EndLoc); 2243 } 2244 2245 /// Rebuild the operand to an Objective-C \@synchronized statement. 2246 /// 2247 /// By default, performs semantic analysis to build the new statement. 2248 /// Subclasses may override this routine to provide different behavior. 2249 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2250 Expr *object) { 2251 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2252 } 2253 2254 /// Build a new Objective-C \@synchronized statement. 2255 /// 2256 /// By default, performs semantic analysis to build the new statement. 2257 /// Subclasses may override this routine to provide different behavior. 2258 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2259 Expr *Object, Stmt *Body) { 2260 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2261 } 2262 2263 /// Build a new Objective-C \@autoreleasepool statement. 2264 /// 2265 /// By default, performs semantic analysis to build the new statement. 2266 /// Subclasses may override this routine to provide different behavior. 2267 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2268 Stmt *Body) { 2269 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2270 } 2271 2272 /// Build a new Objective-C fast enumeration statement. 2273 /// 2274 /// By default, performs semantic analysis to build the new statement. 2275 /// Subclasses may override this routine to provide different behavior. 2276 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2277 Stmt *Element, 2278 Expr *Collection, 2279 SourceLocation RParenLoc, 2280 Stmt *Body) { 2281 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2282 Element, 2283 Collection, 2284 RParenLoc); 2285 if (ForEachStmt.isInvalid()) 2286 return StmtError(); 2287 2288 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2289 } 2290 2291 /// Build a new C++ exception declaration. 2292 /// 2293 /// By default, performs semantic analysis to build the new decaration. 2294 /// Subclasses may override this routine to provide different behavior. 2295 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2296 TypeSourceInfo *Declarator, 2297 SourceLocation StartLoc, 2298 SourceLocation IdLoc, 2299 IdentifierInfo *Id) { 2300 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2301 StartLoc, IdLoc, Id); 2302 if (Var) 2303 getSema().CurContext->addDecl(Var); 2304 return Var; 2305 } 2306 2307 /// Build a new C++ catch statement. 2308 /// 2309 /// By default, performs semantic analysis to build the new statement. 2310 /// Subclasses may override this routine to provide different behavior. 2311 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2312 VarDecl *ExceptionDecl, 2313 Stmt *Handler) { 2314 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2315 Handler)); 2316 } 2317 2318 /// Build a new C++ try statement. 2319 /// 2320 /// By default, performs semantic analysis to build the new statement. 2321 /// Subclasses may override this routine to provide different behavior. 2322 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2323 ArrayRef<Stmt *> Handlers) { 2324 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2325 } 2326 2327 /// Build a new C++0x range-based for statement. 2328 /// 2329 /// By default, performs semantic analysis to build the new statement. 2330 /// Subclasses may override this routine to provide different behavior. 2331 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2332 SourceLocation CoawaitLoc, Stmt *Init, 2333 SourceLocation ColonLoc, Stmt *Range, 2334 Stmt *Begin, Stmt *End, Expr *Cond, 2335 Expr *Inc, Stmt *LoopVar, 2336 SourceLocation RParenLoc) { 2337 // If we've just learned that the range is actually an Objective-C 2338 // collection, treat this as an Objective-C fast enumeration loop. 2339 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2340 if (RangeStmt->isSingleDecl()) { 2341 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2342 if (RangeVar->isInvalidDecl()) 2343 return StmtError(); 2344 2345 Expr *RangeExpr = RangeVar->getInit(); 2346 if (!RangeExpr->isTypeDependent() && 2347 RangeExpr->getType()->isObjCObjectPointerType()) { 2348 // FIXME: Support init-statements in Objective-C++20 ranged for 2349 // statement. 2350 if (Init) { 2351 return SemaRef.Diag(Init->getBeginLoc(), 2352 diag::err_objc_for_range_init_stmt) 2353 << Init->getSourceRange(); 2354 } 2355 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2356 RangeExpr, RParenLoc); 2357 } 2358 } 2359 } 2360 } 2361 2362 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2363 Range, Begin, End, Cond, Inc, LoopVar, 2364 RParenLoc, Sema::BFRK_Rebuild); 2365 } 2366 2367 /// Build a new C++0x range-based for statement. 2368 /// 2369 /// By default, performs semantic analysis to build the new statement. 2370 /// Subclasses may override this routine to provide different behavior. 2371 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2372 bool IsIfExists, 2373 NestedNameSpecifierLoc QualifierLoc, 2374 DeclarationNameInfo NameInfo, 2375 Stmt *Nested) { 2376 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2377 QualifierLoc, NameInfo, Nested); 2378 } 2379 2380 /// Attach body to a C++0x range-based for statement. 2381 /// 2382 /// By default, performs semantic analysis to finish the new statement. 2383 /// Subclasses may override this routine to provide different behavior. 2384 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2385 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2386 } 2387 2388 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2389 Stmt *TryBlock, Stmt *Handler) { 2390 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2391 } 2392 2393 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2394 Stmt *Block) { 2395 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2396 } 2397 2398 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2399 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2400 } 2401 2402 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2403 SourceLocation LParen, 2404 SourceLocation RParen, Expr *E) { 2405 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, E); 2406 } 2407 2408 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2409 SourceLocation LParen, 2410 SourceLocation RParen, 2411 TypeSourceInfo *TSI) { 2412 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2413 } 2414 2415 /// Build a new predefined expression. 2416 /// 2417 /// By default, performs semantic analysis to build the new expression. 2418 /// Subclasses may override this routine to provide different behavior. 2419 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2420 PredefinedExpr::IdentKind IK) { 2421 return getSema().BuildPredefinedExpr(Loc, IK); 2422 } 2423 2424 /// Build a new expression that references a declaration. 2425 /// 2426 /// By default, performs semantic analysis to build the new expression. 2427 /// Subclasses may override this routine to provide different behavior. 2428 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2429 LookupResult &R, 2430 bool RequiresADL) { 2431 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2432 } 2433 2434 2435 /// Build a new expression that references a declaration. 2436 /// 2437 /// By default, performs semantic analysis to build the new expression. 2438 /// Subclasses may override this routine to provide different behavior. 2439 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2440 ValueDecl *VD, 2441 const DeclarationNameInfo &NameInfo, 2442 NamedDecl *Found, 2443 TemplateArgumentListInfo *TemplateArgs) { 2444 CXXScopeSpec SS; 2445 SS.Adopt(QualifierLoc); 2446 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2447 TemplateArgs); 2448 } 2449 2450 /// Build a new expression in parentheses. 2451 /// 2452 /// By default, performs semantic analysis to build the new expression. 2453 /// Subclasses may override this routine to provide different behavior. 2454 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2455 SourceLocation RParen) { 2456 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2457 } 2458 2459 /// Build a new pseudo-destructor expression. 2460 /// 2461 /// By default, performs semantic analysis to build the new expression. 2462 /// Subclasses may override this routine to provide different behavior. 2463 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2464 SourceLocation OperatorLoc, 2465 bool isArrow, 2466 CXXScopeSpec &SS, 2467 TypeSourceInfo *ScopeType, 2468 SourceLocation CCLoc, 2469 SourceLocation TildeLoc, 2470 PseudoDestructorTypeStorage Destroyed); 2471 2472 /// Build a new unary operator expression. 2473 /// 2474 /// By default, performs semantic analysis to build the new expression. 2475 /// Subclasses may override this routine to provide different behavior. 2476 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2477 UnaryOperatorKind Opc, 2478 Expr *SubExpr) { 2479 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2480 } 2481 2482 /// Build a new builtin offsetof expression. 2483 /// 2484 /// By default, performs semantic analysis to build the new expression. 2485 /// Subclasses may override this routine to provide different behavior. 2486 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2487 TypeSourceInfo *Type, 2488 ArrayRef<Sema::OffsetOfComponent> Components, 2489 SourceLocation RParenLoc) { 2490 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2491 RParenLoc); 2492 } 2493 2494 /// Build a new sizeof, alignof or vec_step expression with a 2495 /// type argument. 2496 /// 2497 /// By default, performs semantic analysis to build the new expression. 2498 /// Subclasses may override this routine to provide different behavior. 2499 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2500 SourceLocation OpLoc, 2501 UnaryExprOrTypeTrait ExprKind, 2502 SourceRange R) { 2503 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2504 } 2505 2506 /// Build a new sizeof, alignof or vec step expression with an 2507 /// expression argument. 2508 /// 2509 /// By default, performs semantic analysis to build the new expression. 2510 /// Subclasses may override this routine to provide different behavior. 2511 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2512 UnaryExprOrTypeTrait ExprKind, 2513 SourceRange R) { 2514 ExprResult Result 2515 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2516 if (Result.isInvalid()) 2517 return ExprError(); 2518 2519 return Result; 2520 } 2521 2522 /// Build a new array subscript expression. 2523 /// 2524 /// By default, performs semantic analysis to build the new expression. 2525 /// Subclasses may override this routine to provide different behavior. 2526 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2527 SourceLocation LBracketLoc, 2528 Expr *RHS, 2529 SourceLocation RBracketLoc) { 2530 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2531 LBracketLoc, RHS, 2532 RBracketLoc); 2533 } 2534 2535 /// Build a new matrix subscript expression. 2536 /// 2537 /// By default, performs semantic analysis to build the new expression. 2538 /// Subclasses may override this routine to provide different behavior. 2539 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2540 Expr *ColumnIdx, 2541 SourceLocation RBracketLoc) { 2542 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2543 RBracketLoc); 2544 } 2545 2546 /// Build a new array section expression. 2547 /// 2548 /// By default, performs semantic analysis to build the new expression. 2549 /// Subclasses may override this routine to provide different behavior. 2550 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2551 Expr *LowerBound, 2552 SourceLocation ColonLocFirst, 2553 SourceLocation ColonLocSecond, 2554 Expr *Length, Expr *Stride, 2555 SourceLocation RBracketLoc) { 2556 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2557 ColonLocFirst, ColonLocSecond, 2558 Length, Stride, RBracketLoc); 2559 } 2560 2561 /// Build a new array shaping expression. 2562 /// 2563 /// By default, performs semantic analysis to build the new expression. 2564 /// Subclasses may override this routine to provide different behavior. 2565 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2566 SourceLocation RParenLoc, 2567 ArrayRef<Expr *> Dims, 2568 ArrayRef<SourceRange> BracketsRanges) { 2569 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2570 BracketsRanges); 2571 } 2572 2573 /// Build a new iterator expression. 2574 /// 2575 /// By default, performs semantic analysis to build the new expression. 2576 /// Subclasses may override this routine to provide different behavior. 2577 ExprResult RebuildOMPIteratorExpr( 2578 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2579 ArrayRef<Sema::OMPIteratorData> Data) { 2580 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2581 LLoc, RLoc, Data); 2582 } 2583 2584 /// Build a new call expression. 2585 /// 2586 /// By default, performs semantic analysis to build the new expression. 2587 /// Subclasses may override this routine to provide different behavior. 2588 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2589 MultiExprArg Args, 2590 SourceLocation RParenLoc, 2591 Expr *ExecConfig = nullptr) { 2592 return getSema().ActOnCallExpr( 2593 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2594 } 2595 2596 /// Build a new member access expression. 2597 /// 2598 /// By default, performs semantic analysis to build the new expression. 2599 /// Subclasses may override this routine to provide different behavior. 2600 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2601 bool isArrow, 2602 NestedNameSpecifierLoc QualifierLoc, 2603 SourceLocation TemplateKWLoc, 2604 const DeclarationNameInfo &MemberNameInfo, 2605 ValueDecl *Member, 2606 NamedDecl *FoundDecl, 2607 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2608 NamedDecl *FirstQualifierInScope) { 2609 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2610 isArrow); 2611 if (!Member->getDeclName()) { 2612 // We have a reference to an unnamed field. This is always the 2613 // base of an anonymous struct/union member access, i.e. the 2614 // field is always of record type. 2615 assert(Member->getType()->isRecordType() && 2616 "unnamed member not of record type?"); 2617 2618 BaseResult = 2619 getSema().PerformObjectMemberConversion(BaseResult.get(), 2620 QualifierLoc.getNestedNameSpecifier(), 2621 FoundDecl, Member); 2622 if (BaseResult.isInvalid()) 2623 return ExprError(); 2624 Base = BaseResult.get(); 2625 2626 CXXScopeSpec EmptySS; 2627 return getSema().BuildFieldReferenceExpr( 2628 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2629 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2630 } 2631 2632 CXXScopeSpec SS; 2633 SS.Adopt(QualifierLoc); 2634 2635 Base = BaseResult.get(); 2636 QualType BaseType = Base->getType(); 2637 2638 if (isArrow && !BaseType->isPointerType()) 2639 return ExprError(); 2640 2641 // FIXME: this involves duplicating earlier analysis in a lot of 2642 // cases; we should avoid this when possible. 2643 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2644 R.addDecl(FoundDecl); 2645 R.resolveKind(); 2646 2647 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2648 SS, TemplateKWLoc, 2649 FirstQualifierInScope, 2650 R, ExplicitTemplateArgs, 2651 /*S*/nullptr); 2652 } 2653 2654 /// Build a new binary operator expression. 2655 /// 2656 /// By default, performs semantic analysis to build the new expression. 2657 /// Subclasses may override this routine to provide different behavior. 2658 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2659 BinaryOperatorKind Opc, 2660 Expr *LHS, Expr *RHS) { 2661 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2662 } 2663 2664 /// Build a new rewritten operator expression. 2665 /// 2666 /// By default, performs semantic analysis to build the new expression. 2667 /// Subclasses may override this routine to provide different behavior. 2668 ExprResult RebuildCXXRewrittenBinaryOperator( 2669 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2670 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2671 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2672 RHS, /*RequiresADL*/false); 2673 } 2674 2675 /// Build a new conditional operator expression. 2676 /// 2677 /// By default, performs semantic analysis to build the new expression. 2678 /// Subclasses may override this routine to provide different behavior. 2679 ExprResult RebuildConditionalOperator(Expr *Cond, 2680 SourceLocation QuestionLoc, 2681 Expr *LHS, 2682 SourceLocation ColonLoc, 2683 Expr *RHS) { 2684 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2685 LHS, RHS); 2686 } 2687 2688 /// Build a new C-style cast expression. 2689 /// 2690 /// By default, performs semantic analysis to build the new expression. 2691 /// Subclasses may override this routine to provide different behavior. 2692 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2693 TypeSourceInfo *TInfo, 2694 SourceLocation RParenLoc, 2695 Expr *SubExpr) { 2696 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2697 SubExpr); 2698 } 2699 2700 /// Build a new compound literal expression. 2701 /// 2702 /// By default, performs semantic analysis to build the new expression. 2703 /// Subclasses may override this routine to provide different behavior. 2704 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2705 TypeSourceInfo *TInfo, 2706 SourceLocation RParenLoc, 2707 Expr *Init) { 2708 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2709 Init); 2710 } 2711 2712 /// Build a new extended vector element access expression. 2713 /// 2714 /// By default, performs semantic analysis to build the new expression. 2715 /// Subclasses may override this routine to provide different behavior. 2716 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2717 SourceLocation OpLoc, 2718 SourceLocation AccessorLoc, 2719 IdentifierInfo &Accessor) { 2720 2721 CXXScopeSpec SS; 2722 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2723 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2724 OpLoc, /*IsArrow*/ false, 2725 SS, SourceLocation(), 2726 /*FirstQualifierInScope*/ nullptr, 2727 NameInfo, 2728 /* TemplateArgs */ nullptr, 2729 /*S*/ nullptr); 2730 } 2731 2732 /// Build a new initializer list expression. 2733 /// 2734 /// By default, performs semantic analysis to build the new expression. 2735 /// Subclasses may override this routine to provide different behavior. 2736 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2737 MultiExprArg Inits, 2738 SourceLocation RBraceLoc) { 2739 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2740 } 2741 2742 /// Build a new designated initializer expression. 2743 /// 2744 /// By default, performs semantic analysis to build the new expression. 2745 /// Subclasses may override this routine to provide different behavior. 2746 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2747 MultiExprArg ArrayExprs, 2748 SourceLocation EqualOrColonLoc, 2749 bool GNUSyntax, 2750 Expr *Init) { 2751 ExprResult Result 2752 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2753 Init); 2754 if (Result.isInvalid()) 2755 return ExprError(); 2756 2757 return Result; 2758 } 2759 2760 /// Build a new value-initialized expression. 2761 /// 2762 /// By default, builds the implicit value initialization without performing 2763 /// any semantic analysis. Subclasses may override this routine to provide 2764 /// different behavior. 2765 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2766 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2767 } 2768 2769 /// Build a new \c va_arg expression. 2770 /// 2771 /// By default, performs semantic analysis to build the new expression. 2772 /// Subclasses may override this routine to provide different behavior. 2773 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2774 Expr *SubExpr, TypeSourceInfo *TInfo, 2775 SourceLocation RParenLoc) { 2776 return getSema().BuildVAArgExpr(BuiltinLoc, 2777 SubExpr, TInfo, 2778 RParenLoc); 2779 } 2780 2781 /// Build a new expression list in parentheses. 2782 /// 2783 /// By default, performs semantic analysis to build the new expression. 2784 /// Subclasses may override this routine to provide different behavior. 2785 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2786 MultiExprArg SubExprs, 2787 SourceLocation RParenLoc) { 2788 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2789 } 2790 2791 /// Build a new address-of-label expression. 2792 /// 2793 /// By default, performs semantic analysis, using the name of the label 2794 /// rather than attempting to map the label statement itself. 2795 /// Subclasses may override this routine to provide different behavior. 2796 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2797 SourceLocation LabelLoc, LabelDecl *Label) { 2798 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2799 } 2800 2801 /// Build a new GNU statement expression. 2802 /// 2803 /// By default, performs semantic analysis to build the new expression. 2804 /// Subclasses may override this routine to provide different behavior. 2805 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2806 SourceLocation RParenLoc, unsigned TemplateDepth) { 2807 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2808 TemplateDepth); 2809 } 2810 2811 /// Build a new __builtin_choose_expr expression. 2812 /// 2813 /// By default, performs semantic analysis to build the new expression. 2814 /// Subclasses may override this routine to provide different behavior. 2815 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2816 Expr *Cond, Expr *LHS, Expr *RHS, 2817 SourceLocation RParenLoc) { 2818 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2819 Cond, LHS, RHS, 2820 RParenLoc); 2821 } 2822 2823 /// Build a new generic selection expression. 2824 /// 2825 /// By default, performs semantic analysis to build the new expression. 2826 /// Subclasses may override this routine to provide different behavior. 2827 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2828 SourceLocation DefaultLoc, 2829 SourceLocation RParenLoc, 2830 Expr *ControllingExpr, 2831 ArrayRef<TypeSourceInfo *> Types, 2832 ArrayRef<Expr *> Exprs) { 2833 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2834 ControllingExpr, Types, Exprs); 2835 } 2836 2837 /// Build a new overloaded operator call expression. 2838 /// 2839 /// By default, performs semantic analysis to build the new expression. 2840 /// The semantic analysis provides the behavior of template instantiation, 2841 /// copying with transformations that turn what looks like an overloaded 2842 /// operator call into a use of a builtin operator, performing 2843 /// argument-dependent lookup, etc. Subclasses may override this routine to 2844 /// provide different behavior. 2845 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2846 SourceLocation OpLoc, 2847 Expr *Callee, 2848 Expr *First, 2849 Expr *Second); 2850 2851 /// Build a new C++ "named" cast expression, such as static_cast or 2852 /// reinterpret_cast. 2853 /// 2854 /// By default, this routine dispatches to one of the more-specific routines 2855 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2856 /// Subclasses may override this routine to provide different behavior. 2857 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2858 Stmt::StmtClass Class, 2859 SourceLocation LAngleLoc, 2860 TypeSourceInfo *TInfo, 2861 SourceLocation RAngleLoc, 2862 SourceLocation LParenLoc, 2863 Expr *SubExpr, 2864 SourceLocation RParenLoc) { 2865 switch (Class) { 2866 case Stmt::CXXStaticCastExprClass: 2867 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2868 RAngleLoc, LParenLoc, 2869 SubExpr, RParenLoc); 2870 2871 case Stmt::CXXDynamicCastExprClass: 2872 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2873 RAngleLoc, LParenLoc, 2874 SubExpr, RParenLoc); 2875 2876 case Stmt::CXXReinterpretCastExprClass: 2877 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2878 RAngleLoc, LParenLoc, 2879 SubExpr, 2880 RParenLoc); 2881 2882 case Stmt::CXXConstCastExprClass: 2883 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2884 RAngleLoc, LParenLoc, 2885 SubExpr, RParenLoc); 2886 2887 case Stmt::CXXAddrspaceCastExprClass: 2888 return getDerived().RebuildCXXAddrspaceCastExpr( 2889 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2890 2891 default: 2892 llvm_unreachable("Invalid C++ named cast"); 2893 } 2894 } 2895 2896 /// Build a new C++ static_cast expression. 2897 /// 2898 /// By default, performs semantic analysis to build the new expression. 2899 /// Subclasses may override this routine to provide different behavior. 2900 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2901 SourceLocation LAngleLoc, 2902 TypeSourceInfo *TInfo, 2903 SourceLocation RAngleLoc, 2904 SourceLocation LParenLoc, 2905 Expr *SubExpr, 2906 SourceLocation RParenLoc) { 2907 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2908 TInfo, SubExpr, 2909 SourceRange(LAngleLoc, RAngleLoc), 2910 SourceRange(LParenLoc, RParenLoc)); 2911 } 2912 2913 /// Build a new C++ dynamic_cast expression. 2914 /// 2915 /// By default, performs semantic analysis to build the new expression. 2916 /// Subclasses may override this routine to provide different behavior. 2917 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2918 SourceLocation LAngleLoc, 2919 TypeSourceInfo *TInfo, 2920 SourceLocation RAngleLoc, 2921 SourceLocation LParenLoc, 2922 Expr *SubExpr, 2923 SourceLocation RParenLoc) { 2924 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2925 TInfo, SubExpr, 2926 SourceRange(LAngleLoc, RAngleLoc), 2927 SourceRange(LParenLoc, RParenLoc)); 2928 } 2929 2930 /// Build a new C++ reinterpret_cast expression. 2931 /// 2932 /// By default, performs semantic analysis to build the new expression. 2933 /// Subclasses may override this routine to provide different behavior. 2934 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2935 SourceLocation LAngleLoc, 2936 TypeSourceInfo *TInfo, 2937 SourceLocation RAngleLoc, 2938 SourceLocation LParenLoc, 2939 Expr *SubExpr, 2940 SourceLocation RParenLoc) { 2941 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2942 TInfo, SubExpr, 2943 SourceRange(LAngleLoc, RAngleLoc), 2944 SourceRange(LParenLoc, RParenLoc)); 2945 } 2946 2947 /// Build a new C++ const_cast expression. 2948 /// 2949 /// By default, performs semantic analysis to build the new expression. 2950 /// Subclasses may override this routine to provide different behavior. 2951 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2952 SourceLocation LAngleLoc, 2953 TypeSourceInfo *TInfo, 2954 SourceLocation RAngleLoc, 2955 SourceLocation LParenLoc, 2956 Expr *SubExpr, 2957 SourceLocation RParenLoc) { 2958 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2959 TInfo, SubExpr, 2960 SourceRange(LAngleLoc, RAngleLoc), 2961 SourceRange(LParenLoc, RParenLoc)); 2962 } 2963 2964 ExprResult 2965 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2966 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2967 SourceLocation LParenLoc, Expr *SubExpr, 2968 SourceLocation RParenLoc) { 2969 return getSema().BuildCXXNamedCast( 2970 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2971 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2972 } 2973 2974 /// Build a new C++ functional-style cast expression. 2975 /// 2976 /// By default, performs semantic analysis to build the new expression. 2977 /// Subclasses may override this routine to provide different behavior. 2978 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2979 SourceLocation LParenLoc, 2980 Expr *Sub, 2981 SourceLocation RParenLoc, 2982 bool ListInitialization) { 2983 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2984 MultiExprArg(&Sub, 1), RParenLoc, 2985 ListInitialization); 2986 } 2987 2988 /// Build a new C++ __builtin_bit_cast expression. 2989 /// 2990 /// By default, performs semantic analysis to build the new expression. 2991 /// Subclasses may override this routine to provide different behavior. 2992 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2993 TypeSourceInfo *TSI, Expr *Sub, 2994 SourceLocation RParenLoc) { 2995 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2996 } 2997 2998 /// Build a new C++ typeid(type) expression. 2999 /// 3000 /// By default, performs semantic analysis to build the new expression. 3001 /// Subclasses may override this routine to provide different behavior. 3002 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3003 SourceLocation TypeidLoc, 3004 TypeSourceInfo *Operand, 3005 SourceLocation RParenLoc) { 3006 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3007 RParenLoc); 3008 } 3009 3010 3011 /// Build a new C++ typeid(expr) expression. 3012 /// 3013 /// By default, performs semantic analysis to build the new expression. 3014 /// Subclasses may override this routine to provide different behavior. 3015 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3016 SourceLocation TypeidLoc, 3017 Expr *Operand, 3018 SourceLocation RParenLoc) { 3019 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3020 RParenLoc); 3021 } 3022 3023 /// Build a new C++ __uuidof(type) expression. 3024 /// 3025 /// By default, performs semantic analysis to build the new expression. 3026 /// Subclasses may override this routine to provide different behavior. 3027 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3028 TypeSourceInfo *Operand, 3029 SourceLocation RParenLoc) { 3030 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3031 } 3032 3033 /// Build a new C++ __uuidof(expr) expression. 3034 /// 3035 /// By default, performs semantic analysis to build the new expression. 3036 /// Subclasses may override this routine to provide different behavior. 3037 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3038 Expr *Operand, SourceLocation RParenLoc) { 3039 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3040 } 3041 3042 /// Build a new C++ "this" expression. 3043 /// 3044 /// By default, builds a new "this" expression without performing any 3045 /// semantic analysis. Subclasses may override this routine to provide 3046 /// different behavior. 3047 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3048 QualType ThisType, 3049 bool isImplicit) { 3050 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3051 } 3052 3053 /// Build a new C++ throw expression. 3054 /// 3055 /// By default, performs semantic analysis to build the new expression. 3056 /// Subclasses may override this routine to provide different behavior. 3057 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3058 bool IsThrownVariableInScope) { 3059 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3060 } 3061 3062 /// Build a new C++ default-argument expression. 3063 /// 3064 /// By default, builds a new default-argument expression, which does not 3065 /// require any semantic analysis. Subclasses may override this routine to 3066 /// provide different behavior. 3067 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3068 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3069 getSema().CurContext); 3070 } 3071 3072 /// Build a new C++11 default-initialization expression. 3073 /// 3074 /// By default, builds a new default field initialization expression, which 3075 /// does not require any semantic analysis. Subclasses may override this 3076 /// routine to provide different behavior. 3077 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3078 FieldDecl *Field) { 3079 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3080 getSema().CurContext); 3081 } 3082 3083 /// Build a new C++ zero-initialization expression. 3084 /// 3085 /// By default, performs semantic analysis to build the new expression. 3086 /// Subclasses may override this routine to provide different behavior. 3087 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3088 SourceLocation LParenLoc, 3089 SourceLocation RParenLoc) { 3090 return getSema().BuildCXXTypeConstructExpr( 3091 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3092 } 3093 3094 /// Build a new C++ "new" expression. 3095 /// 3096 /// By default, performs semantic analysis to build the new expression. 3097 /// Subclasses may override this routine to provide different behavior. 3098 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3099 bool UseGlobal, 3100 SourceLocation PlacementLParen, 3101 MultiExprArg PlacementArgs, 3102 SourceLocation PlacementRParen, 3103 SourceRange TypeIdParens, 3104 QualType AllocatedType, 3105 TypeSourceInfo *AllocatedTypeInfo, 3106 Optional<Expr *> ArraySize, 3107 SourceRange DirectInitRange, 3108 Expr *Initializer) { 3109 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3110 PlacementLParen, 3111 PlacementArgs, 3112 PlacementRParen, 3113 TypeIdParens, 3114 AllocatedType, 3115 AllocatedTypeInfo, 3116 ArraySize, 3117 DirectInitRange, 3118 Initializer); 3119 } 3120 3121 /// Build a new C++ "delete" expression. 3122 /// 3123 /// By default, performs semantic analysis to build the new expression. 3124 /// Subclasses may override this routine to provide different behavior. 3125 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3126 bool IsGlobalDelete, 3127 bool IsArrayForm, 3128 Expr *Operand) { 3129 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3130 Operand); 3131 } 3132 3133 /// Build a new type trait expression. 3134 /// 3135 /// By default, performs semantic analysis to build the new expression. 3136 /// Subclasses may override this routine to provide different behavior. 3137 ExprResult RebuildTypeTrait(TypeTrait Trait, 3138 SourceLocation StartLoc, 3139 ArrayRef<TypeSourceInfo *> Args, 3140 SourceLocation RParenLoc) { 3141 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3142 } 3143 3144 /// Build a new array type trait expression. 3145 /// 3146 /// By default, performs semantic analysis to build the new expression. 3147 /// Subclasses may override this routine to provide different behavior. 3148 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3149 SourceLocation StartLoc, 3150 TypeSourceInfo *TSInfo, 3151 Expr *DimExpr, 3152 SourceLocation RParenLoc) { 3153 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3154 } 3155 3156 /// Build a new expression trait expression. 3157 /// 3158 /// By default, performs semantic analysis to build the new expression. 3159 /// Subclasses may override this routine to provide different behavior. 3160 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3161 SourceLocation StartLoc, 3162 Expr *Queried, 3163 SourceLocation RParenLoc) { 3164 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3165 } 3166 3167 /// Build a new (previously unresolved) declaration reference 3168 /// expression. 3169 /// 3170 /// By default, performs semantic analysis to build the new expression. 3171 /// Subclasses may override this routine to provide different behavior. 3172 ExprResult RebuildDependentScopeDeclRefExpr( 3173 NestedNameSpecifierLoc QualifierLoc, 3174 SourceLocation TemplateKWLoc, 3175 const DeclarationNameInfo &NameInfo, 3176 const TemplateArgumentListInfo *TemplateArgs, 3177 bool IsAddressOfOperand, 3178 TypeSourceInfo **RecoveryTSI) { 3179 CXXScopeSpec SS; 3180 SS.Adopt(QualifierLoc); 3181 3182 if (TemplateArgs || TemplateKWLoc.isValid()) 3183 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3184 TemplateArgs); 3185 3186 return getSema().BuildQualifiedDeclarationNameExpr( 3187 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3188 } 3189 3190 /// Build a new template-id expression. 3191 /// 3192 /// By default, performs semantic analysis to build the new expression. 3193 /// Subclasses may override this routine to provide different behavior. 3194 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3195 SourceLocation TemplateKWLoc, 3196 LookupResult &R, 3197 bool RequiresADL, 3198 const TemplateArgumentListInfo *TemplateArgs) { 3199 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3200 TemplateArgs); 3201 } 3202 3203 /// Build a new object-construction expression. 3204 /// 3205 /// By default, performs semantic analysis to build the new expression. 3206 /// Subclasses may override this routine to provide different behavior. 3207 ExprResult RebuildCXXConstructExpr(QualType T, 3208 SourceLocation Loc, 3209 CXXConstructorDecl *Constructor, 3210 bool IsElidable, 3211 MultiExprArg Args, 3212 bool HadMultipleCandidates, 3213 bool ListInitialization, 3214 bool StdInitListInitialization, 3215 bool RequiresZeroInit, 3216 CXXConstructExpr::ConstructionKind ConstructKind, 3217 SourceRange ParenRange) { 3218 // Reconstruct the constructor we originally found, which might be 3219 // different if this is a call to an inherited constructor. 3220 CXXConstructorDecl *FoundCtor = Constructor; 3221 if (Constructor->isInheritingConstructor()) 3222 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3223 3224 SmallVector<Expr *, 8> ConvertedArgs; 3225 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3226 ConvertedArgs)) 3227 return ExprError(); 3228 3229 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3230 IsElidable, 3231 ConvertedArgs, 3232 HadMultipleCandidates, 3233 ListInitialization, 3234 StdInitListInitialization, 3235 RequiresZeroInit, ConstructKind, 3236 ParenRange); 3237 } 3238 3239 /// Build a new implicit construction via inherited constructor 3240 /// expression. 3241 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3242 CXXConstructorDecl *Constructor, 3243 bool ConstructsVBase, 3244 bool InheritedFromVBase) { 3245 return new (getSema().Context) CXXInheritedCtorInitExpr( 3246 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3247 } 3248 3249 /// Build a new object-construction expression. 3250 /// 3251 /// By default, performs semantic analysis to build the new expression. 3252 /// Subclasses may override this routine to provide different behavior. 3253 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3254 SourceLocation LParenOrBraceLoc, 3255 MultiExprArg Args, 3256 SourceLocation RParenOrBraceLoc, 3257 bool ListInitialization) { 3258 return getSema().BuildCXXTypeConstructExpr( 3259 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3260 } 3261 3262 /// Build a new object-construction expression. 3263 /// 3264 /// By default, performs semantic analysis to build the new expression. 3265 /// Subclasses may override this routine to provide different behavior. 3266 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3267 SourceLocation LParenLoc, 3268 MultiExprArg Args, 3269 SourceLocation RParenLoc, 3270 bool ListInitialization) { 3271 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3272 RParenLoc, ListInitialization); 3273 } 3274 3275 /// Build a new member reference expression. 3276 /// 3277 /// By default, performs semantic analysis to build the new expression. 3278 /// Subclasses may override this routine to provide different behavior. 3279 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3280 QualType BaseType, 3281 bool IsArrow, 3282 SourceLocation OperatorLoc, 3283 NestedNameSpecifierLoc QualifierLoc, 3284 SourceLocation TemplateKWLoc, 3285 NamedDecl *FirstQualifierInScope, 3286 const DeclarationNameInfo &MemberNameInfo, 3287 const TemplateArgumentListInfo *TemplateArgs) { 3288 CXXScopeSpec SS; 3289 SS.Adopt(QualifierLoc); 3290 3291 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3292 OperatorLoc, IsArrow, 3293 SS, TemplateKWLoc, 3294 FirstQualifierInScope, 3295 MemberNameInfo, 3296 TemplateArgs, /*S*/nullptr); 3297 } 3298 3299 /// Build a new member reference expression. 3300 /// 3301 /// By default, performs semantic analysis to build the new expression. 3302 /// Subclasses may override this routine to provide different behavior. 3303 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3304 SourceLocation OperatorLoc, 3305 bool IsArrow, 3306 NestedNameSpecifierLoc QualifierLoc, 3307 SourceLocation TemplateKWLoc, 3308 NamedDecl *FirstQualifierInScope, 3309 LookupResult &R, 3310 const TemplateArgumentListInfo *TemplateArgs) { 3311 CXXScopeSpec SS; 3312 SS.Adopt(QualifierLoc); 3313 3314 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3315 OperatorLoc, IsArrow, 3316 SS, TemplateKWLoc, 3317 FirstQualifierInScope, 3318 R, TemplateArgs, /*S*/nullptr); 3319 } 3320 3321 /// Build a new noexcept expression. 3322 /// 3323 /// By default, performs semantic analysis to build the new expression. 3324 /// Subclasses may override this routine to provide different behavior. 3325 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3326 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3327 } 3328 3329 /// Build a new expression to compute the length of a parameter pack. 3330 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3331 NamedDecl *Pack, 3332 SourceLocation PackLoc, 3333 SourceLocation RParenLoc, 3334 Optional<unsigned> Length, 3335 ArrayRef<TemplateArgument> PartialArgs) { 3336 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3337 RParenLoc, Length, PartialArgs); 3338 } 3339 3340 /// Build a new expression representing a call to a source location 3341 /// builtin. 3342 /// 3343 /// By default, performs semantic analysis to build the new expression. 3344 /// Subclasses may override this routine to provide different behavior. 3345 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3346 SourceLocation BuiltinLoc, 3347 SourceLocation RPLoc, 3348 DeclContext *ParentContext) { 3349 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3350 } 3351 3352 /// Build a new Objective-C boxed expression. 3353 /// 3354 /// By default, performs semantic analysis to build the new expression. 3355 /// Subclasses may override this routine to provide different behavior. 3356 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3357 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3358 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3359 TemplateArgumentListInfo *TALI) { 3360 CXXScopeSpec SS; 3361 SS.Adopt(NNS); 3362 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3363 ConceptNameInfo, 3364 FoundDecl, 3365 NamedConcept, TALI); 3366 if (Result.isInvalid()) 3367 return ExprError(); 3368 return Result; 3369 } 3370 3371 /// \brief Build a new requires expression. 3372 /// 3373 /// By default, performs semantic analysis to build the new expression. 3374 /// Subclasses may override this routine to provide different behavior. 3375 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3376 RequiresExprBodyDecl *Body, 3377 ArrayRef<ParmVarDecl *> LocalParameters, 3378 ArrayRef<concepts::Requirement *> Requirements, 3379 SourceLocation ClosingBraceLoc) { 3380 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3381 LocalParameters, Requirements, ClosingBraceLoc); 3382 } 3383 3384 concepts::TypeRequirement * 3385 RebuildTypeRequirement( 3386 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3387 return SemaRef.BuildTypeRequirement(SubstDiag); 3388 } 3389 3390 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3391 return SemaRef.BuildTypeRequirement(T); 3392 } 3393 3394 concepts::ExprRequirement * 3395 RebuildExprRequirement( 3396 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3397 SourceLocation NoexceptLoc, 3398 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3399 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3400 std::move(Ret)); 3401 } 3402 3403 concepts::ExprRequirement * 3404 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3405 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3406 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3407 std::move(Ret)); 3408 } 3409 3410 concepts::NestedRequirement * 3411 RebuildNestedRequirement( 3412 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3413 return SemaRef.BuildNestedRequirement(SubstDiag); 3414 } 3415 3416 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3417 return SemaRef.BuildNestedRequirement(Constraint); 3418 } 3419 3420 /// \brief Build a new Objective-C boxed expression. 3421 /// 3422 /// By default, performs semantic analysis to build the new expression. 3423 /// Subclasses may override this routine to provide different behavior. 3424 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3425 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3426 } 3427 3428 /// Build a new Objective-C array literal. 3429 /// 3430 /// By default, performs semantic analysis to build the new expression. 3431 /// Subclasses may override this routine to provide different behavior. 3432 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3433 Expr **Elements, unsigned NumElements) { 3434 return getSema().BuildObjCArrayLiteral(Range, 3435 MultiExprArg(Elements, NumElements)); 3436 } 3437 3438 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3439 Expr *Base, Expr *Key, 3440 ObjCMethodDecl *getterMethod, 3441 ObjCMethodDecl *setterMethod) { 3442 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3443 getterMethod, setterMethod); 3444 } 3445 3446 /// Build a new Objective-C dictionary literal. 3447 /// 3448 /// By default, performs semantic analysis to build the new expression. 3449 /// Subclasses may override this routine to provide different behavior. 3450 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3451 MutableArrayRef<ObjCDictionaryElement> Elements) { 3452 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3453 } 3454 3455 /// Build a new Objective-C \@encode expression. 3456 /// 3457 /// By default, performs semantic analysis to build the new expression. 3458 /// Subclasses may override this routine to provide different behavior. 3459 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3460 TypeSourceInfo *EncodeTypeInfo, 3461 SourceLocation RParenLoc) { 3462 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3463 } 3464 3465 /// Build a new Objective-C class message. 3466 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3467 Selector Sel, 3468 ArrayRef<SourceLocation> SelectorLocs, 3469 ObjCMethodDecl *Method, 3470 SourceLocation LBracLoc, 3471 MultiExprArg Args, 3472 SourceLocation RBracLoc) { 3473 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3474 ReceiverTypeInfo->getType(), 3475 /*SuperLoc=*/SourceLocation(), 3476 Sel, Method, LBracLoc, SelectorLocs, 3477 RBracLoc, Args); 3478 } 3479 3480 /// Build a new Objective-C instance message. 3481 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3482 Selector Sel, 3483 ArrayRef<SourceLocation> SelectorLocs, 3484 ObjCMethodDecl *Method, 3485 SourceLocation LBracLoc, 3486 MultiExprArg Args, 3487 SourceLocation RBracLoc) { 3488 return SemaRef.BuildInstanceMessage(Receiver, 3489 Receiver->getType(), 3490 /*SuperLoc=*/SourceLocation(), 3491 Sel, Method, LBracLoc, SelectorLocs, 3492 RBracLoc, Args); 3493 } 3494 3495 /// Build a new Objective-C instance/class message to 'super'. 3496 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3497 Selector Sel, 3498 ArrayRef<SourceLocation> SelectorLocs, 3499 QualType SuperType, 3500 ObjCMethodDecl *Method, 3501 SourceLocation LBracLoc, 3502 MultiExprArg Args, 3503 SourceLocation RBracLoc) { 3504 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3505 SuperType, 3506 SuperLoc, 3507 Sel, Method, LBracLoc, SelectorLocs, 3508 RBracLoc, Args) 3509 : SemaRef.BuildClassMessage(nullptr, 3510 SuperType, 3511 SuperLoc, 3512 Sel, Method, LBracLoc, SelectorLocs, 3513 RBracLoc, Args); 3514 3515 3516 } 3517 3518 /// Build a new Objective-C ivar reference expression. 3519 /// 3520 /// By default, performs semantic analysis to build the new expression. 3521 /// Subclasses may override this routine to provide different behavior. 3522 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3523 SourceLocation IvarLoc, 3524 bool IsArrow, bool IsFreeIvar) { 3525 CXXScopeSpec SS; 3526 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3527 ExprResult Result = getSema().BuildMemberReferenceExpr( 3528 BaseArg, BaseArg->getType(), 3529 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3530 /*FirstQualifierInScope=*/nullptr, NameInfo, 3531 /*TemplateArgs=*/nullptr, 3532 /*S=*/nullptr); 3533 if (IsFreeIvar && Result.isUsable()) 3534 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3535 return Result; 3536 } 3537 3538 /// Build a new Objective-C property reference expression. 3539 /// 3540 /// By default, performs semantic analysis to build the new expression. 3541 /// Subclasses may override this routine to provide different behavior. 3542 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3543 ObjCPropertyDecl *Property, 3544 SourceLocation PropertyLoc) { 3545 CXXScopeSpec SS; 3546 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3547 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3548 /*FIXME:*/PropertyLoc, 3549 /*IsArrow=*/false, 3550 SS, SourceLocation(), 3551 /*FirstQualifierInScope=*/nullptr, 3552 NameInfo, 3553 /*TemplateArgs=*/nullptr, 3554 /*S=*/nullptr); 3555 } 3556 3557 /// Build a new Objective-C property reference expression. 3558 /// 3559 /// By default, performs semantic analysis to build the new expression. 3560 /// Subclasses may override this routine to provide different behavior. 3561 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3562 ObjCMethodDecl *Getter, 3563 ObjCMethodDecl *Setter, 3564 SourceLocation PropertyLoc) { 3565 // Since these expressions can only be value-dependent, we do not 3566 // need to perform semantic analysis again. 3567 return Owned( 3568 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3569 VK_LValue, OK_ObjCProperty, 3570 PropertyLoc, Base)); 3571 } 3572 3573 /// Build a new Objective-C "isa" expression. 3574 /// 3575 /// By default, performs semantic analysis to build the new expression. 3576 /// Subclasses may override this routine to provide different behavior. 3577 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3578 SourceLocation OpLoc, bool IsArrow) { 3579 CXXScopeSpec SS; 3580 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3581 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3582 OpLoc, IsArrow, 3583 SS, SourceLocation(), 3584 /*FirstQualifierInScope=*/nullptr, 3585 NameInfo, 3586 /*TemplateArgs=*/nullptr, 3587 /*S=*/nullptr); 3588 } 3589 3590 /// Build a new shuffle vector expression. 3591 /// 3592 /// By default, performs semantic analysis to build the new expression. 3593 /// Subclasses may override this routine to provide different behavior. 3594 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3595 MultiExprArg SubExprs, 3596 SourceLocation RParenLoc) { 3597 // Find the declaration for __builtin_shufflevector 3598 const IdentifierInfo &Name 3599 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3600 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3601 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3602 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3603 3604 // Build a reference to the __builtin_shufflevector builtin 3605 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3606 Expr *Callee = new (SemaRef.Context) 3607 DeclRefExpr(SemaRef.Context, Builtin, false, 3608 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3609 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3610 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3611 CK_BuiltinFnToFnPtr).get(); 3612 3613 // Build the CallExpr 3614 ExprResult TheCall = CallExpr::Create( 3615 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3616 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3617 FPOptionsOverride()); 3618 3619 // Type-check the __builtin_shufflevector expression. 3620 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3621 } 3622 3623 /// Build a new convert vector expression. 3624 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3625 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3626 SourceLocation RParenLoc) { 3627 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3628 BuiltinLoc, RParenLoc); 3629 } 3630 3631 /// Build a new template argument pack expansion. 3632 /// 3633 /// By default, performs semantic analysis to build a new pack expansion 3634 /// for a template argument. Subclasses may override this routine to provide 3635 /// different behavior. 3636 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3637 SourceLocation EllipsisLoc, 3638 Optional<unsigned> NumExpansions) { 3639 switch (Pattern.getArgument().getKind()) { 3640 case TemplateArgument::Expression: { 3641 ExprResult Result 3642 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3643 EllipsisLoc, NumExpansions); 3644 if (Result.isInvalid()) 3645 return TemplateArgumentLoc(); 3646 3647 return TemplateArgumentLoc(Result.get(), Result.get()); 3648 } 3649 3650 case TemplateArgument::Template: 3651 return TemplateArgumentLoc( 3652 SemaRef.Context, 3653 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3654 NumExpansions), 3655 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3656 EllipsisLoc); 3657 3658 case TemplateArgument::Null: 3659 case TemplateArgument::Integral: 3660 case TemplateArgument::Declaration: 3661 case TemplateArgument::Pack: 3662 case TemplateArgument::TemplateExpansion: 3663 case TemplateArgument::NullPtr: 3664 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3665 3666 case TemplateArgument::Type: 3667 if (TypeSourceInfo *Expansion 3668 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3669 EllipsisLoc, 3670 NumExpansions)) 3671 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3672 Expansion); 3673 break; 3674 } 3675 3676 return TemplateArgumentLoc(); 3677 } 3678 3679 /// Build a new expression pack expansion. 3680 /// 3681 /// By default, performs semantic analysis to build a new pack expansion 3682 /// for an expression. Subclasses may override this routine to provide 3683 /// different behavior. 3684 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3685 Optional<unsigned> NumExpansions) { 3686 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3687 } 3688 3689 /// Build a new C++1z fold-expression. 3690 /// 3691 /// By default, performs semantic analysis in order to build a new fold 3692 /// expression. 3693 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3694 SourceLocation LParenLoc, Expr *LHS, 3695 BinaryOperatorKind Operator, 3696 SourceLocation EllipsisLoc, Expr *RHS, 3697 SourceLocation RParenLoc, 3698 Optional<unsigned> NumExpansions) { 3699 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3700 EllipsisLoc, RHS, RParenLoc, 3701 NumExpansions); 3702 } 3703 3704 /// Build an empty C++1z fold-expression with the given operator. 3705 /// 3706 /// By default, produces the fallback value for the fold-expression, or 3707 /// produce an error if there is no fallback value. 3708 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3709 BinaryOperatorKind Operator) { 3710 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3711 } 3712 3713 /// Build a new atomic operation expression. 3714 /// 3715 /// By default, performs semantic analysis to build the new expression. 3716 /// Subclasses may override this routine to provide different behavior. 3717 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3718 AtomicExpr::AtomicOp Op, 3719 SourceLocation RParenLoc) { 3720 // Use this for all of the locations, since we don't know the difference 3721 // between the call and the expr at this point. 3722 SourceRange Range{BuiltinLoc, RParenLoc}; 3723 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3724 Sema::AtomicArgumentOrder::AST); 3725 } 3726 3727 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3728 ArrayRef<Expr *> SubExprs, QualType Type) { 3729 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3730 } 3731 3732 private: 3733 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3734 QualType ObjectType, 3735 NamedDecl *FirstQualifierInScope, 3736 CXXScopeSpec &SS); 3737 3738 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3739 QualType ObjectType, 3740 NamedDecl *FirstQualifierInScope, 3741 CXXScopeSpec &SS); 3742 3743 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3744 NamedDecl *FirstQualifierInScope, 3745 CXXScopeSpec &SS); 3746 3747 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3748 DependentNameTypeLoc TL, 3749 bool DeducibleTSTContext); 3750 }; 3751 3752 template <typename Derived> 3753 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3754 if (!S) 3755 return S; 3756 3757 switch (S->getStmtClass()) { 3758 case Stmt::NoStmtClass: break; 3759 3760 // Transform individual statement nodes 3761 // Pass SDK into statements that can produce a value 3762 #define STMT(Node, Parent) \ 3763 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3764 #define VALUESTMT(Node, Parent) \ 3765 case Stmt::Node##Class: \ 3766 return getDerived().Transform##Node(cast<Node>(S), SDK); 3767 #define ABSTRACT_STMT(Node) 3768 #define EXPR(Node, Parent) 3769 #include "clang/AST/StmtNodes.inc" 3770 3771 // Transform expressions by calling TransformExpr. 3772 #define STMT(Node, Parent) 3773 #define ABSTRACT_STMT(Stmt) 3774 #define EXPR(Node, Parent) case Stmt::Node##Class: 3775 #include "clang/AST/StmtNodes.inc" 3776 { 3777 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3778 3779 if (SDK == SDK_StmtExprResult) 3780 E = getSema().ActOnStmtExprResult(E); 3781 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3782 } 3783 } 3784 3785 return S; 3786 } 3787 3788 template<typename Derived> 3789 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3790 if (!S) 3791 return S; 3792 3793 switch (S->getClauseKind()) { 3794 default: break; 3795 // Transform individual clause nodes 3796 #define GEN_CLANG_CLAUSE_CLASS 3797 #define CLAUSE_CLASS(Enum, Str, Class) \ 3798 case Enum: \ 3799 return getDerived().Transform##Class(cast<Class>(S)); 3800 #include "llvm/Frontend/OpenMP/OMP.inc" 3801 } 3802 3803 return S; 3804 } 3805 3806 3807 template<typename Derived> 3808 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3809 if (!E) 3810 return E; 3811 3812 switch (E->getStmtClass()) { 3813 case Stmt::NoStmtClass: break; 3814 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3815 #define ABSTRACT_STMT(Stmt) 3816 #define EXPR(Node, Parent) \ 3817 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3818 #include "clang/AST/StmtNodes.inc" 3819 } 3820 3821 return E; 3822 } 3823 3824 template<typename Derived> 3825 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3826 bool NotCopyInit) { 3827 // Initializers are instantiated like expressions, except that various outer 3828 // layers are stripped. 3829 if (!Init) 3830 return Init; 3831 3832 if (auto *FE = dyn_cast<FullExpr>(Init)) 3833 Init = FE->getSubExpr(); 3834 3835 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3836 Init = AIL->getCommonExpr(); 3837 3838 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3839 Init = MTE->getSubExpr(); 3840 3841 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3842 Init = Binder->getSubExpr(); 3843 3844 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3845 Init = ICE->getSubExprAsWritten(); 3846 3847 if (CXXStdInitializerListExpr *ILE = 3848 dyn_cast<CXXStdInitializerListExpr>(Init)) 3849 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3850 3851 // If this is copy-initialization, we only need to reconstruct 3852 // InitListExprs. Other forms of copy-initialization will be a no-op if 3853 // the initializer is already the right type. 3854 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3855 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3856 return getDerived().TransformExpr(Init); 3857 3858 // Revert value-initialization back to empty parens. 3859 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3860 SourceRange Parens = VIE->getSourceRange(); 3861 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3862 Parens.getEnd()); 3863 } 3864 3865 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3866 if (isa<ImplicitValueInitExpr>(Init)) 3867 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3868 SourceLocation()); 3869 3870 // Revert initialization by constructor back to a parenthesized or braced list 3871 // of expressions. Any other form of initializer can just be reused directly. 3872 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3873 return getDerived().TransformExpr(Init); 3874 3875 // If the initialization implicitly converted an initializer list to a 3876 // std::initializer_list object, unwrap the std::initializer_list too. 3877 if (Construct && Construct->isStdInitListInitialization()) 3878 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3879 3880 // Enter a list-init context if this was list initialization. 3881 EnterExpressionEvaluationContext Context( 3882 getSema(), EnterExpressionEvaluationContext::InitList, 3883 Construct->isListInitialization()); 3884 3885 SmallVector<Expr*, 8> NewArgs; 3886 bool ArgChanged = false; 3887 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3888 /*IsCall*/true, NewArgs, &ArgChanged)) 3889 return ExprError(); 3890 3891 // If this was list initialization, revert to syntactic list form. 3892 if (Construct->isListInitialization()) 3893 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3894 Construct->getEndLoc()); 3895 3896 // Build a ParenListExpr to represent anything else. 3897 SourceRange Parens = Construct->getParenOrBraceRange(); 3898 if (Parens.isInvalid()) { 3899 // This was a variable declaration's initialization for which no initializer 3900 // was specified. 3901 assert(NewArgs.empty() && 3902 "no parens or braces but have direct init with arguments?"); 3903 return ExprEmpty(); 3904 } 3905 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3906 Parens.getEnd()); 3907 } 3908 3909 template<typename Derived> 3910 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3911 unsigned NumInputs, 3912 bool IsCall, 3913 SmallVectorImpl<Expr *> &Outputs, 3914 bool *ArgChanged) { 3915 for (unsigned I = 0; I != NumInputs; ++I) { 3916 // If requested, drop call arguments that need to be dropped. 3917 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3918 if (ArgChanged) 3919 *ArgChanged = true; 3920 3921 break; 3922 } 3923 3924 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3925 Expr *Pattern = Expansion->getPattern(); 3926 3927 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3928 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3929 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3930 3931 // Determine whether the set of unexpanded parameter packs can and should 3932 // be expanded. 3933 bool Expand = true; 3934 bool RetainExpansion = false; 3935 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3936 Optional<unsigned> NumExpansions = OrigNumExpansions; 3937 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3938 Pattern->getSourceRange(), 3939 Unexpanded, 3940 Expand, RetainExpansion, 3941 NumExpansions)) 3942 return true; 3943 3944 if (!Expand) { 3945 // The transform has determined that we should perform a simple 3946 // transformation on the pack expansion, producing another pack 3947 // expansion. 3948 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3949 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3950 if (OutPattern.isInvalid()) 3951 return true; 3952 3953 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3954 Expansion->getEllipsisLoc(), 3955 NumExpansions); 3956 if (Out.isInvalid()) 3957 return true; 3958 3959 if (ArgChanged) 3960 *ArgChanged = true; 3961 Outputs.push_back(Out.get()); 3962 continue; 3963 } 3964 3965 // Record right away that the argument was changed. This needs 3966 // to happen even if the array expands to nothing. 3967 if (ArgChanged) *ArgChanged = true; 3968 3969 // The transform has determined that we should perform an elementwise 3970 // expansion of the pattern. Do so. 3971 for (unsigned I = 0; I != *NumExpansions; ++I) { 3972 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3973 ExprResult Out = getDerived().TransformExpr(Pattern); 3974 if (Out.isInvalid()) 3975 return true; 3976 3977 if (Out.get()->containsUnexpandedParameterPack()) { 3978 Out = getDerived().RebuildPackExpansion( 3979 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3980 if (Out.isInvalid()) 3981 return true; 3982 } 3983 3984 Outputs.push_back(Out.get()); 3985 } 3986 3987 // If we're supposed to retain a pack expansion, do so by temporarily 3988 // forgetting the partially-substituted parameter pack. 3989 if (RetainExpansion) { 3990 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3991 3992 ExprResult Out = getDerived().TransformExpr(Pattern); 3993 if (Out.isInvalid()) 3994 return true; 3995 3996 Out = getDerived().RebuildPackExpansion( 3997 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3998 if (Out.isInvalid()) 3999 return true; 4000 4001 Outputs.push_back(Out.get()); 4002 } 4003 4004 continue; 4005 } 4006 4007 ExprResult Result = 4008 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4009 : getDerived().TransformExpr(Inputs[I]); 4010 if (Result.isInvalid()) 4011 return true; 4012 4013 if (Result.get() != Inputs[I] && ArgChanged) 4014 *ArgChanged = true; 4015 4016 Outputs.push_back(Result.get()); 4017 } 4018 4019 return false; 4020 } 4021 4022 template <typename Derived> 4023 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4024 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4025 if (Var) { 4026 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4027 getDerived().TransformDefinition(Var->getLocation(), Var)); 4028 4029 if (!ConditionVar) 4030 return Sema::ConditionError(); 4031 4032 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4033 } 4034 4035 if (Expr) { 4036 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4037 4038 if (CondExpr.isInvalid()) 4039 return Sema::ConditionError(); 4040 4041 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 4042 } 4043 4044 return Sema::ConditionResult(); 4045 } 4046 4047 template <typename Derived> 4048 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4049 NestedNameSpecifierLoc NNS, QualType ObjectType, 4050 NamedDecl *FirstQualifierInScope) { 4051 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4052 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4053 Qualifier = Qualifier.getPrefix()) 4054 Qualifiers.push_back(Qualifier); 4055 4056 CXXScopeSpec SS; 4057 while (!Qualifiers.empty()) { 4058 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4059 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4060 4061 switch (QNNS->getKind()) { 4062 case NestedNameSpecifier::Identifier: { 4063 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4064 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4065 ObjectType); 4066 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4067 SS, FirstQualifierInScope, false)) 4068 return NestedNameSpecifierLoc(); 4069 break; 4070 } 4071 4072 case NestedNameSpecifier::Namespace: { 4073 NamespaceDecl *NS = 4074 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4075 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4076 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4077 break; 4078 } 4079 4080 case NestedNameSpecifier::NamespaceAlias: { 4081 NamespaceAliasDecl *Alias = 4082 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4083 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4084 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4085 Q.getLocalEndLoc()); 4086 break; 4087 } 4088 4089 case NestedNameSpecifier::Global: 4090 // There is no meaningful transformation that one could perform on the 4091 // global scope. 4092 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4093 break; 4094 4095 case NestedNameSpecifier::Super: { 4096 CXXRecordDecl *RD = 4097 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4098 SourceLocation(), QNNS->getAsRecordDecl())); 4099 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4100 break; 4101 } 4102 4103 case NestedNameSpecifier::TypeSpecWithTemplate: 4104 case NestedNameSpecifier::TypeSpec: { 4105 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4106 FirstQualifierInScope, SS); 4107 4108 if (!TL) 4109 return NestedNameSpecifierLoc(); 4110 4111 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4112 (SemaRef.getLangOpts().CPlusPlus11 && 4113 TL.getType()->isEnumeralType())) { 4114 assert(!TL.getType().hasLocalQualifiers() && 4115 "Can't get cv-qualifiers here"); 4116 if (TL.getType()->isEnumeralType()) 4117 SemaRef.Diag(TL.getBeginLoc(), 4118 diag::warn_cxx98_compat_enum_nested_name_spec); 4119 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4120 Q.getLocalEndLoc()); 4121 break; 4122 } 4123 // If the nested-name-specifier is an invalid type def, don't emit an 4124 // error because a previous error should have already been emitted. 4125 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4126 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4127 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4128 << TL.getType() << SS.getRange(); 4129 } 4130 return NestedNameSpecifierLoc(); 4131 } 4132 } 4133 4134 // The qualifier-in-scope and object type only apply to the leftmost entity. 4135 FirstQualifierInScope = nullptr; 4136 ObjectType = QualType(); 4137 } 4138 4139 // Don't rebuild the nested-name-specifier if we don't have to. 4140 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4141 !getDerived().AlwaysRebuild()) 4142 return NNS; 4143 4144 // If we can re-use the source-location data from the original 4145 // nested-name-specifier, do so. 4146 if (SS.location_size() == NNS.getDataLength() && 4147 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4148 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4149 4150 // Allocate new nested-name-specifier location information. 4151 return SS.getWithLocInContext(SemaRef.Context); 4152 } 4153 4154 template<typename Derived> 4155 DeclarationNameInfo 4156 TreeTransform<Derived> 4157 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4158 DeclarationName Name = NameInfo.getName(); 4159 if (!Name) 4160 return DeclarationNameInfo(); 4161 4162 switch (Name.getNameKind()) { 4163 case DeclarationName::Identifier: 4164 case DeclarationName::ObjCZeroArgSelector: 4165 case DeclarationName::ObjCOneArgSelector: 4166 case DeclarationName::ObjCMultiArgSelector: 4167 case DeclarationName::CXXOperatorName: 4168 case DeclarationName::CXXLiteralOperatorName: 4169 case DeclarationName::CXXUsingDirective: 4170 return NameInfo; 4171 4172 case DeclarationName::CXXDeductionGuideName: { 4173 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4174 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4175 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4176 if (!NewTemplate) 4177 return DeclarationNameInfo(); 4178 4179 DeclarationNameInfo NewNameInfo(NameInfo); 4180 NewNameInfo.setName( 4181 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4182 return NewNameInfo; 4183 } 4184 4185 case DeclarationName::CXXConstructorName: 4186 case DeclarationName::CXXDestructorName: 4187 case DeclarationName::CXXConversionFunctionName: { 4188 TypeSourceInfo *NewTInfo; 4189 CanQualType NewCanTy; 4190 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4191 NewTInfo = getDerived().TransformType(OldTInfo); 4192 if (!NewTInfo) 4193 return DeclarationNameInfo(); 4194 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4195 } 4196 else { 4197 NewTInfo = nullptr; 4198 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4199 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4200 if (NewT.isNull()) 4201 return DeclarationNameInfo(); 4202 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4203 } 4204 4205 DeclarationName NewName 4206 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4207 NewCanTy); 4208 DeclarationNameInfo NewNameInfo(NameInfo); 4209 NewNameInfo.setName(NewName); 4210 NewNameInfo.setNamedTypeInfo(NewTInfo); 4211 return NewNameInfo; 4212 } 4213 } 4214 4215 llvm_unreachable("Unknown name kind."); 4216 } 4217 4218 template<typename Derived> 4219 TemplateName 4220 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4221 TemplateName Name, 4222 SourceLocation NameLoc, 4223 QualType ObjectType, 4224 NamedDecl *FirstQualifierInScope, 4225 bool AllowInjectedClassName) { 4226 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4227 TemplateDecl *Template = QTN->getTemplateDecl(); 4228 assert(Template && "qualified template name must refer to a template"); 4229 4230 TemplateDecl *TransTemplate 4231 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4232 Template)); 4233 if (!TransTemplate) 4234 return TemplateName(); 4235 4236 if (!getDerived().AlwaysRebuild() && 4237 SS.getScopeRep() == QTN->getQualifier() && 4238 TransTemplate == Template) 4239 return Name; 4240 4241 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4242 TransTemplate); 4243 } 4244 4245 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4246 if (SS.getScopeRep()) { 4247 // These apply to the scope specifier, not the template. 4248 ObjectType = QualType(); 4249 FirstQualifierInScope = nullptr; 4250 } 4251 4252 if (!getDerived().AlwaysRebuild() && 4253 SS.getScopeRep() == DTN->getQualifier() && 4254 ObjectType.isNull()) 4255 return Name; 4256 4257 // FIXME: Preserve the location of the "template" keyword. 4258 SourceLocation TemplateKWLoc = NameLoc; 4259 4260 if (DTN->isIdentifier()) { 4261 return getDerived().RebuildTemplateName(SS, 4262 TemplateKWLoc, 4263 *DTN->getIdentifier(), 4264 NameLoc, 4265 ObjectType, 4266 FirstQualifierInScope, 4267 AllowInjectedClassName); 4268 } 4269 4270 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4271 DTN->getOperator(), NameLoc, 4272 ObjectType, AllowInjectedClassName); 4273 } 4274 4275 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 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 TransTemplate == Template) 4284 return Name; 4285 4286 return TemplateName(TransTemplate); 4287 } 4288 4289 if (SubstTemplateTemplateParmPackStorage *SubstPack 4290 = Name.getAsSubstTemplateTemplateParmPack()) { 4291 TemplateTemplateParmDecl *TransParam 4292 = cast_or_null<TemplateTemplateParmDecl>( 4293 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4294 if (!TransParam) 4295 return TemplateName(); 4296 4297 if (!getDerived().AlwaysRebuild() && 4298 TransParam == SubstPack->getParameterPack()) 4299 return Name; 4300 4301 return getDerived().RebuildTemplateName(TransParam, 4302 SubstPack->getArgumentPack()); 4303 } 4304 4305 // These should be getting filtered out before they reach the AST. 4306 llvm_unreachable("overloaded function decl survived to here"); 4307 } 4308 4309 template<typename Derived> 4310 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4311 const TemplateArgument &Arg, 4312 TemplateArgumentLoc &Output) { 4313 Output = getSema().getTrivialTemplateArgumentLoc( 4314 Arg, QualType(), getDerived().getBaseLocation()); 4315 } 4316 4317 template<typename Derived> 4318 bool TreeTransform<Derived>::TransformTemplateArgument( 4319 const TemplateArgumentLoc &Input, 4320 TemplateArgumentLoc &Output, bool Uneval) { 4321 const TemplateArgument &Arg = Input.getArgument(); 4322 switch (Arg.getKind()) { 4323 case TemplateArgument::Null: 4324 case TemplateArgument::Pack: 4325 llvm_unreachable("Unexpected TemplateArgument"); 4326 4327 case TemplateArgument::Integral: 4328 case TemplateArgument::NullPtr: 4329 case TemplateArgument::Declaration: { 4330 // Transform a resolved template argument straight to a resolved template 4331 // argument. We get here when substituting into an already-substituted 4332 // template type argument during concept satisfaction checking. 4333 QualType T = Arg.getNonTypeTemplateArgumentType(); 4334 QualType NewT = getDerived().TransformType(T); 4335 if (NewT.isNull()) 4336 return true; 4337 4338 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4339 ? Arg.getAsDecl() 4340 : nullptr; 4341 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4342 getDerived().getBaseLocation(), D)) 4343 : nullptr; 4344 if (D && !NewD) 4345 return true; 4346 4347 if (NewT == T && D == NewD) 4348 Output = Input; 4349 else if (Arg.getKind() == TemplateArgument::Integral) 4350 Output = TemplateArgumentLoc( 4351 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4352 TemplateArgumentLocInfo()); 4353 else if (Arg.getKind() == TemplateArgument::NullPtr) 4354 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4355 TemplateArgumentLocInfo()); 4356 else 4357 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4358 TemplateArgumentLocInfo()); 4359 4360 return false; 4361 } 4362 4363 case TemplateArgument::Type: { 4364 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4365 if (!DI) 4366 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4367 4368 DI = getDerived().TransformType(DI); 4369 if (!DI) return true; 4370 4371 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4372 return false; 4373 } 4374 4375 case TemplateArgument::Template: { 4376 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4377 if (QualifierLoc) { 4378 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4379 if (!QualifierLoc) 4380 return true; 4381 } 4382 4383 CXXScopeSpec SS; 4384 SS.Adopt(QualifierLoc); 4385 TemplateName Template 4386 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4387 Input.getTemplateNameLoc()); 4388 if (Template.isNull()) 4389 return true; 4390 4391 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4392 QualifierLoc, Input.getTemplateNameLoc()); 4393 return false; 4394 } 4395 4396 case TemplateArgument::TemplateExpansion: 4397 llvm_unreachable("Caller should expand pack expansions"); 4398 4399 case TemplateArgument::Expression: { 4400 // Template argument expressions are constant expressions. 4401 EnterExpressionEvaluationContext Unevaluated( 4402 getSema(), 4403 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4404 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4405 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4406 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4407 4408 Expr *InputExpr = Input.getSourceExpression(); 4409 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4410 4411 ExprResult E = getDerived().TransformExpr(InputExpr); 4412 E = SemaRef.ActOnConstantExpression(E); 4413 if (E.isInvalid()) return true; 4414 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4415 return false; 4416 } 4417 } 4418 4419 // Work around bogus GCC warning 4420 return true; 4421 } 4422 4423 /// Iterator adaptor that invents template argument location information 4424 /// for each of the template arguments in its underlying iterator. 4425 template<typename Derived, typename InputIterator> 4426 class TemplateArgumentLocInventIterator { 4427 TreeTransform<Derived> &Self; 4428 InputIterator Iter; 4429 4430 public: 4431 typedef TemplateArgumentLoc value_type; 4432 typedef TemplateArgumentLoc reference; 4433 typedef typename std::iterator_traits<InputIterator>::difference_type 4434 difference_type; 4435 typedef std::input_iterator_tag iterator_category; 4436 4437 class pointer { 4438 TemplateArgumentLoc Arg; 4439 4440 public: 4441 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4442 4443 const TemplateArgumentLoc *operator->() const { return &Arg; } 4444 }; 4445 4446 TemplateArgumentLocInventIterator() { } 4447 4448 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4449 InputIterator Iter) 4450 : Self(Self), Iter(Iter) { } 4451 4452 TemplateArgumentLocInventIterator &operator++() { 4453 ++Iter; 4454 return *this; 4455 } 4456 4457 TemplateArgumentLocInventIterator operator++(int) { 4458 TemplateArgumentLocInventIterator Old(*this); 4459 ++(*this); 4460 return Old; 4461 } 4462 4463 reference operator*() const { 4464 TemplateArgumentLoc Result; 4465 Self.InventTemplateArgumentLoc(*Iter, Result); 4466 return Result; 4467 } 4468 4469 pointer operator->() const { return pointer(**this); } 4470 4471 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4472 const TemplateArgumentLocInventIterator &Y) { 4473 return X.Iter == Y.Iter; 4474 } 4475 4476 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4477 const TemplateArgumentLocInventIterator &Y) { 4478 return X.Iter != Y.Iter; 4479 } 4480 }; 4481 4482 template<typename Derived> 4483 template<typename InputIterator> 4484 bool TreeTransform<Derived>::TransformTemplateArguments( 4485 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4486 bool Uneval) { 4487 for (; First != Last; ++First) { 4488 TemplateArgumentLoc Out; 4489 TemplateArgumentLoc In = *First; 4490 4491 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4492 // Unpack argument packs, which we translate them into separate 4493 // arguments. 4494 // FIXME: We could do much better if we could guarantee that the 4495 // TemplateArgumentLocInfo for the pack expansion would be usable for 4496 // all of the template arguments in the argument pack. 4497 typedef TemplateArgumentLocInventIterator<Derived, 4498 TemplateArgument::pack_iterator> 4499 PackLocIterator; 4500 if (TransformTemplateArguments(PackLocIterator(*this, 4501 In.getArgument().pack_begin()), 4502 PackLocIterator(*this, 4503 In.getArgument().pack_end()), 4504 Outputs, Uneval)) 4505 return true; 4506 4507 continue; 4508 } 4509 4510 if (In.getArgument().isPackExpansion()) { 4511 // We have a pack expansion, for which we will be substituting into 4512 // the pattern. 4513 SourceLocation Ellipsis; 4514 Optional<unsigned> OrigNumExpansions; 4515 TemplateArgumentLoc Pattern 4516 = getSema().getTemplateArgumentPackExpansionPattern( 4517 In, Ellipsis, OrigNumExpansions); 4518 4519 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4520 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4521 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4522 4523 // Determine whether the set of unexpanded parameter packs can and should 4524 // be expanded. 4525 bool Expand = true; 4526 bool RetainExpansion = false; 4527 Optional<unsigned> NumExpansions = OrigNumExpansions; 4528 if (getDerived().TryExpandParameterPacks(Ellipsis, 4529 Pattern.getSourceRange(), 4530 Unexpanded, 4531 Expand, 4532 RetainExpansion, 4533 NumExpansions)) 4534 return true; 4535 4536 if (!Expand) { 4537 // The transform has determined that we should perform a simple 4538 // transformation on the pack expansion, producing another pack 4539 // expansion. 4540 TemplateArgumentLoc OutPattern; 4541 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4542 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4543 return true; 4544 4545 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4546 NumExpansions); 4547 if (Out.getArgument().isNull()) 4548 return true; 4549 4550 Outputs.addArgument(Out); 4551 continue; 4552 } 4553 4554 // The transform has determined that we should perform an elementwise 4555 // expansion of the pattern. Do so. 4556 for (unsigned I = 0; I != *NumExpansions; ++I) { 4557 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4558 4559 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4560 return true; 4561 4562 if (Out.getArgument().containsUnexpandedParameterPack()) { 4563 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4564 OrigNumExpansions); 4565 if (Out.getArgument().isNull()) 4566 return true; 4567 } 4568 4569 Outputs.addArgument(Out); 4570 } 4571 4572 // If we're supposed to retain a pack expansion, do so by temporarily 4573 // forgetting the partially-substituted parameter pack. 4574 if (RetainExpansion) { 4575 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4576 4577 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4578 return true; 4579 4580 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4581 OrigNumExpansions); 4582 if (Out.getArgument().isNull()) 4583 return true; 4584 4585 Outputs.addArgument(Out); 4586 } 4587 4588 continue; 4589 } 4590 4591 // The simple case: 4592 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4593 return true; 4594 4595 Outputs.addArgument(Out); 4596 } 4597 4598 return false; 4599 4600 } 4601 4602 //===----------------------------------------------------------------------===// 4603 // Type transformation 4604 //===----------------------------------------------------------------------===// 4605 4606 template<typename Derived> 4607 QualType TreeTransform<Derived>::TransformType(QualType T) { 4608 if (getDerived().AlreadyTransformed(T)) 4609 return T; 4610 4611 // Temporary workaround. All of these transformations should 4612 // eventually turn into transformations on TypeLocs. 4613 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4614 getDerived().getBaseLocation()); 4615 4616 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4617 4618 if (!NewDI) 4619 return QualType(); 4620 4621 return NewDI->getType(); 4622 } 4623 4624 template<typename Derived> 4625 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4626 // Refine the base location to the type's location. 4627 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4628 getDerived().getBaseEntity()); 4629 if (getDerived().AlreadyTransformed(DI->getType())) 4630 return DI; 4631 4632 TypeLocBuilder TLB; 4633 4634 TypeLoc TL = DI->getTypeLoc(); 4635 TLB.reserve(TL.getFullDataSize()); 4636 4637 QualType Result = getDerived().TransformType(TLB, TL); 4638 if (Result.isNull()) 4639 return nullptr; 4640 4641 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4642 } 4643 4644 template<typename Derived> 4645 QualType 4646 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4647 switch (T.getTypeLocClass()) { 4648 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4649 #define TYPELOC(CLASS, PARENT) \ 4650 case TypeLoc::CLASS: \ 4651 return getDerived().Transform##CLASS##Type(TLB, \ 4652 T.castAs<CLASS##TypeLoc>()); 4653 #include "clang/AST/TypeLocNodes.def" 4654 } 4655 4656 llvm_unreachable("unhandled type loc!"); 4657 } 4658 4659 template<typename Derived> 4660 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4661 if (!isa<DependentNameType>(T)) 4662 return TransformType(T); 4663 4664 if (getDerived().AlreadyTransformed(T)) 4665 return T; 4666 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4667 getDerived().getBaseLocation()); 4668 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4669 return NewDI ? NewDI->getType() : QualType(); 4670 } 4671 4672 template<typename Derived> 4673 TypeSourceInfo * 4674 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4675 if (!isa<DependentNameType>(DI->getType())) 4676 return TransformType(DI); 4677 4678 // Refine the base location to the type's location. 4679 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4680 getDerived().getBaseEntity()); 4681 if (getDerived().AlreadyTransformed(DI->getType())) 4682 return DI; 4683 4684 TypeLocBuilder TLB; 4685 4686 TypeLoc TL = DI->getTypeLoc(); 4687 TLB.reserve(TL.getFullDataSize()); 4688 4689 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4690 if (QTL) 4691 TL = QTL.getUnqualifiedLoc(); 4692 4693 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4694 4695 QualType Result = getDerived().TransformDependentNameType( 4696 TLB, DNTL, /*DeducedTSTContext*/true); 4697 if (Result.isNull()) 4698 return nullptr; 4699 4700 if (QTL) { 4701 Result = getDerived().RebuildQualifiedType(Result, QTL); 4702 if (Result.isNull()) 4703 return nullptr; 4704 TLB.TypeWasModifiedSafely(Result); 4705 } 4706 4707 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4708 } 4709 4710 template<typename Derived> 4711 QualType 4712 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4713 QualifiedTypeLoc T) { 4714 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4715 if (Result.isNull()) 4716 return QualType(); 4717 4718 Result = getDerived().RebuildQualifiedType(Result, T); 4719 4720 if (Result.isNull()) 4721 return QualType(); 4722 4723 // RebuildQualifiedType might have updated the type, but not in a way 4724 // that invalidates the TypeLoc. (There's no location information for 4725 // qualifiers.) 4726 TLB.TypeWasModifiedSafely(Result); 4727 4728 return Result; 4729 } 4730 4731 template <typename Derived> 4732 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4733 QualifiedTypeLoc TL) { 4734 4735 SourceLocation Loc = TL.getBeginLoc(); 4736 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4737 4738 if (((T.getAddressSpace() != LangAS::Default && 4739 Quals.getAddressSpace() != LangAS::Default)) && 4740 T.getAddressSpace() != Quals.getAddressSpace()) { 4741 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4742 << TL.getType() << T; 4743 return QualType(); 4744 } 4745 4746 // C++ [dcl.fct]p7: 4747 // [When] adding cv-qualifications on top of the function type [...] the 4748 // cv-qualifiers are ignored. 4749 if (T->isFunctionType()) { 4750 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4751 Quals.getAddressSpace()); 4752 return T; 4753 } 4754 4755 // C++ [dcl.ref]p1: 4756 // when the cv-qualifiers are introduced through the use of a typedef-name 4757 // or decltype-specifier [...] the cv-qualifiers are ignored. 4758 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4759 // applied to a reference type. 4760 if (T->isReferenceType()) { 4761 // The only qualifier that applies to a reference type is restrict. 4762 if (!Quals.hasRestrict()) 4763 return T; 4764 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4765 } 4766 4767 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4768 // resulting type. 4769 if (Quals.hasObjCLifetime()) { 4770 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4771 Quals.removeObjCLifetime(); 4772 else if (T.getObjCLifetime()) { 4773 // Objective-C ARC: 4774 // A lifetime qualifier applied to a substituted template parameter 4775 // overrides the lifetime qualifier from the template argument. 4776 const AutoType *AutoTy; 4777 if (const SubstTemplateTypeParmType *SubstTypeParam 4778 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4779 QualType Replacement = SubstTypeParam->getReplacementType(); 4780 Qualifiers Qs = Replacement.getQualifiers(); 4781 Qs.removeObjCLifetime(); 4782 Replacement = SemaRef.Context.getQualifiedType( 4783 Replacement.getUnqualifiedType(), Qs); 4784 T = SemaRef.Context.getSubstTemplateTypeParmType( 4785 SubstTypeParam->getReplacedParameter(), Replacement); 4786 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4787 // 'auto' types behave the same way as template parameters. 4788 QualType Deduced = AutoTy->getDeducedType(); 4789 Qualifiers Qs = Deduced.getQualifiers(); 4790 Qs.removeObjCLifetime(); 4791 Deduced = 4792 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4793 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4794 AutoTy->isDependentType(), 4795 /*isPack=*/false, 4796 AutoTy->getTypeConstraintConcept(), 4797 AutoTy->getTypeConstraintArguments()); 4798 } else { 4799 // Otherwise, complain about the addition of a qualifier to an 4800 // already-qualified type. 4801 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4802 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4803 Quals.removeObjCLifetime(); 4804 } 4805 } 4806 } 4807 4808 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4809 } 4810 4811 template<typename Derived> 4812 TypeLoc 4813 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4814 QualType ObjectType, 4815 NamedDecl *UnqualLookup, 4816 CXXScopeSpec &SS) { 4817 if (getDerived().AlreadyTransformed(TL.getType())) 4818 return TL; 4819 4820 TypeSourceInfo *TSI = 4821 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4822 if (TSI) 4823 return TSI->getTypeLoc(); 4824 return TypeLoc(); 4825 } 4826 4827 template<typename Derived> 4828 TypeSourceInfo * 4829 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4830 QualType ObjectType, 4831 NamedDecl *UnqualLookup, 4832 CXXScopeSpec &SS) { 4833 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4834 return TSInfo; 4835 4836 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4837 UnqualLookup, SS); 4838 } 4839 4840 template <typename Derived> 4841 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4842 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4843 CXXScopeSpec &SS) { 4844 QualType T = TL.getType(); 4845 assert(!getDerived().AlreadyTransformed(T)); 4846 4847 TypeLocBuilder TLB; 4848 QualType Result; 4849 4850 if (isa<TemplateSpecializationType>(T)) { 4851 TemplateSpecializationTypeLoc SpecTL = 4852 TL.castAs<TemplateSpecializationTypeLoc>(); 4853 4854 TemplateName Template = getDerived().TransformTemplateName( 4855 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4856 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4857 if (Template.isNull()) 4858 return nullptr; 4859 4860 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4861 Template); 4862 } else if (isa<DependentTemplateSpecializationType>(T)) { 4863 DependentTemplateSpecializationTypeLoc SpecTL = 4864 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4865 4866 TemplateName Template 4867 = getDerived().RebuildTemplateName(SS, 4868 SpecTL.getTemplateKeywordLoc(), 4869 *SpecTL.getTypePtr()->getIdentifier(), 4870 SpecTL.getTemplateNameLoc(), 4871 ObjectType, UnqualLookup, 4872 /*AllowInjectedClassName*/true); 4873 if (Template.isNull()) 4874 return nullptr; 4875 4876 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4877 SpecTL, 4878 Template, 4879 SS); 4880 } else { 4881 // Nothing special needs to be done for these. 4882 Result = getDerived().TransformType(TLB, TL); 4883 } 4884 4885 if (Result.isNull()) 4886 return nullptr; 4887 4888 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4889 } 4890 4891 template <class TyLoc> static inline 4892 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4893 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4894 NewT.setNameLoc(T.getNameLoc()); 4895 return T.getType(); 4896 } 4897 4898 template<typename Derived> 4899 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4900 BuiltinTypeLoc T) { 4901 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4902 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4903 if (T.needsExtraLocalData()) 4904 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4905 return T.getType(); 4906 } 4907 4908 template<typename Derived> 4909 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4910 ComplexTypeLoc T) { 4911 // FIXME: recurse? 4912 return TransformTypeSpecType(TLB, T); 4913 } 4914 4915 template <typename Derived> 4916 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4917 AdjustedTypeLoc TL) { 4918 // Adjustments applied during transformation are handled elsewhere. 4919 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4920 } 4921 4922 template<typename Derived> 4923 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4924 DecayedTypeLoc TL) { 4925 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4926 if (OriginalType.isNull()) 4927 return QualType(); 4928 4929 QualType Result = TL.getType(); 4930 if (getDerived().AlwaysRebuild() || 4931 OriginalType != TL.getOriginalLoc().getType()) 4932 Result = SemaRef.Context.getDecayedType(OriginalType); 4933 TLB.push<DecayedTypeLoc>(Result); 4934 // Nothing to set for DecayedTypeLoc. 4935 return Result; 4936 } 4937 4938 template<typename Derived> 4939 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4940 PointerTypeLoc TL) { 4941 QualType PointeeType 4942 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4943 if (PointeeType.isNull()) 4944 return QualType(); 4945 4946 QualType Result = TL.getType(); 4947 if (PointeeType->getAs<ObjCObjectType>()) { 4948 // A dependent pointer type 'T *' has is being transformed such 4949 // that an Objective-C class type is being replaced for 'T'. The 4950 // resulting pointer type is an ObjCObjectPointerType, not a 4951 // PointerType. 4952 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4953 4954 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4955 NewT.setStarLoc(TL.getStarLoc()); 4956 return Result; 4957 } 4958 4959 if (getDerived().AlwaysRebuild() || 4960 PointeeType != TL.getPointeeLoc().getType()) { 4961 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4962 if (Result.isNull()) 4963 return QualType(); 4964 } 4965 4966 // Objective-C ARC can add lifetime qualifiers to the type that we're 4967 // pointing to. 4968 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4969 4970 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4971 NewT.setSigilLoc(TL.getSigilLoc()); 4972 return Result; 4973 } 4974 4975 template<typename Derived> 4976 QualType 4977 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4978 BlockPointerTypeLoc TL) { 4979 QualType PointeeType 4980 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4981 if (PointeeType.isNull()) 4982 return QualType(); 4983 4984 QualType Result = TL.getType(); 4985 if (getDerived().AlwaysRebuild() || 4986 PointeeType != TL.getPointeeLoc().getType()) { 4987 Result = getDerived().RebuildBlockPointerType(PointeeType, 4988 TL.getSigilLoc()); 4989 if (Result.isNull()) 4990 return QualType(); 4991 } 4992 4993 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4994 NewT.setSigilLoc(TL.getSigilLoc()); 4995 return Result; 4996 } 4997 4998 /// Transforms a reference type. Note that somewhat paradoxically we 4999 /// don't care whether the type itself is an l-value type or an r-value 5000 /// type; we only care if the type was *written* as an l-value type 5001 /// or an r-value type. 5002 template<typename Derived> 5003 QualType 5004 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5005 ReferenceTypeLoc TL) { 5006 const ReferenceType *T = TL.getTypePtr(); 5007 5008 // Note that this works with the pointee-as-written. 5009 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5010 if (PointeeType.isNull()) 5011 return QualType(); 5012 5013 QualType Result = TL.getType(); 5014 if (getDerived().AlwaysRebuild() || 5015 PointeeType != T->getPointeeTypeAsWritten()) { 5016 Result = getDerived().RebuildReferenceType(PointeeType, 5017 T->isSpelledAsLValue(), 5018 TL.getSigilLoc()); 5019 if (Result.isNull()) 5020 return QualType(); 5021 } 5022 5023 // Objective-C ARC can add lifetime qualifiers to the type that we're 5024 // referring to. 5025 TLB.TypeWasModifiedSafely( 5026 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5027 5028 // r-value references can be rebuilt as l-value references. 5029 ReferenceTypeLoc NewTL; 5030 if (isa<LValueReferenceType>(Result)) 5031 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5032 else 5033 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5034 NewTL.setSigilLoc(TL.getSigilLoc()); 5035 5036 return Result; 5037 } 5038 5039 template<typename Derived> 5040 QualType 5041 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5042 LValueReferenceTypeLoc TL) { 5043 return TransformReferenceType(TLB, TL); 5044 } 5045 5046 template<typename Derived> 5047 QualType 5048 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5049 RValueReferenceTypeLoc TL) { 5050 return TransformReferenceType(TLB, TL); 5051 } 5052 5053 template<typename Derived> 5054 QualType 5055 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5056 MemberPointerTypeLoc TL) { 5057 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5058 if (PointeeType.isNull()) 5059 return QualType(); 5060 5061 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5062 TypeSourceInfo *NewClsTInfo = nullptr; 5063 if (OldClsTInfo) { 5064 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5065 if (!NewClsTInfo) 5066 return QualType(); 5067 } 5068 5069 const MemberPointerType *T = TL.getTypePtr(); 5070 QualType OldClsType = QualType(T->getClass(), 0); 5071 QualType NewClsType; 5072 if (NewClsTInfo) 5073 NewClsType = NewClsTInfo->getType(); 5074 else { 5075 NewClsType = getDerived().TransformType(OldClsType); 5076 if (NewClsType.isNull()) 5077 return QualType(); 5078 } 5079 5080 QualType Result = TL.getType(); 5081 if (getDerived().AlwaysRebuild() || 5082 PointeeType != T->getPointeeType() || 5083 NewClsType != OldClsType) { 5084 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5085 TL.getStarLoc()); 5086 if (Result.isNull()) 5087 return QualType(); 5088 } 5089 5090 // If we had to adjust the pointee type when building a member pointer, make 5091 // sure to push TypeLoc info for it. 5092 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5093 if (MPT && PointeeType != MPT->getPointeeType()) { 5094 assert(isa<AdjustedType>(MPT->getPointeeType())); 5095 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5096 } 5097 5098 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5099 NewTL.setSigilLoc(TL.getSigilLoc()); 5100 NewTL.setClassTInfo(NewClsTInfo); 5101 5102 return Result; 5103 } 5104 5105 template<typename Derived> 5106 QualType 5107 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5108 ConstantArrayTypeLoc TL) { 5109 const ConstantArrayType *T = TL.getTypePtr(); 5110 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5111 if (ElementType.isNull()) 5112 return QualType(); 5113 5114 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5115 Expr *OldSize = TL.getSizeExpr(); 5116 if (!OldSize) 5117 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5118 Expr *NewSize = nullptr; 5119 if (OldSize) { 5120 EnterExpressionEvaluationContext Unevaluated( 5121 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5122 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5123 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5124 } 5125 5126 QualType Result = TL.getType(); 5127 if (getDerived().AlwaysRebuild() || 5128 ElementType != T->getElementType() || 5129 (T->getSizeExpr() && NewSize != OldSize)) { 5130 Result = getDerived().RebuildConstantArrayType(ElementType, 5131 T->getSizeModifier(), 5132 T->getSize(), NewSize, 5133 T->getIndexTypeCVRQualifiers(), 5134 TL.getBracketsRange()); 5135 if (Result.isNull()) 5136 return QualType(); 5137 } 5138 5139 // We might have either a ConstantArrayType or a VariableArrayType now: 5140 // a ConstantArrayType is allowed to have an element type which is a 5141 // VariableArrayType if the type is dependent. Fortunately, all array 5142 // types have the same location layout. 5143 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5144 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5145 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5146 NewTL.setSizeExpr(NewSize); 5147 5148 return Result; 5149 } 5150 5151 template<typename Derived> 5152 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5153 TypeLocBuilder &TLB, 5154 IncompleteArrayTypeLoc TL) { 5155 const IncompleteArrayType *T = TL.getTypePtr(); 5156 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5157 if (ElementType.isNull()) 5158 return QualType(); 5159 5160 QualType Result = TL.getType(); 5161 if (getDerived().AlwaysRebuild() || 5162 ElementType != T->getElementType()) { 5163 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5164 T->getSizeModifier(), 5165 T->getIndexTypeCVRQualifiers(), 5166 TL.getBracketsRange()); 5167 if (Result.isNull()) 5168 return QualType(); 5169 } 5170 5171 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5172 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5173 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5174 NewTL.setSizeExpr(nullptr); 5175 5176 return Result; 5177 } 5178 5179 template<typename Derived> 5180 QualType 5181 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5182 VariableArrayTypeLoc TL) { 5183 const VariableArrayType *T = TL.getTypePtr(); 5184 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5185 if (ElementType.isNull()) 5186 return QualType(); 5187 5188 ExprResult SizeResult; 5189 { 5190 EnterExpressionEvaluationContext Context( 5191 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5192 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5193 } 5194 if (SizeResult.isInvalid()) 5195 return QualType(); 5196 SizeResult = 5197 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5198 if (SizeResult.isInvalid()) 5199 return QualType(); 5200 5201 Expr *Size = SizeResult.get(); 5202 5203 QualType Result = TL.getType(); 5204 if (getDerived().AlwaysRebuild() || 5205 ElementType != T->getElementType() || 5206 Size != T->getSizeExpr()) { 5207 Result = getDerived().RebuildVariableArrayType(ElementType, 5208 T->getSizeModifier(), 5209 Size, 5210 T->getIndexTypeCVRQualifiers(), 5211 TL.getBracketsRange()); 5212 if (Result.isNull()) 5213 return QualType(); 5214 } 5215 5216 // We might have constant size array now, but fortunately it has the same 5217 // location layout. 5218 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5219 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5220 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5221 NewTL.setSizeExpr(Size); 5222 5223 return Result; 5224 } 5225 5226 template<typename Derived> 5227 QualType 5228 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5229 DependentSizedArrayTypeLoc TL) { 5230 const DependentSizedArrayType *T = TL.getTypePtr(); 5231 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5232 if (ElementType.isNull()) 5233 return QualType(); 5234 5235 // Array bounds are constant expressions. 5236 EnterExpressionEvaluationContext Unevaluated( 5237 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5238 5239 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5240 Expr *origSize = TL.getSizeExpr(); 5241 if (!origSize) origSize = T->getSizeExpr(); 5242 5243 ExprResult sizeResult 5244 = getDerived().TransformExpr(origSize); 5245 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 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 != origSize) { 5255 Result = getDerived().RebuildDependentSizedArrayType(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 any sort of array type now, but fortunately they 5265 // all have the same 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 TreeTransform<Derived>::TransformDependentVectorType( 5276 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5277 const DependentVectorType *T = TL.getTypePtr(); 5278 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5279 if (ElementType.isNull()) 5280 return QualType(); 5281 5282 EnterExpressionEvaluationContext Unevaluated( 5283 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5284 5285 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5286 Size = SemaRef.ActOnConstantExpression(Size); 5287 if (Size.isInvalid()) 5288 return QualType(); 5289 5290 QualType Result = TL.getType(); 5291 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5292 Size.get() != T->getSizeExpr()) { 5293 Result = getDerived().RebuildDependentVectorType( 5294 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5295 if (Result.isNull()) 5296 return QualType(); 5297 } 5298 5299 // Result might be dependent or not. 5300 if (isa<DependentVectorType>(Result)) { 5301 DependentVectorTypeLoc NewTL = 5302 TLB.push<DependentVectorTypeLoc>(Result); 5303 NewTL.setNameLoc(TL.getNameLoc()); 5304 } else { 5305 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5306 NewTL.setNameLoc(TL.getNameLoc()); 5307 } 5308 5309 return Result; 5310 } 5311 5312 template<typename Derived> 5313 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5314 TypeLocBuilder &TLB, 5315 DependentSizedExtVectorTypeLoc TL) { 5316 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5317 5318 // FIXME: ext vector locs should be nested 5319 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5320 if (ElementType.isNull()) 5321 return QualType(); 5322 5323 // Vector sizes are constant expressions. 5324 EnterExpressionEvaluationContext Unevaluated( 5325 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5326 5327 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5328 Size = SemaRef.ActOnConstantExpression(Size); 5329 if (Size.isInvalid()) 5330 return QualType(); 5331 5332 QualType Result = TL.getType(); 5333 if (getDerived().AlwaysRebuild() || 5334 ElementType != T->getElementType() || 5335 Size.get() != T->getSizeExpr()) { 5336 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5337 Size.get(), 5338 T->getAttributeLoc()); 5339 if (Result.isNull()) 5340 return QualType(); 5341 } 5342 5343 // Result might be dependent or not. 5344 if (isa<DependentSizedExtVectorType>(Result)) { 5345 DependentSizedExtVectorTypeLoc NewTL 5346 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5347 NewTL.setNameLoc(TL.getNameLoc()); 5348 } else { 5349 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5350 NewTL.setNameLoc(TL.getNameLoc()); 5351 } 5352 5353 return Result; 5354 } 5355 5356 template <typename Derived> 5357 QualType 5358 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5359 ConstantMatrixTypeLoc TL) { 5360 const ConstantMatrixType *T = TL.getTypePtr(); 5361 QualType ElementType = getDerived().TransformType(T->getElementType()); 5362 if (ElementType.isNull()) 5363 return QualType(); 5364 5365 QualType Result = TL.getType(); 5366 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5367 Result = getDerived().RebuildConstantMatrixType( 5368 ElementType, T->getNumRows(), T->getNumColumns()); 5369 if (Result.isNull()) 5370 return QualType(); 5371 } 5372 5373 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5374 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5375 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5376 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5377 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5378 5379 return Result; 5380 } 5381 5382 template <typename Derived> 5383 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5384 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5385 const DependentSizedMatrixType *T = TL.getTypePtr(); 5386 5387 QualType ElementType = getDerived().TransformType(T->getElementType()); 5388 if (ElementType.isNull()) { 5389 return QualType(); 5390 } 5391 5392 // Matrix dimensions are constant expressions. 5393 EnterExpressionEvaluationContext Unevaluated( 5394 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5395 5396 Expr *origRows = TL.getAttrRowOperand(); 5397 if (!origRows) 5398 origRows = T->getRowExpr(); 5399 Expr *origColumns = TL.getAttrColumnOperand(); 5400 if (!origColumns) 5401 origColumns = T->getColumnExpr(); 5402 5403 ExprResult rowResult = getDerived().TransformExpr(origRows); 5404 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5405 if (rowResult.isInvalid()) 5406 return QualType(); 5407 5408 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5409 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5410 if (columnResult.isInvalid()) 5411 return QualType(); 5412 5413 Expr *rows = rowResult.get(); 5414 Expr *columns = columnResult.get(); 5415 5416 QualType Result = TL.getType(); 5417 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5418 rows != origRows || columns != origColumns) { 5419 Result = getDerived().RebuildDependentSizedMatrixType( 5420 ElementType, rows, columns, T->getAttributeLoc()); 5421 5422 if (Result.isNull()) 5423 return QualType(); 5424 } 5425 5426 // We might have any sort of matrix type now, but fortunately they 5427 // all have the same location layout. 5428 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5429 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5430 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5431 NewTL.setAttrRowOperand(rows); 5432 NewTL.setAttrColumnOperand(columns); 5433 return Result; 5434 } 5435 5436 template <typename Derived> 5437 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5438 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5439 const DependentAddressSpaceType *T = TL.getTypePtr(); 5440 5441 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5442 5443 if (pointeeType.isNull()) 5444 return QualType(); 5445 5446 // Address spaces are constant expressions. 5447 EnterExpressionEvaluationContext Unevaluated( 5448 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5449 5450 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5451 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5452 if (AddrSpace.isInvalid()) 5453 return QualType(); 5454 5455 QualType Result = TL.getType(); 5456 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5457 AddrSpace.get() != T->getAddrSpaceExpr()) { 5458 Result = getDerived().RebuildDependentAddressSpaceType( 5459 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5460 if (Result.isNull()) 5461 return QualType(); 5462 } 5463 5464 // Result might be dependent or not. 5465 if (isa<DependentAddressSpaceType>(Result)) { 5466 DependentAddressSpaceTypeLoc NewTL = 5467 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5468 5469 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5470 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5471 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5472 5473 } else { 5474 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5475 Result, getDerived().getBaseLocation()); 5476 TransformType(TLB, DI->getTypeLoc()); 5477 } 5478 5479 return Result; 5480 } 5481 5482 template <typename Derived> 5483 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5484 VectorTypeLoc TL) { 5485 const VectorType *T = TL.getTypePtr(); 5486 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5487 if (ElementType.isNull()) 5488 return QualType(); 5489 5490 QualType Result = TL.getType(); 5491 if (getDerived().AlwaysRebuild() || 5492 ElementType != T->getElementType()) { 5493 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5494 T->getVectorKind()); 5495 if (Result.isNull()) 5496 return QualType(); 5497 } 5498 5499 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5500 NewTL.setNameLoc(TL.getNameLoc()); 5501 5502 return Result; 5503 } 5504 5505 template<typename Derived> 5506 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5507 ExtVectorTypeLoc TL) { 5508 const VectorType *T = TL.getTypePtr(); 5509 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5510 if (ElementType.isNull()) 5511 return QualType(); 5512 5513 QualType Result = TL.getType(); 5514 if (getDerived().AlwaysRebuild() || 5515 ElementType != T->getElementType()) { 5516 Result = getDerived().RebuildExtVectorType(ElementType, 5517 T->getNumElements(), 5518 /*FIXME*/ SourceLocation()); 5519 if (Result.isNull()) 5520 return QualType(); 5521 } 5522 5523 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5524 NewTL.setNameLoc(TL.getNameLoc()); 5525 5526 return Result; 5527 } 5528 5529 template <typename Derived> 5530 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5531 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5532 bool ExpectParameterPack) { 5533 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5534 TypeSourceInfo *NewDI = nullptr; 5535 5536 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5537 // If we're substituting into a pack expansion type and we know the 5538 // length we want to expand to, just substitute for the pattern. 5539 TypeLoc OldTL = OldDI->getTypeLoc(); 5540 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5541 5542 TypeLocBuilder TLB; 5543 TypeLoc NewTL = OldDI->getTypeLoc(); 5544 TLB.reserve(NewTL.getFullDataSize()); 5545 5546 QualType Result = getDerived().TransformType(TLB, 5547 OldExpansionTL.getPatternLoc()); 5548 if (Result.isNull()) 5549 return nullptr; 5550 5551 Result = RebuildPackExpansionType(Result, 5552 OldExpansionTL.getPatternLoc().getSourceRange(), 5553 OldExpansionTL.getEllipsisLoc(), 5554 NumExpansions); 5555 if (Result.isNull()) 5556 return nullptr; 5557 5558 PackExpansionTypeLoc NewExpansionTL 5559 = TLB.push<PackExpansionTypeLoc>(Result); 5560 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5561 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5562 } else 5563 NewDI = getDerived().TransformType(OldDI); 5564 if (!NewDI) 5565 return nullptr; 5566 5567 if (NewDI == OldDI && indexAdjustment == 0) 5568 return OldParm; 5569 5570 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5571 OldParm->getDeclContext(), 5572 OldParm->getInnerLocStart(), 5573 OldParm->getLocation(), 5574 OldParm->getIdentifier(), 5575 NewDI->getType(), 5576 NewDI, 5577 OldParm->getStorageClass(), 5578 /* DefArg */ nullptr); 5579 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5580 OldParm->getFunctionScopeIndex() + indexAdjustment); 5581 transformedLocalDecl(OldParm, {newParm}); 5582 return newParm; 5583 } 5584 5585 template <typename Derived> 5586 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5587 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5588 const QualType *ParamTypes, 5589 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5590 SmallVectorImpl<QualType> &OutParamTypes, 5591 SmallVectorImpl<ParmVarDecl *> *PVars, 5592 Sema::ExtParameterInfoBuilder &PInfos) { 5593 int indexAdjustment = 0; 5594 5595 unsigned NumParams = Params.size(); 5596 for (unsigned i = 0; i != NumParams; ++i) { 5597 if (ParmVarDecl *OldParm = Params[i]) { 5598 assert(OldParm->getFunctionScopeIndex() == i); 5599 5600 Optional<unsigned> NumExpansions; 5601 ParmVarDecl *NewParm = nullptr; 5602 if (OldParm->isParameterPack()) { 5603 // We have a function parameter pack that may need to be expanded. 5604 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5605 5606 // Find the parameter packs that could be expanded. 5607 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5608 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5609 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5610 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5611 5612 // Determine whether we should expand the parameter packs. 5613 bool ShouldExpand = false; 5614 bool RetainExpansion = false; 5615 Optional<unsigned> OrigNumExpansions; 5616 if (Unexpanded.size() > 0) { 5617 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5618 NumExpansions = OrigNumExpansions; 5619 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5620 Pattern.getSourceRange(), 5621 Unexpanded, 5622 ShouldExpand, 5623 RetainExpansion, 5624 NumExpansions)) { 5625 return true; 5626 } 5627 } else { 5628 #ifndef NDEBUG 5629 const AutoType *AT = 5630 Pattern.getType().getTypePtr()->getContainedAutoType(); 5631 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5632 "Could not find parameter packs or undeduced auto type!"); 5633 #endif 5634 } 5635 5636 if (ShouldExpand) { 5637 // Expand the function parameter pack into multiple, separate 5638 // parameters. 5639 getDerived().ExpandingFunctionParameterPack(OldParm); 5640 for (unsigned I = 0; I != *NumExpansions; ++I) { 5641 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5642 ParmVarDecl *NewParm 5643 = getDerived().TransformFunctionTypeParam(OldParm, 5644 indexAdjustment++, 5645 OrigNumExpansions, 5646 /*ExpectParameterPack=*/false); 5647 if (!NewParm) 5648 return true; 5649 5650 if (ParamInfos) 5651 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5652 OutParamTypes.push_back(NewParm->getType()); 5653 if (PVars) 5654 PVars->push_back(NewParm); 5655 } 5656 5657 // If we're supposed to retain a pack expansion, do so by temporarily 5658 // forgetting the partially-substituted parameter pack. 5659 if (RetainExpansion) { 5660 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5661 ParmVarDecl *NewParm 5662 = getDerived().TransformFunctionTypeParam(OldParm, 5663 indexAdjustment++, 5664 OrigNumExpansions, 5665 /*ExpectParameterPack=*/false); 5666 if (!NewParm) 5667 return true; 5668 5669 if (ParamInfos) 5670 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5671 OutParamTypes.push_back(NewParm->getType()); 5672 if (PVars) 5673 PVars->push_back(NewParm); 5674 } 5675 5676 // The next parameter should have the same adjustment as the 5677 // last thing we pushed, but we post-incremented indexAdjustment 5678 // on every push. Also, if we push nothing, the adjustment should 5679 // go down by one. 5680 indexAdjustment--; 5681 5682 // We're done with the pack expansion. 5683 continue; 5684 } 5685 5686 // We'll substitute the parameter now without expanding the pack 5687 // expansion. 5688 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5689 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5690 indexAdjustment, 5691 NumExpansions, 5692 /*ExpectParameterPack=*/true); 5693 assert(NewParm->isParameterPack() && 5694 "Parameter pack no longer a parameter pack after " 5695 "transformation."); 5696 } else { 5697 NewParm = getDerived().TransformFunctionTypeParam( 5698 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5699 } 5700 5701 if (!NewParm) 5702 return true; 5703 5704 if (ParamInfos) 5705 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5706 OutParamTypes.push_back(NewParm->getType()); 5707 if (PVars) 5708 PVars->push_back(NewParm); 5709 continue; 5710 } 5711 5712 // Deal with the possibility that we don't have a parameter 5713 // declaration for this parameter. 5714 QualType OldType = ParamTypes[i]; 5715 bool IsPackExpansion = false; 5716 Optional<unsigned> NumExpansions; 5717 QualType NewType; 5718 if (const PackExpansionType *Expansion 5719 = dyn_cast<PackExpansionType>(OldType)) { 5720 // We have a function parameter pack that may need to be expanded. 5721 QualType Pattern = Expansion->getPattern(); 5722 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5723 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5724 5725 // Determine whether we should expand the parameter packs. 5726 bool ShouldExpand = false; 5727 bool RetainExpansion = false; 5728 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5729 Unexpanded, 5730 ShouldExpand, 5731 RetainExpansion, 5732 NumExpansions)) { 5733 return true; 5734 } 5735 5736 if (ShouldExpand) { 5737 // Expand the function parameter pack into multiple, separate 5738 // parameters. 5739 for (unsigned I = 0; I != *NumExpansions; ++I) { 5740 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5741 QualType NewType = getDerived().TransformType(Pattern); 5742 if (NewType.isNull()) 5743 return true; 5744 5745 if (NewType->containsUnexpandedParameterPack()) { 5746 NewType = 5747 getSema().getASTContext().getPackExpansionType(NewType, None); 5748 5749 if (NewType.isNull()) 5750 return true; 5751 } 5752 5753 if (ParamInfos) 5754 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5755 OutParamTypes.push_back(NewType); 5756 if (PVars) 5757 PVars->push_back(nullptr); 5758 } 5759 5760 // We're done with the pack expansion. 5761 continue; 5762 } 5763 5764 // If we're supposed to retain a pack expansion, do so by temporarily 5765 // forgetting the partially-substituted parameter pack. 5766 if (RetainExpansion) { 5767 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5768 QualType NewType = getDerived().TransformType(Pattern); 5769 if (NewType.isNull()) 5770 return true; 5771 5772 if (ParamInfos) 5773 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5774 OutParamTypes.push_back(NewType); 5775 if (PVars) 5776 PVars->push_back(nullptr); 5777 } 5778 5779 // We'll substitute the parameter now without expanding the pack 5780 // expansion. 5781 OldType = Expansion->getPattern(); 5782 IsPackExpansion = true; 5783 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5784 NewType = getDerived().TransformType(OldType); 5785 } else { 5786 NewType = getDerived().TransformType(OldType); 5787 } 5788 5789 if (NewType.isNull()) 5790 return true; 5791 5792 if (IsPackExpansion) 5793 NewType = getSema().Context.getPackExpansionType(NewType, 5794 NumExpansions); 5795 5796 if (ParamInfos) 5797 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5798 OutParamTypes.push_back(NewType); 5799 if (PVars) 5800 PVars->push_back(nullptr); 5801 } 5802 5803 #ifndef NDEBUG 5804 if (PVars) { 5805 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5806 if (ParmVarDecl *parm = (*PVars)[i]) 5807 assert(parm->getFunctionScopeIndex() == i); 5808 } 5809 #endif 5810 5811 return false; 5812 } 5813 5814 template<typename Derived> 5815 QualType 5816 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5817 FunctionProtoTypeLoc TL) { 5818 SmallVector<QualType, 4> ExceptionStorage; 5819 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5820 return getDerived().TransformFunctionProtoType( 5821 TLB, TL, nullptr, Qualifiers(), 5822 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5823 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5824 ExceptionStorage, Changed); 5825 }); 5826 } 5827 5828 template<typename Derived> template<typename Fn> 5829 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5830 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5831 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5832 5833 // Transform the parameters and return type. 5834 // 5835 // We are required to instantiate the params and return type in source order. 5836 // When the function has a trailing return type, we instantiate the 5837 // parameters before the return type, since the return type can then refer 5838 // to the parameters themselves (via decltype, sizeof, etc.). 5839 // 5840 SmallVector<QualType, 4> ParamTypes; 5841 SmallVector<ParmVarDecl*, 4> ParamDecls; 5842 Sema::ExtParameterInfoBuilder ExtParamInfos; 5843 const FunctionProtoType *T = TL.getTypePtr(); 5844 5845 QualType ResultType; 5846 5847 if (T->hasTrailingReturn()) { 5848 if (getDerived().TransformFunctionTypeParams( 5849 TL.getBeginLoc(), TL.getParams(), 5850 TL.getTypePtr()->param_type_begin(), 5851 T->getExtParameterInfosOrNull(), 5852 ParamTypes, &ParamDecls, ExtParamInfos)) 5853 return QualType(); 5854 5855 { 5856 // C++11 [expr.prim.general]p3: 5857 // If a declaration declares a member function or member function 5858 // template of a class X, the expression this is a prvalue of type 5859 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5860 // and the end of the function-definition, member-declarator, or 5861 // declarator. 5862 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5863 5864 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5865 if (ResultType.isNull()) 5866 return QualType(); 5867 } 5868 } 5869 else { 5870 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5871 if (ResultType.isNull()) 5872 return QualType(); 5873 5874 if (getDerived().TransformFunctionTypeParams( 5875 TL.getBeginLoc(), TL.getParams(), 5876 TL.getTypePtr()->param_type_begin(), 5877 T->getExtParameterInfosOrNull(), 5878 ParamTypes, &ParamDecls, ExtParamInfos)) 5879 return QualType(); 5880 } 5881 5882 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5883 5884 bool EPIChanged = false; 5885 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5886 return QualType(); 5887 5888 // Handle extended parameter information. 5889 if (auto NewExtParamInfos = 5890 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5891 if (!EPI.ExtParameterInfos || 5892 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5893 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5894 EPIChanged = true; 5895 } 5896 EPI.ExtParameterInfos = NewExtParamInfos; 5897 } else if (EPI.ExtParameterInfos) { 5898 EPIChanged = true; 5899 EPI.ExtParameterInfos = nullptr; 5900 } 5901 5902 QualType Result = TL.getType(); 5903 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5904 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5905 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5906 if (Result.isNull()) 5907 return QualType(); 5908 } 5909 5910 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5911 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5912 NewTL.setLParenLoc(TL.getLParenLoc()); 5913 NewTL.setRParenLoc(TL.getRParenLoc()); 5914 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5915 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5916 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5917 NewTL.setParam(i, ParamDecls[i]); 5918 5919 return Result; 5920 } 5921 5922 template<typename Derived> 5923 bool TreeTransform<Derived>::TransformExceptionSpec( 5924 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5925 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5926 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5927 5928 // Instantiate a dynamic noexcept expression, if any. 5929 if (isComputedNoexcept(ESI.Type)) { 5930 EnterExpressionEvaluationContext Unevaluated( 5931 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5932 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5933 if (NoexceptExpr.isInvalid()) 5934 return true; 5935 5936 ExceptionSpecificationType EST = ESI.Type; 5937 NoexceptExpr = 5938 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5939 if (NoexceptExpr.isInvalid()) 5940 return true; 5941 5942 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5943 Changed = true; 5944 ESI.NoexceptExpr = NoexceptExpr.get(); 5945 ESI.Type = EST; 5946 } 5947 5948 if (ESI.Type != EST_Dynamic) 5949 return false; 5950 5951 // Instantiate a dynamic exception specification's type. 5952 for (QualType T : ESI.Exceptions) { 5953 if (const PackExpansionType *PackExpansion = 5954 T->getAs<PackExpansionType>()) { 5955 Changed = true; 5956 5957 // We have a pack expansion. Instantiate it. 5958 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5959 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5960 Unexpanded); 5961 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5962 5963 // Determine whether the set of unexpanded parameter packs can and 5964 // should 5965 // be expanded. 5966 bool Expand = false; 5967 bool RetainExpansion = false; 5968 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5969 // FIXME: Track the location of the ellipsis (and track source location 5970 // information for the types in the exception specification in general). 5971 if (getDerived().TryExpandParameterPacks( 5972 Loc, SourceRange(), Unexpanded, Expand, 5973 RetainExpansion, NumExpansions)) 5974 return true; 5975 5976 if (!Expand) { 5977 // We can't expand this pack expansion into separate arguments yet; 5978 // just substitute into the pattern and create a new pack expansion 5979 // type. 5980 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5981 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5982 if (U.isNull()) 5983 return true; 5984 5985 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5986 Exceptions.push_back(U); 5987 continue; 5988 } 5989 5990 // Substitute into the pack expansion pattern for each slice of the 5991 // pack. 5992 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5993 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5994 5995 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5996 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5997 return true; 5998 5999 Exceptions.push_back(U); 6000 } 6001 } else { 6002 QualType U = getDerived().TransformType(T); 6003 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6004 return true; 6005 if (T != U) 6006 Changed = true; 6007 6008 Exceptions.push_back(U); 6009 } 6010 } 6011 6012 ESI.Exceptions = Exceptions; 6013 if (ESI.Exceptions.empty()) 6014 ESI.Type = EST_DynamicNone; 6015 return false; 6016 } 6017 6018 template<typename Derived> 6019 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6020 TypeLocBuilder &TLB, 6021 FunctionNoProtoTypeLoc TL) { 6022 const FunctionNoProtoType *T = TL.getTypePtr(); 6023 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6024 if (ResultType.isNull()) 6025 return QualType(); 6026 6027 QualType Result = TL.getType(); 6028 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6029 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6030 6031 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6032 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6033 NewTL.setLParenLoc(TL.getLParenLoc()); 6034 NewTL.setRParenLoc(TL.getRParenLoc()); 6035 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6036 6037 return Result; 6038 } 6039 6040 template<typename Derived> QualType 6041 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 6042 UnresolvedUsingTypeLoc TL) { 6043 const UnresolvedUsingType *T = TL.getTypePtr(); 6044 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6045 if (!D) 6046 return QualType(); 6047 6048 QualType Result = TL.getType(); 6049 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6050 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6051 if (Result.isNull()) 6052 return QualType(); 6053 } 6054 6055 // We might get an arbitrary type spec type back. We should at 6056 // least always get a type spec type, though. 6057 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6058 NewTL.setNameLoc(TL.getNameLoc()); 6059 6060 return Result; 6061 } 6062 6063 template<typename Derived> 6064 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6065 TypedefTypeLoc TL) { 6066 const TypedefType *T = TL.getTypePtr(); 6067 TypedefNameDecl *Typedef 6068 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6069 T->getDecl())); 6070 if (!Typedef) 6071 return QualType(); 6072 6073 QualType Result = TL.getType(); 6074 if (getDerived().AlwaysRebuild() || 6075 Typedef != T->getDecl()) { 6076 Result = getDerived().RebuildTypedefType(Typedef); 6077 if (Result.isNull()) 6078 return QualType(); 6079 } 6080 6081 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6082 NewTL.setNameLoc(TL.getNameLoc()); 6083 6084 return Result; 6085 } 6086 6087 template<typename Derived> 6088 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6089 TypeOfExprTypeLoc TL) { 6090 // typeof expressions are not potentially evaluated contexts 6091 EnterExpressionEvaluationContext Unevaluated( 6092 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6093 Sema::ReuseLambdaContextDecl); 6094 6095 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6096 if (E.isInvalid()) 6097 return QualType(); 6098 6099 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6100 if (E.isInvalid()) 6101 return QualType(); 6102 6103 QualType Result = TL.getType(); 6104 if (getDerived().AlwaysRebuild() || 6105 E.get() != TL.getUnderlyingExpr()) { 6106 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6107 if (Result.isNull()) 6108 return QualType(); 6109 } 6110 else E.get(); 6111 6112 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6113 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6114 NewTL.setLParenLoc(TL.getLParenLoc()); 6115 NewTL.setRParenLoc(TL.getRParenLoc()); 6116 6117 return Result; 6118 } 6119 6120 template<typename Derived> 6121 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6122 TypeOfTypeLoc TL) { 6123 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6124 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6125 if (!New_Under_TI) 6126 return QualType(); 6127 6128 QualType Result = TL.getType(); 6129 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6130 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6131 if (Result.isNull()) 6132 return QualType(); 6133 } 6134 6135 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6136 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6137 NewTL.setLParenLoc(TL.getLParenLoc()); 6138 NewTL.setRParenLoc(TL.getRParenLoc()); 6139 NewTL.setUnderlyingTInfo(New_Under_TI); 6140 6141 return Result; 6142 } 6143 6144 template<typename Derived> 6145 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6146 DecltypeTypeLoc TL) { 6147 const DecltypeType *T = TL.getTypePtr(); 6148 6149 // decltype expressions are not potentially evaluated contexts 6150 EnterExpressionEvaluationContext Unevaluated( 6151 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6152 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6153 6154 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6155 if (E.isInvalid()) 6156 return QualType(); 6157 6158 E = getSema().ActOnDecltypeExpression(E.get()); 6159 if (E.isInvalid()) 6160 return QualType(); 6161 6162 QualType Result = TL.getType(); 6163 if (getDerived().AlwaysRebuild() || 6164 E.get() != T->getUnderlyingExpr()) { 6165 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6166 if (Result.isNull()) 6167 return QualType(); 6168 } 6169 else E.get(); 6170 6171 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6172 NewTL.setNameLoc(TL.getNameLoc()); 6173 6174 return Result; 6175 } 6176 6177 template<typename Derived> 6178 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6179 TypeLocBuilder &TLB, 6180 UnaryTransformTypeLoc TL) { 6181 QualType Result = TL.getType(); 6182 if (Result->isDependentType()) { 6183 const UnaryTransformType *T = TL.getTypePtr(); 6184 QualType NewBase = 6185 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6186 Result = getDerived().RebuildUnaryTransformType(NewBase, 6187 T->getUTTKind(), 6188 TL.getKWLoc()); 6189 if (Result.isNull()) 6190 return QualType(); 6191 } 6192 6193 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6194 NewTL.setKWLoc(TL.getKWLoc()); 6195 NewTL.setParensRange(TL.getParensRange()); 6196 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6197 return Result; 6198 } 6199 6200 template<typename Derived> 6201 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6202 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6203 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6204 6205 CXXScopeSpec SS; 6206 TemplateName TemplateName = getDerived().TransformTemplateName( 6207 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6208 if (TemplateName.isNull()) 6209 return QualType(); 6210 6211 QualType OldDeduced = T->getDeducedType(); 6212 QualType NewDeduced; 6213 if (!OldDeduced.isNull()) { 6214 NewDeduced = getDerived().TransformType(OldDeduced); 6215 if (NewDeduced.isNull()) 6216 return QualType(); 6217 } 6218 6219 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6220 TemplateName, NewDeduced); 6221 if (Result.isNull()) 6222 return QualType(); 6223 6224 DeducedTemplateSpecializationTypeLoc NewTL = 6225 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6226 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6227 6228 return Result; 6229 } 6230 6231 template<typename Derived> 6232 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6233 RecordTypeLoc TL) { 6234 const RecordType *T = TL.getTypePtr(); 6235 RecordDecl *Record 6236 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6237 T->getDecl())); 6238 if (!Record) 6239 return QualType(); 6240 6241 QualType Result = TL.getType(); 6242 if (getDerived().AlwaysRebuild() || 6243 Record != T->getDecl()) { 6244 Result = getDerived().RebuildRecordType(Record); 6245 if (Result.isNull()) 6246 return QualType(); 6247 } 6248 6249 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6250 NewTL.setNameLoc(TL.getNameLoc()); 6251 6252 return Result; 6253 } 6254 6255 template<typename Derived> 6256 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6257 EnumTypeLoc TL) { 6258 const EnumType *T = TL.getTypePtr(); 6259 EnumDecl *Enum 6260 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6261 T->getDecl())); 6262 if (!Enum) 6263 return QualType(); 6264 6265 QualType Result = TL.getType(); 6266 if (getDerived().AlwaysRebuild() || 6267 Enum != T->getDecl()) { 6268 Result = getDerived().RebuildEnumType(Enum); 6269 if (Result.isNull()) 6270 return QualType(); 6271 } 6272 6273 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6274 NewTL.setNameLoc(TL.getNameLoc()); 6275 6276 return Result; 6277 } 6278 6279 template<typename Derived> 6280 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6281 TypeLocBuilder &TLB, 6282 InjectedClassNameTypeLoc TL) { 6283 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6284 TL.getTypePtr()->getDecl()); 6285 if (!D) return QualType(); 6286 6287 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6288 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6289 return T; 6290 } 6291 6292 template<typename Derived> 6293 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6294 TypeLocBuilder &TLB, 6295 TemplateTypeParmTypeLoc TL) { 6296 return TransformTypeSpecType(TLB, TL); 6297 } 6298 6299 template<typename Derived> 6300 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6301 TypeLocBuilder &TLB, 6302 SubstTemplateTypeParmTypeLoc TL) { 6303 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6304 6305 // Substitute into the replacement type, which itself might involve something 6306 // that needs to be transformed. This only tends to occur with default 6307 // template arguments of template template parameters. 6308 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6309 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6310 if (Replacement.isNull()) 6311 return QualType(); 6312 6313 // Always canonicalize the replacement type. 6314 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6315 QualType Result 6316 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6317 Replacement); 6318 6319 // Propagate type-source information. 6320 SubstTemplateTypeParmTypeLoc NewTL 6321 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6322 NewTL.setNameLoc(TL.getNameLoc()); 6323 return Result; 6324 6325 } 6326 6327 template<typename Derived> 6328 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6329 TypeLocBuilder &TLB, 6330 SubstTemplateTypeParmPackTypeLoc TL) { 6331 return TransformTypeSpecType(TLB, TL); 6332 } 6333 6334 template<typename Derived> 6335 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6336 TypeLocBuilder &TLB, 6337 TemplateSpecializationTypeLoc TL) { 6338 const TemplateSpecializationType *T = TL.getTypePtr(); 6339 6340 // The nested-name-specifier never matters in a TemplateSpecializationType, 6341 // because we can't have a dependent nested-name-specifier anyway. 6342 CXXScopeSpec SS; 6343 TemplateName Template 6344 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6345 TL.getTemplateNameLoc()); 6346 if (Template.isNull()) 6347 return QualType(); 6348 6349 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6350 } 6351 6352 template<typename Derived> 6353 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6354 AtomicTypeLoc TL) { 6355 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6356 if (ValueType.isNull()) 6357 return QualType(); 6358 6359 QualType Result = TL.getType(); 6360 if (getDerived().AlwaysRebuild() || 6361 ValueType != TL.getValueLoc().getType()) { 6362 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6363 if (Result.isNull()) 6364 return QualType(); 6365 } 6366 6367 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6368 NewTL.setKWLoc(TL.getKWLoc()); 6369 NewTL.setLParenLoc(TL.getLParenLoc()); 6370 NewTL.setRParenLoc(TL.getRParenLoc()); 6371 6372 return Result; 6373 } 6374 6375 template <typename Derived> 6376 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6377 PipeTypeLoc TL) { 6378 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6379 if (ValueType.isNull()) 6380 return QualType(); 6381 6382 QualType Result = TL.getType(); 6383 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6384 const PipeType *PT = Result->castAs<PipeType>(); 6385 bool isReadPipe = PT->isReadOnly(); 6386 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6387 if (Result.isNull()) 6388 return QualType(); 6389 } 6390 6391 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6392 NewTL.setKWLoc(TL.getKWLoc()); 6393 6394 return Result; 6395 } 6396 6397 template <typename Derived> 6398 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6399 ExtIntTypeLoc TL) { 6400 const ExtIntType *EIT = TL.getTypePtr(); 6401 QualType Result = TL.getType(); 6402 6403 if (getDerived().AlwaysRebuild()) { 6404 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6405 EIT->getNumBits(), TL.getNameLoc()); 6406 if (Result.isNull()) 6407 return QualType(); 6408 } 6409 6410 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6411 NewTL.setNameLoc(TL.getNameLoc()); 6412 return Result; 6413 } 6414 6415 template <typename Derived> 6416 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6417 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6418 const DependentExtIntType *EIT = TL.getTypePtr(); 6419 6420 EnterExpressionEvaluationContext Unevaluated( 6421 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6422 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6423 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6424 6425 if (BitsExpr.isInvalid()) 6426 return QualType(); 6427 6428 QualType Result = TL.getType(); 6429 6430 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6431 Result = getDerived().RebuildDependentExtIntType( 6432 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6433 6434 if (Result.isNull()) 6435 return QualType(); 6436 } 6437 6438 if (isa<DependentExtIntType>(Result)) { 6439 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6440 NewTL.setNameLoc(TL.getNameLoc()); 6441 } else { 6442 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6443 NewTL.setNameLoc(TL.getNameLoc()); 6444 } 6445 return Result; 6446 } 6447 6448 /// Simple iterator that traverses the template arguments in a 6449 /// container that provides a \c getArgLoc() member function. 6450 /// 6451 /// This iterator is intended to be used with the iterator form of 6452 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6453 template<typename ArgLocContainer> 6454 class TemplateArgumentLocContainerIterator { 6455 ArgLocContainer *Container; 6456 unsigned Index; 6457 6458 public: 6459 typedef TemplateArgumentLoc value_type; 6460 typedef TemplateArgumentLoc reference; 6461 typedef int difference_type; 6462 typedef std::input_iterator_tag iterator_category; 6463 6464 class pointer { 6465 TemplateArgumentLoc Arg; 6466 6467 public: 6468 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6469 6470 const TemplateArgumentLoc *operator->() const { 6471 return &Arg; 6472 } 6473 }; 6474 6475 6476 TemplateArgumentLocContainerIterator() {} 6477 6478 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6479 unsigned Index) 6480 : Container(&Container), Index(Index) { } 6481 6482 TemplateArgumentLocContainerIterator &operator++() { 6483 ++Index; 6484 return *this; 6485 } 6486 6487 TemplateArgumentLocContainerIterator operator++(int) { 6488 TemplateArgumentLocContainerIterator Old(*this); 6489 ++(*this); 6490 return Old; 6491 } 6492 6493 TemplateArgumentLoc operator*() const { 6494 return Container->getArgLoc(Index); 6495 } 6496 6497 pointer operator->() const { 6498 return pointer(Container->getArgLoc(Index)); 6499 } 6500 6501 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6502 const TemplateArgumentLocContainerIterator &Y) { 6503 return X.Container == Y.Container && X.Index == Y.Index; 6504 } 6505 6506 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6507 const TemplateArgumentLocContainerIterator &Y) { 6508 return !(X == Y); 6509 } 6510 }; 6511 6512 template<typename Derived> 6513 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6514 AutoTypeLoc TL) { 6515 const AutoType *T = TL.getTypePtr(); 6516 QualType OldDeduced = T->getDeducedType(); 6517 QualType NewDeduced; 6518 if (!OldDeduced.isNull()) { 6519 NewDeduced = getDerived().TransformType(OldDeduced); 6520 if (NewDeduced.isNull()) 6521 return QualType(); 6522 } 6523 6524 ConceptDecl *NewCD = nullptr; 6525 TemplateArgumentListInfo NewTemplateArgs; 6526 NestedNameSpecifierLoc NewNestedNameSpec; 6527 if (T->isConstrained()) { 6528 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6529 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6530 6531 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6532 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6533 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6534 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6535 ArgIterator(TL, 6536 TL.getNumArgs()), 6537 NewTemplateArgs)) 6538 return QualType(); 6539 6540 if (TL.getNestedNameSpecifierLoc()) { 6541 NewNestedNameSpec 6542 = getDerived().TransformNestedNameSpecifierLoc( 6543 TL.getNestedNameSpecifierLoc()); 6544 if (!NewNestedNameSpec) 6545 return QualType(); 6546 } 6547 } 6548 6549 QualType Result = TL.getType(); 6550 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6551 T->isDependentType() || T->isConstrained()) { 6552 // FIXME: Maybe don't rebuild if all template arguments are the same. 6553 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6554 NewArgList.reserve(NewArgList.size()); 6555 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6556 NewArgList.push_back(ArgLoc.getArgument()); 6557 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6558 NewArgList); 6559 if (Result.isNull()) 6560 return QualType(); 6561 } 6562 6563 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6564 NewTL.setNameLoc(TL.getNameLoc()); 6565 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6566 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6567 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6568 NewTL.setFoundDecl(TL.getFoundDecl()); 6569 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6570 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6571 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6572 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6573 6574 return Result; 6575 } 6576 6577 template <typename Derived> 6578 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6579 TypeLocBuilder &TLB, 6580 TemplateSpecializationTypeLoc TL, 6581 TemplateName Template) { 6582 TemplateArgumentListInfo NewTemplateArgs; 6583 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6584 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6585 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6586 ArgIterator; 6587 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6588 ArgIterator(TL, TL.getNumArgs()), 6589 NewTemplateArgs)) 6590 return QualType(); 6591 6592 // FIXME: maybe don't rebuild if all the template arguments are the same. 6593 6594 QualType Result = 6595 getDerived().RebuildTemplateSpecializationType(Template, 6596 TL.getTemplateNameLoc(), 6597 NewTemplateArgs); 6598 6599 if (!Result.isNull()) { 6600 // Specializations of template template parameters are represented as 6601 // TemplateSpecializationTypes, and substitution of type alias templates 6602 // within a dependent context can transform them into 6603 // DependentTemplateSpecializationTypes. 6604 if (isa<DependentTemplateSpecializationType>(Result)) { 6605 DependentTemplateSpecializationTypeLoc NewTL 6606 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6607 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6608 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6609 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6610 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6611 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6612 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6613 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6614 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6615 return Result; 6616 } 6617 6618 TemplateSpecializationTypeLoc NewTL 6619 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6620 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6621 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6622 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6623 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6624 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6625 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6626 } 6627 6628 return Result; 6629 } 6630 6631 template <typename Derived> 6632 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6633 TypeLocBuilder &TLB, 6634 DependentTemplateSpecializationTypeLoc TL, 6635 TemplateName Template, 6636 CXXScopeSpec &SS) { 6637 TemplateArgumentListInfo NewTemplateArgs; 6638 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6639 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6640 typedef TemplateArgumentLocContainerIterator< 6641 DependentTemplateSpecializationTypeLoc> ArgIterator; 6642 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6643 ArgIterator(TL, TL.getNumArgs()), 6644 NewTemplateArgs)) 6645 return QualType(); 6646 6647 // FIXME: maybe don't rebuild if all the template arguments are the same. 6648 6649 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6650 QualType Result 6651 = getSema().Context.getDependentTemplateSpecializationType( 6652 TL.getTypePtr()->getKeyword(), 6653 DTN->getQualifier(), 6654 DTN->getIdentifier(), 6655 NewTemplateArgs); 6656 6657 DependentTemplateSpecializationTypeLoc NewTL 6658 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6659 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6660 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6661 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6662 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6663 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6664 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6665 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6666 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6667 return Result; 6668 } 6669 6670 QualType Result 6671 = getDerived().RebuildTemplateSpecializationType(Template, 6672 TL.getTemplateNameLoc(), 6673 NewTemplateArgs); 6674 6675 if (!Result.isNull()) { 6676 /// FIXME: Wrap this in an elaborated-type-specifier? 6677 TemplateSpecializationTypeLoc NewTL 6678 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6679 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6680 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6681 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6682 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6683 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6684 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6685 } 6686 6687 return Result; 6688 } 6689 6690 template<typename Derived> 6691 QualType 6692 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6693 ElaboratedTypeLoc TL) { 6694 const ElaboratedType *T = TL.getTypePtr(); 6695 6696 NestedNameSpecifierLoc QualifierLoc; 6697 // NOTE: the qualifier in an ElaboratedType is optional. 6698 if (TL.getQualifierLoc()) { 6699 QualifierLoc 6700 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6701 if (!QualifierLoc) 6702 return QualType(); 6703 } 6704 6705 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6706 if (NamedT.isNull()) 6707 return QualType(); 6708 6709 // C++0x [dcl.type.elab]p2: 6710 // If the identifier resolves to a typedef-name or the simple-template-id 6711 // resolves to an alias template specialization, the 6712 // elaborated-type-specifier is ill-formed. 6713 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6714 if (const TemplateSpecializationType *TST = 6715 NamedT->getAs<TemplateSpecializationType>()) { 6716 TemplateName Template = TST->getTemplateName(); 6717 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6718 Template.getAsTemplateDecl())) { 6719 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6720 diag::err_tag_reference_non_tag) 6721 << TAT << Sema::NTK_TypeAliasTemplate 6722 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6723 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6724 } 6725 } 6726 } 6727 6728 QualType Result = TL.getType(); 6729 if (getDerived().AlwaysRebuild() || 6730 QualifierLoc != TL.getQualifierLoc() || 6731 NamedT != T->getNamedType()) { 6732 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6733 T->getKeyword(), 6734 QualifierLoc, NamedT); 6735 if (Result.isNull()) 6736 return QualType(); 6737 } 6738 6739 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6740 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6741 NewTL.setQualifierLoc(QualifierLoc); 6742 return Result; 6743 } 6744 6745 template<typename Derived> 6746 QualType TreeTransform<Derived>::TransformAttributedType( 6747 TypeLocBuilder &TLB, 6748 AttributedTypeLoc TL) { 6749 const AttributedType *oldType = TL.getTypePtr(); 6750 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6751 if (modifiedType.isNull()) 6752 return QualType(); 6753 6754 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6755 const Attr *oldAttr = TL.getAttr(); 6756 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6757 if (oldAttr && !newAttr) 6758 return QualType(); 6759 6760 QualType result = TL.getType(); 6761 6762 // FIXME: dependent operand expressions? 6763 if (getDerived().AlwaysRebuild() || 6764 modifiedType != oldType->getModifiedType()) { 6765 // TODO: this is really lame; we should really be rebuilding the 6766 // equivalent type from first principles. 6767 QualType equivalentType 6768 = getDerived().TransformType(oldType->getEquivalentType()); 6769 if (equivalentType.isNull()) 6770 return QualType(); 6771 6772 // Check whether we can add nullability; it is only represented as 6773 // type sugar, and therefore cannot be diagnosed in any other way. 6774 if (auto nullability = oldType->getImmediateNullability()) { 6775 if (!modifiedType->canHaveNullability()) { 6776 SemaRef.Diag(TL.getAttr()->getLocation(), 6777 diag::err_nullability_nonpointer) 6778 << DiagNullabilityKind(*nullability, false) << modifiedType; 6779 return QualType(); 6780 } 6781 } 6782 6783 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6784 modifiedType, 6785 equivalentType); 6786 } 6787 6788 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6789 newTL.setAttr(newAttr); 6790 return result; 6791 } 6792 6793 template<typename Derived> 6794 QualType 6795 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6796 ParenTypeLoc TL) { 6797 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6798 if (Inner.isNull()) 6799 return QualType(); 6800 6801 QualType Result = TL.getType(); 6802 if (getDerived().AlwaysRebuild() || 6803 Inner != TL.getInnerLoc().getType()) { 6804 Result = getDerived().RebuildParenType(Inner); 6805 if (Result.isNull()) 6806 return QualType(); 6807 } 6808 6809 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6810 NewTL.setLParenLoc(TL.getLParenLoc()); 6811 NewTL.setRParenLoc(TL.getRParenLoc()); 6812 return Result; 6813 } 6814 6815 template <typename Derived> 6816 QualType 6817 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6818 MacroQualifiedTypeLoc TL) { 6819 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6820 if (Inner.isNull()) 6821 return QualType(); 6822 6823 QualType Result = TL.getType(); 6824 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6825 Result = 6826 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6827 if (Result.isNull()) 6828 return QualType(); 6829 } 6830 6831 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6832 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6833 return Result; 6834 } 6835 6836 template<typename Derived> 6837 QualType TreeTransform<Derived>::TransformDependentNameType( 6838 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6839 return TransformDependentNameType(TLB, TL, false); 6840 } 6841 6842 template<typename Derived> 6843 QualType TreeTransform<Derived>::TransformDependentNameType( 6844 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6845 const DependentNameType *T = TL.getTypePtr(); 6846 6847 NestedNameSpecifierLoc QualifierLoc 6848 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6849 if (!QualifierLoc) 6850 return QualType(); 6851 6852 QualType Result 6853 = getDerived().RebuildDependentNameType(T->getKeyword(), 6854 TL.getElaboratedKeywordLoc(), 6855 QualifierLoc, 6856 T->getIdentifier(), 6857 TL.getNameLoc(), 6858 DeducedTSTContext); 6859 if (Result.isNull()) 6860 return QualType(); 6861 6862 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6863 QualType NamedT = ElabT->getNamedType(); 6864 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6865 6866 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6867 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6868 NewTL.setQualifierLoc(QualifierLoc); 6869 } else { 6870 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6871 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6872 NewTL.setQualifierLoc(QualifierLoc); 6873 NewTL.setNameLoc(TL.getNameLoc()); 6874 } 6875 return Result; 6876 } 6877 6878 template<typename Derived> 6879 QualType TreeTransform<Derived>:: 6880 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6881 DependentTemplateSpecializationTypeLoc TL) { 6882 NestedNameSpecifierLoc QualifierLoc; 6883 if (TL.getQualifierLoc()) { 6884 QualifierLoc 6885 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6886 if (!QualifierLoc) 6887 return QualType(); 6888 } 6889 6890 return getDerived() 6891 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6892 } 6893 6894 template<typename Derived> 6895 QualType TreeTransform<Derived>:: 6896 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6897 DependentTemplateSpecializationTypeLoc TL, 6898 NestedNameSpecifierLoc QualifierLoc) { 6899 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6900 6901 TemplateArgumentListInfo NewTemplateArgs; 6902 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6903 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6904 6905 typedef TemplateArgumentLocContainerIterator< 6906 DependentTemplateSpecializationTypeLoc> ArgIterator; 6907 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6908 ArgIterator(TL, TL.getNumArgs()), 6909 NewTemplateArgs)) 6910 return QualType(); 6911 6912 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6913 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6914 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6915 /*AllowInjectedClassName*/ false); 6916 if (Result.isNull()) 6917 return QualType(); 6918 6919 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6920 QualType NamedT = ElabT->getNamedType(); 6921 6922 // Copy information relevant to the template specialization. 6923 TemplateSpecializationTypeLoc NamedTL 6924 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6925 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6926 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6927 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6928 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6929 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6930 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6931 6932 // Copy information relevant to the elaborated type. 6933 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6934 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6935 NewTL.setQualifierLoc(QualifierLoc); 6936 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6937 DependentTemplateSpecializationTypeLoc SpecTL 6938 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6939 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6940 SpecTL.setQualifierLoc(QualifierLoc); 6941 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6942 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6943 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6944 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6945 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6946 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6947 } else { 6948 TemplateSpecializationTypeLoc SpecTL 6949 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6950 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6951 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6952 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6953 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6954 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6955 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6956 } 6957 return Result; 6958 } 6959 6960 template<typename Derived> 6961 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6962 PackExpansionTypeLoc TL) { 6963 QualType Pattern 6964 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6965 if (Pattern.isNull()) 6966 return QualType(); 6967 6968 QualType Result = TL.getType(); 6969 if (getDerived().AlwaysRebuild() || 6970 Pattern != TL.getPatternLoc().getType()) { 6971 Result = getDerived().RebuildPackExpansionType(Pattern, 6972 TL.getPatternLoc().getSourceRange(), 6973 TL.getEllipsisLoc(), 6974 TL.getTypePtr()->getNumExpansions()); 6975 if (Result.isNull()) 6976 return QualType(); 6977 } 6978 6979 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6980 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6981 return Result; 6982 } 6983 6984 template<typename Derived> 6985 QualType 6986 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6987 ObjCInterfaceTypeLoc TL) { 6988 // ObjCInterfaceType is never dependent. 6989 TLB.pushFullCopy(TL); 6990 return TL.getType(); 6991 } 6992 6993 template<typename Derived> 6994 QualType 6995 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6996 ObjCTypeParamTypeLoc TL) { 6997 const ObjCTypeParamType *T = TL.getTypePtr(); 6998 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6999 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7000 if (!OTP) 7001 return QualType(); 7002 7003 QualType Result = TL.getType(); 7004 if (getDerived().AlwaysRebuild() || 7005 OTP != T->getDecl()) { 7006 Result = getDerived().RebuildObjCTypeParamType(OTP, 7007 TL.getProtocolLAngleLoc(), 7008 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7009 TL.getNumProtocols()), 7010 TL.getProtocolLocs(), 7011 TL.getProtocolRAngleLoc()); 7012 if (Result.isNull()) 7013 return QualType(); 7014 } 7015 7016 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7017 if (TL.getNumProtocols()) { 7018 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7019 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7020 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7021 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7022 } 7023 return Result; 7024 } 7025 7026 template<typename Derived> 7027 QualType 7028 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7029 ObjCObjectTypeLoc TL) { 7030 // Transform base type. 7031 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7032 if (BaseType.isNull()) 7033 return QualType(); 7034 7035 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7036 7037 // Transform type arguments. 7038 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7039 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7040 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7041 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7042 QualType TypeArg = TypeArgInfo->getType(); 7043 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7044 AnyChanged = true; 7045 7046 // We have a pack expansion. Instantiate it. 7047 const auto *PackExpansion = PackExpansionLoc.getType() 7048 ->castAs<PackExpansionType>(); 7049 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7050 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7051 Unexpanded); 7052 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7053 7054 // Determine whether the set of unexpanded parameter packs can 7055 // and should be expanded. 7056 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7057 bool Expand = false; 7058 bool RetainExpansion = false; 7059 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7060 if (getDerived().TryExpandParameterPacks( 7061 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7062 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7063 return QualType(); 7064 7065 if (!Expand) { 7066 // We can't expand this pack expansion into separate arguments yet; 7067 // just substitute into the pattern and create a new pack expansion 7068 // type. 7069 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7070 7071 TypeLocBuilder TypeArgBuilder; 7072 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7073 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7074 PatternLoc); 7075 if (NewPatternType.isNull()) 7076 return QualType(); 7077 7078 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7079 NewPatternType, NumExpansions); 7080 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7081 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7082 NewTypeArgInfos.push_back( 7083 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7084 continue; 7085 } 7086 7087 // Substitute into the pack expansion pattern for each slice of the 7088 // pack. 7089 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7090 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7091 7092 TypeLocBuilder TypeArgBuilder; 7093 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7094 7095 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7096 PatternLoc); 7097 if (NewTypeArg.isNull()) 7098 return QualType(); 7099 7100 NewTypeArgInfos.push_back( 7101 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7102 } 7103 7104 continue; 7105 } 7106 7107 TypeLocBuilder TypeArgBuilder; 7108 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7109 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7110 if (NewTypeArg.isNull()) 7111 return QualType(); 7112 7113 // If nothing changed, just keep the old TypeSourceInfo. 7114 if (NewTypeArg == TypeArg) { 7115 NewTypeArgInfos.push_back(TypeArgInfo); 7116 continue; 7117 } 7118 7119 NewTypeArgInfos.push_back( 7120 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7121 AnyChanged = true; 7122 } 7123 7124 QualType Result = TL.getType(); 7125 if (getDerived().AlwaysRebuild() || AnyChanged) { 7126 // Rebuild the type. 7127 Result = getDerived().RebuildObjCObjectType( 7128 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7129 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7130 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7131 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7132 7133 if (Result.isNull()) 7134 return QualType(); 7135 } 7136 7137 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7138 NewT.setHasBaseTypeAsWritten(true); 7139 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7140 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7141 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7142 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7143 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7144 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7145 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7146 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7147 return Result; 7148 } 7149 7150 template<typename Derived> 7151 QualType 7152 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7153 ObjCObjectPointerTypeLoc TL) { 7154 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7155 if (PointeeType.isNull()) 7156 return QualType(); 7157 7158 QualType Result = TL.getType(); 7159 if (getDerived().AlwaysRebuild() || 7160 PointeeType != TL.getPointeeLoc().getType()) { 7161 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7162 TL.getStarLoc()); 7163 if (Result.isNull()) 7164 return QualType(); 7165 } 7166 7167 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7168 NewT.setStarLoc(TL.getStarLoc()); 7169 return Result; 7170 } 7171 7172 //===----------------------------------------------------------------------===// 7173 // Statement transformation 7174 //===----------------------------------------------------------------------===// 7175 template<typename Derived> 7176 StmtResult 7177 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7178 return S; 7179 } 7180 7181 template<typename Derived> 7182 StmtResult 7183 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7184 return getDerived().TransformCompoundStmt(S, false); 7185 } 7186 7187 template<typename Derived> 7188 StmtResult 7189 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7190 bool IsStmtExpr) { 7191 Sema::CompoundScopeRAII CompoundScope(getSema()); 7192 7193 const Stmt *ExprResult = S->getStmtExprResult(); 7194 bool SubStmtInvalid = false; 7195 bool SubStmtChanged = false; 7196 SmallVector<Stmt*, 8> Statements; 7197 for (auto *B : S->body()) { 7198 StmtResult Result = getDerived().TransformStmt( 7199 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7200 7201 if (Result.isInvalid()) { 7202 // Immediately fail if this was a DeclStmt, since it's very 7203 // likely that this will cause problems for future statements. 7204 if (isa<DeclStmt>(B)) 7205 return StmtError(); 7206 7207 // Otherwise, just keep processing substatements and fail later. 7208 SubStmtInvalid = true; 7209 continue; 7210 } 7211 7212 SubStmtChanged = SubStmtChanged || Result.get() != B; 7213 Statements.push_back(Result.getAs<Stmt>()); 7214 } 7215 7216 if (SubStmtInvalid) 7217 return StmtError(); 7218 7219 if (!getDerived().AlwaysRebuild() && 7220 !SubStmtChanged) 7221 return S; 7222 7223 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7224 Statements, 7225 S->getRBracLoc(), 7226 IsStmtExpr); 7227 } 7228 7229 template<typename Derived> 7230 StmtResult 7231 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7232 ExprResult LHS, RHS; 7233 { 7234 EnterExpressionEvaluationContext Unevaluated( 7235 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7236 7237 // Transform the left-hand case value. 7238 LHS = getDerived().TransformExpr(S->getLHS()); 7239 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7240 if (LHS.isInvalid()) 7241 return StmtError(); 7242 7243 // Transform the right-hand case value (for the GNU case-range extension). 7244 RHS = getDerived().TransformExpr(S->getRHS()); 7245 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7246 if (RHS.isInvalid()) 7247 return StmtError(); 7248 } 7249 7250 // Build the case statement. 7251 // Case statements are always rebuilt so that they will attached to their 7252 // transformed switch statement. 7253 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7254 LHS.get(), 7255 S->getEllipsisLoc(), 7256 RHS.get(), 7257 S->getColonLoc()); 7258 if (Case.isInvalid()) 7259 return StmtError(); 7260 7261 // Transform the statement following the case 7262 StmtResult SubStmt = 7263 getDerived().TransformStmt(S->getSubStmt()); 7264 if (SubStmt.isInvalid()) 7265 return StmtError(); 7266 7267 // Attach the body to the case statement 7268 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7269 } 7270 7271 template <typename Derived> 7272 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7273 // Transform the statement following the default case 7274 StmtResult SubStmt = 7275 getDerived().TransformStmt(S->getSubStmt()); 7276 if (SubStmt.isInvalid()) 7277 return StmtError(); 7278 7279 // Default statements are always rebuilt 7280 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7281 SubStmt.get()); 7282 } 7283 7284 template<typename Derived> 7285 StmtResult 7286 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7287 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7288 if (SubStmt.isInvalid()) 7289 return StmtError(); 7290 7291 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7292 S->getDecl()); 7293 if (!LD) 7294 return StmtError(); 7295 7296 // If we're transforming "in-place" (we're not creating new local 7297 // declarations), assume we're replacing the old label statement 7298 // and clear out the reference to it. 7299 if (LD == S->getDecl()) 7300 S->getDecl()->setStmt(nullptr); 7301 7302 // FIXME: Pass the real colon location in. 7303 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7304 cast<LabelDecl>(LD), SourceLocation(), 7305 SubStmt.get()); 7306 } 7307 7308 template <typename Derived> 7309 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7310 if (!R) 7311 return R; 7312 7313 switch (R->getKind()) { 7314 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7315 #define ATTR(X) 7316 #define PRAGMA_SPELLING_ATTR(X) \ 7317 case attr::X: \ 7318 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7319 #include "clang/Basic/AttrList.inc" 7320 default: 7321 return R; 7322 } 7323 } 7324 7325 template <typename Derived> 7326 StmtResult 7327 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7328 StmtDiscardKind SDK) { 7329 bool AttrsChanged = false; 7330 SmallVector<const Attr *, 1> Attrs; 7331 7332 // Visit attributes and keep track if any are transformed. 7333 for (const auto *I : S->getAttrs()) { 7334 const Attr *R = getDerived().TransformAttr(I); 7335 AttrsChanged |= (I != R); 7336 if (R) 7337 Attrs.push_back(R); 7338 } 7339 7340 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7341 if (SubStmt.isInvalid()) 7342 return StmtError(); 7343 7344 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7345 return S; 7346 7347 // If transforming the attributes failed for all of the attributes in the 7348 // statement, don't make an AttributedStmt without attributes. 7349 if (Attrs.empty()) 7350 return SubStmt; 7351 7352 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7353 SubStmt.get()); 7354 } 7355 7356 template<typename Derived> 7357 StmtResult 7358 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7359 // Transform the initialization statement 7360 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7361 if (Init.isInvalid()) 7362 return StmtError(); 7363 7364 // Transform the condition 7365 Sema::ConditionResult Cond = getDerived().TransformCondition( 7366 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7367 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7368 : Sema::ConditionKind::Boolean); 7369 if (Cond.isInvalid()) 7370 return StmtError(); 7371 7372 // If this is a constexpr if, determine which arm we should instantiate. 7373 llvm::Optional<bool> ConstexprConditionValue; 7374 if (S->isConstexpr()) 7375 ConstexprConditionValue = Cond.getKnownValue(); 7376 7377 // Transform the "then" branch. 7378 StmtResult Then; 7379 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7380 Then = getDerived().TransformStmt(S->getThen()); 7381 if (Then.isInvalid()) 7382 return StmtError(); 7383 } else { 7384 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7385 } 7386 7387 // Transform the "else" branch. 7388 StmtResult Else; 7389 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7390 Else = getDerived().TransformStmt(S->getElse()); 7391 if (Else.isInvalid()) 7392 return StmtError(); 7393 } 7394 7395 if (!getDerived().AlwaysRebuild() && 7396 Init.get() == S->getInit() && 7397 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7398 Then.get() == S->getThen() && 7399 Else.get() == S->getElse()) 7400 return S; 7401 7402 return getDerived().RebuildIfStmt( 7403 S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, 7404 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7405 } 7406 7407 template<typename Derived> 7408 StmtResult 7409 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7410 // Transform the initialization statement 7411 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7412 if (Init.isInvalid()) 7413 return StmtError(); 7414 7415 // Transform the condition. 7416 Sema::ConditionResult Cond = getDerived().TransformCondition( 7417 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7418 Sema::ConditionKind::Switch); 7419 if (Cond.isInvalid()) 7420 return StmtError(); 7421 7422 // Rebuild the switch statement. 7423 StmtResult Switch = 7424 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7425 Init.get(), Cond, S->getRParenLoc()); 7426 if (Switch.isInvalid()) 7427 return StmtError(); 7428 7429 // Transform the body of the switch statement. 7430 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7431 if (Body.isInvalid()) 7432 return StmtError(); 7433 7434 // Complete the switch statement. 7435 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7436 Body.get()); 7437 } 7438 7439 template<typename Derived> 7440 StmtResult 7441 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7442 // Transform the condition 7443 Sema::ConditionResult Cond = getDerived().TransformCondition( 7444 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7445 Sema::ConditionKind::Boolean); 7446 if (Cond.isInvalid()) 7447 return StmtError(); 7448 7449 // Transform the body 7450 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7451 if (Body.isInvalid()) 7452 return StmtError(); 7453 7454 if (!getDerived().AlwaysRebuild() && 7455 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7456 Body.get() == S->getBody()) 7457 return Owned(S); 7458 7459 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7460 Cond, S->getRParenLoc(), Body.get()); 7461 } 7462 7463 template<typename Derived> 7464 StmtResult 7465 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7466 // Transform the body 7467 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7468 if (Body.isInvalid()) 7469 return StmtError(); 7470 7471 // Transform the condition 7472 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7473 if (Cond.isInvalid()) 7474 return StmtError(); 7475 7476 if (!getDerived().AlwaysRebuild() && 7477 Cond.get() == S->getCond() && 7478 Body.get() == S->getBody()) 7479 return S; 7480 7481 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7482 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7483 S->getRParenLoc()); 7484 } 7485 7486 template<typename Derived> 7487 StmtResult 7488 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7489 if (getSema().getLangOpts().OpenMP) 7490 getSema().startOpenMPLoop(); 7491 7492 // Transform the initialization statement 7493 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7494 if (Init.isInvalid()) 7495 return StmtError(); 7496 7497 // In OpenMP loop region loop control variable must be captured and be 7498 // private. Perform analysis of first part (if any). 7499 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7500 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7501 7502 // Transform the condition 7503 Sema::ConditionResult Cond = getDerived().TransformCondition( 7504 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7505 Sema::ConditionKind::Boolean); 7506 if (Cond.isInvalid()) 7507 return StmtError(); 7508 7509 // Transform the increment 7510 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7511 if (Inc.isInvalid()) 7512 return StmtError(); 7513 7514 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7515 if (S->getInc() && !FullInc.get()) 7516 return StmtError(); 7517 7518 // Transform the body 7519 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7520 if (Body.isInvalid()) 7521 return StmtError(); 7522 7523 if (!getDerived().AlwaysRebuild() && 7524 Init.get() == S->getInit() && 7525 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7526 Inc.get() == S->getInc() && 7527 Body.get() == S->getBody()) 7528 return S; 7529 7530 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7531 Init.get(), Cond, FullInc, 7532 S->getRParenLoc(), Body.get()); 7533 } 7534 7535 template<typename Derived> 7536 StmtResult 7537 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7538 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7539 S->getLabel()); 7540 if (!LD) 7541 return StmtError(); 7542 7543 // Goto statements must always be rebuilt, to resolve the label. 7544 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7545 cast<LabelDecl>(LD)); 7546 } 7547 7548 template<typename Derived> 7549 StmtResult 7550 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7551 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7552 if (Target.isInvalid()) 7553 return StmtError(); 7554 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7555 7556 if (!getDerived().AlwaysRebuild() && 7557 Target.get() == S->getTarget()) 7558 return S; 7559 7560 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7561 Target.get()); 7562 } 7563 7564 template<typename Derived> 7565 StmtResult 7566 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7567 return S; 7568 } 7569 7570 template<typename Derived> 7571 StmtResult 7572 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7573 return S; 7574 } 7575 7576 template<typename Derived> 7577 StmtResult 7578 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7579 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7580 /*NotCopyInit*/false); 7581 if (Result.isInvalid()) 7582 return StmtError(); 7583 7584 // FIXME: We always rebuild the return statement because there is no way 7585 // to tell whether the return type of the function has changed. 7586 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7587 } 7588 7589 template<typename Derived> 7590 StmtResult 7591 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7592 bool DeclChanged = false; 7593 SmallVector<Decl *, 4> Decls; 7594 for (auto *D : S->decls()) { 7595 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7596 if (!Transformed) 7597 return StmtError(); 7598 7599 if (Transformed != D) 7600 DeclChanged = true; 7601 7602 Decls.push_back(Transformed); 7603 } 7604 7605 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7606 return S; 7607 7608 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7609 } 7610 7611 template<typename Derived> 7612 StmtResult 7613 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7614 7615 SmallVector<Expr*, 8> Constraints; 7616 SmallVector<Expr*, 8> Exprs; 7617 SmallVector<IdentifierInfo *, 4> Names; 7618 7619 ExprResult AsmString; 7620 SmallVector<Expr*, 8> Clobbers; 7621 7622 bool ExprsChanged = false; 7623 7624 // Go through the outputs. 7625 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7626 Names.push_back(S->getOutputIdentifier(I)); 7627 7628 // No need to transform the constraint literal. 7629 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7630 7631 // Transform the output expr. 7632 Expr *OutputExpr = S->getOutputExpr(I); 7633 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7634 if (Result.isInvalid()) 7635 return StmtError(); 7636 7637 ExprsChanged |= Result.get() != OutputExpr; 7638 7639 Exprs.push_back(Result.get()); 7640 } 7641 7642 // Go through the inputs. 7643 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7644 Names.push_back(S->getInputIdentifier(I)); 7645 7646 // No need to transform the constraint literal. 7647 Constraints.push_back(S->getInputConstraintLiteral(I)); 7648 7649 // Transform the input expr. 7650 Expr *InputExpr = S->getInputExpr(I); 7651 ExprResult Result = getDerived().TransformExpr(InputExpr); 7652 if (Result.isInvalid()) 7653 return StmtError(); 7654 7655 ExprsChanged |= Result.get() != InputExpr; 7656 7657 Exprs.push_back(Result.get()); 7658 } 7659 7660 // Go through the Labels. 7661 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7662 Names.push_back(S->getLabelIdentifier(I)); 7663 7664 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7665 if (Result.isInvalid()) 7666 return StmtError(); 7667 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7668 Exprs.push_back(Result.get()); 7669 } 7670 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7671 return S; 7672 7673 // Go through the clobbers. 7674 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7675 Clobbers.push_back(S->getClobberStringLiteral(I)); 7676 7677 // No need to transform the asm string literal. 7678 AsmString = S->getAsmString(); 7679 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7680 S->isVolatile(), S->getNumOutputs(), 7681 S->getNumInputs(), Names.data(), 7682 Constraints, Exprs, AsmString.get(), 7683 Clobbers, S->getNumLabels(), 7684 S->getRParenLoc()); 7685 } 7686 7687 template<typename Derived> 7688 StmtResult 7689 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7690 ArrayRef<Token> AsmToks = 7691 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7692 7693 bool HadError = false, HadChange = false; 7694 7695 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7696 SmallVector<Expr*, 8> TransformedExprs; 7697 TransformedExprs.reserve(SrcExprs.size()); 7698 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7699 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7700 if (!Result.isUsable()) { 7701 HadError = true; 7702 } else { 7703 HadChange |= (Result.get() != SrcExprs[i]); 7704 TransformedExprs.push_back(Result.get()); 7705 } 7706 } 7707 7708 if (HadError) return StmtError(); 7709 if (!HadChange && !getDerived().AlwaysRebuild()) 7710 return Owned(S); 7711 7712 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7713 AsmToks, S->getAsmString(), 7714 S->getNumOutputs(), S->getNumInputs(), 7715 S->getAllConstraints(), S->getClobbers(), 7716 TransformedExprs, S->getEndLoc()); 7717 } 7718 7719 // C++ Coroutines TS 7720 7721 template<typename Derived> 7722 StmtResult 7723 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7724 auto *ScopeInfo = SemaRef.getCurFunction(); 7725 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7726 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7727 ScopeInfo->NeedsCoroutineSuspends && 7728 ScopeInfo->CoroutineSuspends.first == nullptr && 7729 ScopeInfo->CoroutineSuspends.second == nullptr && 7730 "expected clean scope info"); 7731 7732 // Set that we have (possibly-invalid) suspend points before we do anything 7733 // that may fail. 7734 ScopeInfo->setNeedsCoroutineSuspends(false); 7735 7736 // We re-build the coroutine promise object (and the coroutine parameters its 7737 // type and constructor depend on) based on the types used in our current 7738 // function. We must do so, and set it on the current FunctionScopeInfo, 7739 // before attempting to transform the other parts of the coroutine body 7740 // statement, such as the implicit suspend statements (because those 7741 // statements reference the FunctionScopeInfo::CoroutinePromise). 7742 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7743 return StmtError(); 7744 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7745 if (!Promise) 7746 return StmtError(); 7747 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7748 ScopeInfo->CoroutinePromise = Promise; 7749 7750 // Transform the implicit coroutine statements constructed using dependent 7751 // types during the previous parse: initial and final suspensions, the return 7752 // object, and others. We also transform the coroutine function's body. 7753 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7754 if (InitSuspend.isInvalid()) 7755 return StmtError(); 7756 StmtResult FinalSuspend = 7757 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7758 if (FinalSuspend.isInvalid() || 7759 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7760 return StmtError(); 7761 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7762 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7763 7764 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7765 if (BodyRes.isInvalid()) 7766 return StmtError(); 7767 7768 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7769 if (Builder.isInvalid()) 7770 return StmtError(); 7771 7772 Expr *ReturnObject = S->getReturnValueInit(); 7773 assert(ReturnObject && "the return object is expected to be valid"); 7774 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7775 /*NoCopyInit*/ false); 7776 if (Res.isInvalid()) 7777 return StmtError(); 7778 Builder.ReturnValue = Res.get(); 7779 7780 // If during the previous parse the coroutine still had a dependent promise 7781 // statement, we may need to build some implicit coroutine statements 7782 // (such as exception and fallthrough handlers) for the first time. 7783 if (S->hasDependentPromiseType()) { 7784 // We can only build these statements, however, if the current promise type 7785 // is not dependent. 7786 if (!Promise->getType()->isDependentType()) { 7787 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7788 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7789 "these nodes should not have been built yet"); 7790 if (!Builder.buildDependentStatements()) 7791 return StmtError(); 7792 } 7793 } else { 7794 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7795 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7796 if (Res.isInvalid()) 7797 return StmtError(); 7798 Builder.OnFallthrough = Res.get(); 7799 } 7800 7801 if (auto *OnException = S->getExceptionHandler()) { 7802 StmtResult Res = getDerived().TransformStmt(OnException); 7803 if (Res.isInvalid()) 7804 return StmtError(); 7805 Builder.OnException = Res.get(); 7806 } 7807 7808 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7809 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7810 if (Res.isInvalid()) 7811 return StmtError(); 7812 Builder.ReturnStmtOnAllocFailure = Res.get(); 7813 } 7814 7815 // Transform any additional statements we may have already built 7816 assert(S->getAllocate() && S->getDeallocate() && 7817 "allocation and deallocation calls must already be built"); 7818 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7819 if (AllocRes.isInvalid()) 7820 return StmtError(); 7821 Builder.Allocate = AllocRes.get(); 7822 7823 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7824 if (DeallocRes.isInvalid()) 7825 return StmtError(); 7826 Builder.Deallocate = DeallocRes.get(); 7827 7828 assert(S->getResultDecl() && "ResultDecl must already be built"); 7829 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7830 if (ResultDecl.isInvalid()) 7831 return StmtError(); 7832 Builder.ResultDecl = ResultDecl.get(); 7833 7834 if (auto *ReturnStmt = S->getReturnStmt()) { 7835 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7836 if (Res.isInvalid()) 7837 return StmtError(); 7838 Builder.ReturnStmt = Res.get(); 7839 } 7840 } 7841 7842 return getDerived().RebuildCoroutineBodyStmt(Builder); 7843 } 7844 7845 template<typename Derived> 7846 StmtResult 7847 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7848 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7849 /*NotCopyInit*/false); 7850 if (Result.isInvalid()) 7851 return StmtError(); 7852 7853 // Always rebuild; we don't know if this needs to be injected into a new 7854 // context or if the promise type has changed. 7855 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7856 S->isImplicit()); 7857 } 7858 7859 template<typename Derived> 7860 ExprResult 7861 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7862 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7863 /*NotCopyInit*/false); 7864 if (Result.isInvalid()) 7865 return ExprError(); 7866 7867 // Always rebuild; we don't know if this needs to be injected into a new 7868 // context or if the promise type has changed. 7869 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7870 E->isImplicit()); 7871 } 7872 7873 template <typename Derived> 7874 ExprResult 7875 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7876 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7877 /*NotCopyInit*/ false); 7878 if (OperandResult.isInvalid()) 7879 return ExprError(); 7880 7881 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7882 E->getOperatorCoawaitLookup()); 7883 7884 if (LookupResult.isInvalid()) 7885 return ExprError(); 7886 7887 // Always rebuild; we don't know if this needs to be injected into a new 7888 // context or if the promise type has changed. 7889 return getDerived().RebuildDependentCoawaitExpr( 7890 E->getKeywordLoc(), OperandResult.get(), 7891 cast<UnresolvedLookupExpr>(LookupResult.get())); 7892 } 7893 7894 template<typename Derived> 7895 ExprResult 7896 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7897 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7898 /*NotCopyInit*/false); 7899 if (Result.isInvalid()) 7900 return ExprError(); 7901 7902 // Always rebuild; we don't know if this needs to be injected into a new 7903 // context or if the promise type has changed. 7904 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7905 } 7906 7907 // Objective-C Statements. 7908 7909 template<typename Derived> 7910 StmtResult 7911 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7912 // Transform the body of the @try. 7913 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7914 if (TryBody.isInvalid()) 7915 return StmtError(); 7916 7917 // Transform the @catch statements (if present). 7918 bool AnyCatchChanged = false; 7919 SmallVector<Stmt*, 8> CatchStmts; 7920 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7921 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7922 if (Catch.isInvalid()) 7923 return StmtError(); 7924 if (Catch.get() != S->getCatchStmt(I)) 7925 AnyCatchChanged = true; 7926 CatchStmts.push_back(Catch.get()); 7927 } 7928 7929 // Transform the @finally statement (if present). 7930 StmtResult Finally; 7931 if (S->getFinallyStmt()) { 7932 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7933 if (Finally.isInvalid()) 7934 return StmtError(); 7935 } 7936 7937 // If nothing changed, just retain this statement. 7938 if (!getDerived().AlwaysRebuild() && 7939 TryBody.get() == S->getTryBody() && 7940 !AnyCatchChanged && 7941 Finally.get() == S->getFinallyStmt()) 7942 return S; 7943 7944 // Build a new statement. 7945 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7946 CatchStmts, Finally.get()); 7947 } 7948 7949 template<typename Derived> 7950 StmtResult 7951 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7952 // Transform the @catch parameter, if there is one. 7953 VarDecl *Var = nullptr; 7954 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7955 TypeSourceInfo *TSInfo = nullptr; 7956 if (FromVar->getTypeSourceInfo()) { 7957 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7958 if (!TSInfo) 7959 return StmtError(); 7960 } 7961 7962 QualType T; 7963 if (TSInfo) 7964 T = TSInfo->getType(); 7965 else { 7966 T = getDerived().TransformType(FromVar->getType()); 7967 if (T.isNull()) 7968 return StmtError(); 7969 } 7970 7971 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7972 if (!Var) 7973 return StmtError(); 7974 } 7975 7976 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7977 if (Body.isInvalid()) 7978 return StmtError(); 7979 7980 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7981 S->getRParenLoc(), 7982 Var, Body.get()); 7983 } 7984 7985 template<typename Derived> 7986 StmtResult 7987 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7988 // Transform the body. 7989 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7990 if (Body.isInvalid()) 7991 return StmtError(); 7992 7993 // If nothing changed, just retain this statement. 7994 if (!getDerived().AlwaysRebuild() && 7995 Body.get() == S->getFinallyBody()) 7996 return S; 7997 7998 // Build a new statement. 7999 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8000 Body.get()); 8001 } 8002 8003 template<typename Derived> 8004 StmtResult 8005 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8006 ExprResult Operand; 8007 if (S->getThrowExpr()) { 8008 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8009 if (Operand.isInvalid()) 8010 return StmtError(); 8011 } 8012 8013 if (!getDerived().AlwaysRebuild() && 8014 Operand.get() == S->getThrowExpr()) 8015 return S; 8016 8017 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8018 } 8019 8020 template<typename Derived> 8021 StmtResult 8022 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8023 ObjCAtSynchronizedStmt *S) { 8024 // Transform the object we are locking. 8025 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8026 if (Object.isInvalid()) 8027 return StmtError(); 8028 Object = 8029 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8030 Object.get()); 8031 if (Object.isInvalid()) 8032 return StmtError(); 8033 8034 // Transform the body. 8035 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8036 if (Body.isInvalid()) 8037 return StmtError(); 8038 8039 // If nothing change, just retain the current statement. 8040 if (!getDerived().AlwaysRebuild() && 8041 Object.get() == S->getSynchExpr() && 8042 Body.get() == S->getSynchBody()) 8043 return S; 8044 8045 // Build a new statement. 8046 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8047 Object.get(), Body.get()); 8048 } 8049 8050 template<typename Derived> 8051 StmtResult 8052 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8053 ObjCAutoreleasePoolStmt *S) { 8054 // Transform the body. 8055 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8056 if (Body.isInvalid()) 8057 return StmtError(); 8058 8059 // If nothing changed, just retain this statement. 8060 if (!getDerived().AlwaysRebuild() && 8061 Body.get() == S->getSubStmt()) 8062 return S; 8063 8064 // Build a new statement. 8065 return getDerived().RebuildObjCAutoreleasePoolStmt( 8066 S->getAtLoc(), Body.get()); 8067 } 8068 8069 template<typename Derived> 8070 StmtResult 8071 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8072 ObjCForCollectionStmt *S) { 8073 // Transform the element statement. 8074 StmtResult Element = 8075 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8076 if (Element.isInvalid()) 8077 return StmtError(); 8078 8079 // Transform the collection expression. 8080 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8081 if (Collection.isInvalid()) 8082 return StmtError(); 8083 8084 // Transform the body. 8085 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8086 if (Body.isInvalid()) 8087 return StmtError(); 8088 8089 // If nothing changed, just retain this statement. 8090 if (!getDerived().AlwaysRebuild() && 8091 Element.get() == S->getElement() && 8092 Collection.get() == S->getCollection() && 8093 Body.get() == S->getBody()) 8094 return S; 8095 8096 // Build a new statement. 8097 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8098 Element.get(), 8099 Collection.get(), 8100 S->getRParenLoc(), 8101 Body.get()); 8102 } 8103 8104 template <typename Derived> 8105 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8106 // Transform the exception declaration, if any. 8107 VarDecl *Var = nullptr; 8108 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8109 TypeSourceInfo *T = 8110 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8111 if (!T) 8112 return StmtError(); 8113 8114 Var = getDerived().RebuildExceptionDecl( 8115 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8116 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8117 if (!Var || Var->isInvalidDecl()) 8118 return StmtError(); 8119 } 8120 8121 // Transform the actual exception handler. 8122 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8123 if (Handler.isInvalid()) 8124 return StmtError(); 8125 8126 if (!getDerived().AlwaysRebuild() && !Var && 8127 Handler.get() == S->getHandlerBlock()) 8128 return S; 8129 8130 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8131 } 8132 8133 template <typename Derived> 8134 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8135 // Transform the try block itself. 8136 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8137 if (TryBlock.isInvalid()) 8138 return StmtError(); 8139 8140 // Transform the handlers. 8141 bool HandlerChanged = false; 8142 SmallVector<Stmt *, 8> Handlers; 8143 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8144 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8145 if (Handler.isInvalid()) 8146 return StmtError(); 8147 8148 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8149 Handlers.push_back(Handler.getAs<Stmt>()); 8150 } 8151 8152 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8153 !HandlerChanged) 8154 return S; 8155 8156 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8157 Handlers); 8158 } 8159 8160 template<typename Derived> 8161 StmtResult 8162 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8163 StmtResult Init = 8164 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8165 if (Init.isInvalid()) 8166 return StmtError(); 8167 8168 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8169 if (Range.isInvalid()) 8170 return StmtError(); 8171 8172 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8173 if (Begin.isInvalid()) 8174 return StmtError(); 8175 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8176 if (End.isInvalid()) 8177 return StmtError(); 8178 8179 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8180 if (Cond.isInvalid()) 8181 return StmtError(); 8182 if (Cond.get()) 8183 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8184 if (Cond.isInvalid()) 8185 return StmtError(); 8186 if (Cond.get()) 8187 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8188 8189 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8190 if (Inc.isInvalid()) 8191 return StmtError(); 8192 if (Inc.get()) 8193 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8194 8195 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8196 if (LoopVar.isInvalid()) 8197 return StmtError(); 8198 8199 StmtResult NewStmt = S; 8200 if (getDerived().AlwaysRebuild() || 8201 Init.get() != S->getInit() || 8202 Range.get() != S->getRangeStmt() || 8203 Begin.get() != S->getBeginStmt() || 8204 End.get() != S->getEndStmt() || 8205 Cond.get() != S->getCond() || 8206 Inc.get() != S->getInc() || 8207 LoopVar.get() != S->getLoopVarStmt()) { 8208 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8209 S->getCoawaitLoc(), Init.get(), 8210 S->getColonLoc(), Range.get(), 8211 Begin.get(), End.get(), 8212 Cond.get(), 8213 Inc.get(), LoopVar.get(), 8214 S->getRParenLoc()); 8215 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8216 // Might not have attached any initializer to the loop variable. 8217 getSema().ActOnInitializerError( 8218 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8219 return StmtError(); 8220 } 8221 } 8222 8223 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8224 if (Body.isInvalid()) 8225 return StmtError(); 8226 8227 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8228 // it now so we have a new statement to attach the body to. 8229 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8230 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8231 S->getCoawaitLoc(), Init.get(), 8232 S->getColonLoc(), Range.get(), 8233 Begin.get(), End.get(), 8234 Cond.get(), 8235 Inc.get(), LoopVar.get(), 8236 S->getRParenLoc()); 8237 if (NewStmt.isInvalid()) 8238 return StmtError(); 8239 } 8240 8241 if (NewStmt.get() == S) 8242 return S; 8243 8244 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8245 } 8246 8247 template<typename Derived> 8248 StmtResult 8249 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8250 MSDependentExistsStmt *S) { 8251 // Transform the nested-name-specifier, if any. 8252 NestedNameSpecifierLoc QualifierLoc; 8253 if (S->getQualifierLoc()) { 8254 QualifierLoc 8255 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8256 if (!QualifierLoc) 8257 return StmtError(); 8258 } 8259 8260 // Transform the declaration name. 8261 DeclarationNameInfo NameInfo = S->getNameInfo(); 8262 if (NameInfo.getName()) { 8263 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8264 if (!NameInfo.getName()) 8265 return StmtError(); 8266 } 8267 8268 // Check whether anything changed. 8269 if (!getDerived().AlwaysRebuild() && 8270 QualifierLoc == S->getQualifierLoc() && 8271 NameInfo.getName() == S->getNameInfo().getName()) 8272 return S; 8273 8274 // Determine whether this name exists, if we can. 8275 CXXScopeSpec SS; 8276 SS.Adopt(QualifierLoc); 8277 bool Dependent = false; 8278 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8279 case Sema::IER_Exists: 8280 if (S->isIfExists()) 8281 break; 8282 8283 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8284 8285 case Sema::IER_DoesNotExist: 8286 if (S->isIfNotExists()) 8287 break; 8288 8289 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8290 8291 case Sema::IER_Dependent: 8292 Dependent = true; 8293 break; 8294 8295 case Sema::IER_Error: 8296 return StmtError(); 8297 } 8298 8299 // We need to continue with the instantiation, so do so now. 8300 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8301 if (SubStmt.isInvalid()) 8302 return StmtError(); 8303 8304 // If we have resolved the name, just transform to the substatement. 8305 if (!Dependent) 8306 return SubStmt; 8307 8308 // The name is still dependent, so build a dependent expression again. 8309 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8310 S->isIfExists(), 8311 QualifierLoc, 8312 NameInfo, 8313 SubStmt.get()); 8314 } 8315 8316 template<typename Derived> 8317 ExprResult 8318 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8319 NestedNameSpecifierLoc QualifierLoc; 8320 if (E->getQualifierLoc()) { 8321 QualifierLoc 8322 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8323 if (!QualifierLoc) 8324 return ExprError(); 8325 } 8326 8327 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8328 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8329 if (!PD) 8330 return ExprError(); 8331 8332 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8333 if (Base.isInvalid()) 8334 return ExprError(); 8335 8336 return new (SemaRef.getASTContext()) 8337 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8338 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8339 QualifierLoc, E->getMemberLoc()); 8340 } 8341 8342 template <typename Derived> 8343 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8344 MSPropertySubscriptExpr *E) { 8345 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8346 if (BaseRes.isInvalid()) 8347 return ExprError(); 8348 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8349 if (IdxRes.isInvalid()) 8350 return ExprError(); 8351 8352 if (!getDerived().AlwaysRebuild() && 8353 BaseRes.get() == E->getBase() && 8354 IdxRes.get() == E->getIdx()) 8355 return E; 8356 8357 return getDerived().RebuildArraySubscriptExpr( 8358 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8359 } 8360 8361 template <typename Derived> 8362 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8363 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8364 if (TryBlock.isInvalid()) 8365 return StmtError(); 8366 8367 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8368 if (Handler.isInvalid()) 8369 return StmtError(); 8370 8371 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8372 Handler.get() == S->getHandler()) 8373 return S; 8374 8375 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8376 TryBlock.get(), Handler.get()); 8377 } 8378 8379 template <typename Derived> 8380 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8381 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8382 if (Block.isInvalid()) 8383 return StmtError(); 8384 8385 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8386 } 8387 8388 template <typename Derived> 8389 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8390 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8391 if (FilterExpr.isInvalid()) 8392 return StmtError(); 8393 8394 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8395 if (Block.isInvalid()) 8396 return StmtError(); 8397 8398 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8399 Block.get()); 8400 } 8401 8402 template <typename Derived> 8403 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8404 if (isa<SEHFinallyStmt>(Handler)) 8405 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8406 else 8407 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8408 } 8409 8410 template<typename Derived> 8411 StmtResult 8412 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8413 return S; 8414 } 8415 8416 //===----------------------------------------------------------------------===// 8417 // OpenMP directive transformation 8418 //===----------------------------------------------------------------------===// 8419 8420 template <typename Derived> 8421 StmtResult 8422 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8423 // OMPCanonicalLoops are eliminated during transformation, since they will be 8424 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8425 // after transformation. 8426 return getDerived().TransformStmt(L->getLoopStmt()); 8427 } 8428 8429 template <typename Derived> 8430 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8431 OMPExecutableDirective *D) { 8432 8433 // Transform the clauses 8434 llvm::SmallVector<OMPClause *, 16> TClauses; 8435 ArrayRef<OMPClause *> Clauses = D->clauses(); 8436 TClauses.reserve(Clauses.size()); 8437 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8438 I != E; ++I) { 8439 if (*I) { 8440 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8441 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8442 getDerived().getSema().EndOpenMPClause(); 8443 if (Clause) 8444 TClauses.push_back(Clause); 8445 } else { 8446 TClauses.push_back(nullptr); 8447 } 8448 } 8449 StmtResult AssociatedStmt; 8450 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8451 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8452 /*CurScope=*/nullptr); 8453 StmtResult Body; 8454 { 8455 Sema::CompoundScopeRAII CompoundScope(getSema()); 8456 Stmt *CS; 8457 if (D->getDirectiveKind() == OMPD_atomic || 8458 D->getDirectiveKind() == OMPD_critical || 8459 D->getDirectiveKind() == OMPD_section || 8460 D->getDirectiveKind() == OMPD_master) 8461 CS = D->getAssociatedStmt(); 8462 else 8463 CS = D->getRawStmt(); 8464 Body = getDerived().TransformStmt(CS); 8465 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8466 getSema().getLangOpts().OpenMPIRBuilder) 8467 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8468 } 8469 AssociatedStmt = 8470 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8471 if (AssociatedStmt.isInvalid()) { 8472 return StmtError(); 8473 } 8474 } 8475 if (TClauses.size() != Clauses.size()) { 8476 return StmtError(); 8477 } 8478 8479 // Transform directive name for 'omp critical' directive. 8480 DeclarationNameInfo DirName; 8481 if (D->getDirectiveKind() == OMPD_critical) { 8482 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8483 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8484 } 8485 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8486 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8487 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8488 } else if (D->getDirectiveKind() == OMPD_cancel) { 8489 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8490 } 8491 8492 return getDerived().RebuildOMPExecutableDirective( 8493 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8494 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8495 } 8496 8497 template <typename Derived> 8498 StmtResult 8499 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8500 DeclarationNameInfo DirName; 8501 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8502 D->getBeginLoc()); 8503 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8504 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8505 return Res; 8506 } 8507 8508 template <typename Derived> 8509 StmtResult 8510 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8511 DeclarationNameInfo DirName; 8512 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8513 D->getBeginLoc()); 8514 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8515 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8516 return Res; 8517 } 8518 8519 template <typename Derived> 8520 StmtResult 8521 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8522 DeclarationNameInfo DirName; 8523 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8524 nullptr, D->getBeginLoc()); 8525 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8526 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8527 return Res; 8528 } 8529 8530 template <typename Derived> 8531 StmtResult 8532 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8533 DeclarationNameInfo DirName; 8534 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8535 D->getBeginLoc()); 8536 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8537 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8538 return Res; 8539 } 8540 8541 template <typename Derived> 8542 StmtResult 8543 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8544 DeclarationNameInfo DirName; 8545 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8546 D->getBeginLoc()); 8547 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8548 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8549 return Res; 8550 } 8551 8552 template <typename Derived> 8553 StmtResult 8554 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8555 DeclarationNameInfo DirName; 8556 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8557 D->getBeginLoc()); 8558 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8559 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8560 return Res; 8561 } 8562 8563 template <typename Derived> 8564 StmtResult 8565 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8566 DeclarationNameInfo DirName; 8567 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8568 D->getBeginLoc()); 8569 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8570 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8571 return Res; 8572 } 8573 8574 template <typename Derived> 8575 StmtResult 8576 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8577 DeclarationNameInfo DirName; 8578 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8579 D->getBeginLoc()); 8580 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8581 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8582 return Res; 8583 } 8584 8585 template <typename Derived> 8586 StmtResult 8587 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8588 DeclarationNameInfo DirName; 8589 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, 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>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8599 getDerived().getSema().StartOpenMPDSABlock( 8600 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8601 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8602 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8603 return Res; 8604 } 8605 8606 template <typename Derived> 8607 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8608 OMPParallelForDirective *D) { 8609 DeclarationNameInfo DirName; 8610 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8611 nullptr, D->getBeginLoc()); 8612 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8613 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8614 return Res; 8615 } 8616 8617 template <typename Derived> 8618 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8619 OMPParallelForSimdDirective *D) { 8620 DeclarationNameInfo DirName; 8621 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8622 nullptr, D->getBeginLoc()); 8623 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8624 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8625 return Res; 8626 } 8627 8628 template <typename Derived> 8629 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8630 OMPParallelMasterDirective *D) { 8631 DeclarationNameInfo DirName; 8632 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8633 nullptr, D->getBeginLoc()); 8634 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8635 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8636 return Res; 8637 } 8638 8639 template <typename Derived> 8640 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8641 OMPParallelSectionsDirective *D) { 8642 DeclarationNameInfo DirName; 8643 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8644 nullptr, D->getBeginLoc()); 8645 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8646 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8647 return Res; 8648 } 8649 8650 template <typename Derived> 8651 StmtResult 8652 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8653 DeclarationNameInfo DirName; 8654 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8655 D->getBeginLoc()); 8656 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8657 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8658 return Res; 8659 } 8660 8661 template <typename Derived> 8662 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8663 OMPTaskyieldDirective *D) { 8664 DeclarationNameInfo DirName; 8665 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8666 D->getBeginLoc()); 8667 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8668 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8669 return Res; 8670 } 8671 8672 template <typename Derived> 8673 StmtResult 8674 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8675 DeclarationNameInfo DirName; 8676 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8677 D->getBeginLoc()); 8678 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8679 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8680 return Res; 8681 } 8682 8683 template <typename Derived> 8684 StmtResult 8685 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8686 DeclarationNameInfo DirName; 8687 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8688 D->getBeginLoc()); 8689 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8690 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8691 return Res; 8692 } 8693 8694 template <typename Derived> 8695 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8696 OMPTaskgroupDirective *D) { 8697 DeclarationNameInfo DirName; 8698 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8699 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 8707 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8708 DeclarationNameInfo DirName; 8709 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8710 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 8718 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8719 DeclarationNameInfo DirName; 8720 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8721 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 8729 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8730 DeclarationNameInfo DirName; 8731 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8732 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 8740 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8741 DeclarationNameInfo DirName; 8742 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8743 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>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8752 DeclarationNameInfo DirName; 8753 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, 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 8762 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8763 DeclarationNameInfo DirName; 8764 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, 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 TreeTransform<Derived>::TransformOMPTargetDataDirective( 8773 OMPTargetDataDirective *D) { 8774 DeclarationNameInfo DirName; 8775 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, 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 TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8784 OMPTargetEnterDataDirective *D) { 8785 DeclarationNameInfo DirName; 8786 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8787 nullptr, 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>::TransformOMPTargetExitDataDirective( 8795 OMPTargetExitDataDirective *D) { 8796 DeclarationNameInfo DirName; 8797 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8798 nullptr, 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 TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8806 OMPTargetParallelDirective *D) { 8807 DeclarationNameInfo DirName; 8808 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8809 nullptr, 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 TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8817 OMPTargetParallelForDirective *D) { 8818 DeclarationNameInfo DirName; 8819 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8820 nullptr, 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 TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8828 OMPTargetUpdateDirective *D) { 8829 DeclarationNameInfo DirName; 8830 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8831 nullptr, 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>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8840 DeclarationNameInfo DirName; 8841 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, 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 TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8850 OMPCancellationPointDirective *D) { 8851 DeclarationNameInfo DirName; 8852 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8853 nullptr, 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>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8862 DeclarationNameInfo DirName; 8863 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, 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 8872 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8873 DeclarationNameInfo DirName; 8874 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, 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>::TransformOMPTaskLoopSimdDirective( 8883 OMPTaskLoopSimdDirective *D) { 8884 DeclarationNameInfo DirName; 8885 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, 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>::TransformOMPMasterTaskLoopDirective( 8894 OMPMasterTaskLoopDirective *D) { 8895 DeclarationNameInfo DirName; 8896 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, 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>::TransformOMPMasterTaskLoopSimdDirective( 8905 OMPMasterTaskLoopSimdDirective *D) { 8906 DeclarationNameInfo DirName; 8907 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, 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>::TransformOMPParallelMasterTaskLoopDirective( 8916 OMPParallelMasterTaskLoopDirective *D) { 8917 DeclarationNameInfo DirName; 8918 getDerived().getSema().StartOpenMPDSABlock( 8919 OMPD_parallel_master_taskloop, DirName, 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 8927 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8928 OMPParallelMasterTaskLoopSimdDirective *D) { 8929 DeclarationNameInfo DirName; 8930 getDerived().getSema().StartOpenMPDSABlock( 8931 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8932 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8933 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8934 return Res; 8935 } 8936 8937 template <typename Derived> 8938 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8939 OMPDistributeDirective *D) { 8940 DeclarationNameInfo DirName; 8941 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8942 D->getBeginLoc()); 8943 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8944 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8945 return Res; 8946 } 8947 8948 template <typename Derived> 8949 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8950 OMPDistributeParallelForDirective *D) { 8951 DeclarationNameInfo DirName; 8952 getDerived().getSema().StartOpenMPDSABlock( 8953 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8954 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8955 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8956 return Res; 8957 } 8958 8959 template <typename Derived> 8960 StmtResult 8961 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8962 OMPDistributeParallelForSimdDirective *D) { 8963 DeclarationNameInfo DirName; 8964 getDerived().getSema().StartOpenMPDSABlock( 8965 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8966 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8967 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8968 return Res; 8969 } 8970 8971 template <typename Derived> 8972 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8973 OMPDistributeSimdDirective *D) { 8974 DeclarationNameInfo DirName; 8975 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8976 nullptr, D->getBeginLoc()); 8977 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8978 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8979 return Res; 8980 } 8981 8982 template <typename Derived> 8983 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8984 OMPTargetParallelForSimdDirective *D) { 8985 DeclarationNameInfo DirName; 8986 getDerived().getSema().StartOpenMPDSABlock( 8987 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8988 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8989 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8990 return Res; 8991 } 8992 8993 template <typename Derived> 8994 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8995 OMPTargetSimdDirective *D) { 8996 DeclarationNameInfo DirName; 8997 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8998 D->getBeginLoc()); 8999 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9000 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9001 return Res; 9002 } 9003 9004 template <typename Derived> 9005 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9006 OMPTeamsDistributeDirective *D) { 9007 DeclarationNameInfo DirName; 9008 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9009 nullptr, D->getBeginLoc()); 9010 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9011 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9012 return Res; 9013 } 9014 9015 template <typename Derived> 9016 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9017 OMPTeamsDistributeSimdDirective *D) { 9018 DeclarationNameInfo DirName; 9019 getDerived().getSema().StartOpenMPDSABlock( 9020 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9021 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9022 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9023 return Res; 9024 } 9025 9026 template <typename Derived> 9027 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9028 OMPTeamsDistributeParallelForSimdDirective *D) { 9029 DeclarationNameInfo DirName; 9030 getDerived().getSema().StartOpenMPDSABlock( 9031 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9032 D->getBeginLoc()); 9033 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9034 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9035 return Res; 9036 } 9037 9038 template <typename Derived> 9039 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9040 OMPTeamsDistributeParallelForDirective *D) { 9041 DeclarationNameInfo DirName; 9042 getDerived().getSema().StartOpenMPDSABlock( 9043 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9044 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9045 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9046 return Res; 9047 } 9048 9049 template <typename Derived> 9050 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9051 OMPTargetTeamsDirective *D) { 9052 DeclarationNameInfo DirName; 9053 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9054 nullptr, D->getBeginLoc()); 9055 auto Res = getDerived().TransformOMPExecutableDirective(D); 9056 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9057 return Res; 9058 } 9059 9060 template <typename Derived> 9061 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9062 OMPTargetTeamsDistributeDirective *D) { 9063 DeclarationNameInfo DirName; 9064 getDerived().getSema().StartOpenMPDSABlock( 9065 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9066 auto Res = getDerived().TransformOMPExecutableDirective(D); 9067 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9068 return Res; 9069 } 9070 9071 template <typename Derived> 9072 StmtResult 9073 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9074 OMPTargetTeamsDistributeParallelForDirective *D) { 9075 DeclarationNameInfo DirName; 9076 getDerived().getSema().StartOpenMPDSABlock( 9077 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9078 D->getBeginLoc()); 9079 auto Res = getDerived().TransformOMPExecutableDirective(D); 9080 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9081 return Res; 9082 } 9083 9084 template <typename Derived> 9085 StmtResult TreeTransform<Derived>:: 9086 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9087 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9088 DeclarationNameInfo DirName; 9089 getDerived().getSema().StartOpenMPDSABlock( 9090 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9091 D->getBeginLoc()); 9092 auto Res = getDerived().TransformOMPExecutableDirective(D); 9093 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9094 return Res; 9095 } 9096 9097 template <typename Derived> 9098 StmtResult 9099 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9100 OMPTargetTeamsDistributeSimdDirective *D) { 9101 DeclarationNameInfo DirName; 9102 getDerived().getSema().StartOpenMPDSABlock( 9103 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9104 auto Res = getDerived().TransformOMPExecutableDirective(D); 9105 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9106 return Res; 9107 } 9108 9109 template <typename Derived> 9110 StmtResult 9111 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9112 DeclarationNameInfo DirName; 9113 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9114 D->getBeginLoc()); 9115 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9116 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9117 return Res; 9118 } 9119 9120 template <typename Derived> 9121 StmtResult 9122 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9123 DeclarationNameInfo DirName; 9124 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9125 D->getBeginLoc()); 9126 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9127 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9128 return Res; 9129 } 9130 9131 template <typename Derived> 9132 StmtResult 9133 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9134 DeclarationNameInfo DirName; 9135 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9136 D->getBeginLoc()); 9137 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9138 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9139 return Res; 9140 } 9141 9142 //===----------------------------------------------------------------------===// 9143 // OpenMP clause transformation 9144 //===----------------------------------------------------------------------===// 9145 template <typename Derived> 9146 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9147 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9148 if (Cond.isInvalid()) 9149 return nullptr; 9150 return getDerived().RebuildOMPIfClause( 9151 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9152 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9153 } 9154 9155 template <typename Derived> 9156 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9157 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9158 if (Cond.isInvalid()) 9159 return nullptr; 9160 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9161 C->getLParenLoc(), C->getEndLoc()); 9162 } 9163 9164 template <typename Derived> 9165 OMPClause * 9166 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9167 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9168 if (NumThreads.isInvalid()) 9169 return nullptr; 9170 return getDerived().RebuildOMPNumThreadsClause( 9171 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9172 } 9173 9174 template <typename Derived> 9175 OMPClause * 9176 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9177 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9178 if (E.isInvalid()) 9179 return nullptr; 9180 return getDerived().RebuildOMPSafelenClause( 9181 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9182 } 9183 9184 template <typename Derived> 9185 OMPClause * 9186 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9187 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9188 if (E.isInvalid()) 9189 return nullptr; 9190 return getDerived().RebuildOMPAllocatorClause( 9191 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9192 } 9193 9194 template <typename Derived> 9195 OMPClause * 9196 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9197 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9198 if (E.isInvalid()) 9199 return nullptr; 9200 return getDerived().RebuildOMPSimdlenClause( 9201 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9202 } 9203 9204 template <typename Derived> 9205 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9206 SmallVector<Expr *, 4> TransformedSizes; 9207 TransformedSizes.reserve(C->getNumSizes()); 9208 bool Changed = false; 9209 for (Expr *E : C->getSizesRefs()) { 9210 if (!E) { 9211 TransformedSizes.push_back(nullptr); 9212 continue; 9213 } 9214 9215 ExprResult T = getDerived().TransformExpr(E); 9216 if (T.isInvalid()) 9217 return nullptr; 9218 if (E != T.get()) 9219 Changed = true; 9220 TransformedSizes.push_back(T.get()); 9221 } 9222 9223 if (!Changed && !getDerived().AlwaysRebuild()) 9224 return C; 9225 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9226 C->getLParenLoc(), C->getEndLoc()); 9227 } 9228 9229 template <typename Derived> 9230 OMPClause * 9231 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9232 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9233 if (E.isInvalid()) 9234 return nullptr; 9235 return getDerived().RebuildOMPCollapseClause( 9236 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9237 } 9238 9239 template <typename Derived> 9240 OMPClause * 9241 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9242 return getDerived().RebuildOMPDefaultClause( 9243 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9244 C->getLParenLoc(), C->getEndLoc()); 9245 } 9246 9247 template <typename Derived> 9248 OMPClause * 9249 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9250 return getDerived().RebuildOMPProcBindClause( 9251 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9252 C->getLParenLoc(), C->getEndLoc()); 9253 } 9254 9255 template <typename Derived> 9256 OMPClause * 9257 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9258 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9259 if (E.isInvalid()) 9260 return nullptr; 9261 return getDerived().RebuildOMPScheduleClause( 9262 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9263 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9264 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9265 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9266 } 9267 9268 template <typename Derived> 9269 OMPClause * 9270 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9271 ExprResult E; 9272 if (auto *Num = C->getNumForLoops()) { 9273 E = getDerived().TransformExpr(Num); 9274 if (E.isInvalid()) 9275 return nullptr; 9276 } 9277 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9278 C->getLParenLoc(), E.get()); 9279 } 9280 9281 template <typename Derived> 9282 OMPClause * 9283 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9284 ExprResult E; 9285 if (Expr *Evt = C->getEventHandler()) { 9286 E = getDerived().TransformExpr(Evt); 9287 if (E.isInvalid()) 9288 return nullptr; 9289 } 9290 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9291 C->getLParenLoc(), C->getEndLoc()); 9292 } 9293 9294 template <typename Derived> 9295 OMPClause * 9296 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9297 // No need to rebuild this clause, no template-dependent parameters. 9298 return C; 9299 } 9300 9301 template <typename Derived> 9302 OMPClause * 9303 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9304 // No need to rebuild this clause, no template-dependent parameters. 9305 return C; 9306 } 9307 9308 template <typename Derived> 9309 OMPClause * 9310 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9311 // No need to rebuild this clause, no template-dependent parameters. 9312 return C; 9313 } 9314 9315 template <typename Derived> 9316 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9317 // No need to rebuild this clause, no template-dependent parameters. 9318 return C; 9319 } 9320 9321 template <typename Derived> 9322 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9323 // No need to rebuild this clause, no template-dependent parameters. 9324 return C; 9325 } 9326 9327 template <typename Derived> 9328 OMPClause * 9329 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9330 // No need to rebuild this clause, no template-dependent parameters. 9331 return C; 9332 } 9333 9334 template <typename Derived> 9335 OMPClause * 9336 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9337 // No need to rebuild this clause, no template-dependent parameters. 9338 return C; 9339 } 9340 9341 template <typename Derived> 9342 OMPClause * 9343 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9344 // No need to rebuild this clause, no template-dependent parameters. 9345 return C; 9346 } 9347 9348 template <typename Derived> 9349 OMPClause * 9350 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9351 // No need to rebuild this clause, no template-dependent parameters. 9352 return C; 9353 } 9354 9355 template <typename Derived> 9356 OMPClause * 9357 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9358 // No need to rebuild this clause, no template-dependent parameters. 9359 return C; 9360 } 9361 9362 template <typename Derived> 9363 OMPClause * 9364 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9365 // No need to rebuild this clause, no template-dependent parameters. 9366 return C; 9367 } 9368 9369 template <typename Derived> 9370 OMPClause * 9371 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9372 // No need to rebuild this clause, no template-dependent parameters. 9373 return C; 9374 } 9375 9376 template <typename Derived> 9377 OMPClause * 9378 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9379 // No need to rebuild this clause, no template-dependent parameters. 9380 return C; 9381 } 9382 9383 template <typename Derived> 9384 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9385 // No need to rebuild this clause, no template-dependent parameters. 9386 return C; 9387 } 9388 9389 template <typename Derived> 9390 OMPClause * 9391 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9392 // No need to rebuild this clause, no template-dependent parameters. 9393 return C; 9394 } 9395 9396 template <typename Derived> 9397 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9398 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9399 if (IVR.isInvalid()) 9400 return nullptr; 9401 9402 llvm::SmallVector<Expr *, 8> PrefExprs; 9403 PrefExprs.reserve(C->varlist_size() - 1); 9404 for (Expr *E : llvm::drop_begin(C->varlists())) { 9405 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9406 if (ER.isInvalid()) 9407 return nullptr; 9408 PrefExprs.push_back(ER.get()); 9409 } 9410 return getDerived().RebuildOMPInitClause( 9411 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9412 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9413 } 9414 9415 template <typename Derived> 9416 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9417 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9418 if (ER.isInvalid()) 9419 return nullptr; 9420 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9421 C->getLParenLoc(), C->getVarLoc(), 9422 C->getEndLoc()); 9423 } 9424 9425 template <typename Derived> 9426 OMPClause * 9427 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9428 ExprResult ER; 9429 if (Expr *IV = C->getInteropVar()) { 9430 ER = getDerived().TransformExpr(IV); 9431 if (ER.isInvalid()) 9432 return nullptr; 9433 } 9434 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9435 C->getLParenLoc(), C->getVarLoc(), 9436 C->getEndLoc()); 9437 } 9438 9439 template <typename Derived> 9440 OMPClause * 9441 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9442 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9443 if (Cond.isInvalid()) 9444 return nullptr; 9445 return getDerived().RebuildOMPNovariantsClause( 9446 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9447 } 9448 9449 template <typename Derived> 9450 OMPClause * 9451 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9452 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9453 if (Cond.isInvalid()) 9454 return nullptr; 9455 return getDerived().RebuildOMPNocontextClause( 9456 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9457 } 9458 9459 template <typename Derived> 9460 OMPClause * 9461 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9462 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9463 if (ThreadID.isInvalid()) 9464 return nullptr; 9465 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9466 C->getLParenLoc(), C->getEndLoc()); 9467 } 9468 9469 template <typename Derived> 9470 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9471 OMPUnifiedAddressClause *C) { 9472 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9473 } 9474 9475 template <typename Derived> 9476 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9477 OMPUnifiedSharedMemoryClause *C) { 9478 llvm_unreachable( 9479 "unified_shared_memory clause cannot appear in dependent context"); 9480 } 9481 9482 template <typename Derived> 9483 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9484 OMPReverseOffloadClause *C) { 9485 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9486 } 9487 9488 template <typename Derived> 9489 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9490 OMPDynamicAllocatorsClause *C) { 9491 llvm_unreachable( 9492 "dynamic_allocators clause cannot appear in dependent context"); 9493 } 9494 9495 template <typename Derived> 9496 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9497 OMPAtomicDefaultMemOrderClause *C) { 9498 llvm_unreachable( 9499 "atomic_default_mem_order clause cannot appear in dependent context"); 9500 } 9501 9502 template <typename Derived> 9503 OMPClause * 9504 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9505 llvm::SmallVector<Expr *, 16> Vars; 9506 Vars.reserve(C->varlist_size()); 9507 for (auto *VE : C->varlists()) { 9508 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9509 if (EVar.isInvalid()) 9510 return nullptr; 9511 Vars.push_back(EVar.get()); 9512 } 9513 return getDerived().RebuildOMPPrivateClause( 9514 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9515 } 9516 9517 template <typename Derived> 9518 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9519 OMPFirstprivateClause *C) { 9520 llvm::SmallVector<Expr *, 16> Vars; 9521 Vars.reserve(C->varlist_size()); 9522 for (auto *VE : C->varlists()) { 9523 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9524 if (EVar.isInvalid()) 9525 return nullptr; 9526 Vars.push_back(EVar.get()); 9527 } 9528 return getDerived().RebuildOMPFirstprivateClause( 9529 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9530 } 9531 9532 template <typename Derived> 9533 OMPClause * 9534 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9535 llvm::SmallVector<Expr *, 16> Vars; 9536 Vars.reserve(C->varlist_size()); 9537 for (auto *VE : C->varlists()) { 9538 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9539 if (EVar.isInvalid()) 9540 return nullptr; 9541 Vars.push_back(EVar.get()); 9542 } 9543 return getDerived().RebuildOMPLastprivateClause( 9544 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9545 C->getLParenLoc(), C->getEndLoc()); 9546 } 9547 9548 template <typename Derived> 9549 OMPClause * 9550 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9551 llvm::SmallVector<Expr *, 16> Vars; 9552 Vars.reserve(C->varlist_size()); 9553 for (auto *VE : C->varlists()) { 9554 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9555 if (EVar.isInvalid()) 9556 return nullptr; 9557 Vars.push_back(EVar.get()); 9558 } 9559 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9560 C->getLParenLoc(), C->getEndLoc()); 9561 } 9562 9563 template <typename Derived> 9564 OMPClause * 9565 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9566 llvm::SmallVector<Expr *, 16> Vars; 9567 Vars.reserve(C->varlist_size()); 9568 for (auto *VE : C->varlists()) { 9569 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9570 if (EVar.isInvalid()) 9571 return nullptr; 9572 Vars.push_back(EVar.get()); 9573 } 9574 CXXScopeSpec ReductionIdScopeSpec; 9575 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9576 9577 DeclarationNameInfo NameInfo = C->getNameInfo(); 9578 if (NameInfo.getName()) { 9579 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9580 if (!NameInfo.getName()) 9581 return nullptr; 9582 } 9583 // Build a list of all UDR decls with the same names ranged by the Scopes. 9584 // The Scope boundary is a duplication of the previous decl. 9585 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9586 for (auto *E : C->reduction_ops()) { 9587 // Transform all the decls. 9588 if (E) { 9589 auto *ULE = cast<UnresolvedLookupExpr>(E); 9590 UnresolvedSet<8> Decls; 9591 for (auto *D : ULE->decls()) { 9592 NamedDecl *InstD = 9593 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9594 Decls.addDecl(InstD, InstD->getAccess()); 9595 } 9596 UnresolvedReductions.push_back( 9597 UnresolvedLookupExpr::Create( 9598 SemaRef.Context, /*NamingClass=*/nullptr, 9599 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9600 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9601 Decls.begin(), Decls.end())); 9602 } else 9603 UnresolvedReductions.push_back(nullptr); 9604 } 9605 return getDerived().RebuildOMPReductionClause( 9606 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9607 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9608 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9609 } 9610 9611 template <typename Derived> 9612 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9613 OMPTaskReductionClause *C) { 9614 llvm::SmallVector<Expr *, 16> Vars; 9615 Vars.reserve(C->varlist_size()); 9616 for (auto *VE : C->varlists()) { 9617 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9618 if (EVar.isInvalid()) 9619 return nullptr; 9620 Vars.push_back(EVar.get()); 9621 } 9622 CXXScopeSpec ReductionIdScopeSpec; 9623 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9624 9625 DeclarationNameInfo NameInfo = C->getNameInfo(); 9626 if (NameInfo.getName()) { 9627 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9628 if (!NameInfo.getName()) 9629 return nullptr; 9630 } 9631 // Build a list of all UDR decls with the same names ranged by the Scopes. 9632 // The Scope boundary is a duplication of the previous decl. 9633 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9634 for (auto *E : C->reduction_ops()) { 9635 // Transform all the decls. 9636 if (E) { 9637 auto *ULE = cast<UnresolvedLookupExpr>(E); 9638 UnresolvedSet<8> Decls; 9639 for (auto *D : ULE->decls()) { 9640 NamedDecl *InstD = 9641 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9642 Decls.addDecl(InstD, InstD->getAccess()); 9643 } 9644 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9645 SemaRef.Context, /*NamingClass=*/nullptr, 9646 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9647 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9648 } else 9649 UnresolvedReductions.push_back(nullptr); 9650 } 9651 return getDerived().RebuildOMPTaskReductionClause( 9652 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9653 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9654 } 9655 9656 template <typename Derived> 9657 OMPClause * 9658 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9659 llvm::SmallVector<Expr *, 16> Vars; 9660 Vars.reserve(C->varlist_size()); 9661 for (auto *VE : C->varlists()) { 9662 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9663 if (EVar.isInvalid()) 9664 return nullptr; 9665 Vars.push_back(EVar.get()); 9666 } 9667 CXXScopeSpec ReductionIdScopeSpec; 9668 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9669 9670 DeclarationNameInfo NameInfo = C->getNameInfo(); 9671 if (NameInfo.getName()) { 9672 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9673 if (!NameInfo.getName()) 9674 return nullptr; 9675 } 9676 // Build a list of all UDR decls with the same names ranged by the Scopes. 9677 // The Scope boundary is a duplication of the previous decl. 9678 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9679 for (auto *E : C->reduction_ops()) { 9680 // Transform all the decls. 9681 if (E) { 9682 auto *ULE = cast<UnresolvedLookupExpr>(E); 9683 UnresolvedSet<8> Decls; 9684 for (auto *D : ULE->decls()) { 9685 NamedDecl *InstD = 9686 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9687 Decls.addDecl(InstD, InstD->getAccess()); 9688 } 9689 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9690 SemaRef.Context, /*NamingClass=*/nullptr, 9691 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9692 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9693 } else 9694 UnresolvedReductions.push_back(nullptr); 9695 } 9696 return getDerived().RebuildOMPInReductionClause( 9697 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9698 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9699 } 9700 9701 template <typename Derived> 9702 OMPClause * 9703 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9704 llvm::SmallVector<Expr *, 16> Vars; 9705 Vars.reserve(C->varlist_size()); 9706 for (auto *VE : C->varlists()) { 9707 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9708 if (EVar.isInvalid()) 9709 return nullptr; 9710 Vars.push_back(EVar.get()); 9711 } 9712 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9713 if (Step.isInvalid()) 9714 return nullptr; 9715 return getDerived().RebuildOMPLinearClause( 9716 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9717 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9718 } 9719 9720 template <typename Derived> 9721 OMPClause * 9722 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9723 llvm::SmallVector<Expr *, 16> Vars; 9724 Vars.reserve(C->varlist_size()); 9725 for (auto *VE : C->varlists()) { 9726 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9727 if (EVar.isInvalid()) 9728 return nullptr; 9729 Vars.push_back(EVar.get()); 9730 } 9731 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9732 if (Alignment.isInvalid()) 9733 return nullptr; 9734 return getDerived().RebuildOMPAlignedClause( 9735 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9736 C->getColonLoc(), C->getEndLoc()); 9737 } 9738 9739 template <typename Derived> 9740 OMPClause * 9741 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9742 llvm::SmallVector<Expr *, 16> Vars; 9743 Vars.reserve(C->varlist_size()); 9744 for (auto *VE : C->varlists()) { 9745 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9746 if (EVar.isInvalid()) 9747 return nullptr; 9748 Vars.push_back(EVar.get()); 9749 } 9750 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9751 C->getLParenLoc(), C->getEndLoc()); 9752 } 9753 9754 template <typename Derived> 9755 OMPClause * 9756 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9757 llvm::SmallVector<Expr *, 16> Vars; 9758 Vars.reserve(C->varlist_size()); 9759 for (auto *VE : C->varlists()) { 9760 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9761 if (EVar.isInvalid()) 9762 return nullptr; 9763 Vars.push_back(EVar.get()); 9764 } 9765 return getDerived().RebuildOMPCopyprivateClause( 9766 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9767 } 9768 9769 template <typename Derived> 9770 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9771 llvm::SmallVector<Expr *, 16> Vars; 9772 Vars.reserve(C->varlist_size()); 9773 for (auto *VE : C->varlists()) { 9774 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9775 if (EVar.isInvalid()) 9776 return nullptr; 9777 Vars.push_back(EVar.get()); 9778 } 9779 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9780 C->getLParenLoc(), C->getEndLoc()); 9781 } 9782 9783 template <typename Derived> 9784 OMPClause * 9785 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9786 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9787 if (E.isInvalid()) 9788 return nullptr; 9789 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9790 C->getLParenLoc(), C->getEndLoc()); 9791 } 9792 9793 template <typename Derived> 9794 OMPClause * 9795 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9796 llvm::SmallVector<Expr *, 16> Vars; 9797 Expr *DepModifier = C->getModifier(); 9798 if (DepModifier) { 9799 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9800 if (DepModRes.isInvalid()) 9801 return nullptr; 9802 DepModifier = DepModRes.get(); 9803 } 9804 Vars.reserve(C->varlist_size()); 9805 for (auto *VE : C->varlists()) { 9806 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9807 if (EVar.isInvalid()) 9808 return nullptr; 9809 Vars.push_back(EVar.get()); 9810 } 9811 return getDerived().RebuildOMPDependClause( 9812 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9813 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9814 C->getEndLoc()); 9815 } 9816 9817 template <typename Derived> 9818 OMPClause * 9819 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9820 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9821 if (E.isInvalid()) 9822 return nullptr; 9823 return getDerived().RebuildOMPDeviceClause( 9824 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9825 C->getModifierLoc(), C->getEndLoc()); 9826 } 9827 9828 template <typename Derived, class T> 9829 bool transformOMPMappableExprListClause( 9830 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9831 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9832 DeclarationNameInfo &MapperIdInfo, 9833 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9834 // Transform expressions in the list. 9835 Vars.reserve(C->varlist_size()); 9836 for (auto *VE : C->varlists()) { 9837 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9838 if (EVar.isInvalid()) 9839 return true; 9840 Vars.push_back(EVar.get()); 9841 } 9842 // Transform mapper scope specifier and identifier. 9843 NestedNameSpecifierLoc QualifierLoc; 9844 if (C->getMapperQualifierLoc()) { 9845 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9846 C->getMapperQualifierLoc()); 9847 if (!QualifierLoc) 9848 return true; 9849 } 9850 MapperIdScopeSpec.Adopt(QualifierLoc); 9851 MapperIdInfo = C->getMapperIdInfo(); 9852 if (MapperIdInfo.getName()) { 9853 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9854 if (!MapperIdInfo.getName()) 9855 return true; 9856 } 9857 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9858 // the previous user-defined mapper lookup in dependent environment. 9859 for (auto *E : C->mapperlists()) { 9860 // Transform all the decls. 9861 if (E) { 9862 auto *ULE = cast<UnresolvedLookupExpr>(E); 9863 UnresolvedSet<8> Decls; 9864 for (auto *D : ULE->decls()) { 9865 NamedDecl *InstD = 9866 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9867 Decls.addDecl(InstD, InstD->getAccess()); 9868 } 9869 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9870 TT.getSema().Context, /*NamingClass=*/nullptr, 9871 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9872 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9873 Decls.end())); 9874 } else { 9875 UnresolvedMappers.push_back(nullptr); 9876 } 9877 } 9878 return false; 9879 } 9880 9881 template <typename Derived> 9882 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9883 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9884 llvm::SmallVector<Expr *, 16> Vars; 9885 CXXScopeSpec MapperIdScopeSpec; 9886 DeclarationNameInfo MapperIdInfo; 9887 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9888 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9889 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9890 return nullptr; 9891 return getDerived().RebuildOMPMapClause( 9892 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9893 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9894 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9895 } 9896 9897 template <typename Derived> 9898 OMPClause * 9899 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9900 Expr *Allocator = C->getAllocator(); 9901 if (Allocator) { 9902 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9903 if (AllocatorRes.isInvalid()) 9904 return nullptr; 9905 Allocator = AllocatorRes.get(); 9906 } 9907 llvm::SmallVector<Expr *, 16> Vars; 9908 Vars.reserve(C->varlist_size()); 9909 for (auto *VE : C->varlists()) { 9910 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9911 if (EVar.isInvalid()) 9912 return nullptr; 9913 Vars.push_back(EVar.get()); 9914 } 9915 return getDerived().RebuildOMPAllocateClause( 9916 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9917 C->getEndLoc()); 9918 } 9919 9920 template <typename Derived> 9921 OMPClause * 9922 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9923 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9924 if (E.isInvalid()) 9925 return nullptr; 9926 return getDerived().RebuildOMPNumTeamsClause( 9927 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9928 } 9929 9930 template <typename Derived> 9931 OMPClause * 9932 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9933 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9934 if (E.isInvalid()) 9935 return nullptr; 9936 return getDerived().RebuildOMPThreadLimitClause( 9937 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9938 } 9939 9940 template <typename Derived> 9941 OMPClause * 9942 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9943 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9944 if (E.isInvalid()) 9945 return nullptr; 9946 return getDerived().RebuildOMPPriorityClause( 9947 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9948 } 9949 9950 template <typename Derived> 9951 OMPClause * 9952 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9953 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9954 if (E.isInvalid()) 9955 return nullptr; 9956 return getDerived().RebuildOMPGrainsizeClause( 9957 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9958 } 9959 9960 template <typename Derived> 9961 OMPClause * 9962 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9963 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9964 if (E.isInvalid()) 9965 return nullptr; 9966 return getDerived().RebuildOMPNumTasksClause( 9967 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9968 } 9969 9970 template <typename Derived> 9971 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9972 ExprResult E = getDerived().TransformExpr(C->getHint()); 9973 if (E.isInvalid()) 9974 return nullptr; 9975 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9976 C->getLParenLoc(), C->getEndLoc()); 9977 } 9978 9979 template <typename Derived> 9980 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9981 OMPDistScheduleClause *C) { 9982 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9983 if (E.isInvalid()) 9984 return nullptr; 9985 return getDerived().RebuildOMPDistScheduleClause( 9986 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9987 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9988 } 9989 9990 template <typename Derived> 9991 OMPClause * 9992 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9993 // Rebuild Defaultmap Clause since we need to invoke the checking of 9994 // defaultmap(none:variable-category) after template initialization. 9995 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9996 C->getDefaultmapKind(), 9997 C->getBeginLoc(), 9998 C->getLParenLoc(), 9999 C->getDefaultmapModifierLoc(), 10000 C->getDefaultmapKindLoc(), 10001 C->getEndLoc()); 10002 } 10003 10004 template <typename Derived> 10005 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10006 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10007 llvm::SmallVector<Expr *, 16> Vars; 10008 CXXScopeSpec MapperIdScopeSpec; 10009 DeclarationNameInfo MapperIdInfo; 10010 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10011 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10012 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10013 return nullptr; 10014 return getDerived().RebuildOMPToClause( 10015 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10016 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10017 } 10018 10019 template <typename Derived> 10020 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10021 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10022 llvm::SmallVector<Expr *, 16> Vars; 10023 CXXScopeSpec MapperIdScopeSpec; 10024 DeclarationNameInfo MapperIdInfo; 10025 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10026 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10027 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10028 return nullptr; 10029 return getDerived().RebuildOMPFromClause( 10030 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10031 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10032 } 10033 10034 template <typename Derived> 10035 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10036 OMPUseDevicePtrClause *C) { 10037 llvm::SmallVector<Expr *, 16> Vars; 10038 Vars.reserve(C->varlist_size()); 10039 for (auto *VE : C->varlists()) { 10040 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10041 if (EVar.isInvalid()) 10042 return nullptr; 10043 Vars.push_back(EVar.get()); 10044 } 10045 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10046 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10047 } 10048 10049 template <typename Derived> 10050 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10051 OMPUseDeviceAddrClause *C) { 10052 llvm::SmallVector<Expr *, 16> Vars; 10053 Vars.reserve(C->varlist_size()); 10054 for (auto *VE : C->varlists()) { 10055 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10056 if (EVar.isInvalid()) 10057 return nullptr; 10058 Vars.push_back(EVar.get()); 10059 } 10060 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10061 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10062 } 10063 10064 template <typename Derived> 10065 OMPClause * 10066 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10067 llvm::SmallVector<Expr *, 16> Vars; 10068 Vars.reserve(C->varlist_size()); 10069 for (auto *VE : C->varlists()) { 10070 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10071 if (EVar.isInvalid()) 10072 return nullptr; 10073 Vars.push_back(EVar.get()); 10074 } 10075 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10076 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10077 } 10078 10079 template <typename Derived> 10080 OMPClause * 10081 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10082 llvm::SmallVector<Expr *, 16> Vars; 10083 Vars.reserve(C->varlist_size()); 10084 for (auto *VE : C->varlists()) { 10085 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10086 if (EVar.isInvalid()) 10087 return nullptr; 10088 Vars.push_back(EVar.get()); 10089 } 10090 return getDerived().RebuildOMPNontemporalClause( 10091 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10092 } 10093 10094 template <typename Derived> 10095 OMPClause * 10096 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10097 llvm::SmallVector<Expr *, 16> Vars; 10098 Vars.reserve(C->varlist_size()); 10099 for (auto *VE : C->varlists()) { 10100 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10101 if (EVar.isInvalid()) 10102 return nullptr; 10103 Vars.push_back(EVar.get()); 10104 } 10105 return getDerived().RebuildOMPInclusiveClause( 10106 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10107 } 10108 10109 template <typename Derived> 10110 OMPClause * 10111 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10112 llvm::SmallVector<Expr *, 16> Vars; 10113 Vars.reserve(C->varlist_size()); 10114 for (auto *VE : C->varlists()) { 10115 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10116 if (EVar.isInvalid()) 10117 return nullptr; 10118 Vars.push_back(EVar.get()); 10119 } 10120 return getDerived().RebuildOMPExclusiveClause( 10121 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10122 } 10123 10124 template <typename Derived> 10125 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10126 OMPUsesAllocatorsClause *C) { 10127 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10128 Data.reserve(C->getNumberOfAllocators()); 10129 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10130 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10131 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10132 if (Allocator.isInvalid()) 10133 continue; 10134 ExprResult AllocatorTraits; 10135 if (Expr *AT = D.AllocatorTraits) { 10136 AllocatorTraits = getDerived().TransformExpr(AT); 10137 if (AllocatorTraits.isInvalid()) 10138 continue; 10139 } 10140 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10141 NewD.Allocator = Allocator.get(); 10142 NewD.AllocatorTraits = AllocatorTraits.get(); 10143 NewD.LParenLoc = D.LParenLoc; 10144 NewD.RParenLoc = D.RParenLoc; 10145 } 10146 return getDerived().RebuildOMPUsesAllocatorsClause( 10147 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10148 } 10149 10150 template <typename Derived> 10151 OMPClause * 10152 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10153 SmallVector<Expr *, 4> Locators; 10154 Locators.reserve(C->varlist_size()); 10155 ExprResult ModifierRes; 10156 if (Expr *Modifier = C->getModifier()) { 10157 ModifierRes = getDerived().TransformExpr(Modifier); 10158 if (ModifierRes.isInvalid()) 10159 return nullptr; 10160 } 10161 for (Expr *E : C->varlists()) { 10162 ExprResult Locator = getDerived().TransformExpr(E); 10163 if (Locator.isInvalid()) 10164 continue; 10165 Locators.push_back(Locator.get()); 10166 } 10167 return getDerived().RebuildOMPAffinityClause( 10168 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10169 ModifierRes.get(), Locators); 10170 } 10171 10172 template <typename Derived> 10173 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10174 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10175 C->getBeginLoc(), C->getLParenLoc(), 10176 C->getEndLoc()); 10177 } 10178 10179 //===----------------------------------------------------------------------===// 10180 // Expression transformation 10181 //===----------------------------------------------------------------------===// 10182 template<typename Derived> 10183 ExprResult 10184 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10185 return TransformExpr(E->getSubExpr()); 10186 } 10187 10188 template <typename Derived> 10189 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10190 SYCLUniqueStableNameExpr *E) { 10191 if (!E->isTypeDependent()) 10192 return E; 10193 10194 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10195 10196 if (!NewT) 10197 return ExprError(); 10198 10199 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10200 return E; 10201 10202 return getDerived().RebuildSYCLUniqueStableNameExpr( 10203 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10204 } 10205 10206 template<typename Derived> 10207 ExprResult 10208 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10209 if (!E->isTypeDependent()) 10210 return E; 10211 10212 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10213 E->getIdentKind()); 10214 } 10215 10216 template<typename Derived> 10217 ExprResult 10218 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10219 NestedNameSpecifierLoc QualifierLoc; 10220 if (E->getQualifierLoc()) { 10221 QualifierLoc 10222 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10223 if (!QualifierLoc) 10224 return ExprError(); 10225 } 10226 10227 ValueDecl *ND 10228 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10229 E->getDecl())); 10230 if (!ND) 10231 return ExprError(); 10232 10233 NamedDecl *Found = ND; 10234 if (E->getFoundDecl() != E->getDecl()) { 10235 Found = cast_or_null<NamedDecl>( 10236 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10237 if (!Found) 10238 return ExprError(); 10239 } 10240 10241 DeclarationNameInfo NameInfo = E->getNameInfo(); 10242 if (NameInfo.getName()) { 10243 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10244 if (!NameInfo.getName()) 10245 return ExprError(); 10246 } 10247 10248 if (!getDerived().AlwaysRebuild() && 10249 QualifierLoc == E->getQualifierLoc() && 10250 ND == E->getDecl() && 10251 Found == E->getFoundDecl() && 10252 NameInfo.getName() == E->getDecl()->getDeclName() && 10253 !E->hasExplicitTemplateArgs()) { 10254 10255 // Mark it referenced in the new context regardless. 10256 // FIXME: this is a bit instantiation-specific. 10257 SemaRef.MarkDeclRefReferenced(E); 10258 10259 return E; 10260 } 10261 10262 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10263 if (E->hasExplicitTemplateArgs()) { 10264 TemplateArgs = &TransArgs; 10265 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10266 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10267 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10268 E->getNumTemplateArgs(), 10269 TransArgs)) 10270 return ExprError(); 10271 } 10272 10273 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10274 Found, TemplateArgs); 10275 } 10276 10277 template<typename Derived> 10278 ExprResult 10279 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10280 return E; 10281 } 10282 10283 template <typename Derived> 10284 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10285 FixedPointLiteral *E) { 10286 return E; 10287 } 10288 10289 template<typename Derived> 10290 ExprResult 10291 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10292 return E; 10293 } 10294 10295 template<typename Derived> 10296 ExprResult 10297 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10298 return E; 10299 } 10300 10301 template<typename Derived> 10302 ExprResult 10303 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10304 return E; 10305 } 10306 10307 template<typename Derived> 10308 ExprResult 10309 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10310 return E; 10311 } 10312 10313 template<typename Derived> 10314 ExprResult 10315 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10316 if (FunctionDecl *FD = E->getDirectCallee()) 10317 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10318 return SemaRef.MaybeBindToTemporary(E); 10319 } 10320 10321 template<typename Derived> 10322 ExprResult 10323 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10324 ExprResult ControllingExpr = 10325 getDerived().TransformExpr(E->getControllingExpr()); 10326 if (ControllingExpr.isInvalid()) 10327 return ExprError(); 10328 10329 SmallVector<Expr *, 4> AssocExprs; 10330 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10331 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10332 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10333 if (TSI) { 10334 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10335 if (!AssocType) 10336 return ExprError(); 10337 AssocTypes.push_back(AssocType); 10338 } else { 10339 AssocTypes.push_back(nullptr); 10340 } 10341 10342 ExprResult AssocExpr = 10343 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10344 if (AssocExpr.isInvalid()) 10345 return ExprError(); 10346 AssocExprs.push_back(AssocExpr.get()); 10347 } 10348 10349 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10350 E->getDefaultLoc(), 10351 E->getRParenLoc(), 10352 ControllingExpr.get(), 10353 AssocTypes, 10354 AssocExprs); 10355 } 10356 10357 template<typename Derived> 10358 ExprResult 10359 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10360 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10361 if (SubExpr.isInvalid()) 10362 return ExprError(); 10363 10364 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10365 return E; 10366 10367 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10368 E->getRParen()); 10369 } 10370 10371 /// The operand of a unary address-of operator has special rules: it's 10372 /// allowed to refer to a non-static member of a class even if there's no 'this' 10373 /// object available. 10374 template<typename Derived> 10375 ExprResult 10376 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10377 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10378 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10379 else 10380 return getDerived().TransformExpr(E); 10381 } 10382 10383 template<typename Derived> 10384 ExprResult 10385 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10386 ExprResult SubExpr; 10387 if (E->getOpcode() == UO_AddrOf) 10388 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10389 else 10390 SubExpr = TransformExpr(E->getSubExpr()); 10391 if (SubExpr.isInvalid()) 10392 return ExprError(); 10393 10394 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10395 return E; 10396 10397 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10398 E->getOpcode(), 10399 SubExpr.get()); 10400 } 10401 10402 template<typename Derived> 10403 ExprResult 10404 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10405 // Transform the type. 10406 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10407 if (!Type) 10408 return ExprError(); 10409 10410 // Transform all of the components into components similar to what the 10411 // parser uses. 10412 // FIXME: It would be slightly more efficient in the non-dependent case to 10413 // just map FieldDecls, rather than requiring the rebuilder to look for 10414 // the fields again. However, __builtin_offsetof is rare enough in 10415 // template code that we don't care. 10416 bool ExprChanged = false; 10417 typedef Sema::OffsetOfComponent Component; 10418 SmallVector<Component, 4> Components; 10419 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10420 const OffsetOfNode &ON = E->getComponent(I); 10421 Component Comp; 10422 Comp.isBrackets = true; 10423 Comp.LocStart = ON.getSourceRange().getBegin(); 10424 Comp.LocEnd = ON.getSourceRange().getEnd(); 10425 switch (ON.getKind()) { 10426 case OffsetOfNode::Array: { 10427 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10428 ExprResult Index = getDerived().TransformExpr(FromIndex); 10429 if (Index.isInvalid()) 10430 return ExprError(); 10431 10432 ExprChanged = ExprChanged || Index.get() != FromIndex; 10433 Comp.isBrackets = true; 10434 Comp.U.E = Index.get(); 10435 break; 10436 } 10437 10438 case OffsetOfNode::Field: 10439 case OffsetOfNode::Identifier: 10440 Comp.isBrackets = false; 10441 Comp.U.IdentInfo = ON.getFieldName(); 10442 if (!Comp.U.IdentInfo) 10443 continue; 10444 10445 break; 10446 10447 case OffsetOfNode::Base: 10448 // Will be recomputed during the rebuild. 10449 continue; 10450 } 10451 10452 Components.push_back(Comp); 10453 } 10454 10455 // If nothing changed, retain the existing expression. 10456 if (!getDerived().AlwaysRebuild() && 10457 Type == E->getTypeSourceInfo() && 10458 !ExprChanged) 10459 return E; 10460 10461 // Build a new offsetof expression. 10462 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10463 Components, E->getRParenLoc()); 10464 } 10465 10466 template<typename Derived> 10467 ExprResult 10468 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10469 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10470 "opaque value expression requires transformation"); 10471 return E; 10472 } 10473 10474 template<typename Derived> 10475 ExprResult 10476 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10477 return E; 10478 } 10479 10480 template <typename Derived> 10481 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10482 llvm::SmallVector<Expr *, 8> Children; 10483 bool Changed = false; 10484 for (Expr *C : E->subExpressions()) { 10485 ExprResult NewC = getDerived().TransformExpr(C); 10486 if (NewC.isInvalid()) 10487 return ExprError(); 10488 Children.push_back(NewC.get()); 10489 10490 Changed |= NewC.get() != C; 10491 } 10492 if (!getDerived().AlwaysRebuild() && !Changed) 10493 return E; 10494 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10495 Children, E->getType()); 10496 } 10497 10498 template<typename Derived> 10499 ExprResult 10500 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10501 // Rebuild the syntactic form. The original syntactic form has 10502 // opaque-value expressions in it, so strip those away and rebuild 10503 // the result. This is a really awful way of doing this, but the 10504 // better solution (rebuilding the semantic expressions and 10505 // rebinding OVEs as necessary) doesn't work; we'd need 10506 // TreeTransform to not strip away implicit conversions. 10507 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10508 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10509 if (result.isInvalid()) return ExprError(); 10510 10511 // If that gives us a pseudo-object result back, the pseudo-object 10512 // expression must have been an lvalue-to-rvalue conversion which we 10513 // should reapply. 10514 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10515 result = SemaRef.checkPseudoObjectRValue(result.get()); 10516 10517 return result; 10518 } 10519 10520 template<typename Derived> 10521 ExprResult 10522 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10523 UnaryExprOrTypeTraitExpr *E) { 10524 if (E->isArgumentType()) { 10525 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10526 10527 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10528 if (!NewT) 10529 return ExprError(); 10530 10531 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10532 return E; 10533 10534 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10535 E->getKind(), 10536 E->getSourceRange()); 10537 } 10538 10539 // C++0x [expr.sizeof]p1: 10540 // The operand is either an expression, which is an unevaluated operand 10541 // [...] 10542 EnterExpressionEvaluationContext Unevaluated( 10543 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10544 Sema::ReuseLambdaContextDecl); 10545 10546 // Try to recover if we have something like sizeof(T::X) where X is a type. 10547 // Notably, there must be *exactly* one set of parens if X is a type. 10548 TypeSourceInfo *RecoveryTSI = nullptr; 10549 ExprResult SubExpr; 10550 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10551 if (auto *DRE = 10552 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10553 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10554 PE, DRE, false, &RecoveryTSI); 10555 else 10556 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10557 10558 if (RecoveryTSI) { 10559 return getDerived().RebuildUnaryExprOrTypeTrait( 10560 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10561 } else if (SubExpr.isInvalid()) 10562 return ExprError(); 10563 10564 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10565 return E; 10566 10567 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10568 E->getOperatorLoc(), 10569 E->getKind(), 10570 E->getSourceRange()); 10571 } 10572 10573 template<typename Derived> 10574 ExprResult 10575 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10576 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10577 if (LHS.isInvalid()) 10578 return ExprError(); 10579 10580 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10581 if (RHS.isInvalid()) 10582 return ExprError(); 10583 10584 10585 if (!getDerived().AlwaysRebuild() && 10586 LHS.get() == E->getLHS() && 10587 RHS.get() == E->getRHS()) 10588 return E; 10589 10590 return getDerived().RebuildArraySubscriptExpr( 10591 LHS.get(), 10592 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10593 } 10594 10595 template <typename Derived> 10596 ExprResult 10597 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10598 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10599 if (Base.isInvalid()) 10600 return ExprError(); 10601 10602 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10603 if (RowIdx.isInvalid()) 10604 return ExprError(); 10605 10606 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10607 if (ColumnIdx.isInvalid()) 10608 return ExprError(); 10609 10610 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10611 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10612 return E; 10613 10614 return getDerived().RebuildMatrixSubscriptExpr( 10615 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10616 } 10617 10618 template <typename Derived> 10619 ExprResult 10620 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10621 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10622 if (Base.isInvalid()) 10623 return ExprError(); 10624 10625 ExprResult LowerBound; 10626 if (E->getLowerBound()) { 10627 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10628 if (LowerBound.isInvalid()) 10629 return ExprError(); 10630 } 10631 10632 ExprResult Length; 10633 if (E->getLength()) { 10634 Length = getDerived().TransformExpr(E->getLength()); 10635 if (Length.isInvalid()) 10636 return ExprError(); 10637 } 10638 10639 ExprResult Stride; 10640 if (Expr *Str = E->getStride()) { 10641 Stride = getDerived().TransformExpr(Str); 10642 if (Stride.isInvalid()) 10643 return ExprError(); 10644 } 10645 10646 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10647 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10648 return E; 10649 10650 return getDerived().RebuildOMPArraySectionExpr( 10651 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10652 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10653 E->getRBracketLoc()); 10654 } 10655 10656 template <typename Derived> 10657 ExprResult 10658 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10659 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10660 if (Base.isInvalid()) 10661 return ExprError(); 10662 10663 SmallVector<Expr *, 4> Dims; 10664 bool ErrorFound = false; 10665 for (Expr *Dim : E->getDimensions()) { 10666 ExprResult DimRes = getDerived().TransformExpr(Dim); 10667 if (DimRes.isInvalid()) { 10668 ErrorFound = true; 10669 continue; 10670 } 10671 Dims.push_back(DimRes.get()); 10672 } 10673 10674 if (ErrorFound) 10675 return ExprError(); 10676 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10677 E->getRParenLoc(), Dims, 10678 E->getBracketsRanges()); 10679 } 10680 10681 template <typename Derived> 10682 ExprResult 10683 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10684 unsigned NumIterators = E->numOfIterators(); 10685 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10686 10687 bool ErrorFound = false; 10688 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10689 for (unsigned I = 0; I < NumIterators; ++I) { 10690 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10691 Data[I].DeclIdent = D->getIdentifier(); 10692 Data[I].DeclIdentLoc = D->getLocation(); 10693 if (D->getLocation() == D->getBeginLoc()) { 10694 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10695 "Implicit type must be int."); 10696 } else { 10697 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10698 QualType DeclTy = getDerived().TransformType(D->getType()); 10699 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10700 } 10701 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10702 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10703 ExprResult End = getDerived().TransformExpr(Range.End); 10704 ExprResult Step = getDerived().TransformExpr(Range.Step); 10705 ErrorFound = ErrorFound || 10706 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10707 !Data[I].Type.get().isNull())) || 10708 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10709 if (ErrorFound) 10710 continue; 10711 Data[I].Range.Begin = Begin.get(); 10712 Data[I].Range.End = End.get(); 10713 Data[I].Range.Step = Step.get(); 10714 Data[I].AssignLoc = E->getAssignLoc(I); 10715 Data[I].ColonLoc = E->getColonLoc(I); 10716 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10717 NeedToRebuild = 10718 NeedToRebuild || 10719 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10720 D->getType().getTypePtrOrNull()) || 10721 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10722 Range.Step != Data[I].Range.Step; 10723 } 10724 if (ErrorFound) 10725 return ExprError(); 10726 if (!NeedToRebuild) 10727 return E; 10728 10729 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10730 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10731 if (!Res.isUsable()) 10732 return Res; 10733 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10734 for (unsigned I = 0; I < NumIterators; ++I) 10735 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10736 IE->getIteratorDecl(I)); 10737 return Res; 10738 } 10739 10740 template<typename Derived> 10741 ExprResult 10742 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10743 // Transform the callee. 10744 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10745 if (Callee.isInvalid()) 10746 return ExprError(); 10747 10748 // Transform arguments. 10749 bool ArgChanged = false; 10750 SmallVector<Expr*, 8> Args; 10751 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10752 &ArgChanged)) 10753 return ExprError(); 10754 10755 if (!getDerived().AlwaysRebuild() && 10756 Callee.get() == E->getCallee() && 10757 !ArgChanged) 10758 return SemaRef.MaybeBindToTemporary(E); 10759 10760 // FIXME: Wrong source location information for the '('. 10761 SourceLocation FakeLParenLoc 10762 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10763 10764 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10765 if (E->hasStoredFPFeatures()) { 10766 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10767 getSema().CurFPFeatures = 10768 NewOverrides.applyOverrides(getSema().getLangOpts()); 10769 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10770 } 10771 10772 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10773 Args, 10774 E->getRParenLoc()); 10775 } 10776 10777 template<typename Derived> 10778 ExprResult 10779 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10780 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10781 if (Base.isInvalid()) 10782 return ExprError(); 10783 10784 NestedNameSpecifierLoc QualifierLoc; 10785 if (E->hasQualifier()) { 10786 QualifierLoc 10787 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10788 10789 if (!QualifierLoc) 10790 return ExprError(); 10791 } 10792 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10793 10794 ValueDecl *Member 10795 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10796 E->getMemberDecl())); 10797 if (!Member) 10798 return ExprError(); 10799 10800 NamedDecl *FoundDecl = E->getFoundDecl(); 10801 if (FoundDecl == E->getMemberDecl()) { 10802 FoundDecl = Member; 10803 } else { 10804 FoundDecl = cast_or_null<NamedDecl>( 10805 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10806 if (!FoundDecl) 10807 return ExprError(); 10808 } 10809 10810 if (!getDerived().AlwaysRebuild() && 10811 Base.get() == E->getBase() && 10812 QualifierLoc == E->getQualifierLoc() && 10813 Member == E->getMemberDecl() && 10814 FoundDecl == E->getFoundDecl() && 10815 !E->hasExplicitTemplateArgs()) { 10816 10817 // Mark it referenced in the new context regardless. 10818 // FIXME: this is a bit instantiation-specific. 10819 SemaRef.MarkMemberReferenced(E); 10820 10821 return E; 10822 } 10823 10824 TemplateArgumentListInfo TransArgs; 10825 if (E->hasExplicitTemplateArgs()) { 10826 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10827 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10828 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10829 E->getNumTemplateArgs(), 10830 TransArgs)) 10831 return ExprError(); 10832 } 10833 10834 // FIXME: Bogus source location for the operator 10835 SourceLocation FakeOperatorLoc = 10836 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10837 10838 // FIXME: to do this check properly, we will need to preserve the 10839 // first-qualifier-in-scope here, just in case we had a dependent 10840 // base (and therefore couldn't do the check) and a 10841 // nested-name-qualifier (and therefore could do the lookup). 10842 NamedDecl *FirstQualifierInScope = nullptr; 10843 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10844 if (MemberNameInfo.getName()) { 10845 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10846 if (!MemberNameInfo.getName()) 10847 return ExprError(); 10848 } 10849 10850 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10851 E->isArrow(), 10852 QualifierLoc, 10853 TemplateKWLoc, 10854 MemberNameInfo, 10855 Member, 10856 FoundDecl, 10857 (E->hasExplicitTemplateArgs() 10858 ? &TransArgs : nullptr), 10859 FirstQualifierInScope); 10860 } 10861 10862 template<typename Derived> 10863 ExprResult 10864 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10865 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10866 if (LHS.isInvalid()) 10867 return ExprError(); 10868 10869 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10870 if (RHS.isInvalid()) 10871 return ExprError(); 10872 10873 if (!getDerived().AlwaysRebuild() && 10874 LHS.get() == E->getLHS() && 10875 RHS.get() == E->getRHS()) 10876 return E; 10877 10878 if (E->isCompoundAssignmentOp()) 10879 // FPFeatures has already been established from trailing storage 10880 return getDerived().RebuildBinaryOperator( 10881 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10882 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10883 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10884 getSema().CurFPFeatures = 10885 NewOverrides.applyOverrides(getSema().getLangOpts()); 10886 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10887 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10888 LHS.get(), RHS.get()); 10889 } 10890 10891 template <typename Derived> 10892 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10893 CXXRewrittenBinaryOperator *E) { 10894 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10895 10896 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10897 if (LHS.isInvalid()) 10898 return ExprError(); 10899 10900 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10901 if (RHS.isInvalid()) 10902 return ExprError(); 10903 10904 if (!getDerived().AlwaysRebuild() && 10905 LHS.get() == Decomp.LHS && 10906 RHS.get() == Decomp.RHS) 10907 return E; 10908 10909 // Extract the already-resolved callee declarations so that we can restrict 10910 // ourselves to using them as the unqualified lookup results when rebuilding. 10911 UnresolvedSet<2> UnqualLookups; 10912 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10913 const_cast<Expr *>(Decomp.InnerBinOp)}; 10914 for (Expr *PossibleBinOp : PossibleBinOps) { 10915 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10916 if (!Op) 10917 continue; 10918 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10919 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10920 continue; 10921 10922 // Transform the callee in case we built a call to a local extern 10923 // declaration. 10924 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10925 E->getOperatorLoc(), Callee->getFoundDecl())); 10926 if (!Found) 10927 return ExprError(); 10928 UnqualLookups.addDecl(Found); 10929 } 10930 10931 return getDerived().RebuildCXXRewrittenBinaryOperator( 10932 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10933 } 10934 10935 template<typename Derived> 10936 ExprResult 10937 TreeTransform<Derived>::TransformCompoundAssignOperator( 10938 CompoundAssignOperator *E) { 10939 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10940 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10941 getSema().CurFPFeatures = 10942 NewOverrides.applyOverrides(getSema().getLangOpts()); 10943 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10944 return getDerived().TransformBinaryOperator(E); 10945 } 10946 10947 template<typename Derived> 10948 ExprResult TreeTransform<Derived>:: 10949 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10950 // Just rebuild the common and RHS expressions and see whether we 10951 // get any changes. 10952 10953 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10954 if (commonExpr.isInvalid()) 10955 return ExprError(); 10956 10957 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10958 if (rhs.isInvalid()) 10959 return ExprError(); 10960 10961 if (!getDerived().AlwaysRebuild() && 10962 commonExpr.get() == e->getCommon() && 10963 rhs.get() == e->getFalseExpr()) 10964 return e; 10965 10966 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10967 e->getQuestionLoc(), 10968 nullptr, 10969 e->getColonLoc(), 10970 rhs.get()); 10971 } 10972 10973 template<typename Derived> 10974 ExprResult 10975 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10976 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10977 if (Cond.isInvalid()) 10978 return ExprError(); 10979 10980 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10981 if (LHS.isInvalid()) 10982 return ExprError(); 10983 10984 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10985 if (RHS.isInvalid()) 10986 return ExprError(); 10987 10988 if (!getDerived().AlwaysRebuild() && 10989 Cond.get() == E->getCond() && 10990 LHS.get() == E->getLHS() && 10991 RHS.get() == E->getRHS()) 10992 return E; 10993 10994 return getDerived().RebuildConditionalOperator(Cond.get(), 10995 E->getQuestionLoc(), 10996 LHS.get(), 10997 E->getColonLoc(), 10998 RHS.get()); 10999 } 11000 11001 template<typename Derived> 11002 ExprResult 11003 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11004 // Implicit casts are eliminated during transformation, since they 11005 // will be recomputed by semantic analysis after transformation. 11006 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11007 } 11008 11009 template<typename Derived> 11010 ExprResult 11011 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11012 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11013 if (!Type) 11014 return ExprError(); 11015 11016 ExprResult SubExpr 11017 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11018 if (SubExpr.isInvalid()) 11019 return ExprError(); 11020 11021 if (!getDerived().AlwaysRebuild() && 11022 Type == E->getTypeInfoAsWritten() && 11023 SubExpr.get() == E->getSubExpr()) 11024 return E; 11025 11026 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11027 Type, 11028 E->getRParenLoc(), 11029 SubExpr.get()); 11030 } 11031 11032 template<typename Derived> 11033 ExprResult 11034 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11035 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11036 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11037 if (!NewT) 11038 return ExprError(); 11039 11040 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11041 if (Init.isInvalid()) 11042 return ExprError(); 11043 11044 if (!getDerived().AlwaysRebuild() && 11045 OldT == NewT && 11046 Init.get() == E->getInitializer()) 11047 return SemaRef.MaybeBindToTemporary(E); 11048 11049 // Note: the expression type doesn't necessarily match the 11050 // type-as-written, but that's okay, because it should always be 11051 // derivable from the initializer. 11052 11053 return getDerived().RebuildCompoundLiteralExpr( 11054 E->getLParenLoc(), NewT, 11055 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11056 } 11057 11058 template<typename Derived> 11059 ExprResult 11060 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11061 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11062 if (Base.isInvalid()) 11063 return ExprError(); 11064 11065 if (!getDerived().AlwaysRebuild() && 11066 Base.get() == E->getBase()) 11067 return E; 11068 11069 // FIXME: Bad source location 11070 SourceLocation FakeOperatorLoc = 11071 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11072 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11073 E->getAccessorLoc(), 11074 E->getAccessor()); 11075 } 11076 11077 template<typename Derived> 11078 ExprResult 11079 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11080 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11081 E = Syntactic; 11082 11083 bool InitChanged = false; 11084 11085 EnterExpressionEvaluationContext Context( 11086 getSema(), EnterExpressionEvaluationContext::InitList); 11087 11088 SmallVector<Expr*, 4> Inits; 11089 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11090 Inits, &InitChanged)) 11091 return ExprError(); 11092 11093 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11094 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11095 // in some cases. We can't reuse it in general, because the syntactic and 11096 // semantic forms are linked, and we can't know that semantic form will 11097 // match even if the syntactic form does. 11098 } 11099 11100 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11101 E->getRBraceLoc()); 11102 } 11103 11104 template<typename Derived> 11105 ExprResult 11106 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11107 Designation Desig; 11108 11109 // transform the initializer value 11110 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11111 if (Init.isInvalid()) 11112 return ExprError(); 11113 11114 // transform the designators. 11115 SmallVector<Expr*, 4> ArrayExprs; 11116 bool ExprChanged = false; 11117 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11118 if (D.isFieldDesignator()) { 11119 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11120 D.getDotLoc(), 11121 D.getFieldLoc())); 11122 if (D.getField()) { 11123 FieldDecl *Field = cast_or_null<FieldDecl>( 11124 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11125 if (Field != D.getField()) 11126 // Rebuild the expression when the transformed FieldDecl is 11127 // different to the already assigned FieldDecl. 11128 ExprChanged = true; 11129 } else { 11130 // Ensure that the designator expression is rebuilt when there isn't 11131 // a resolved FieldDecl in the designator as we don't want to assign 11132 // a FieldDecl to a pattern designator that will be instantiated again. 11133 ExprChanged = true; 11134 } 11135 continue; 11136 } 11137 11138 if (D.isArrayDesignator()) { 11139 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11140 if (Index.isInvalid()) 11141 return ExprError(); 11142 11143 Desig.AddDesignator( 11144 Designator::getArray(Index.get(), D.getLBracketLoc())); 11145 11146 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11147 ArrayExprs.push_back(Index.get()); 11148 continue; 11149 } 11150 11151 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11152 ExprResult Start 11153 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11154 if (Start.isInvalid()) 11155 return ExprError(); 11156 11157 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11158 if (End.isInvalid()) 11159 return ExprError(); 11160 11161 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11162 End.get(), 11163 D.getLBracketLoc(), 11164 D.getEllipsisLoc())); 11165 11166 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11167 End.get() != E->getArrayRangeEnd(D); 11168 11169 ArrayExprs.push_back(Start.get()); 11170 ArrayExprs.push_back(End.get()); 11171 } 11172 11173 if (!getDerived().AlwaysRebuild() && 11174 Init.get() == E->getInit() && 11175 !ExprChanged) 11176 return E; 11177 11178 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11179 E->getEqualOrColonLoc(), 11180 E->usesGNUSyntax(), Init.get()); 11181 } 11182 11183 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11184 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11185 template<typename Derived> 11186 ExprResult 11187 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11188 DesignatedInitUpdateExpr *E) { 11189 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11190 "initializer"); 11191 return ExprError(); 11192 } 11193 11194 template<typename Derived> 11195 ExprResult 11196 TreeTransform<Derived>::TransformNoInitExpr( 11197 NoInitExpr *E) { 11198 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11199 return ExprError(); 11200 } 11201 11202 template<typename Derived> 11203 ExprResult 11204 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11205 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11206 return ExprError(); 11207 } 11208 11209 template<typename Derived> 11210 ExprResult 11211 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11212 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11213 return ExprError(); 11214 } 11215 11216 template<typename Derived> 11217 ExprResult 11218 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11219 ImplicitValueInitExpr *E) { 11220 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11221 11222 // FIXME: Will we ever have proper type location here? Will we actually 11223 // need to transform the type? 11224 QualType T = getDerived().TransformType(E->getType()); 11225 if (T.isNull()) 11226 return ExprError(); 11227 11228 if (!getDerived().AlwaysRebuild() && 11229 T == E->getType()) 11230 return E; 11231 11232 return getDerived().RebuildImplicitValueInitExpr(T); 11233 } 11234 11235 template<typename Derived> 11236 ExprResult 11237 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11238 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11239 if (!TInfo) 11240 return ExprError(); 11241 11242 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11243 if (SubExpr.isInvalid()) 11244 return ExprError(); 11245 11246 if (!getDerived().AlwaysRebuild() && 11247 TInfo == E->getWrittenTypeInfo() && 11248 SubExpr.get() == E->getSubExpr()) 11249 return E; 11250 11251 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11252 TInfo, E->getRParenLoc()); 11253 } 11254 11255 template<typename Derived> 11256 ExprResult 11257 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11258 bool ArgumentChanged = false; 11259 SmallVector<Expr*, 4> Inits; 11260 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11261 &ArgumentChanged)) 11262 return ExprError(); 11263 11264 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11265 Inits, 11266 E->getRParenLoc()); 11267 } 11268 11269 /// Transform an address-of-label expression. 11270 /// 11271 /// By default, the transformation of an address-of-label expression always 11272 /// rebuilds the expression, so that the label identifier can be resolved to 11273 /// the corresponding label statement by semantic analysis. 11274 template<typename Derived> 11275 ExprResult 11276 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11277 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11278 E->getLabel()); 11279 if (!LD) 11280 return ExprError(); 11281 11282 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11283 cast<LabelDecl>(LD)); 11284 } 11285 11286 template<typename Derived> 11287 ExprResult 11288 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11289 SemaRef.ActOnStartStmtExpr(); 11290 StmtResult SubStmt 11291 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11292 if (SubStmt.isInvalid()) { 11293 SemaRef.ActOnStmtExprError(); 11294 return ExprError(); 11295 } 11296 11297 unsigned OldDepth = E->getTemplateDepth(); 11298 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11299 11300 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11301 SubStmt.get() == E->getSubStmt()) { 11302 // Calling this an 'error' is unintuitive, but it does the right thing. 11303 SemaRef.ActOnStmtExprError(); 11304 return SemaRef.MaybeBindToTemporary(E); 11305 } 11306 11307 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11308 E->getRParenLoc(), NewDepth); 11309 } 11310 11311 template<typename Derived> 11312 ExprResult 11313 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11314 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11315 if (Cond.isInvalid()) 11316 return ExprError(); 11317 11318 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11319 if (LHS.isInvalid()) 11320 return ExprError(); 11321 11322 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11323 if (RHS.isInvalid()) 11324 return ExprError(); 11325 11326 if (!getDerived().AlwaysRebuild() && 11327 Cond.get() == E->getCond() && 11328 LHS.get() == E->getLHS() && 11329 RHS.get() == E->getRHS()) 11330 return E; 11331 11332 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11333 Cond.get(), LHS.get(), RHS.get(), 11334 E->getRParenLoc()); 11335 } 11336 11337 template<typename Derived> 11338 ExprResult 11339 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11340 return E; 11341 } 11342 11343 template<typename Derived> 11344 ExprResult 11345 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11346 switch (E->getOperator()) { 11347 case OO_New: 11348 case OO_Delete: 11349 case OO_Array_New: 11350 case OO_Array_Delete: 11351 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11352 11353 case OO_Call: { 11354 // This is a call to an object's operator(). 11355 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11356 11357 // Transform the object itself. 11358 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11359 if (Object.isInvalid()) 11360 return ExprError(); 11361 11362 // FIXME: Poor location information 11363 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11364 static_cast<Expr *>(Object.get())->getEndLoc()); 11365 11366 // Transform the call arguments. 11367 SmallVector<Expr*, 8> Args; 11368 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11369 Args)) 11370 return ExprError(); 11371 11372 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11373 E->getEndLoc()); 11374 } 11375 11376 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11377 case OO_##Name: 11378 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11379 #include "clang/Basic/OperatorKinds.def" 11380 case OO_Subscript: 11381 // Handled below. 11382 break; 11383 11384 case OO_Conditional: 11385 llvm_unreachable("conditional operator is not actually overloadable"); 11386 11387 case OO_None: 11388 case NUM_OVERLOADED_OPERATORS: 11389 llvm_unreachable("not an overloaded operator?"); 11390 } 11391 11392 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11393 if (Callee.isInvalid()) 11394 return ExprError(); 11395 11396 ExprResult First; 11397 if (E->getOperator() == OO_Amp) 11398 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11399 else 11400 First = getDerived().TransformExpr(E->getArg(0)); 11401 if (First.isInvalid()) 11402 return ExprError(); 11403 11404 ExprResult Second; 11405 if (E->getNumArgs() == 2) { 11406 Second = getDerived().TransformExpr(E->getArg(1)); 11407 if (Second.isInvalid()) 11408 return ExprError(); 11409 } 11410 11411 if (!getDerived().AlwaysRebuild() && 11412 Callee.get() == E->getCallee() && 11413 First.get() == E->getArg(0) && 11414 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11415 return SemaRef.MaybeBindToTemporary(E); 11416 11417 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11418 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11419 getSema().CurFPFeatures = 11420 NewOverrides.applyOverrides(getSema().getLangOpts()); 11421 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11422 11423 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11424 E->getOperatorLoc(), 11425 Callee.get(), 11426 First.get(), 11427 Second.get()); 11428 } 11429 11430 template<typename Derived> 11431 ExprResult 11432 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11433 return getDerived().TransformCallExpr(E); 11434 } 11435 11436 template <typename Derived> 11437 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11438 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11439 getSema().CurContext != E->getParentContext(); 11440 11441 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11442 return E; 11443 11444 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11445 E->getEndLoc(), 11446 getSema().CurContext); 11447 } 11448 11449 template<typename Derived> 11450 ExprResult 11451 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11452 // Transform the callee. 11453 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11454 if (Callee.isInvalid()) 11455 return ExprError(); 11456 11457 // Transform exec config. 11458 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11459 if (EC.isInvalid()) 11460 return ExprError(); 11461 11462 // Transform arguments. 11463 bool ArgChanged = false; 11464 SmallVector<Expr*, 8> Args; 11465 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11466 &ArgChanged)) 11467 return ExprError(); 11468 11469 if (!getDerived().AlwaysRebuild() && 11470 Callee.get() == E->getCallee() && 11471 !ArgChanged) 11472 return SemaRef.MaybeBindToTemporary(E); 11473 11474 // FIXME: Wrong source location information for the '('. 11475 SourceLocation FakeLParenLoc 11476 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11477 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11478 Args, 11479 E->getRParenLoc(), EC.get()); 11480 } 11481 11482 template<typename Derived> 11483 ExprResult 11484 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11485 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11486 if (!Type) 11487 return ExprError(); 11488 11489 ExprResult SubExpr 11490 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11491 if (SubExpr.isInvalid()) 11492 return ExprError(); 11493 11494 if (!getDerived().AlwaysRebuild() && 11495 Type == E->getTypeInfoAsWritten() && 11496 SubExpr.get() == E->getSubExpr()) 11497 return E; 11498 return getDerived().RebuildCXXNamedCastExpr( 11499 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11500 Type, E->getAngleBrackets().getEnd(), 11501 // FIXME. this should be '(' location 11502 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11503 } 11504 11505 template<typename Derived> 11506 ExprResult 11507 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11508 TypeSourceInfo *TSI = 11509 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11510 if (!TSI) 11511 return ExprError(); 11512 11513 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11514 if (Sub.isInvalid()) 11515 return ExprError(); 11516 11517 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11518 Sub.get(), BCE->getEndLoc()); 11519 } 11520 11521 template<typename Derived> 11522 ExprResult 11523 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11524 return getDerived().TransformCXXNamedCastExpr(E); 11525 } 11526 11527 template<typename Derived> 11528 ExprResult 11529 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11530 return getDerived().TransformCXXNamedCastExpr(E); 11531 } 11532 11533 template<typename Derived> 11534 ExprResult 11535 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11536 CXXReinterpretCastExpr *E) { 11537 return getDerived().TransformCXXNamedCastExpr(E); 11538 } 11539 11540 template<typename Derived> 11541 ExprResult 11542 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11543 return getDerived().TransformCXXNamedCastExpr(E); 11544 } 11545 11546 template<typename Derived> 11547 ExprResult 11548 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11549 return getDerived().TransformCXXNamedCastExpr(E); 11550 } 11551 11552 template<typename Derived> 11553 ExprResult 11554 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11555 CXXFunctionalCastExpr *E) { 11556 TypeSourceInfo *Type = 11557 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11558 if (!Type) 11559 return ExprError(); 11560 11561 ExprResult SubExpr 11562 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11563 if (SubExpr.isInvalid()) 11564 return ExprError(); 11565 11566 if (!getDerived().AlwaysRebuild() && 11567 Type == E->getTypeInfoAsWritten() && 11568 SubExpr.get() == E->getSubExpr()) 11569 return E; 11570 11571 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11572 E->getLParenLoc(), 11573 SubExpr.get(), 11574 E->getRParenLoc(), 11575 E->isListInitialization()); 11576 } 11577 11578 template<typename Derived> 11579 ExprResult 11580 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11581 if (E->isTypeOperand()) { 11582 TypeSourceInfo *TInfo 11583 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11584 if (!TInfo) 11585 return ExprError(); 11586 11587 if (!getDerived().AlwaysRebuild() && 11588 TInfo == E->getTypeOperandSourceInfo()) 11589 return E; 11590 11591 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11592 TInfo, E->getEndLoc()); 11593 } 11594 11595 // We don't know whether the subexpression is potentially evaluated until 11596 // after we perform semantic analysis. We speculatively assume it is 11597 // unevaluated; it will get fixed later if the subexpression is in fact 11598 // potentially evaluated. 11599 EnterExpressionEvaluationContext Unevaluated( 11600 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11601 Sema::ReuseLambdaContextDecl); 11602 11603 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11604 if (SubExpr.isInvalid()) 11605 return ExprError(); 11606 11607 if (!getDerived().AlwaysRebuild() && 11608 SubExpr.get() == E->getExprOperand()) 11609 return E; 11610 11611 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11612 SubExpr.get(), E->getEndLoc()); 11613 } 11614 11615 template<typename Derived> 11616 ExprResult 11617 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11618 if (E->isTypeOperand()) { 11619 TypeSourceInfo *TInfo 11620 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11621 if (!TInfo) 11622 return ExprError(); 11623 11624 if (!getDerived().AlwaysRebuild() && 11625 TInfo == E->getTypeOperandSourceInfo()) 11626 return E; 11627 11628 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11629 TInfo, E->getEndLoc()); 11630 } 11631 11632 EnterExpressionEvaluationContext Unevaluated( 11633 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11634 11635 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11636 if (SubExpr.isInvalid()) 11637 return ExprError(); 11638 11639 if (!getDerived().AlwaysRebuild() && 11640 SubExpr.get() == E->getExprOperand()) 11641 return E; 11642 11643 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11644 SubExpr.get(), E->getEndLoc()); 11645 } 11646 11647 template<typename Derived> 11648 ExprResult 11649 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11650 return E; 11651 } 11652 11653 template<typename Derived> 11654 ExprResult 11655 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11656 CXXNullPtrLiteralExpr *E) { 11657 return E; 11658 } 11659 11660 template<typename Derived> 11661 ExprResult 11662 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11663 QualType T = getSema().getCurrentThisType(); 11664 11665 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11666 // Mark it referenced in the new context regardless. 11667 // FIXME: this is a bit instantiation-specific. 11668 getSema().MarkThisReferenced(E); 11669 return E; 11670 } 11671 11672 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11673 } 11674 11675 template<typename Derived> 11676 ExprResult 11677 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11678 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11679 if (SubExpr.isInvalid()) 11680 return ExprError(); 11681 11682 if (!getDerived().AlwaysRebuild() && 11683 SubExpr.get() == E->getSubExpr()) 11684 return E; 11685 11686 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11687 E->isThrownVariableInScope()); 11688 } 11689 11690 template<typename Derived> 11691 ExprResult 11692 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11693 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11694 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11695 if (!Param) 11696 return ExprError(); 11697 11698 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11699 E->getUsedContext() == SemaRef.CurContext) 11700 return E; 11701 11702 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11703 } 11704 11705 template<typename Derived> 11706 ExprResult 11707 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11708 FieldDecl *Field = cast_or_null<FieldDecl>( 11709 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11710 if (!Field) 11711 return ExprError(); 11712 11713 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11714 E->getUsedContext() == SemaRef.CurContext) 11715 return E; 11716 11717 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11718 } 11719 11720 template<typename Derived> 11721 ExprResult 11722 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11723 CXXScalarValueInitExpr *E) { 11724 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11725 if (!T) 11726 return ExprError(); 11727 11728 if (!getDerived().AlwaysRebuild() && 11729 T == E->getTypeSourceInfo()) 11730 return E; 11731 11732 return getDerived().RebuildCXXScalarValueInitExpr(T, 11733 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11734 E->getRParenLoc()); 11735 } 11736 11737 template<typename Derived> 11738 ExprResult 11739 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11740 // Transform the type that we're allocating 11741 TypeSourceInfo *AllocTypeInfo = 11742 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11743 if (!AllocTypeInfo) 11744 return ExprError(); 11745 11746 // Transform the size of the array we're allocating (if any). 11747 Optional<Expr *> ArraySize; 11748 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11749 ExprResult NewArraySize; 11750 if (*OldArraySize) { 11751 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11752 if (NewArraySize.isInvalid()) 11753 return ExprError(); 11754 } 11755 ArraySize = NewArraySize.get(); 11756 } 11757 11758 // Transform the placement arguments (if any). 11759 bool ArgumentChanged = false; 11760 SmallVector<Expr*, 8> PlacementArgs; 11761 if (getDerived().TransformExprs(E->getPlacementArgs(), 11762 E->getNumPlacementArgs(), true, 11763 PlacementArgs, &ArgumentChanged)) 11764 return ExprError(); 11765 11766 // Transform the initializer (if any). 11767 Expr *OldInit = E->getInitializer(); 11768 ExprResult NewInit; 11769 if (OldInit) 11770 NewInit = getDerived().TransformInitializer(OldInit, true); 11771 if (NewInit.isInvalid()) 11772 return ExprError(); 11773 11774 // Transform new operator and delete operator. 11775 FunctionDecl *OperatorNew = nullptr; 11776 if (E->getOperatorNew()) { 11777 OperatorNew = cast_or_null<FunctionDecl>( 11778 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11779 if (!OperatorNew) 11780 return ExprError(); 11781 } 11782 11783 FunctionDecl *OperatorDelete = nullptr; 11784 if (E->getOperatorDelete()) { 11785 OperatorDelete = cast_or_null<FunctionDecl>( 11786 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11787 if (!OperatorDelete) 11788 return ExprError(); 11789 } 11790 11791 if (!getDerived().AlwaysRebuild() && 11792 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11793 ArraySize == E->getArraySize() && 11794 NewInit.get() == OldInit && 11795 OperatorNew == E->getOperatorNew() && 11796 OperatorDelete == E->getOperatorDelete() && 11797 !ArgumentChanged) { 11798 // Mark any declarations we need as referenced. 11799 // FIXME: instantiation-specific. 11800 if (OperatorNew) 11801 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11802 if (OperatorDelete) 11803 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11804 11805 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11806 QualType ElementType 11807 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11808 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11809 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11810 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11811 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11812 } 11813 } 11814 } 11815 11816 return E; 11817 } 11818 11819 QualType AllocType = AllocTypeInfo->getType(); 11820 if (!ArraySize) { 11821 // If no array size was specified, but the new expression was 11822 // instantiated with an array type (e.g., "new T" where T is 11823 // instantiated with "int[4]"), extract the outer bound from the 11824 // array type as our array size. We do this with constant and 11825 // dependently-sized array types. 11826 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11827 if (!ArrayT) { 11828 // Do nothing 11829 } else if (const ConstantArrayType *ConsArrayT 11830 = dyn_cast<ConstantArrayType>(ArrayT)) { 11831 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11832 SemaRef.Context.getSizeType(), 11833 /*FIXME:*/ E->getBeginLoc()); 11834 AllocType = ConsArrayT->getElementType(); 11835 } else if (const DependentSizedArrayType *DepArrayT 11836 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11837 if (DepArrayT->getSizeExpr()) { 11838 ArraySize = DepArrayT->getSizeExpr(); 11839 AllocType = DepArrayT->getElementType(); 11840 } 11841 } 11842 } 11843 11844 return getDerived().RebuildCXXNewExpr( 11845 E->getBeginLoc(), E->isGlobalNew(), 11846 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11847 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11848 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11849 } 11850 11851 template<typename Derived> 11852 ExprResult 11853 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11854 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11855 if (Operand.isInvalid()) 11856 return ExprError(); 11857 11858 // Transform the delete operator, if known. 11859 FunctionDecl *OperatorDelete = nullptr; 11860 if (E->getOperatorDelete()) { 11861 OperatorDelete = cast_or_null<FunctionDecl>( 11862 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11863 if (!OperatorDelete) 11864 return ExprError(); 11865 } 11866 11867 if (!getDerived().AlwaysRebuild() && 11868 Operand.get() == E->getArgument() && 11869 OperatorDelete == E->getOperatorDelete()) { 11870 // Mark any declarations we need as referenced. 11871 // FIXME: instantiation-specific. 11872 if (OperatorDelete) 11873 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11874 11875 if (!E->getArgument()->isTypeDependent()) { 11876 QualType Destroyed = SemaRef.Context.getBaseElementType( 11877 E->getDestroyedType()); 11878 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11879 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11880 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11881 SemaRef.LookupDestructor(Record)); 11882 } 11883 } 11884 11885 return E; 11886 } 11887 11888 return getDerived().RebuildCXXDeleteExpr( 11889 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11890 } 11891 11892 template<typename Derived> 11893 ExprResult 11894 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11895 CXXPseudoDestructorExpr *E) { 11896 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11897 if (Base.isInvalid()) 11898 return ExprError(); 11899 11900 ParsedType ObjectTypePtr; 11901 bool MayBePseudoDestructor = false; 11902 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11903 E->getOperatorLoc(), 11904 E->isArrow()? tok::arrow : tok::period, 11905 ObjectTypePtr, 11906 MayBePseudoDestructor); 11907 if (Base.isInvalid()) 11908 return ExprError(); 11909 11910 QualType ObjectType = ObjectTypePtr.get(); 11911 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11912 if (QualifierLoc) { 11913 QualifierLoc 11914 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11915 if (!QualifierLoc) 11916 return ExprError(); 11917 } 11918 CXXScopeSpec SS; 11919 SS.Adopt(QualifierLoc); 11920 11921 PseudoDestructorTypeStorage Destroyed; 11922 if (E->getDestroyedTypeInfo()) { 11923 TypeSourceInfo *DestroyedTypeInfo 11924 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11925 ObjectType, nullptr, SS); 11926 if (!DestroyedTypeInfo) 11927 return ExprError(); 11928 Destroyed = DestroyedTypeInfo; 11929 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11930 // We aren't likely to be able to resolve the identifier down to a type 11931 // now anyway, so just retain the identifier. 11932 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11933 E->getDestroyedTypeLoc()); 11934 } else { 11935 // Look for a destructor known with the given name. 11936 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11937 *E->getDestroyedTypeIdentifier(), 11938 E->getDestroyedTypeLoc(), 11939 /*Scope=*/nullptr, 11940 SS, ObjectTypePtr, 11941 false); 11942 if (!T) 11943 return ExprError(); 11944 11945 Destroyed 11946 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11947 E->getDestroyedTypeLoc()); 11948 } 11949 11950 TypeSourceInfo *ScopeTypeInfo = nullptr; 11951 if (E->getScopeTypeInfo()) { 11952 CXXScopeSpec EmptySS; 11953 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11954 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11955 if (!ScopeTypeInfo) 11956 return ExprError(); 11957 } 11958 11959 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11960 E->getOperatorLoc(), 11961 E->isArrow(), 11962 SS, 11963 ScopeTypeInfo, 11964 E->getColonColonLoc(), 11965 E->getTildeLoc(), 11966 Destroyed); 11967 } 11968 11969 template <typename Derived> 11970 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11971 bool RequiresADL, 11972 LookupResult &R) { 11973 // Transform all the decls. 11974 bool AllEmptyPacks = true; 11975 for (auto *OldD : Old->decls()) { 11976 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11977 if (!InstD) { 11978 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11979 // This can happen because of dependent hiding. 11980 if (isa<UsingShadowDecl>(OldD)) 11981 continue; 11982 else { 11983 R.clear(); 11984 return true; 11985 } 11986 } 11987 11988 // Expand using pack declarations. 11989 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11990 ArrayRef<NamedDecl*> Decls = SingleDecl; 11991 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11992 Decls = UPD->expansions(); 11993 11994 // Expand using declarations. 11995 for (auto *D : Decls) { 11996 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11997 for (auto *SD : UD->shadows()) 11998 R.addDecl(SD); 11999 } else { 12000 R.addDecl(D); 12001 } 12002 } 12003 12004 AllEmptyPacks &= Decls.empty(); 12005 }; 12006 12007 // C++ [temp.res]/8.4.2: 12008 // The program is ill-formed, no diagnostic required, if [...] lookup for 12009 // a name in the template definition found a using-declaration, but the 12010 // lookup in the corresponding scope in the instantiation odoes not find 12011 // any declarations because the using-declaration was a pack expansion and 12012 // the corresponding pack is empty 12013 if (AllEmptyPacks && !RequiresADL) { 12014 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12015 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12016 return true; 12017 } 12018 12019 // Resolve a kind, but don't do any further analysis. If it's 12020 // ambiguous, the callee needs to deal with it. 12021 R.resolveKind(); 12022 return false; 12023 } 12024 12025 template<typename Derived> 12026 ExprResult 12027 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12028 UnresolvedLookupExpr *Old) { 12029 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12030 Sema::LookupOrdinaryName); 12031 12032 // Transform the declaration set. 12033 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12034 return ExprError(); 12035 12036 // Rebuild the nested-name qualifier, if present. 12037 CXXScopeSpec SS; 12038 if (Old->getQualifierLoc()) { 12039 NestedNameSpecifierLoc QualifierLoc 12040 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12041 if (!QualifierLoc) 12042 return ExprError(); 12043 12044 SS.Adopt(QualifierLoc); 12045 } 12046 12047 if (Old->getNamingClass()) { 12048 CXXRecordDecl *NamingClass 12049 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12050 Old->getNameLoc(), 12051 Old->getNamingClass())); 12052 if (!NamingClass) { 12053 R.clear(); 12054 return ExprError(); 12055 } 12056 12057 R.setNamingClass(NamingClass); 12058 } 12059 12060 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12061 12062 // If we have neither explicit template arguments, nor the template keyword, 12063 // it's a normal declaration name or member reference. 12064 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12065 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12066 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12067 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12068 // give a good diagnostic. 12069 if (D && D->isCXXInstanceMember()) { 12070 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12071 /*TemplateArgs=*/nullptr, 12072 /*Scope=*/nullptr); 12073 } 12074 12075 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12076 } 12077 12078 // If we have template arguments, rebuild them, then rebuild the 12079 // templateid expression. 12080 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12081 if (Old->hasExplicitTemplateArgs() && 12082 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12083 Old->getNumTemplateArgs(), 12084 TransArgs)) { 12085 R.clear(); 12086 return ExprError(); 12087 } 12088 12089 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12090 Old->requiresADL(), &TransArgs); 12091 } 12092 12093 template<typename Derived> 12094 ExprResult 12095 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12096 bool ArgChanged = false; 12097 SmallVector<TypeSourceInfo *, 4> Args; 12098 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12099 TypeSourceInfo *From = E->getArg(I); 12100 TypeLoc FromTL = From->getTypeLoc(); 12101 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12102 TypeLocBuilder TLB; 12103 TLB.reserve(FromTL.getFullDataSize()); 12104 QualType To = getDerived().TransformType(TLB, FromTL); 12105 if (To.isNull()) 12106 return ExprError(); 12107 12108 if (To == From->getType()) 12109 Args.push_back(From); 12110 else { 12111 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12112 ArgChanged = true; 12113 } 12114 continue; 12115 } 12116 12117 ArgChanged = true; 12118 12119 // We have a pack expansion. Instantiate it. 12120 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12121 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12122 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12123 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12124 12125 // Determine whether the set of unexpanded parameter packs can and should 12126 // be expanded. 12127 bool Expand = true; 12128 bool RetainExpansion = false; 12129 Optional<unsigned> OrigNumExpansions = 12130 ExpansionTL.getTypePtr()->getNumExpansions(); 12131 Optional<unsigned> NumExpansions = OrigNumExpansions; 12132 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12133 PatternTL.getSourceRange(), 12134 Unexpanded, 12135 Expand, RetainExpansion, 12136 NumExpansions)) 12137 return ExprError(); 12138 12139 if (!Expand) { 12140 // The transform has determined that we should perform a simple 12141 // transformation on the pack expansion, producing another pack 12142 // expansion. 12143 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12144 12145 TypeLocBuilder TLB; 12146 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12147 12148 QualType To = getDerived().TransformType(TLB, PatternTL); 12149 if (To.isNull()) 12150 return ExprError(); 12151 12152 To = getDerived().RebuildPackExpansionType(To, 12153 PatternTL.getSourceRange(), 12154 ExpansionTL.getEllipsisLoc(), 12155 NumExpansions); 12156 if (To.isNull()) 12157 return ExprError(); 12158 12159 PackExpansionTypeLoc ToExpansionTL 12160 = TLB.push<PackExpansionTypeLoc>(To); 12161 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12162 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12163 continue; 12164 } 12165 12166 // Expand the pack expansion by substituting for each argument in the 12167 // pack(s). 12168 for (unsigned I = 0; I != *NumExpansions; ++I) { 12169 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12170 TypeLocBuilder TLB; 12171 TLB.reserve(PatternTL.getFullDataSize()); 12172 QualType To = getDerived().TransformType(TLB, PatternTL); 12173 if (To.isNull()) 12174 return ExprError(); 12175 12176 if (To->containsUnexpandedParameterPack()) { 12177 To = getDerived().RebuildPackExpansionType(To, 12178 PatternTL.getSourceRange(), 12179 ExpansionTL.getEllipsisLoc(), 12180 NumExpansions); 12181 if (To.isNull()) 12182 return ExprError(); 12183 12184 PackExpansionTypeLoc ToExpansionTL 12185 = TLB.push<PackExpansionTypeLoc>(To); 12186 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12187 } 12188 12189 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12190 } 12191 12192 if (!RetainExpansion) 12193 continue; 12194 12195 // If we're supposed to retain a pack expansion, do so by temporarily 12196 // forgetting the partially-substituted parameter pack. 12197 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12198 12199 TypeLocBuilder TLB; 12200 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12201 12202 QualType To = getDerived().TransformType(TLB, PatternTL); 12203 if (To.isNull()) 12204 return ExprError(); 12205 12206 To = getDerived().RebuildPackExpansionType(To, 12207 PatternTL.getSourceRange(), 12208 ExpansionTL.getEllipsisLoc(), 12209 NumExpansions); 12210 if (To.isNull()) 12211 return ExprError(); 12212 12213 PackExpansionTypeLoc ToExpansionTL 12214 = TLB.push<PackExpansionTypeLoc>(To); 12215 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12216 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12217 } 12218 12219 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12220 return E; 12221 12222 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12223 E->getEndLoc()); 12224 } 12225 12226 template<typename Derived> 12227 ExprResult 12228 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12229 ConceptSpecializationExpr *E) { 12230 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12231 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12232 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12233 Old->NumTemplateArgs, TransArgs)) 12234 return ExprError(); 12235 12236 return getDerived().RebuildConceptSpecializationExpr( 12237 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12238 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12239 &TransArgs); 12240 } 12241 12242 template<typename Derived> 12243 ExprResult 12244 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12245 SmallVector<ParmVarDecl*, 4> TransParams; 12246 SmallVector<QualType, 4> TransParamTypes; 12247 Sema::ExtParameterInfoBuilder ExtParamInfos; 12248 12249 // C++2a [expr.prim.req]p2 12250 // Expressions appearing within a requirement-body are unevaluated operands. 12251 EnterExpressionEvaluationContext Ctx( 12252 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12253 12254 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12255 getSema().Context, getSema().CurContext, 12256 E->getBody()->getBeginLoc()); 12257 12258 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12259 12260 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12261 E->getLocalParameters(), 12262 /*ParamTypes=*/nullptr, 12263 /*ParamInfos=*/nullptr, 12264 TransParamTypes, &TransParams, 12265 ExtParamInfos)) 12266 return ExprError(); 12267 12268 for (ParmVarDecl *Param : TransParams) 12269 Param->setDeclContext(Body); 12270 12271 SmallVector<concepts::Requirement *, 4> TransReqs; 12272 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12273 TransReqs)) 12274 return ExprError(); 12275 12276 for (concepts::Requirement *Req : TransReqs) { 12277 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12278 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12279 ER->getReturnTypeRequirement() 12280 .getTypeConstraintTemplateParameterList()->getParam(0) 12281 ->setDeclContext(Body); 12282 } 12283 } 12284 } 12285 12286 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12287 TransParams, TransReqs, 12288 E->getRBraceLoc()); 12289 } 12290 12291 template<typename Derived> 12292 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12293 ArrayRef<concepts::Requirement *> Reqs, 12294 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12295 for (concepts::Requirement *Req : Reqs) { 12296 concepts::Requirement *TransReq = nullptr; 12297 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12298 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12299 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12300 TransReq = getDerived().TransformExprRequirement(ExprReq); 12301 else 12302 TransReq = getDerived().TransformNestedRequirement( 12303 cast<concepts::NestedRequirement>(Req)); 12304 if (!TransReq) 12305 return true; 12306 Transformed.push_back(TransReq); 12307 } 12308 return false; 12309 } 12310 12311 template<typename Derived> 12312 concepts::TypeRequirement * 12313 TreeTransform<Derived>::TransformTypeRequirement( 12314 concepts::TypeRequirement *Req) { 12315 if (Req->isSubstitutionFailure()) { 12316 if (getDerived().AlwaysRebuild()) 12317 return getDerived().RebuildTypeRequirement( 12318 Req->getSubstitutionDiagnostic()); 12319 return Req; 12320 } 12321 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12322 if (!TransType) 12323 return nullptr; 12324 return getDerived().RebuildTypeRequirement(TransType); 12325 } 12326 12327 template<typename Derived> 12328 concepts::ExprRequirement * 12329 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12330 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12331 if (Req->isExprSubstitutionFailure()) 12332 TransExpr = Req->getExprSubstitutionDiagnostic(); 12333 else { 12334 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12335 if (TransExprRes.isInvalid()) 12336 return nullptr; 12337 TransExpr = TransExprRes.get(); 12338 } 12339 12340 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12341 const auto &RetReq = Req->getReturnTypeRequirement(); 12342 if (RetReq.isEmpty()) 12343 TransRetReq.emplace(); 12344 else if (RetReq.isSubstitutionFailure()) 12345 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12346 else if (RetReq.isTypeConstraint()) { 12347 TemplateParameterList *OrigTPL = 12348 RetReq.getTypeConstraintTemplateParameterList(); 12349 TemplateParameterList *TPL = 12350 getDerived().TransformTemplateParameterList(OrigTPL); 12351 if (!TPL) 12352 return nullptr; 12353 TransRetReq.emplace(TPL); 12354 } 12355 assert(TransRetReq.hasValue() && 12356 "All code paths leading here must set TransRetReq"); 12357 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12358 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12359 Req->getNoexceptLoc(), 12360 std::move(*TransRetReq)); 12361 return getDerived().RebuildExprRequirement( 12362 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12363 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12364 } 12365 12366 template<typename Derived> 12367 concepts::NestedRequirement * 12368 TreeTransform<Derived>::TransformNestedRequirement( 12369 concepts::NestedRequirement *Req) { 12370 if (Req->isSubstitutionFailure()) { 12371 if (getDerived().AlwaysRebuild()) 12372 return getDerived().RebuildNestedRequirement( 12373 Req->getSubstitutionDiagnostic()); 12374 return Req; 12375 } 12376 ExprResult TransConstraint = 12377 getDerived().TransformExpr(Req->getConstraintExpr()); 12378 if (TransConstraint.isInvalid()) 12379 return nullptr; 12380 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12381 } 12382 12383 template<typename Derived> 12384 ExprResult 12385 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12386 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12387 if (!T) 12388 return ExprError(); 12389 12390 if (!getDerived().AlwaysRebuild() && 12391 T == E->getQueriedTypeSourceInfo()) 12392 return E; 12393 12394 ExprResult SubExpr; 12395 { 12396 EnterExpressionEvaluationContext Unevaluated( 12397 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12398 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12399 if (SubExpr.isInvalid()) 12400 return ExprError(); 12401 12402 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12403 return E; 12404 } 12405 12406 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12407 SubExpr.get(), E->getEndLoc()); 12408 } 12409 12410 template<typename Derived> 12411 ExprResult 12412 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12413 ExprResult SubExpr; 12414 { 12415 EnterExpressionEvaluationContext Unevaluated( 12416 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12417 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12418 if (SubExpr.isInvalid()) 12419 return ExprError(); 12420 12421 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12422 return E; 12423 } 12424 12425 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12426 SubExpr.get(), E->getEndLoc()); 12427 } 12428 12429 template <typename Derived> 12430 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12431 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12432 TypeSourceInfo **RecoveryTSI) { 12433 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12434 DRE, AddrTaken, RecoveryTSI); 12435 12436 // Propagate both errors and recovered types, which return ExprEmpty. 12437 if (!NewDRE.isUsable()) 12438 return NewDRE; 12439 12440 // We got an expr, wrap it up in parens. 12441 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12442 return PE; 12443 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12444 PE->getRParen()); 12445 } 12446 12447 template <typename Derived> 12448 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12449 DependentScopeDeclRefExpr *E) { 12450 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12451 nullptr); 12452 } 12453 12454 template<typename Derived> 12455 ExprResult 12456 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12457 DependentScopeDeclRefExpr *E, 12458 bool IsAddressOfOperand, 12459 TypeSourceInfo **RecoveryTSI) { 12460 assert(E->getQualifierLoc()); 12461 NestedNameSpecifierLoc QualifierLoc 12462 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12463 if (!QualifierLoc) 12464 return ExprError(); 12465 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12466 12467 // TODO: If this is a conversion-function-id, verify that the 12468 // destination type name (if present) resolves the same way after 12469 // instantiation as it did in the local scope. 12470 12471 DeclarationNameInfo NameInfo 12472 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12473 if (!NameInfo.getName()) 12474 return ExprError(); 12475 12476 if (!E->hasExplicitTemplateArgs()) { 12477 if (!getDerived().AlwaysRebuild() && 12478 QualifierLoc == E->getQualifierLoc() && 12479 // Note: it is sufficient to compare the Name component of NameInfo: 12480 // if name has not changed, DNLoc has not changed either. 12481 NameInfo.getName() == E->getDeclName()) 12482 return E; 12483 12484 return getDerived().RebuildDependentScopeDeclRefExpr( 12485 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12486 IsAddressOfOperand, RecoveryTSI); 12487 } 12488 12489 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12490 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12491 E->getNumTemplateArgs(), 12492 TransArgs)) 12493 return ExprError(); 12494 12495 return getDerived().RebuildDependentScopeDeclRefExpr( 12496 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12497 RecoveryTSI); 12498 } 12499 12500 template<typename Derived> 12501 ExprResult 12502 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12503 // CXXConstructExprs other than for list-initialization and 12504 // CXXTemporaryObjectExpr are always implicit, so when we have 12505 // a 1-argument construction we just transform that argument. 12506 if (getDerived().AllowSkippingCXXConstructExpr() && 12507 ((E->getNumArgs() == 1 || 12508 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12509 (!getDerived().DropCallArgument(E->getArg(0))) && 12510 !E->isListInitialization())) 12511 return getDerived().TransformInitializer(E->getArg(0), 12512 /*DirectInit*/ false); 12513 12514 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12515 12516 QualType T = getDerived().TransformType(E->getType()); 12517 if (T.isNull()) 12518 return ExprError(); 12519 12520 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12521 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12522 if (!Constructor) 12523 return ExprError(); 12524 12525 bool ArgumentChanged = false; 12526 SmallVector<Expr*, 8> Args; 12527 { 12528 EnterExpressionEvaluationContext Context( 12529 getSema(), EnterExpressionEvaluationContext::InitList, 12530 E->isListInitialization()); 12531 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12532 &ArgumentChanged)) 12533 return ExprError(); 12534 } 12535 12536 if (!getDerived().AlwaysRebuild() && 12537 T == E->getType() && 12538 Constructor == E->getConstructor() && 12539 !ArgumentChanged) { 12540 // Mark the constructor as referenced. 12541 // FIXME: Instantiation-specific 12542 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12543 return E; 12544 } 12545 12546 return getDerived().RebuildCXXConstructExpr( 12547 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12548 E->hadMultipleCandidates(), E->isListInitialization(), 12549 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12550 E->getConstructionKind(), E->getParenOrBraceRange()); 12551 } 12552 12553 template<typename Derived> 12554 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12555 CXXInheritedCtorInitExpr *E) { 12556 QualType T = getDerived().TransformType(E->getType()); 12557 if (T.isNull()) 12558 return ExprError(); 12559 12560 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12561 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12562 if (!Constructor) 12563 return ExprError(); 12564 12565 if (!getDerived().AlwaysRebuild() && 12566 T == E->getType() && 12567 Constructor == E->getConstructor()) { 12568 // Mark the constructor as referenced. 12569 // FIXME: Instantiation-specific 12570 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12571 return E; 12572 } 12573 12574 return getDerived().RebuildCXXInheritedCtorInitExpr( 12575 T, E->getLocation(), Constructor, 12576 E->constructsVBase(), E->inheritedFromVBase()); 12577 } 12578 12579 /// Transform a C++ temporary-binding expression. 12580 /// 12581 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12582 /// transform the subexpression and return that. 12583 template<typename Derived> 12584 ExprResult 12585 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12586 return getDerived().TransformExpr(E->getSubExpr()); 12587 } 12588 12589 /// Transform a C++ expression that contains cleanups that should 12590 /// be run after the expression is evaluated. 12591 /// 12592 /// Since ExprWithCleanups nodes are implicitly generated, we 12593 /// just transform the subexpression and return that. 12594 template<typename Derived> 12595 ExprResult 12596 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12597 return getDerived().TransformExpr(E->getSubExpr()); 12598 } 12599 12600 template<typename Derived> 12601 ExprResult 12602 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12603 CXXTemporaryObjectExpr *E) { 12604 TypeSourceInfo *T = 12605 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12606 if (!T) 12607 return ExprError(); 12608 12609 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12610 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12611 if (!Constructor) 12612 return ExprError(); 12613 12614 bool ArgumentChanged = false; 12615 SmallVector<Expr*, 8> Args; 12616 Args.reserve(E->getNumArgs()); 12617 { 12618 EnterExpressionEvaluationContext Context( 12619 getSema(), EnterExpressionEvaluationContext::InitList, 12620 E->isListInitialization()); 12621 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12622 &ArgumentChanged)) 12623 return ExprError(); 12624 } 12625 12626 if (!getDerived().AlwaysRebuild() && 12627 T == E->getTypeSourceInfo() && 12628 Constructor == E->getConstructor() && 12629 !ArgumentChanged) { 12630 // FIXME: Instantiation-specific 12631 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12632 return SemaRef.MaybeBindToTemporary(E); 12633 } 12634 12635 // FIXME: We should just pass E->isListInitialization(), but we're not 12636 // prepared to handle list-initialization without a child InitListExpr. 12637 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12638 return getDerived().RebuildCXXTemporaryObjectExpr( 12639 T, LParenLoc, Args, E->getEndLoc(), 12640 /*ListInitialization=*/LParenLoc.isInvalid()); 12641 } 12642 12643 template<typename Derived> 12644 ExprResult 12645 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12646 // Transform any init-capture expressions before entering the scope of the 12647 // lambda body, because they are not semantically within that scope. 12648 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12649 struct TransformedInitCapture { 12650 // The location of the ... if the result is retaining a pack expansion. 12651 SourceLocation EllipsisLoc; 12652 // Zero or more expansions of the init-capture. 12653 SmallVector<InitCaptureInfoTy, 4> Expansions; 12654 }; 12655 SmallVector<TransformedInitCapture, 4> InitCaptures; 12656 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12657 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12658 CEnd = E->capture_end(); 12659 C != CEnd; ++C) { 12660 if (!E->isInitCapture(C)) 12661 continue; 12662 12663 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12664 VarDecl *OldVD = C->getCapturedVar(); 12665 12666 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12667 Optional<unsigned> NumExpansions) { 12668 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12669 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12670 12671 if (NewExprInitResult.isInvalid()) { 12672 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12673 return; 12674 } 12675 Expr *NewExprInit = NewExprInitResult.get(); 12676 12677 QualType NewInitCaptureType = 12678 getSema().buildLambdaInitCaptureInitialization( 12679 C->getLocation(), OldVD->getType()->isReferenceType(), 12680 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12681 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12682 NewExprInit); 12683 Result.Expansions.push_back( 12684 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12685 }; 12686 12687 // If this is an init-capture pack, consider expanding the pack now. 12688 if (OldVD->isParameterPack()) { 12689 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12690 ->getTypeLoc() 12691 .castAs<PackExpansionTypeLoc>(); 12692 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12693 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12694 12695 // Determine whether the set of unexpanded parameter packs can and should 12696 // be expanded. 12697 bool Expand = true; 12698 bool RetainExpansion = false; 12699 Optional<unsigned> OrigNumExpansions = 12700 ExpansionTL.getTypePtr()->getNumExpansions(); 12701 Optional<unsigned> NumExpansions = OrigNumExpansions; 12702 if (getDerived().TryExpandParameterPacks( 12703 ExpansionTL.getEllipsisLoc(), 12704 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12705 RetainExpansion, NumExpansions)) 12706 return ExprError(); 12707 if (Expand) { 12708 for (unsigned I = 0; I != *NumExpansions; ++I) { 12709 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12710 SubstInitCapture(SourceLocation(), None); 12711 } 12712 } 12713 if (!Expand || RetainExpansion) { 12714 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12715 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12716 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12717 } 12718 } else { 12719 SubstInitCapture(SourceLocation(), None); 12720 } 12721 } 12722 12723 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12724 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12725 12726 // Transform the template parameters, and add them to the current 12727 // instantiation scope. The null case is handled correctly. 12728 auto TPL = getDerived().TransformTemplateParameterList( 12729 E->getTemplateParameterList()); 12730 LSI->GLTemplateParameterList = TPL; 12731 12732 // Transform the type of the original lambda's call operator. 12733 // The transformation MUST be done in the CurrentInstantiationScope since 12734 // it introduces a mapping of the original to the newly created 12735 // transformed parameters. 12736 TypeSourceInfo *NewCallOpTSI = nullptr; 12737 { 12738 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12739 FunctionProtoTypeLoc OldCallOpFPTL = 12740 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12741 12742 TypeLocBuilder NewCallOpTLBuilder; 12743 SmallVector<QualType, 4> ExceptionStorage; 12744 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12745 QualType NewCallOpType = TransformFunctionProtoType( 12746 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12747 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12748 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12749 ExceptionStorage, Changed); 12750 }); 12751 if (NewCallOpType.isNull()) 12752 return ExprError(); 12753 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12754 NewCallOpType); 12755 } 12756 12757 // Transform the trailing requires clause 12758 ExprResult NewTrailingRequiresClause; 12759 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12760 // FIXME: Concepts: Substitution into requires clause should only happen 12761 // when checking satisfaction. 12762 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12763 12764 // Create the local class that will describe the lambda. 12765 // FIXME: KnownDependent below is wrong when substituting inside a templated 12766 // context that isn't a DeclContext (such as a variable template). 12767 CXXRecordDecl *OldClass = E->getLambdaClass(); 12768 CXXRecordDecl *Class 12769 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12770 NewCallOpTSI, 12771 /*KnownDependent=*/false, 12772 E->getCaptureDefault()); 12773 getDerived().transformedLocalDecl(OldClass, {Class}); 12774 12775 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12776 if (getDerived().ReplacingOriginal()) 12777 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12778 OldClass->getLambdaManglingNumber(), 12779 OldClass->getDeviceLambdaManglingNumber(), 12780 OldClass->getLambdaContextDecl()); 12781 12782 // Build the call operator. 12783 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12784 Class, E->getIntroducerRange(), NewCallOpTSI, 12785 E->getCallOperator()->getEndLoc(), 12786 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12787 E->getCallOperator()->getConstexprKind(), 12788 NewTrailingRequiresClause.get()); 12789 12790 LSI->CallOperator = NewCallOperator; 12791 12792 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12793 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12794 12795 // Number the lambda for linkage purposes if necessary. 12796 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12797 12798 // Introduce the context of the call operator. 12799 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12800 /*NewThisContext*/false); 12801 12802 // Enter the scope of the lambda. 12803 getSema().buildLambdaScope(LSI, NewCallOperator, 12804 E->getIntroducerRange(), 12805 E->getCaptureDefault(), 12806 E->getCaptureDefaultLoc(), 12807 E->hasExplicitParameters(), 12808 E->hasExplicitResultType(), 12809 E->isMutable()); 12810 12811 bool Invalid = false; 12812 12813 // Transform captures. 12814 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12815 CEnd = E->capture_end(); 12816 C != CEnd; ++C) { 12817 // When we hit the first implicit capture, tell Sema that we've finished 12818 // the list of explicit captures. 12819 if (C->isImplicit()) 12820 break; 12821 12822 // Capturing 'this' is trivial. 12823 if (C->capturesThis()) { 12824 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12825 /*BuildAndDiagnose*/ true, nullptr, 12826 C->getCaptureKind() == LCK_StarThis); 12827 continue; 12828 } 12829 // Captured expression will be recaptured during captured variables 12830 // rebuilding. 12831 if (C->capturesVLAType()) 12832 continue; 12833 12834 // Rebuild init-captures, including the implied field declaration. 12835 if (E->isInitCapture(C)) { 12836 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12837 12838 VarDecl *OldVD = C->getCapturedVar(); 12839 llvm::SmallVector<Decl*, 4> NewVDs; 12840 12841 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12842 ExprResult Init = Info.first; 12843 QualType InitQualType = Info.second; 12844 if (Init.isInvalid() || InitQualType.isNull()) { 12845 Invalid = true; 12846 break; 12847 } 12848 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12849 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12850 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12851 if (!NewVD) { 12852 Invalid = true; 12853 break; 12854 } 12855 NewVDs.push_back(NewVD); 12856 getSema().addInitCapture(LSI, NewVD); 12857 } 12858 12859 if (Invalid) 12860 break; 12861 12862 getDerived().transformedLocalDecl(OldVD, NewVDs); 12863 continue; 12864 } 12865 12866 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12867 12868 // Determine the capture kind for Sema. 12869 Sema::TryCaptureKind Kind 12870 = C->isImplicit()? Sema::TryCapture_Implicit 12871 : C->getCaptureKind() == LCK_ByCopy 12872 ? Sema::TryCapture_ExplicitByVal 12873 : Sema::TryCapture_ExplicitByRef; 12874 SourceLocation EllipsisLoc; 12875 if (C->isPackExpansion()) { 12876 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12877 bool ShouldExpand = false; 12878 bool RetainExpansion = false; 12879 Optional<unsigned> NumExpansions; 12880 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12881 C->getLocation(), 12882 Unexpanded, 12883 ShouldExpand, RetainExpansion, 12884 NumExpansions)) { 12885 Invalid = true; 12886 continue; 12887 } 12888 12889 if (ShouldExpand) { 12890 // The transform has determined that we should perform an expansion; 12891 // transform and capture each of the arguments. 12892 // expansion of the pattern. Do so. 12893 VarDecl *Pack = C->getCapturedVar(); 12894 for (unsigned I = 0; I != *NumExpansions; ++I) { 12895 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12896 VarDecl *CapturedVar 12897 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12898 Pack)); 12899 if (!CapturedVar) { 12900 Invalid = true; 12901 continue; 12902 } 12903 12904 // Capture the transformed variable. 12905 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12906 } 12907 12908 // FIXME: Retain a pack expansion if RetainExpansion is true. 12909 12910 continue; 12911 } 12912 12913 EllipsisLoc = C->getEllipsisLoc(); 12914 } 12915 12916 // Transform the captured variable. 12917 VarDecl *CapturedVar 12918 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12919 C->getCapturedVar())); 12920 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12921 Invalid = true; 12922 continue; 12923 } 12924 12925 // Capture the transformed variable. 12926 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12927 EllipsisLoc); 12928 } 12929 getSema().finishLambdaExplicitCaptures(LSI); 12930 12931 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12932 // evaluation context even if we're not transforming the function body. 12933 getSema().PushExpressionEvaluationContext( 12934 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12935 12936 // Instantiate the body of the lambda expression. 12937 StmtResult Body = 12938 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12939 12940 // ActOnLambda* will pop the function scope for us. 12941 FuncScopeCleanup.disable(); 12942 12943 if (Body.isInvalid()) { 12944 SavedContext.pop(); 12945 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12946 /*IsInstantiation=*/true); 12947 return ExprError(); 12948 } 12949 12950 // Copy the LSI before ActOnFinishFunctionBody removes it. 12951 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12952 // the call operator. 12953 auto LSICopy = *LSI; 12954 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12955 /*IsInstantiation*/ true); 12956 SavedContext.pop(); 12957 12958 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12959 &LSICopy); 12960 } 12961 12962 template<typename Derived> 12963 StmtResult 12964 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12965 return TransformStmt(S); 12966 } 12967 12968 template<typename Derived> 12969 StmtResult 12970 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12971 // Transform captures. 12972 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12973 CEnd = E->capture_end(); 12974 C != CEnd; ++C) { 12975 // When we hit the first implicit capture, tell Sema that we've finished 12976 // the list of explicit captures. 12977 if (!C->isImplicit()) 12978 continue; 12979 12980 // Capturing 'this' is trivial. 12981 if (C->capturesThis()) { 12982 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12983 /*BuildAndDiagnose*/ true, nullptr, 12984 C->getCaptureKind() == LCK_StarThis); 12985 continue; 12986 } 12987 // Captured expression will be recaptured during captured variables 12988 // rebuilding. 12989 if (C->capturesVLAType()) 12990 continue; 12991 12992 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12993 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12994 12995 // Transform the captured variable. 12996 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12997 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12998 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12999 return StmtError(); 13000 13001 // Capture the transformed variable. 13002 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13003 } 13004 13005 return S; 13006 } 13007 13008 template<typename Derived> 13009 ExprResult 13010 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13011 CXXUnresolvedConstructExpr *E) { 13012 TypeSourceInfo *T = 13013 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13014 if (!T) 13015 return ExprError(); 13016 13017 bool ArgumentChanged = false; 13018 SmallVector<Expr*, 8> Args; 13019 Args.reserve(E->getNumArgs()); 13020 { 13021 EnterExpressionEvaluationContext Context( 13022 getSema(), EnterExpressionEvaluationContext::InitList, 13023 E->isListInitialization()); 13024 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13025 &ArgumentChanged)) 13026 return ExprError(); 13027 } 13028 13029 if (!getDerived().AlwaysRebuild() && 13030 T == E->getTypeSourceInfo() && 13031 !ArgumentChanged) 13032 return E; 13033 13034 // FIXME: we're faking the locations of the commas 13035 return getDerived().RebuildCXXUnresolvedConstructExpr( 13036 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13037 } 13038 13039 template<typename Derived> 13040 ExprResult 13041 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13042 CXXDependentScopeMemberExpr *E) { 13043 // Transform the base of the expression. 13044 ExprResult Base((Expr*) nullptr); 13045 Expr *OldBase; 13046 QualType BaseType; 13047 QualType ObjectType; 13048 if (!E->isImplicitAccess()) { 13049 OldBase = E->getBase(); 13050 Base = getDerived().TransformExpr(OldBase); 13051 if (Base.isInvalid()) 13052 return ExprError(); 13053 13054 // Start the member reference and compute the object's type. 13055 ParsedType ObjectTy; 13056 bool MayBePseudoDestructor = false; 13057 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13058 E->getOperatorLoc(), 13059 E->isArrow()? tok::arrow : tok::period, 13060 ObjectTy, 13061 MayBePseudoDestructor); 13062 if (Base.isInvalid()) 13063 return ExprError(); 13064 13065 ObjectType = ObjectTy.get(); 13066 BaseType = ((Expr*) Base.get())->getType(); 13067 } else { 13068 OldBase = nullptr; 13069 BaseType = getDerived().TransformType(E->getBaseType()); 13070 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13071 } 13072 13073 // Transform the first part of the nested-name-specifier that qualifies 13074 // the member name. 13075 NamedDecl *FirstQualifierInScope 13076 = getDerived().TransformFirstQualifierInScope( 13077 E->getFirstQualifierFoundInScope(), 13078 E->getQualifierLoc().getBeginLoc()); 13079 13080 NestedNameSpecifierLoc QualifierLoc; 13081 if (E->getQualifier()) { 13082 QualifierLoc 13083 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13084 ObjectType, 13085 FirstQualifierInScope); 13086 if (!QualifierLoc) 13087 return ExprError(); 13088 } 13089 13090 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13091 13092 // TODO: If this is a conversion-function-id, verify that the 13093 // destination type name (if present) resolves the same way after 13094 // instantiation as it did in the local scope. 13095 13096 DeclarationNameInfo NameInfo 13097 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13098 if (!NameInfo.getName()) 13099 return ExprError(); 13100 13101 if (!E->hasExplicitTemplateArgs()) { 13102 // This is a reference to a member without an explicitly-specified 13103 // template argument list. Optimize for this common case. 13104 if (!getDerived().AlwaysRebuild() && 13105 Base.get() == OldBase && 13106 BaseType == E->getBaseType() && 13107 QualifierLoc == E->getQualifierLoc() && 13108 NameInfo.getName() == E->getMember() && 13109 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13110 return E; 13111 13112 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13113 BaseType, 13114 E->isArrow(), 13115 E->getOperatorLoc(), 13116 QualifierLoc, 13117 TemplateKWLoc, 13118 FirstQualifierInScope, 13119 NameInfo, 13120 /*TemplateArgs*/nullptr); 13121 } 13122 13123 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13124 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13125 E->getNumTemplateArgs(), 13126 TransArgs)) 13127 return ExprError(); 13128 13129 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13130 BaseType, 13131 E->isArrow(), 13132 E->getOperatorLoc(), 13133 QualifierLoc, 13134 TemplateKWLoc, 13135 FirstQualifierInScope, 13136 NameInfo, 13137 &TransArgs); 13138 } 13139 13140 template<typename Derived> 13141 ExprResult 13142 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 13143 // Transform the base of the expression. 13144 ExprResult Base((Expr*) nullptr); 13145 QualType BaseType; 13146 if (!Old->isImplicitAccess()) { 13147 Base = getDerived().TransformExpr(Old->getBase()); 13148 if (Base.isInvalid()) 13149 return ExprError(); 13150 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 13151 Old->isArrow()); 13152 if (Base.isInvalid()) 13153 return ExprError(); 13154 BaseType = Base.get()->getType(); 13155 } else { 13156 BaseType = getDerived().TransformType(Old->getBaseType()); 13157 } 13158 13159 NestedNameSpecifierLoc QualifierLoc; 13160 if (Old->getQualifierLoc()) { 13161 QualifierLoc 13162 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13163 if (!QualifierLoc) 13164 return ExprError(); 13165 } 13166 13167 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13168 13169 LookupResult R(SemaRef, Old->getMemberNameInfo(), 13170 Sema::LookupOrdinaryName); 13171 13172 // Transform the declaration set. 13173 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 13174 return ExprError(); 13175 13176 // Determine the naming class. 13177 if (Old->getNamingClass()) { 13178 CXXRecordDecl *NamingClass 13179 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 13180 Old->getMemberLoc(), 13181 Old->getNamingClass())); 13182 if (!NamingClass) 13183 return ExprError(); 13184 13185 R.setNamingClass(NamingClass); 13186 } 13187 13188 TemplateArgumentListInfo TransArgs; 13189 if (Old->hasExplicitTemplateArgs()) { 13190 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13191 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13192 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 13193 Old->getNumTemplateArgs(), 13194 TransArgs)) 13195 return ExprError(); 13196 } 13197 13198 // FIXME: to do this check properly, we will need to preserve the 13199 // first-qualifier-in-scope here, just in case we had a dependent 13200 // base (and therefore couldn't do the check) and a 13201 // nested-name-qualifier (and therefore could do the lookup). 13202 NamedDecl *FirstQualifierInScope = nullptr; 13203 13204 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 13205 BaseType, 13206 Old->getOperatorLoc(), 13207 Old->isArrow(), 13208 QualifierLoc, 13209 TemplateKWLoc, 13210 FirstQualifierInScope, 13211 R, 13212 (Old->hasExplicitTemplateArgs() 13213 ? &TransArgs : nullptr)); 13214 } 13215 13216 template<typename Derived> 13217 ExprResult 13218 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13219 EnterExpressionEvaluationContext Unevaluated( 13220 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13221 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13222 if (SubExpr.isInvalid()) 13223 return ExprError(); 13224 13225 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13226 return E; 13227 13228 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13229 } 13230 13231 template<typename Derived> 13232 ExprResult 13233 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13234 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13235 if (Pattern.isInvalid()) 13236 return ExprError(); 13237 13238 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13239 return E; 13240 13241 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13242 E->getNumExpansions()); 13243 } 13244 13245 template<typename Derived> 13246 ExprResult 13247 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13248 // If E is not value-dependent, then nothing will change when we transform it. 13249 // Note: This is an instantiation-centric view. 13250 if (!E->isValueDependent()) 13251 return E; 13252 13253 EnterExpressionEvaluationContext Unevaluated( 13254 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13255 13256 ArrayRef<TemplateArgument> PackArgs; 13257 TemplateArgument ArgStorage; 13258 13259 // Find the argument list to transform. 13260 if (E->isPartiallySubstituted()) { 13261 PackArgs = E->getPartialArguments(); 13262 } else if (E->isValueDependent()) { 13263 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13264 bool ShouldExpand = false; 13265 bool RetainExpansion = false; 13266 Optional<unsigned> NumExpansions; 13267 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13268 Unexpanded, 13269 ShouldExpand, RetainExpansion, 13270 NumExpansions)) 13271 return ExprError(); 13272 13273 // If we need to expand the pack, build a template argument from it and 13274 // expand that. 13275 if (ShouldExpand) { 13276 auto *Pack = E->getPack(); 13277 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13278 ArgStorage = getSema().Context.getPackExpansionType( 13279 getSema().Context.getTypeDeclType(TTPD), None); 13280 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13281 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13282 } else { 13283 auto *VD = cast<ValueDecl>(Pack); 13284 ExprResult DRE = getSema().BuildDeclRefExpr( 13285 VD, VD->getType().getNonLValueExprType(getSema().Context), 13286 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 13287 E->getPackLoc()); 13288 if (DRE.isInvalid()) 13289 return ExprError(); 13290 ArgStorage = new (getSema().Context) PackExpansionExpr( 13291 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13292 } 13293 PackArgs = ArgStorage; 13294 } 13295 } 13296 13297 // If we're not expanding the pack, just transform the decl. 13298 if (!PackArgs.size()) { 13299 auto *Pack = cast_or_null<NamedDecl>( 13300 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13301 if (!Pack) 13302 return ExprError(); 13303 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13304 E->getPackLoc(), 13305 E->getRParenLoc(), None, None); 13306 } 13307 13308 // Try to compute the result without performing a partial substitution. 13309 Optional<unsigned> Result = 0; 13310 for (const TemplateArgument &Arg : PackArgs) { 13311 if (!Arg.isPackExpansion()) { 13312 Result = *Result + 1; 13313 continue; 13314 } 13315 13316 TemplateArgumentLoc ArgLoc; 13317 InventTemplateArgumentLoc(Arg, ArgLoc); 13318 13319 // Find the pattern of the pack expansion. 13320 SourceLocation Ellipsis; 13321 Optional<unsigned> OrigNumExpansions; 13322 TemplateArgumentLoc Pattern = 13323 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13324 OrigNumExpansions); 13325 13326 // Substitute under the pack expansion. Do not expand the pack (yet). 13327 TemplateArgumentLoc OutPattern; 13328 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13329 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13330 /*Uneval*/ true)) 13331 return true; 13332 13333 // See if we can determine the number of arguments from the result. 13334 Optional<unsigned> NumExpansions = 13335 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13336 if (!NumExpansions) { 13337 // No: we must be in an alias template expansion, and we're going to need 13338 // to actually expand the packs. 13339 Result = None; 13340 break; 13341 } 13342 13343 Result = *Result + *NumExpansions; 13344 } 13345 13346 // Common case: we could determine the number of expansions without 13347 // substituting. 13348 if (Result) 13349 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13350 E->getPackLoc(), 13351 E->getRParenLoc(), *Result, None); 13352 13353 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13354 E->getPackLoc()); 13355 { 13356 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13357 typedef TemplateArgumentLocInventIterator< 13358 Derived, const TemplateArgument*> PackLocIterator; 13359 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13360 PackLocIterator(*this, PackArgs.end()), 13361 TransformedPackArgs, /*Uneval*/true)) 13362 return ExprError(); 13363 } 13364 13365 // Check whether we managed to fully-expand the pack. 13366 // FIXME: Is it possible for us to do so and not hit the early exit path? 13367 SmallVector<TemplateArgument, 8> Args; 13368 bool PartialSubstitution = false; 13369 for (auto &Loc : TransformedPackArgs.arguments()) { 13370 Args.push_back(Loc.getArgument()); 13371 if (Loc.getArgument().isPackExpansion()) 13372 PartialSubstitution = true; 13373 } 13374 13375 if (PartialSubstitution) 13376 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13377 E->getPackLoc(), 13378 E->getRParenLoc(), None, Args); 13379 13380 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13381 E->getPackLoc(), E->getRParenLoc(), 13382 Args.size(), None); 13383 } 13384 13385 template<typename Derived> 13386 ExprResult 13387 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13388 SubstNonTypeTemplateParmPackExpr *E) { 13389 // Default behavior is to do nothing with this transformation. 13390 return E; 13391 } 13392 13393 template<typename Derived> 13394 ExprResult 13395 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13396 SubstNonTypeTemplateParmExpr *E) { 13397 // Default behavior is to do nothing with this transformation. 13398 return E; 13399 } 13400 13401 template<typename Derived> 13402 ExprResult 13403 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13404 // Default behavior is to do nothing with this transformation. 13405 return E; 13406 } 13407 13408 template<typename Derived> 13409 ExprResult 13410 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13411 MaterializeTemporaryExpr *E) { 13412 return getDerived().TransformExpr(E->getSubExpr()); 13413 } 13414 13415 template<typename Derived> 13416 ExprResult 13417 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13418 UnresolvedLookupExpr *Callee = nullptr; 13419 if (Expr *OldCallee = E->getCallee()) { 13420 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13421 if (CalleeResult.isInvalid()) 13422 return ExprError(); 13423 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13424 } 13425 13426 Expr *Pattern = E->getPattern(); 13427 13428 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13429 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13430 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13431 13432 // Determine whether the set of unexpanded parameter packs can and should 13433 // be expanded. 13434 bool Expand = true; 13435 bool RetainExpansion = false; 13436 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13437 NumExpansions = OrigNumExpansions; 13438 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13439 Pattern->getSourceRange(), 13440 Unexpanded, 13441 Expand, RetainExpansion, 13442 NumExpansions)) 13443 return true; 13444 13445 if (!Expand) { 13446 // Do not expand any packs here, just transform and rebuild a fold 13447 // expression. 13448 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13449 13450 ExprResult LHS = 13451 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13452 if (LHS.isInvalid()) 13453 return true; 13454 13455 ExprResult RHS = 13456 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13457 if (RHS.isInvalid()) 13458 return true; 13459 13460 if (!getDerived().AlwaysRebuild() && 13461 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13462 return E; 13463 13464 return getDerived().RebuildCXXFoldExpr( 13465 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13466 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13467 } 13468 13469 // Formally a fold expression expands to nested parenthesized expressions. 13470 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13471 // them. 13472 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13473 SemaRef.Diag(E->getEllipsisLoc(), 13474 clang::diag::err_fold_expression_limit_exceeded) 13475 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13476 << E->getSourceRange(); 13477 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13478 return ExprError(); 13479 } 13480 13481 // The transform has determined that we should perform an elementwise 13482 // expansion of the pattern. Do so. 13483 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13484 if (Result.isInvalid()) 13485 return true; 13486 bool LeftFold = E->isLeftFold(); 13487 13488 // If we're retaining an expansion for a right fold, it is the innermost 13489 // component and takes the init (if any). 13490 if (!LeftFold && RetainExpansion) { 13491 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13492 13493 ExprResult Out = getDerived().TransformExpr(Pattern); 13494 if (Out.isInvalid()) 13495 return true; 13496 13497 Result = getDerived().RebuildCXXFoldExpr( 13498 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13499 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13500 if (Result.isInvalid()) 13501 return true; 13502 } 13503 13504 for (unsigned I = 0; I != *NumExpansions; ++I) { 13505 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13506 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13507 ExprResult Out = getDerived().TransformExpr(Pattern); 13508 if (Out.isInvalid()) 13509 return true; 13510 13511 if (Out.get()->containsUnexpandedParameterPack()) { 13512 // We still have a pack; retain a pack expansion for this slice. 13513 Result = getDerived().RebuildCXXFoldExpr( 13514 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13515 E->getOperator(), E->getEllipsisLoc(), 13516 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13517 OrigNumExpansions); 13518 } else if (Result.isUsable()) { 13519 // We've got down to a single element; build a binary operator. 13520 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13521 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13522 if (Callee) 13523 Result = getDerived().RebuildCXXOperatorCallExpr( 13524 BinaryOperator::getOverloadedOperator(E->getOperator()), 13525 E->getEllipsisLoc(), Callee, LHS, RHS); 13526 else 13527 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13528 E->getOperator(), LHS, RHS); 13529 } else 13530 Result = Out; 13531 13532 if (Result.isInvalid()) 13533 return true; 13534 } 13535 13536 // If we're retaining an expansion for a left fold, it is the outermost 13537 // component and takes the complete expansion so far as its init (if any). 13538 if (LeftFold && RetainExpansion) { 13539 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13540 13541 ExprResult Out = getDerived().TransformExpr(Pattern); 13542 if (Out.isInvalid()) 13543 return true; 13544 13545 Result = getDerived().RebuildCXXFoldExpr( 13546 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13547 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13548 if (Result.isInvalid()) 13549 return true; 13550 } 13551 13552 // If we had no init and an empty pack, and we're not retaining an expansion, 13553 // then produce a fallback value or error. 13554 if (Result.isUnset()) 13555 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13556 E->getOperator()); 13557 13558 return Result; 13559 } 13560 13561 template<typename Derived> 13562 ExprResult 13563 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13564 CXXStdInitializerListExpr *E) { 13565 return getDerived().TransformExpr(E->getSubExpr()); 13566 } 13567 13568 template<typename Derived> 13569 ExprResult 13570 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13571 return SemaRef.MaybeBindToTemporary(E); 13572 } 13573 13574 template<typename Derived> 13575 ExprResult 13576 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13577 return E; 13578 } 13579 13580 template<typename Derived> 13581 ExprResult 13582 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13583 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13584 if (SubExpr.isInvalid()) 13585 return ExprError(); 13586 13587 if (!getDerived().AlwaysRebuild() && 13588 SubExpr.get() == E->getSubExpr()) 13589 return E; 13590 13591 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13592 } 13593 13594 template<typename Derived> 13595 ExprResult 13596 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13597 // Transform each of the elements. 13598 SmallVector<Expr *, 8> Elements; 13599 bool ArgChanged = false; 13600 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13601 /*IsCall=*/false, Elements, &ArgChanged)) 13602 return ExprError(); 13603 13604 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13605 return SemaRef.MaybeBindToTemporary(E); 13606 13607 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13608 Elements.data(), 13609 Elements.size()); 13610 } 13611 13612 template<typename Derived> 13613 ExprResult 13614 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13615 ObjCDictionaryLiteral *E) { 13616 // Transform each of the elements. 13617 SmallVector<ObjCDictionaryElement, 8> Elements; 13618 bool ArgChanged = false; 13619 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13620 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13621 13622 if (OrigElement.isPackExpansion()) { 13623 // This key/value element is a pack expansion. 13624 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13625 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13626 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13627 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13628 13629 // Determine whether the set of unexpanded parameter packs can 13630 // and should be expanded. 13631 bool Expand = true; 13632 bool RetainExpansion = false; 13633 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13634 Optional<unsigned> NumExpansions = OrigNumExpansions; 13635 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13636 OrigElement.Value->getEndLoc()); 13637 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13638 PatternRange, Unexpanded, Expand, 13639 RetainExpansion, NumExpansions)) 13640 return ExprError(); 13641 13642 if (!Expand) { 13643 // The transform has determined that we should perform a simple 13644 // transformation on the pack expansion, producing another pack 13645 // expansion. 13646 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13647 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13648 if (Key.isInvalid()) 13649 return ExprError(); 13650 13651 if (Key.get() != OrigElement.Key) 13652 ArgChanged = true; 13653 13654 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13655 if (Value.isInvalid()) 13656 return ExprError(); 13657 13658 if (Value.get() != OrigElement.Value) 13659 ArgChanged = true; 13660 13661 ObjCDictionaryElement Expansion = { 13662 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13663 }; 13664 Elements.push_back(Expansion); 13665 continue; 13666 } 13667 13668 // Record right away that the argument was changed. This needs 13669 // to happen even if the array expands to nothing. 13670 ArgChanged = true; 13671 13672 // The transform has determined that we should perform an elementwise 13673 // expansion of the pattern. Do so. 13674 for (unsigned I = 0; I != *NumExpansions; ++I) { 13675 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13676 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13677 if (Key.isInvalid()) 13678 return ExprError(); 13679 13680 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13681 if (Value.isInvalid()) 13682 return ExprError(); 13683 13684 ObjCDictionaryElement Element = { 13685 Key.get(), Value.get(), SourceLocation(), NumExpansions 13686 }; 13687 13688 // If any unexpanded parameter packs remain, we still have a 13689 // pack expansion. 13690 // FIXME: Can this really happen? 13691 if (Key.get()->containsUnexpandedParameterPack() || 13692 Value.get()->containsUnexpandedParameterPack()) 13693 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13694 13695 Elements.push_back(Element); 13696 } 13697 13698 // FIXME: Retain a pack expansion if RetainExpansion is true. 13699 13700 // We've finished with this pack expansion. 13701 continue; 13702 } 13703 13704 // Transform and check key. 13705 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13706 if (Key.isInvalid()) 13707 return ExprError(); 13708 13709 if (Key.get() != OrigElement.Key) 13710 ArgChanged = true; 13711 13712 // Transform and check value. 13713 ExprResult Value 13714 = getDerived().TransformExpr(OrigElement.Value); 13715 if (Value.isInvalid()) 13716 return ExprError(); 13717 13718 if (Value.get() != OrigElement.Value) 13719 ArgChanged = true; 13720 13721 ObjCDictionaryElement Element = { 13722 Key.get(), Value.get(), SourceLocation(), None 13723 }; 13724 Elements.push_back(Element); 13725 } 13726 13727 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13728 return SemaRef.MaybeBindToTemporary(E); 13729 13730 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13731 Elements); 13732 } 13733 13734 template<typename Derived> 13735 ExprResult 13736 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13737 TypeSourceInfo *EncodedTypeInfo 13738 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13739 if (!EncodedTypeInfo) 13740 return ExprError(); 13741 13742 if (!getDerived().AlwaysRebuild() && 13743 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13744 return E; 13745 13746 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13747 EncodedTypeInfo, 13748 E->getRParenLoc()); 13749 } 13750 13751 template<typename Derived> 13752 ExprResult TreeTransform<Derived>:: 13753 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13754 // This is a kind of implicit conversion, and it needs to get dropped 13755 // and recomputed for the same general reasons that ImplicitCastExprs 13756 // do, as well a more specific one: this expression is only valid when 13757 // it appears *immediately* as an argument expression. 13758 return getDerived().TransformExpr(E->getSubExpr()); 13759 } 13760 13761 template<typename Derived> 13762 ExprResult TreeTransform<Derived>:: 13763 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13764 TypeSourceInfo *TSInfo 13765 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13766 if (!TSInfo) 13767 return ExprError(); 13768 13769 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13770 if (Result.isInvalid()) 13771 return ExprError(); 13772 13773 if (!getDerived().AlwaysRebuild() && 13774 TSInfo == E->getTypeInfoAsWritten() && 13775 Result.get() == E->getSubExpr()) 13776 return E; 13777 13778 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13779 E->getBridgeKeywordLoc(), TSInfo, 13780 Result.get()); 13781 } 13782 13783 template <typename Derived> 13784 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13785 ObjCAvailabilityCheckExpr *E) { 13786 return E; 13787 } 13788 13789 template<typename Derived> 13790 ExprResult 13791 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13792 // Transform arguments. 13793 bool ArgChanged = false; 13794 SmallVector<Expr*, 8> Args; 13795 Args.reserve(E->getNumArgs()); 13796 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13797 &ArgChanged)) 13798 return ExprError(); 13799 13800 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13801 // Class message: transform the receiver type. 13802 TypeSourceInfo *ReceiverTypeInfo 13803 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13804 if (!ReceiverTypeInfo) 13805 return ExprError(); 13806 13807 // If nothing changed, just retain the existing message send. 13808 if (!getDerived().AlwaysRebuild() && 13809 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13810 return SemaRef.MaybeBindToTemporary(E); 13811 13812 // Build a new class message send. 13813 SmallVector<SourceLocation, 16> SelLocs; 13814 E->getSelectorLocs(SelLocs); 13815 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13816 E->getSelector(), 13817 SelLocs, 13818 E->getMethodDecl(), 13819 E->getLeftLoc(), 13820 Args, 13821 E->getRightLoc()); 13822 } 13823 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13824 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13825 if (!E->getMethodDecl()) 13826 return ExprError(); 13827 13828 // Build a new class message send to 'super'. 13829 SmallVector<SourceLocation, 16> SelLocs; 13830 E->getSelectorLocs(SelLocs); 13831 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13832 E->getSelector(), 13833 SelLocs, 13834 E->getReceiverType(), 13835 E->getMethodDecl(), 13836 E->getLeftLoc(), 13837 Args, 13838 E->getRightLoc()); 13839 } 13840 13841 // Instance message: transform the receiver 13842 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13843 "Only class and instance messages may be instantiated"); 13844 ExprResult Receiver 13845 = getDerived().TransformExpr(E->getInstanceReceiver()); 13846 if (Receiver.isInvalid()) 13847 return ExprError(); 13848 13849 // If nothing changed, just retain the existing message send. 13850 if (!getDerived().AlwaysRebuild() && 13851 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13852 return SemaRef.MaybeBindToTemporary(E); 13853 13854 // Build a new instance message send. 13855 SmallVector<SourceLocation, 16> SelLocs; 13856 E->getSelectorLocs(SelLocs); 13857 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13858 E->getSelector(), 13859 SelLocs, 13860 E->getMethodDecl(), 13861 E->getLeftLoc(), 13862 Args, 13863 E->getRightLoc()); 13864 } 13865 13866 template<typename Derived> 13867 ExprResult 13868 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13869 return E; 13870 } 13871 13872 template<typename Derived> 13873 ExprResult 13874 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13875 return E; 13876 } 13877 13878 template<typename Derived> 13879 ExprResult 13880 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13881 // Transform the base expression. 13882 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13883 if (Base.isInvalid()) 13884 return ExprError(); 13885 13886 // We don't need to transform the ivar; it will never change. 13887 13888 // If nothing changed, just retain the existing expression. 13889 if (!getDerived().AlwaysRebuild() && 13890 Base.get() == E->getBase()) 13891 return E; 13892 13893 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13894 E->getLocation(), 13895 E->isArrow(), E->isFreeIvar()); 13896 } 13897 13898 template<typename Derived> 13899 ExprResult 13900 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13901 // 'super' and types never change. Property never changes. Just 13902 // retain the existing expression. 13903 if (!E->isObjectReceiver()) 13904 return E; 13905 13906 // Transform the base expression. 13907 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13908 if (Base.isInvalid()) 13909 return ExprError(); 13910 13911 // We don't need to transform the property; it will never change. 13912 13913 // If nothing changed, just retain the existing expression. 13914 if (!getDerived().AlwaysRebuild() && 13915 Base.get() == E->getBase()) 13916 return E; 13917 13918 if (E->isExplicitProperty()) 13919 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13920 E->getExplicitProperty(), 13921 E->getLocation()); 13922 13923 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13924 SemaRef.Context.PseudoObjectTy, 13925 E->getImplicitPropertyGetter(), 13926 E->getImplicitPropertySetter(), 13927 E->getLocation()); 13928 } 13929 13930 template<typename Derived> 13931 ExprResult 13932 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13933 // Transform the base expression. 13934 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13935 if (Base.isInvalid()) 13936 return ExprError(); 13937 13938 // Transform the key expression. 13939 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13940 if (Key.isInvalid()) 13941 return ExprError(); 13942 13943 // If nothing changed, just retain the existing expression. 13944 if (!getDerived().AlwaysRebuild() && 13945 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13946 return E; 13947 13948 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13949 Base.get(), Key.get(), 13950 E->getAtIndexMethodDecl(), 13951 E->setAtIndexMethodDecl()); 13952 } 13953 13954 template<typename Derived> 13955 ExprResult 13956 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13957 // Transform the base expression. 13958 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13959 if (Base.isInvalid()) 13960 return ExprError(); 13961 13962 // If nothing changed, just retain the existing expression. 13963 if (!getDerived().AlwaysRebuild() && 13964 Base.get() == E->getBase()) 13965 return E; 13966 13967 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13968 E->getOpLoc(), 13969 E->isArrow()); 13970 } 13971 13972 template<typename Derived> 13973 ExprResult 13974 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13975 bool ArgumentChanged = false; 13976 SmallVector<Expr*, 8> SubExprs; 13977 SubExprs.reserve(E->getNumSubExprs()); 13978 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13979 SubExprs, &ArgumentChanged)) 13980 return ExprError(); 13981 13982 if (!getDerived().AlwaysRebuild() && 13983 !ArgumentChanged) 13984 return E; 13985 13986 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13987 SubExprs, 13988 E->getRParenLoc()); 13989 } 13990 13991 template<typename Derived> 13992 ExprResult 13993 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13994 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13995 if (SrcExpr.isInvalid()) 13996 return ExprError(); 13997 13998 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13999 if (!Type) 14000 return ExprError(); 14001 14002 if (!getDerived().AlwaysRebuild() && 14003 Type == E->getTypeSourceInfo() && 14004 SrcExpr.get() == E->getSrcExpr()) 14005 return E; 14006 14007 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14008 SrcExpr.get(), Type, 14009 E->getRParenLoc()); 14010 } 14011 14012 template<typename Derived> 14013 ExprResult 14014 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14015 BlockDecl *oldBlock = E->getBlockDecl(); 14016 14017 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14018 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14019 14020 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14021 blockScope->TheDecl->setBlockMissingReturnType( 14022 oldBlock->blockMissingReturnType()); 14023 14024 SmallVector<ParmVarDecl*, 4> params; 14025 SmallVector<QualType, 4> paramTypes; 14026 14027 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14028 14029 // Parameter substitution. 14030 Sema::ExtParameterInfoBuilder extParamInfos; 14031 if (getDerived().TransformFunctionTypeParams( 14032 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14033 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14034 extParamInfos)) { 14035 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14036 return ExprError(); 14037 } 14038 14039 QualType exprResultType = 14040 getDerived().TransformType(exprFunctionType->getReturnType()); 14041 14042 auto epi = exprFunctionType->getExtProtoInfo(); 14043 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14044 14045 QualType functionType = 14046 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14047 blockScope->FunctionType = functionType; 14048 14049 // Set the parameters on the block decl. 14050 if (!params.empty()) 14051 blockScope->TheDecl->setParams(params); 14052 14053 if (!oldBlock->blockMissingReturnType()) { 14054 blockScope->HasImplicitReturnType = false; 14055 blockScope->ReturnType = exprResultType; 14056 } 14057 14058 // Transform the body 14059 StmtResult body = getDerived().TransformStmt(E->getBody()); 14060 if (body.isInvalid()) { 14061 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14062 return ExprError(); 14063 } 14064 14065 #ifndef NDEBUG 14066 // In builds with assertions, make sure that we captured everything we 14067 // captured before. 14068 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14069 for (const auto &I : oldBlock->captures()) { 14070 VarDecl *oldCapture = I.getVariable(); 14071 14072 // Ignore parameter packs. 14073 if (oldCapture->isParameterPack()) 14074 continue; 14075 14076 VarDecl *newCapture = 14077 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14078 oldCapture)); 14079 assert(blockScope->CaptureMap.count(newCapture)); 14080 } 14081 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14082 } 14083 #endif 14084 14085 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14086 /*Scope=*/nullptr); 14087 } 14088 14089 template<typename Derived> 14090 ExprResult 14091 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14092 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14093 if (SrcExpr.isInvalid()) 14094 return ExprError(); 14095 14096 QualType Type = getDerived().TransformType(E->getType()); 14097 14098 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14099 E->getRParenLoc()); 14100 } 14101 14102 template<typename Derived> 14103 ExprResult 14104 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14105 bool ArgumentChanged = false; 14106 SmallVector<Expr*, 8> SubExprs; 14107 SubExprs.reserve(E->getNumSubExprs()); 14108 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14109 SubExprs, &ArgumentChanged)) 14110 return ExprError(); 14111 14112 if (!getDerived().AlwaysRebuild() && 14113 !ArgumentChanged) 14114 return E; 14115 14116 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14117 E->getOp(), E->getRParenLoc()); 14118 } 14119 14120 //===----------------------------------------------------------------------===// 14121 // Type reconstruction 14122 //===----------------------------------------------------------------------===// 14123 14124 template<typename Derived> 14125 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14126 SourceLocation Star) { 14127 return SemaRef.BuildPointerType(PointeeType, Star, 14128 getDerived().getBaseEntity()); 14129 } 14130 14131 template<typename Derived> 14132 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14133 SourceLocation Star) { 14134 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14135 getDerived().getBaseEntity()); 14136 } 14137 14138 template<typename Derived> 14139 QualType 14140 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14141 bool WrittenAsLValue, 14142 SourceLocation Sigil) { 14143 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14144 Sigil, getDerived().getBaseEntity()); 14145 } 14146 14147 template<typename Derived> 14148 QualType 14149 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14150 QualType ClassType, 14151 SourceLocation Sigil) { 14152 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14153 getDerived().getBaseEntity()); 14154 } 14155 14156 template<typename Derived> 14157 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14158 const ObjCTypeParamDecl *Decl, 14159 SourceLocation ProtocolLAngleLoc, 14160 ArrayRef<ObjCProtocolDecl *> Protocols, 14161 ArrayRef<SourceLocation> ProtocolLocs, 14162 SourceLocation ProtocolRAngleLoc) { 14163 return SemaRef.BuildObjCTypeParamType(Decl, 14164 ProtocolLAngleLoc, Protocols, 14165 ProtocolLocs, ProtocolRAngleLoc, 14166 /*FailOnError=*/true); 14167 } 14168 14169 template<typename Derived> 14170 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14171 QualType BaseType, 14172 SourceLocation Loc, 14173 SourceLocation TypeArgsLAngleLoc, 14174 ArrayRef<TypeSourceInfo *> TypeArgs, 14175 SourceLocation TypeArgsRAngleLoc, 14176 SourceLocation ProtocolLAngleLoc, 14177 ArrayRef<ObjCProtocolDecl *> Protocols, 14178 ArrayRef<SourceLocation> ProtocolLocs, 14179 SourceLocation ProtocolRAngleLoc) { 14180 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14181 TypeArgs, TypeArgsRAngleLoc, 14182 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14183 ProtocolRAngleLoc, 14184 /*FailOnError=*/true); 14185 } 14186 14187 template<typename Derived> 14188 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14189 QualType PointeeType, 14190 SourceLocation Star) { 14191 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14192 } 14193 14194 template<typename Derived> 14195 QualType 14196 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14197 ArrayType::ArraySizeModifier SizeMod, 14198 const llvm::APInt *Size, 14199 Expr *SizeExpr, 14200 unsigned IndexTypeQuals, 14201 SourceRange BracketsRange) { 14202 if (SizeExpr || !Size) 14203 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14204 IndexTypeQuals, BracketsRange, 14205 getDerived().getBaseEntity()); 14206 14207 QualType Types[] = { 14208 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14209 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14210 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14211 }; 14212 const unsigned NumTypes = llvm::array_lengthof(Types); 14213 QualType SizeType; 14214 for (unsigned I = 0; I != NumTypes; ++I) 14215 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14216 SizeType = Types[I]; 14217 break; 14218 } 14219 14220 // Note that we can return a VariableArrayType here in the case where 14221 // the element type was a dependent VariableArrayType. 14222 IntegerLiteral *ArraySize 14223 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14224 /*FIXME*/BracketsRange.getBegin()); 14225 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14226 IndexTypeQuals, BracketsRange, 14227 getDerived().getBaseEntity()); 14228 } 14229 14230 template<typename Derived> 14231 QualType 14232 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14233 ArrayType::ArraySizeModifier SizeMod, 14234 const llvm::APInt &Size, 14235 Expr *SizeExpr, 14236 unsigned IndexTypeQuals, 14237 SourceRange BracketsRange) { 14238 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14239 IndexTypeQuals, BracketsRange); 14240 } 14241 14242 template<typename Derived> 14243 QualType 14244 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14245 ArrayType::ArraySizeModifier SizeMod, 14246 unsigned IndexTypeQuals, 14247 SourceRange BracketsRange) { 14248 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14249 IndexTypeQuals, BracketsRange); 14250 } 14251 14252 template<typename Derived> 14253 QualType 14254 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14255 ArrayType::ArraySizeModifier SizeMod, 14256 Expr *SizeExpr, 14257 unsigned IndexTypeQuals, 14258 SourceRange BracketsRange) { 14259 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14260 SizeExpr, 14261 IndexTypeQuals, BracketsRange); 14262 } 14263 14264 template<typename Derived> 14265 QualType 14266 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14267 ArrayType::ArraySizeModifier SizeMod, 14268 Expr *SizeExpr, 14269 unsigned IndexTypeQuals, 14270 SourceRange BracketsRange) { 14271 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14272 SizeExpr, 14273 IndexTypeQuals, BracketsRange); 14274 } 14275 14276 template <typename Derived> 14277 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14278 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14279 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14280 AttributeLoc); 14281 } 14282 14283 template <typename Derived> 14284 QualType 14285 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14286 unsigned NumElements, 14287 VectorType::VectorKind VecKind) { 14288 // FIXME: semantic checking! 14289 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14290 } 14291 14292 template <typename Derived> 14293 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14294 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14295 VectorType::VectorKind VecKind) { 14296 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14297 } 14298 14299 template<typename Derived> 14300 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14301 unsigned NumElements, 14302 SourceLocation AttributeLoc) { 14303 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14304 NumElements, true); 14305 IntegerLiteral *VectorSize 14306 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14307 AttributeLoc); 14308 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14309 } 14310 14311 template<typename Derived> 14312 QualType 14313 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14314 Expr *SizeExpr, 14315 SourceLocation AttributeLoc) { 14316 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14317 } 14318 14319 template <typename Derived> 14320 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14321 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14322 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14323 NumColumns); 14324 } 14325 14326 template <typename Derived> 14327 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14328 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14329 SourceLocation AttributeLoc) { 14330 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14331 AttributeLoc); 14332 } 14333 14334 template<typename Derived> 14335 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14336 QualType T, 14337 MutableArrayRef<QualType> ParamTypes, 14338 const FunctionProtoType::ExtProtoInfo &EPI) { 14339 return SemaRef.BuildFunctionType(T, ParamTypes, 14340 getDerived().getBaseLocation(), 14341 getDerived().getBaseEntity(), 14342 EPI); 14343 } 14344 14345 template<typename Derived> 14346 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14347 return SemaRef.Context.getFunctionNoProtoType(T); 14348 } 14349 14350 template<typename Derived> 14351 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14352 Decl *D) { 14353 assert(D && "no decl found"); 14354 if (D->isInvalidDecl()) return QualType(); 14355 14356 // FIXME: Doesn't account for ObjCInterfaceDecl! 14357 TypeDecl *Ty; 14358 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14359 // A valid resolved using typename pack expansion decl can have multiple 14360 // UsingDecls, but they must each have exactly one type, and it must be 14361 // the same type in every case. But we must have at least one expansion! 14362 if (UPD->expansions().empty()) { 14363 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14364 << UPD->isCXXClassMember() << UPD; 14365 return QualType(); 14366 } 14367 14368 // We might still have some unresolved types. Try to pick a resolved type 14369 // if we can. The final instantiation will check that the remaining 14370 // unresolved types instantiate to the type we pick. 14371 QualType FallbackT; 14372 QualType T; 14373 for (auto *E : UPD->expansions()) { 14374 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14375 if (ThisT.isNull()) 14376 continue; 14377 else if (ThisT->getAs<UnresolvedUsingType>()) 14378 FallbackT = ThisT; 14379 else if (T.isNull()) 14380 T = ThisT; 14381 else 14382 assert(getSema().Context.hasSameType(ThisT, T) && 14383 "mismatched resolved types in using pack expansion"); 14384 } 14385 return T.isNull() ? FallbackT : T; 14386 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14387 assert(Using->hasTypename() && 14388 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14389 14390 // A valid resolved using typename decl points to exactly one type decl. 14391 assert(++Using->shadow_begin() == Using->shadow_end()); 14392 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 14393 } else { 14394 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14395 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14396 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14397 } 14398 14399 return SemaRef.Context.getTypeDeclType(Ty); 14400 } 14401 14402 template<typename Derived> 14403 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14404 SourceLocation Loc) { 14405 return SemaRef.BuildTypeofExprType(E, Loc); 14406 } 14407 14408 template<typename Derived> 14409 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14410 return SemaRef.Context.getTypeOfType(Underlying); 14411 } 14412 14413 template<typename Derived> 14414 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14415 SourceLocation Loc) { 14416 return SemaRef.BuildDecltypeType(E, Loc); 14417 } 14418 14419 template<typename Derived> 14420 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14421 UnaryTransformType::UTTKind UKind, 14422 SourceLocation Loc) { 14423 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14424 } 14425 14426 template<typename Derived> 14427 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14428 TemplateName Template, 14429 SourceLocation TemplateNameLoc, 14430 TemplateArgumentListInfo &TemplateArgs) { 14431 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14432 } 14433 14434 template<typename Derived> 14435 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14436 SourceLocation KWLoc) { 14437 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14438 } 14439 14440 template<typename Derived> 14441 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14442 SourceLocation KWLoc, 14443 bool isReadPipe) { 14444 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14445 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14446 } 14447 14448 template <typename Derived> 14449 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14450 unsigned NumBits, 14451 SourceLocation Loc) { 14452 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14453 NumBits, true); 14454 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14455 SemaRef.Context.IntTy, Loc); 14456 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14457 } 14458 14459 template <typename Derived> 14460 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14461 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14462 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14463 } 14464 14465 template<typename Derived> 14466 TemplateName 14467 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14468 bool TemplateKW, 14469 TemplateDecl *Template) { 14470 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14471 Template); 14472 } 14473 14474 template<typename Derived> 14475 TemplateName 14476 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14477 SourceLocation TemplateKWLoc, 14478 const IdentifierInfo &Name, 14479 SourceLocation NameLoc, 14480 QualType ObjectType, 14481 NamedDecl *FirstQualifierInScope, 14482 bool AllowInjectedClassName) { 14483 UnqualifiedId TemplateName; 14484 TemplateName.setIdentifier(&Name, NameLoc); 14485 Sema::TemplateTy Template; 14486 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14487 TemplateName, ParsedType::make(ObjectType), 14488 /*EnteringContext=*/false, Template, 14489 AllowInjectedClassName); 14490 return Template.get(); 14491 } 14492 14493 template<typename Derived> 14494 TemplateName 14495 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14496 SourceLocation TemplateKWLoc, 14497 OverloadedOperatorKind Operator, 14498 SourceLocation NameLoc, 14499 QualType ObjectType, 14500 bool AllowInjectedClassName) { 14501 UnqualifiedId Name; 14502 // FIXME: Bogus location information. 14503 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14504 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14505 Sema::TemplateTy Template; 14506 getSema().ActOnTemplateName( 14507 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14508 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14509 return Template.get(); 14510 } 14511 14512 template<typename Derived> 14513 ExprResult 14514 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14515 SourceLocation OpLoc, 14516 Expr *OrigCallee, 14517 Expr *First, 14518 Expr *Second) { 14519 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14520 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14521 14522 if (First->getObjectKind() == OK_ObjCProperty) { 14523 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14524 if (BinaryOperator::isAssignmentOp(Opc)) 14525 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14526 First, Second); 14527 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14528 if (Result.isInvalid()) 14529 return ExprError(); 14530 First = Result.get(); 14531 } 14532 14533 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14534 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14535 if (Result.isInvalid()) 14536 return ExprError(); 14537 Second = Result.get(); 14538 } 14539 14540 // Determine whether this should be a builtin operation. 14541 if (Op == OO_Subscript) { 14542 if (!First->getType()->isOverloadableType() && 14543 !Second->getType()->isOverloadableType()) 14544 return getSema().CreateBuiltinArraySubscriptExpr( 14545 First, Callee->getBeginLoc(), Second, OpLoc); 14546 } else if (Op == OO_Arrow) { 14547 // -> is never a builtin operation. 14548 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14549 } else if (Second == nullptr || isPostIncDec) { 14550 if (!First->getType()->isOverloadableType() || 14551 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14552 // The argument is not of overloadable type, or this is an expression 14553 // of the form &Class::member, so try to create a built-in unary 14554 // operation. 14555 UnaryOperatorKind Opc 14556 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14557 14558 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14559 } 14560 } else { 14561 if (!First->getType()->isOverloadableType() && 14562 !Second->getType()->isOverloadableType()) { 14563 // Neither of the arguments is an overloadable type, so try to 14564 // create a built-in binary operation. 14565 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14566 ExprResult Result 14567 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14568 if (Result.isInvalid()) 14569 return ExprError(); 14570 14571 return Result; 14572 } 14573 } 14574 14575 // Compute the transformed set of functions (and function templates) to be 14576 // used during overload resolution. 14577 UnresolvedSet<16> Functions; 14578 bool RequiresADL; 14579 14580 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14581 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14582 // If the overload could not be resolved in the template definition 14583 // (because we had a dependent argument), ADL is performed as part of 14584 // template instantiation. 14585 RequiresADL = ULE->requiresADL(); 14586 } else { 14587 // If we've resolved this to a particular non-member function, just call 14588 // that function. If we resolved it to a member function, 14589 // CreateOverloaded* will find that function for us. 14590 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14591 if (!isa<CXXMethodDecl>(ND)) 14592 Functions.addDecl(ND); 14593 RequiresADL = false; 14594 } 14595 14596 // Add any functions found via argument-dependent lookup. 14597 Expr *Args[2] = { First, Second }; 14598 unsigned NumArgs = 1 + (Second != nullptr); 14599 14600 // Create the overloaded operator invocation for unary operators. 14601 if (NumArgs == 1 || isPostIncDec) { 14602 UnaryOperatorKind Opc 14603 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14604 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14605 RequiresADL); 14606 } 14607 14608 if (Op == OO_Subscript) { 14609 SourceLocation LBrace; 14610 SourceLocation RBrace; 14611 14612 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14613 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14614 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14615 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14616 } else { 14617 LBrace = Callee->getBeginLoc(); 14618 RBrace = OpLoc; 14619 } 14620 14621 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14622 First, Second); 14623 } 14624 14625 // Create the overloaded operator invocation for binary operators. 14626 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14627 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14628 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14629 if (Result.isInvalid()) 14630 return ExprError(); 14631 14632 return Result; 14633 } 14634 14635 template<typename Derived> 14636 ExprResult 14637 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14638 SourceLocation OperatorLoc, 14639 bool isArrow, 14640 CXXScopeSpec &SS, 14641 TypeSourceInfo *ScopeType, 14642 SourceLocation CCLoc, 14643 SourceLocation TildeLoc, 14644 PseudoDestructorTypeStorage Destroyed) { 14645 QualType BaseType = Base->getType(); 14646 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14647 (!isArrow && !BaseType->getAs<RecordType>()) || 14648 (isArrow && BaseType->getAs<PointerType>() && 14649 !BaseType->castAs<PointerType>()->getPointeeType() 14650 ->template getAs<RecordType>())){ 14651 // This pseudo-destructor expression is still a pseudo-destructor. 14652 return SemaRef.BuildPseudoDestructorExpr( 14653 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14654 CCLoc, TildeLoc, Destroyed); 14655 } 14656 14657 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14658 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14659 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14660 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14661 NameInfo.setNamedTypeInfo(DestroyedType); 14662 14663 // The scope type is now known to be a valid nested name specifier 14664 // component. Tack it on to the end of the nested name specifier. 14665 if (ScopeType) { 14666 if (!ScopeType->getType()->getAs<TagType>()) { 14667 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14668 diag::err_expected_class_or_namespace) 14669 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14670 return ExprError(); 14671 } 14672 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14673 CCLoc); 14674 } 14675 14676 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14677 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14678 OperatorLoc, isArrow, 14679 SS, TemplateKWLoc, 14680 /*FIXME: FirstQualifier*/ nullptr, 14681 NameInfo, 14682 /*TemplateArgs*/ nullptr, 14683 /*S*/nullptr); 14684 } 14685 14686 template<typename Derived> 14687 StmtResult 14688 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14689 SourceLocation Loc = S->getBeginLoc(); 14690 CapturedDecl *CD = S->getCapturedDecl(); 14691 unsigned NumParams = CD->getNumParams(); 14692 unsigned ContextParamPos = CD->getContextParamPosition(); 14693 SmallVector<Sema::CapturedParamNameType, 4> Params; 14694 for (unsigned I = 0; I < NumParams; ++I) { 14695 if (I != ContextParamPos) { 14696 Params.push_back( 14697 std::make_pair( 14698 CD->getParam(I)->getName(), 14699 getDerived().TransformType(CD->getParam(I)->getType()))); 14700 } else { 14701 Params.push_back(std::make_pair(StringRef(), QualType())); 14702 } 14703 } 14704 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14705 S->getCapturedRegionKind(), Params); 14706 StmtResult Body; 14707 { 14708 Sema::CompoundScopeRAII CompoundScope(getSema()); 14709 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14710 } 14711 14712 if (Body.isInvalid()) { 14713 getSema().ActOnCapturedRegionError(); 14714 return StmtError(); 14715 } 14716 14717 return getSema().ActOnCapturedRegionEnd(Body.get()); 14718 } 14719 14720 } // end namespace clang 14721 14722 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14723