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.ActOnAttributedStmt(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 executable directive. 1550 /// 1551 /// By default, performs semantic analysis to build the new statement. 1552 /// Subclasses may override this routine to provide different behavior. 1553 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1554 DeclarationNameInfo DirName, 1555 OpenMPDirectiveKind CancelRegion, 1556 ArrayRef<OMPClause *> Clauses, 1557 Stmt *AStmt, SourceLocation StartLoc, 1558 SourceLocation EndLoc) { 1559 return getSema().ActOnOpenMPExecutableDirective( 1560 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1561 } 1562 1563 /// Build a new OpenMP 'if' clause. 1564 /// 1565 /// By default, performs semantic analysis to build the new OpenMP clause. 1566 /// Subclasses may override this routine to provide different behavior. 1567 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1568 Expr *Condition, SourceLocation StartLoc, 1569 SourceLocation LParenLoc, 1570 SourceLocation NameModifierLoc, 1571 SourceLocation ColonLoc, 1572 SourceLocation EndLoc) { 1573 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1574 LParenLoc, NameModifierLoc, ColonLoc, 1575 EndLoc); 1576 } 1577 1578 /// Build a new OpenMP 'final' clause. 1579 /// 1580 /// By default, performs semantic analysis to build the new OpenMP clause. 1581 /// Subclasses may override this routine to provide different behavior. 1582 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1583 SourceLocation LParenLoc, 1584 SourceLocation EndLoc) { 1585 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1586 EndLoc); 1587 } 1588 1589 /// Build a new OpenMP 'num_threads' clause. 1590 /// 1591 /// By default, performs semantic analysis to build the new OpenMP clause. 1592 /// Subclasses may override this routine to provide different behavior. 1593 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1594 SourceLocation StartLoc, 1595 SourceLocation LParenLoc, 1596 SourceLocation EndLoc) { 1597 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1598 LParenLoc, EndLoc); 1599 } 1600 1601 /// Build a new OpenMP 'safelen' clause. 1602 /// 1603 /// By default, performs semantic analysis to build the new OpenMP clause. 1604 /// Subclasses may override this routine to provide different behavior. 1605 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1606 SourceLocation LParenLoc, 1607 SourceLocation EndLoc) { 1608 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1609 } 1610 1611 /// Build a new OpenMP 'simdlen' clause. 1612 /// 1613 /// By default, performs semantic analysis to build the new OpenMP clause. 1614 /// Subclasses may override this routine to provide different behavior. 1615 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1616 SourceLocation LParenLoc, 1617 SourceLocation EndLoc) { 1618 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1619 } 1620 1621 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1622 SourceLocation StartLoc, 1623 SourceLocation LParenLoc, 1624 SourceLocation EndLoc) { 1625 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1626 } 1627 1628 /// Build a new OpenMP 'allocator' clause. 1629 /// 1630 /// By default, performs semantic analysis to build the new OpenMP clause. 1631 /// Subclasses may override this routine to provide different behavior. 1632 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1633 SourceLocation LParenLoc, 1634 SourceLocation EndLoc) { 1635 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1636 } 1637 1638 /// Build a new OpenMP 'collapse' clause. 1639 /// 1640 /// By default, performs semantic analysis to build the new OpenMP clause. 1641 /// Subclasses may override this routine to provide different behavior. 1642 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1643 SourceLocation LParenLoc, 1644 SourceLocation EndLoc) { 1645 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1646 EndLoc); 1647 } 1648 1649 /// Build a new OpenMP 'default' clause. 1650 /// 1651 /// By default, performs semantic analysis to build the new OpenMP clause. 1652 /// Subclasses may override this routine to provide different behavior. 1653 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1654 SourceLocation StartLoc, 1655 SourceLocation LParenLoc, 1656 SourceLocation EndLoc) { 1657 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1658 StartLoc, LParenLoc, EndLoc); 1659 } 1660 1661 /// Build a new OpenMP 'proc_bind' clause. 1662 /// 1663 /// By default, performs semantic analysis to build the new OpenMP clause. 1664 /// Subclasses may override this routine to provide different behavior. 1665 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1666 SourceLocation KindKwLoc, 1667 SourceLocation StartLoc, 1668 SourceLocation LParenLoc, 1669 SourceLocation EndLoc) { 1670 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1671 StartLoc, LParenLoc, EndLoc); 1672 } 1673 1674 /// Build a new OpenMP 'schedule' clause. 1675 /// 1676 /// By default, performs semantic analysis to build the new OpenMP clause. 1677 /// Subclasses may override this routine to provide different behavior. 1678 OMPClause *RebuildOMPScheduleClause( 1679 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1680 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1681 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1682 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1683 return getSema().ActOnOpenMPScheduleClause( 1684 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1685 CommaLoc, EndLoc); 1686 } 1687 1688 /// Build a new OpenMP 'ordered' clause. 1689 /// 1690 /// By default, performs semantic analysis to build the new OpenMP clause. 1691 /// Subclasses may override this routine to provide different behavior. 1692 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1693 SourceLocation EndLoc, 1694 SourceLocation LParenLoc, Expr *Num) { 1695 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1696 } 1697 1698 /// Build a new OpenMP 'private' clause. 1699 /// 1700 /// By default, performs semantic analysis to build the new OpenMP clause. 1701 /// Subclasses may override this routine to provide different behavior. 1702 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1703 SourceLocation StartLoc, 1704 SourceLocation LParenLoc, 1705 SourceLocation EndLoc) { 1706 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1707 EndLoc); 1708 } 1709 1710 /// Build a new OpenMP 'firstprivate' clause. 1711 /// 1712 /// By default, performs semantic analysis to build the new OpenMP clause. 1713 /// Subclasses may override this routine to provide different behavior. 1714 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1715 SourceLocation StartLoc, 1716 SourceLocation LParenLoc, 1717 SourceLocation EndLoc) { 1718 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1719 EndLoc); 1720 } 1721 1722 /// Build a new OpenMP 'lastprivate' clause. 1723 /// 1724 /// By default, performs semantic analysis to build the new OpenMP clause. 1725 /// Subclasses may override this routine to provide different behavior. 1726 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1727 OpenMPLastprivateModifier LPKind, 1728 SourceLocation LPKindLoc, 1729 SourceLocation ColonLoc, 1730 SourceLocation StartLoc, 1731 SourceLocation LParenLoc, 1732 SourceLocation EndLoc) { 1733 return getSema().ActOnOpenMPLastprivateClause( 1734 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1735 } 1736 1737 /// Build a new OpenMP 'shared' clause. 1738 /// 1739 /// By default, performs semantic analysis to build the new OpenMP clause. 1740 /// Subclasses may override this routine to provide different behavior. 1741 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1742 SourceLocation StartLoc, 1743 SourceLocation LParenLoc, 1744 SourceLocation EndLoc) { 1745 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1746 EndLoc); 1747 } 1748 1749 /// Build a new OpenMP 'reduction' clause. 1750 /// 1751 /// By default, performs semantic analysis to build the new statement. 1752 /// Subclasses may override this routine to provide different behavior. 1753 OMPClause *RebuildOMPReductionClause( 1754 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1755 SourceLocation StartLoc, SourceLocation LParenLoc, 1756 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1757 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1758 const DeclarationNameInfo &ReductionId, 1759 ArrayRef<Expr *> UnresolvedReductions) { 1760 return getSema().ActOnOpenMPReductionClause( 1761 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1762 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1763 } 1764 1765 /// Build a new OpenMP 'task_reduction' clause. 1766 /// 1767 /// By default, performs semantic analysis to build the new statement. 1768 /// Subclasses may override this routine to provide different behavior. 1769 OMPClause *RebuildOMPTaskReductionClause( 1770 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1771 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1772 CXXScopeSpec &ReductionIdScopeSpec, 1773 const DeclarationNameInfo &ReductionId, 1774 ArrayRef<Expr *> UnresolvedReductions) { 1775 return getSema().ActOnOpenMPTaskReductionClause( 1776 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1777 ReductionId, UnresolvedReductions); 1778 } 1779 1780 /// Build a new OpenMP 'in_reduction' clause. 1781 /// 1782 /// By default, performs semantic analysis to build the new statement. 1783 /// Subclasses may override this routine to provide different behavior. 1784 OMPClause * 1785 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1786 SourceLocation LParenLoc, SourceLocation ColonLoc, 1787 SourceLocation EndLoc, 1788 CXXScopeSpec &ReductionIdScopeSpec, 1789 const DeclarationNameInfo &ReductionId, 1790 ArrayRef<Expr *> UnresolvedReductions) { 1791 return getSema().ActOnOpenMPInReductionClause( 1792 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1793 ReductionId, UnresolvedReductions); 1794 } 1795 1796 /// Build a new OpenMP 'linear' clause. 1797 /// 1798 /// By default, performs semantic analysis to build the new OpenMP clause. 1799 /// Subclasses may override this routine to provide different behavior. 1800 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1801 SourceLocation StartLoc, 1802 SourceLocation LParenLoc, 1803 OpenMPLinearClauseKind Modifier, 1804 SourceLocation ModifierLoc, 1805 SourceLocation ColonLoc, 1806 SourceLocation EndLoc) { 1807 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1808 Modifier, ModifierLoc, ColonLoc, 1809 EndLoc); 1810 } 1811 1812 /// Build a new OpenMP 'aligned' clause. 1813 /// 1814 /// By default, performs semantic analysis to build the new OpenMP clause. 1815 /// Subclasses may override this routine to provide different behavior. 1816 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1817 SourceLocation StartLoc, 1818 SourceLocation LParenLoc, 1819 SourceLocation ColonLoc, 1820 SourceLocation EndLoc) { 1821 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1822 LParenLoc, ColonLoc, EndLoc); 1823 } 1824 1825 /// Build a new OpenMP 'copyin' clause. 1826 /// 1827 /// By default, performs semantic analysis to build the new OpenMP clause. 1828 /// Subclasses may override this routine to provide different behavior. 1829 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1830 SourceLocation StartLoc, 1831 SourceLocation LParenLoc, 1832 SourceLocation EndLoc) { 1833 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1834 EndLoc); 1835 } 1836 1837 /// Build a new OpenMP 'copyprivate' clause. 1838 /// 1839 /// By default, performs semantic analysis to build the new OpenMP clause. 1840 /// Subclasses may override this routine to provide different behavior. 1841 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1842 SourceLocation StartLoc, 1843 SourceLocation LParenLoc, 1844 SourceLocation EndLoc) { 1845 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1846 EndLoc); 1847 } 1848 1849 /// Build a new OpenMP 'flush' pseudo clause. 1850 /// 1851 /// By default, performs semantic analysis to build the new OpenMP clause. 1852 /// Subclasses may override this routine to provide different behavior. 1853 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1854 SourceLocation StartLoc, 1855 SourceLocation LParenLoc, 1856 SourceLocation EndLoc) { 1857 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1858 EndLoc); 1859 } 1860 1861 /// Build a new OpenMP 'depobj' pseudo clause. 1862 /// 1863 /// By default, performs semantic analysis to build the new OpenMP clause. 1864 /// Subclasses may override this routine to provide different behavior. 1865 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1866 SourceLocation LParenLoc, 1867 SourceLocation EndLoc) { 1868 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1869 EndLoc); 1870 } 1871 1872 /// Build a new OpenMP 'depend' pseudo clause. 1873 /// 1874 /// By default, performs semantic analysis to build the new OpenMP clause. 1875 /// Subclasses may override this routine to provide different behavior. 1876 OMPClause * 1877 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1878 SourceLocation DepLoc, SourceLocation ColonLoc, 1879 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1880 SourceLocation LParenLoc, SourceLocation EndLoc) { 1881 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1882 ColonLoc, VarList, StartLoc, 1883 LParenLoc, EndLoc); 1884 } 1885 1886 /// Build a new OpenMP 'device' clause. 1887 /// 1888 /// By default, performs semantic analysis to build the new statement. 1889 /// Subclasses may override this routine to provide different behavior. 1890 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1891 Expr *Device, SourceLocation StartLoc, 1892 SourceLocation LParenLoc, 1893 SourceLocation ModifierLoc, 1894 SourceLocation EndLoc) { 1895 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1896 LParenLoc, ModifierLoc, EndLoc); 1897 } 1898 1899 /// Build a new OpenMP 'map' clause. 1900 /// 1901 /// By default, performs semantic analysis to build the new OpenMP clause. 1902 /// Subclasses may override this routine to provide different behavior. 1903 OMPClause *RebuildOMPMapClause( 1904 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1905 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1906 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1907 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1908 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1909 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1910 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1911 MapperIdScopeSpec, MapperId, MapType, 1912 IsMapTypeImplicit, MapLoc, ColonLoc, 1913 VarList, Locs, UnresolvedMappers); 1914 } 1915 1916 /// Build a new OpenMP 'allocate' clause. 1917 /// 1918 /// By default, performs semantic analysis to build the new OpenMP clause. 1919 /// Subclasses may override this routine to provide different behavior. 1920 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1921 SourceLocation StartLoc, 1922 SourceLocation LParenLoc, 1923 SourceLocation ColonLoc, 1924 SourceLocation EndLoc) { 1925 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1926 LParenLoc, ColonLoc, EndLoc); 1927 } 1928 1929 /// Build a new OpenMP 'num_teams' clause. 1930 /// 1931 /// By default, performs semantic analysis to build the new statement. 1932 /// Subclasses may override this routine to provide different behavior. 1933 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1934 SourceLocation LParenLoc, 1935 SourceLocation EndLoc) { 1936 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1937 EndLoc); 1938 } 1939 1940 /// Build a new OpenMP 'thread_limit' clause. 1941 /// 1942 /// By default, performs semantic analysis to build the new statement. 1943 /// Subclasses may override this routine to provide different behavior. 1944 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1945 SourceLocation StartLoc, 1946 SourceLocation LParenLoc, 1947 SourceLocation EndLoc) { 1948 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1949 LParenLoc, EndLoc); 1950 } 1951 1952 /// Build a new OpenMP 'priority' clause. 1953 /// 1954 /// By default, performs semantic analysis to build the new statement. 1955 /// Subclasses may override this routine to provide different behavior. 1956 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1957 SourceLocation LParenLoc, 1958 SourceLocation EndLoc) { 1959 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1960 EndLoc); 1961 } 1962 1963 /// Build a new OpenMP 'grainsize' clause. 1964 /// 1965 /// By default, performs semantic analysis to build the new statement. 1966 /// Subclasses may override this routine to provide different behavior. 1967 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1968 SourceLocation LParenLoc, 1969 SourceLocation EndLoc) { 1970 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1971 EndLoc); 1972 } 1973 1974 /// Build a new OpenMP 'num_tasks' clause. 1975 /// 1976 /// By default, performs semantic analysis to build the new statement. 1977 /// Subclasses may override this routine to provide different behavior. 1978 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1979 SourceLocation LParenLoc, 1980 SourceLocation EndLoc) { 1981 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1982 EndLoc); 1983 } 1984 1985 /// Build a new OpenMP 'hint' clause. 1986 /// 1987 /// By default, performs semantic analysis to build the new statement. 1988 /// Subclasses may override this routine to provide different behavior. 1989 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1990 SourceLocation LParenLoc, 1991 SourceLocation EndLoc) { 1992 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1993 } 1994 1995 /// Build a new OpenMP 'detach' clause. 1996 /// 1997 /// By default, performs semantic analysis to build the new statement. 1998 /// Subclasses may override this routine to provide different behavior. 1999 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2000 SourceLocation LParenLoc, 2001 SourceLocation EndLoc) { 2002 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2003 } 2004 2005 /// Build a new OpenMP 'dist_schedule' clause. 2006 /// 2007 /// By default, performs semantic analysis to build the new OpenMP clause. 2008 /// Subclasses may override this routine to provide different behavior. 2009 OMPClause * 2010 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2011 Expr *ChunkSize, SourceLocation StartLoc, 2012 SourceLocation LParenLoc, SourceLocation KindLoc, 2013 SourceLocation CommaLoc, SourceLocation EndLoc) { 2014 return getSema().ActOnOpenMPDistScheduleClause( 2015 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2016 } 2017 2018 /// Build a new OpenMP 'to' clause. 2019 /// 2020 /// By default, performs semantic analysis to build the new statement. 2021 /// Subclasses may override this routine to provide different behavior. 2022 OMPClause * 2023 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2024 ArrayRef<SourceLocation> MotionModifiersLoc, 2025 CXXScopeSpec &MapperIdScopeSpec, 2026 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2027 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2028 ArrayRef<Expr *> UnresolvedMappers) { 2029 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2030 MapperIdScopeSpec, MapperId, ColonLoc, 2031 VarList, Locs, UnresolvedMappers); 2032 } 2033 2034 /// Build a new OpenMP 'from' clause. 2035 /// 2036 /// By default, performs semantic analysis to build the new statement. 2037 /// Subclasses may override this routine to provide different behavior. 2038 OMPClause * 2039 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2040 ArrayRef<SourceLocation> MotionModifiersLoc, 2041 CXXScopeSpec &MapperIdScopeSpec, 2042 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2043 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2044 ArrayRef<Expr *> UnresolvedMappers) { 2045 return getSema().ActOnOpenMPFromClause( 2046 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2047 ColonLoc, VarList, Locs, UnresolvedMappers); 2048 } 2049 2050 /// Build a new OpenMP 'use_device_ptr' clause. 2051 /// 2052 /// By default, performs semantic analysis to build the new OpenMP clause. 2053 /// Subclasses may override this routine to provide different behavior. 2054 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2055 const OMPVarListLocTy &Locs) { 2056 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2057 } 2058 2059 /// Build a new OpenMP 'use_device_addr' clause. 2060 /// 2061 /// By default, performs semantic analysis to build the new OpenMP clause. 2062 /// Subclasses may override this routine to provide different behavior. 2063 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2064 const OMPVarListLocTy &Locs) { 2065 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2066 } 2067 2068 /// Build a new OpenMP 'is_device_ptr' clause. 2069 /// 2070 /// By default, performs semantic analysis to build the new OpenMP clause. 2071 /// Subclasses may override this routine to provide different behavior. 2072 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2073 const OMPVarListLocTy &Locs) { 2074 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2075 } 2076 2077 /// Build a new OpenMP 'defaultmap' clause. 2078 /// 2079 /// By default, performs semantic analysis to build the new OpenMP clause. 2080 /// Subclasses may override this routine to provide different behavior. 2081 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2082 OpenMPDefaultmapClauseKind Kind, 2083 SourceLocation StartLoc, 2084 SourceLocation LParenLoc, 2085 SourceLocation MLoc, 2086 SourceLocation KindLoc, 2087 SourceLocation EndLoc) { 2088 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2089 MLoc, KindLoc, EndLoc); 2090 } 2091 2092 /// Build a new OpenMP 'nontemporal' clause. 2093 /// 2094 /// By default, performs semantic analysis to build the new OpenMP clause. 2095 /// Subclasses may override this routine to provide different behavior. 2096 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2097 SourceLocation StartLoc, 2098 SourceLocation LParenLoc, 2099 SourceLocation EndLoc) { 2100 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2101 EndLoc); 2102 } 2103 2104 /// Build a new OpenMP 'inclusive' clause. 2105 /// 2106 /// By default, performs semantic analysis to build the new OpenMP clause. 2107 /// Subclasses may override this routine to provide different behavior. 2108 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2109 SourceLocation StartLoc, 2110 SourceLocation LParenLoc, 2111 SourceLocation EndLoc) { 2112 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2113 EndLoc); 2114 } 2115 2116 /// Build a new OpenMP 'exclusive' clause. 2117 /// 2118 /// By default, performs semantic analysis to build the new OpenMP clause. 2119 /// Subclasses may override this routine to provide different behavior. 2120 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2121 SourceLocation StartLoc, 2122 SourceLocation LParenLoc, 2123 SourceLocation EndLoc) { 2124 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2125 EndLoc); 2126 } 2127 2128 /// Build a new OpenMP 'uses_allocators' clause. 2129 /// 2130 /// By default, performs semantic analysis to build the new OpenMP clause. 2131 /// Subclasses may override this routine to provide different behavior. 2132 OMPClause *RebuildOMPUsesAllocatorsClause( 2133 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2134 SourceLocation LParenLoc, SourceLocation EndLoc) { 2135 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2136 Data); 2137 } 2138 2139 /// Build a new OpenMP 'affinity' clause. 2140 /// 2141 /// By default, performs semantic analysis to build the new OpenMP clause. 2142 /// Subclasses may override this routine to provide different behavior. 2143 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2144 SourceLocation LParenLoc, 2145 SourceLocation ColonLoc, 2146 SourceLocation EndLoc, Expr *Modifier, 2147 ArrayRef<Expr *> Locators) { 2148 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2149 EndLoc, Modifier, Locators); 2150 } 2151 2152 /// Build a new OpenMP 'order' clause. 2153 /// 2154 /// By default, performs semantic analysis to build the new OpenMP clause. 2155 /// Subclasses may override this routine to provide different behavior. 2156 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2157 SourceLocation KindKwLoc, 2158 SourceLocation StartLoc, 2159 SourceLocation LParenLoc, 2160 SourceLocation EndLoc) { 2161 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2162 LParenLoc, EndLoc); 2163 } 2164 2165 /// Rebuild the operand to an Objective-C \@synchronized statement. 2166 /// 2167 /// By default, performs semantic analysis to build the new statement. 2168 /// Subclasses may override this routine to provide different behavior. 2169 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2170 Expr *object) { 2171 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2172 } 2173 2174 /// Build a new Objective-C \@synchronized statement. 2175 /// 2176 /// By default, performs semantic analysis to build the new statement. 2177 /// Subclasses may override this routine to provide different behavior. 2178 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2179 Expr *Object, Stmt *Body) { 2180 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2181 } 2182 2183 /// Build a new Objective-C \@autoreleasepool statement. 2184 /// 2185 /// By default, performs semantic analysis to build the new statement. 2186 /// Subclasses may override this routine to provide different behavior. 2187 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2188 Stmt *Body) { 2189 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2190 } 2191 2192 /// Build a new Objective-C fast enumeration statement. 2193 /// 2194 /// By default, performs semantic analysis to build the new statement. 2195 /// Subclasses may override this routine to provide different behavior. 2196 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2197 Stmt *Element, 2198 Expr *Collection, 2199 SourceLocation RParenLoc, 2200 Stmt *Body) { 2201 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2202 Element, 2203 Collection, 2204 RParenLoc); 2205 if (ForEachStmt.isInvalid()) 2206 return StmtError(); 2207 2208 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2209 } 2210 2211 /// Build a new C++ exception declaration. 2212 /// 2213 /// By default, performs semantic analysis to build the new decaration. 2214 /// Subclasses may override this routine to provide different behavior. 2215 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2216 TypeSourceInfo *Declarator, 2217 SourceLocation StartLoc, 2218 SourceLocation IdLoc, 2219 IdentifierInfo *Id) { 2220 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2221 StartLoc, IdLoc, Id); 2222 if (Var) 2223 getSema().CurContext->addDecl(Var); 2224 return Var; 2225 } 2226 2227 /// Build a new C++ catch statement. 2228 /// 2229 /// By default, performs semantic analysis to build the new statement. 2230 /// Subclasses may override this routine to provide different behavior. 2231 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2232 VarDecl *ExceptionDecl, 2233 Stmt *Handler) { 2234 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2235 Handler)); 2236 } 2237 2238 /// Build a new C++ try statement. 2239 /// 2240 /// By default, performs semantic analysis to build the new statement. 2241 /// Subclasses may override this routine to provide different behavior. 2242 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2243 ArrayRef<Stmt *> Handlers) { 2244 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2245 } 2246 2247 /// Build a new C++0x range-based for statement. 2248 /// 2249 /// By default, performs semantic analysis to build the new statement. 2250 /// Subclasses may override this routine to provide different behavior. 2251 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2252 SourceLocation CoawaitLoc, Stmt *Init, 2253 SourceLocation ColonLoc, Stmt *Range, 2254 Stmt *Begin, Stmt *End, Expr *Cond, 2255 Expr *Inc, Stmt *LoopVar, 2256 SourceLocation RParenLoc) { 2257 // If we've just learned that the range is actually an Objective-C 2258 // collection, treat this as an Objective-C fast enumeration loop. 2259 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2260 if (RangeStmt->isSingleDecl()) { 2261 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2262 if (RangeVar->isInvalidDecl()) 2263 return StmtError(); 2264 2265 Expr *RangeExpr = RangeVar->getInit(); 2266 if (!RangeExpr->isTypeDependent() && 2267 RangeExpr->getType()->isObjCObjectPointerType()) { 2268 // FIXME: Support init-statements in Objective-C++20 ranged for 2269 // statement. 2270 if (Init) { 2271 return SemaRef.Diag(Init->getBeginLoc(), 2272 diag::err_objc_for_range_init_stmt) 2273 << Init->getSourceRange(); 2274 } 2275 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2276 RangeExpr, RParenLoc); 2277 } 2278 } 2279 } 2280 } 2281 2282 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2283 Range, Begin, End, Cond, Inc, LoopVar, 2284 RParenLoc, Sema::BFRK_Rebuild); 2285 } 2286 2287 /// Build a new C++0x range-based for statement. 2288 /// 2289 /// By default, performs semantic analysis to build the new statement. 2290 /// Subclasses may override this routine to provide different behavior. 2291 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2292 bool IsIfExists, 2293 NestedNameSpecifierLoc QualifierLoc, 2294 DeclarationNameInfo NameInfo, 2295 Stmt *Nested) { 2296 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2297 QualifierLoc, NameInfo, Nested); 2298 } 2299 2300 /// Attach body to a C++0x range-based for statement. 2301 /// 2302 /// By default, performs semantic analysis to finish the new statement. 2303 /// Subclasses may override this routine to provide different behavior. 2304 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2305 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2306 } 2307 2308 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2309 Stmt *TryBlock, Stmt *Handler) { 2310 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2311 } 2312 2313 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2314 Stmt *Block) { 2315 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2316 } 2317 2318 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2319 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2320 } 2321 2322 /// Build a new predefined expression. 2323 /// 2324 /// By default, performs semantic analysis to build the new expression. 2325 /// Subclasses may override this routine to provide different behavior. 2326 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2327 PredefinedExpr::IdentKind IK) { 2328 return getSema().BuildPredefinedExpr(Loc, IK); 2329 } 2330 2331 /// Build a new expression that references a declaration. 2332 /// 2333 /// By default, performs semantic analysis to build the new expression. 2334 /// Subclasses may override this routine to provide different behavior. 2335 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2336 LookupResult &R, 2337 bool RequiresADL) { 2338 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2339 } 2340 2341 2342 /// Build a new expression that references a declaration. 2343 /// 2344 /// By default, performs semantic analysis to build the new expression. 2345 /// Subclasses may override this routine to provide different behavior. 2346 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2347 ValueDecl *VD, 2348 const DeclarationNameInfo &NameInfo, 2349 NamedDecl *Found, 2350 TemplateArgumentListInfo *TemplateArgs) { 2351 CXXScopeSpec SS; 2352 SS.Adopt(QualifierLoc); 2353 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2354 TemplateArgs); 2355 } 2356 2357 /// Build a new expression in parentheses. 2358 /// 2359 /// By default, performs semantic analysis to build the new expression. 2360 /// Subclasses may override this routine to provide different behavior. 2361 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2362 SourceLocation RParen) { 2363 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2364 } 2365 2366 /// Build a new pseudo-destructor expression. 2367 /// 2368 /// By default, performs semantic analysis to build the new expression. 2369 /// Subclasses may override this routine to provide different behavior. 2370 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2371 SourceLocation OperatorLoc, 2372 bool isArrow, 2373 CXXScopeSpec &SS, 2374 TypeSourceInfo *ScopeType, 2375 SourceLocation CCLoc, 2376 SourceLocation TildeLoc, 2377 PseudoDestructorTypeStorage Destroyed); 2378 2379 /// Build a new unary operator expression. 2380 /// 2381 /// By default, performs semantic analysis to build the new expression. 2382 /// Subclasses may override this routine to provide different behavior. 2383 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2384 UnaryOperatorKind Opc, 2385 Expr *SubExpr) { 2386 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2387 } 2388 2389 /// Build a new builtin offsetof expression. 2390 /// 2391 /// By default, performs semantic analysis to build the new expression. 2392 /// Subclasses may override this routine to provide different behavior. 2393 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2394 TypeSourceInfo *Type, 2395 ArrayRef<Sema::OffsetOfComponent> Components, 2396 SourceLocation RParenLoc) { 2397 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2398 RParenLoc); 2399 } 2400 2401 /// Build a new sizeof, alignof or vec_step expression with a 2402 /// type argument. 2403 /// 2404 /// By default, performs semantic analysis to build the new expression. 2405 /// Subclasses may override this routine to provide different behavior. 2406 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2407 SourceLocation OpLoc, 2408 UnaryExprOrTypeTrait ExprKind, 2409 SourceRange R) { 2410 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2411 } 2412 2413 /// Build a new sizeof, alignof or vec step expression with an 2414 /// expression argument. 2415 /// 2416 /// By default, performs semantic analysis to build the new expression. 2417 /// Subclasses may override this routine to provide different behavior. 2418 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2419 UnaryExprOrTypeTrait ExprKind, 2420 SourceRange R) { 2421 ExprResult Result 2422 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2423 if (Result.isInvalid()) 2424 return ExprError(); 2425 2426 return Result; 2427 } 2428 2429 /// Build a new array subscript expression. 2430 /// 2431 /// By default, performs semantic analysis to build the new expression. 2432 /// Subclasses may override this routine to provide different behavior. 2433 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2434 SourceLocation LBracketLoc, 2435 Expr *RHS, 2436 SourceLocation RBracketLoc) { 2437 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2438 LBracketLoc, RHS, 2439 RBracketLoc); 2440 } 2441 2442 /// Build a new matrix subscript expression. 2443 /// 2444 /// By default, performs semantic analysis to build the new expression. 2445 /// Subclasses may override this routine to provide different behavior. 2446 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2447 Expr *ColumnIdx, 2448 SourceLocation RBracketLoc) { 2449 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2450 RBracketLoc); 2451 } 2452 2453 /// Build a new array section expression. 2454 /// 2455 /// By default, performs semantic analysis to build the new expression. 2456 /// Subclasses may override this routine to provide different behavior. 2457 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2458 Expr *LowerBound, 2459 SourceLocation ColonLocFirst, 2460 SourceLocation ColonLocSecond, 2461 Expr *Length, Expr *Stride, 2462 SourceLocation RBracketLoc) { 2463 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2464 ColonLocFirst, ColonLocSecond, 2465 Length, Stride, RBracketLoc); 2466 } 2467 2468 /// Build a new array shaping expression. 2469 /// 2470 /// By default, performs semantic analysis to build the new expression. 2471 /// Subclasses may override this routine to provide different behavior. 2472 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2473 SourceLocation RParenLoc, 2474 ArrayRef<Expr *> Dims, 2475 ArrayRef<SourceRange> BracketsRanges) { 2476 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2477 BracketsRanges); 2478 } 2479 2480 /// Build a new iterator expression. 2481 /// 2482 /// By default, performs semantic analysis to build the new expression. 2483 /// Subclasses may override this routine to provide different behavior. 2484 ExprResult RebuildOMPIteratorExpr( 2485 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2486 ArrayRef<Sema::OMPIteratorData> Data) { 2487 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2488 LLoc, RLoc, Data); 2489 } 2490 2491 /// Build a new call expression. 2492 /// 2493 /// By default, performs semantic analysis to build the new expression. 2494 /// Subclasses may override this routine to provide different behavior. 2495 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2496 MultiExprArg Args, 2497 SourceLocation RParenLoc, 2498 Expr *ExecConfig = nullptr) { 2499 return getSema().ActOnCallExpr( 2500 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2501 } 2502 2503 /// Build a new member access expression. 2504 /// 2505 /// By default, performs semantic analysis to build the new expression. 2506 /// Subclasses may override this routine to provide different behavior. 2507 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2508 bool isArrow, 2509 NestedNameSpecifierLoc QualifierLoc, 2510 SourceLocation TemplateKWLoc, 2511 const DeclarationNameInfo &MemberNameInfo, 2512 ValueDecl *Member, 2513 NamedDecl *FoundDecl, 2514 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2515 NamedDecl *FirstQualifierInScope) { 2516 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2517 isArrow); 2518 if (!Member->getDeclName()) { 2519 // We have a reference to an unnamed field. This is always the 2520 // base of an anonymous struct/union member access, i.e. the 2521 // field is always of record type. 2522 assert(Member->getType()->isRecordType() && 2523 "unnamed member not of record type?"); 2524 2525 BaseResult = 2526 getSema().PerformObjectMemberConversion(BaseResult.get(), 2527 QualifierLoc.getNestedNameSpecifier(), 2528 FoundDecl, Member); 2529 if (BaseResult.isInvalid()) 2530 return ExprError(); 2531 Base = BaseResult.get(); 2532 2533 CXXScopeSpec EmptySS; 2534 return getSema().BuildFieldReferenceExpr( 2535 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2536 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2537 } 2538 2539 CXXScopeSpec SS; 2540 SS.Adopt(QualifierLoc); 2541 2542 Base = BaseResult.get(); 2543 QualType BaseType = Base->getType(); 2544 2545 if (isArrow && !BaseType->isPointerType()) 2546 return ExprError(); 2547 2548 // FIXME: this involves duplicating earlier analysis in a lot of 2549 // cases; we should avoid this when possible. 2550 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2551 R.addDecl(FoundDecl); 2552 R.resolveKind(); 2553 2554 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2555 SS, TemplateKWLoc, 2556 FirstQualifierInScope, 2557 R, ExplicitTemplateArgs, 2558 /*S*/nullptr); 2559 } 2560 2561 /// Build a new binary operator 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 RebuildBinaryOperator(SourceLocation OpLoc, 2566 BinaryOperatorKind Opc, 2567 Expr *LHS, Expr *RHS) { 2568 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2569 } 2570 2571 /// Build a new rewritten operator expression. 2572 /// 2573 /// By default, performs semantic analysis to build the new expression. 2574 /// Subclasses may override this routine to provide different behavior. 2575 ExprResult RebuildCXXRewrittenBinaryOperator( 2576 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2577 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2578 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2579 RHS, /*RequiresADL*/false); 2580 } 2581 2582 /// Build a new conditional operator expression. 2583 /// 2584 /// By default, performs semantic analysis to build the new expression. 2585 /// Subclasses may override this routine to provide different behavior. 2586 ExprResult RebuildConditionalOperator(Expr *Cond, 2587 SourceLocation QuestionLoc, 2588 Expr *LHS, 2589 SourceLocation ColonLoc, 2590 Expr *RHS) { 2591 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2592 LHS, RHS); 2593 } 2594 2595 /// Build a new C-style cast expression. 2596 /// 2597 /// By default, performs semantic analysis to build the new expression. 2598 /// Subclasses may override this routine to provide different behavior. 2599 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2600 TypeSourceInfo *TInfo, 2601 SourceLocation RParenLoc, 2602 Expr *SubExpr) { 2603 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2604 SubExpr); 2605 } 2606 2607 /// Build a new compound literal expression. 2608 /// 2609 /// By default, performs semantic analysis to build the new expression. 2610 /// Subclasses may override this routine to provide different behavior. 2611 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2612 TypeSourceInfo *TInfo, 2613 SourceLocation RParenLoc, 2614 Expr *Init) { 2615 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2616 Init); 2617 } 2618 2619 /// Build a new extended vector element access expression. 2620 /// 2621 /// By default, performs semantic analysis to build the new expression. 2622 /// Subclasses may override this routine to provide different behavior. 2623 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2624 SourceLocation OpLoc, 2625 SourceLocation AccessorLoc, 2626 IdentifierInfo &Accessor) { 2627 2628 CXXScopeSpec SS; 2629 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2630 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2631 OpLoc, /*IsArrow*/ false, 2632 SS, SourceLocation(), 2633 /*FirstQualifierInScope*/ nullptr, 2634 NameInfo, 2635 /* TemplateArgs */ nullptr, 2636 /*S*/ nullptr); 2637 } 2638 2639 /// Build a new initializer list expression. 2640 /// 2641 /// By default, performs semantic analysis to build the new expression. 2642 /// Subclasses may override this routine to provide different behavior. 2643 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2644 MultiExprArg Inits, 2645 SourceLocation RBraceLoc) { 2646 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2647 } 2648 2649 /// Build a new designated initializer expression. 2650 /// 2651 /// By default, performs semantic analysis to build the new expression. 2652 /// Subclasses may override this routine to provide different behavior. 2653 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2654 MultiExprArg ArrayExprs, 2655 SourceLocation EqualOrColonLoc, 2656 bool GNUSyntax, 2657 Expr *Init) { 2658 ExprResult Result 2659 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2660 Init); 2661 if (Result.isInvalid()) 2662 return ExprError(); 2663 2664 return Result; 2665 } 2666 2667 /// Build a new value-initialized expression. 2668 /// 2669 /// By default, builds the implicit value initialization without performing 2670 /// any semantic analysis. Subclasses may override this routine to provide 2671 /// different behavior. 2672 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2673 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2674 } 2675 2676 /// Build a new \c va_arg expression. 2677 /// 2678 /// By default, performs semantic analysis to build the new expression. 2679 /// Subclasses may override this routine to provide different behavior. 2680 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2681 Expr *SubExpr, TypeSourceInfo *TInfo, 2682 SourceLocation RParenLoc) { 2683 return getSema().BuildVAArgExpr(BuiltinLoc, 2684 SubExpr, TInfo, 2685 RParenLoc); 2686 } 2687 2688 /// Build a new expression list in parentheses. 2689 /// 2690 /// By default, performs semantic analysis to build the new expression. 2691 /// Subclasses may override this routine to provide different behavior. 2692 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2693 MultiExprArg SubExprs, 2694 SourceLocation RParenLoc) { 2695 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2696 } 2697 2698 /// Build a new address-of-label expression. 2699 /// 2700 /// By default, performs semantic analysis, using the name of the label 2701 /// rather than attempting to map the label statement itself. 2702 /// Subclasses may override this routine to provide different behavior. 2703 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2704 SourceLocation LabelLoc, LabelDecl *Label) { 2705 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2706 } 2707 2708 /// Build a new GNU statement expression. 2709 /// 2710 /// By default, performs semantic analysis to build the new expression. 2711 /// Subclasses may override this routine to provide different behavior. 2712 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2713 SourceLocation RParenLoc, unsigned TemplateDepth) { 2714 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2715 TemplateDepth); 2716 } 2717 2718 /// Build a new __builtin_choose_expr expression. 2719 /// 2720 /// By default, performs semantic analysis to build the new expression. 2721 /// Subclasses may override this routine to provide different behavior. 2722 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2723 Expr *Cond, Expr *LHS, Expr *RHS, 2724 SourceLocation RParenLoc) { 2725 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2726 Cond, LHS, RHS, 2727 RParenLoc); 2728 } 2729 2730 /// Build a new generic selection expression. 2731 /// 2732 /// By default, performs semantic analysis to build the new expression. 2733 /// Subclasses may override this routine to provide different behavior. 2734 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2735 SourceLocation DefaultLoc, 2736 SourceLocation RParenLoc, 2737 Expr *ControllingExpr, 2738 ArrayRef<TypeSourceInfo *> Types, 2739 ArrayRef<Expr *> Exprs) { 2740 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2741 ControllingExpr, Types, Exprs); 2742 } 2743 2744 /// Build a new overloaded operator call expression. 2745 /// 2746 /// By default, performs semantic analysis to build the new expression. 2747 /// The semantic analysis provides the behavior of template instantiation, 2748 /// copying with transformations that turn what looks like an overloaded 2749 /// operator call into a use of a builtin operator, performing 2750 /// argument-dependent lookup, etc. Subclasses may override this routine to 2751 /// provide different behavior. 2752 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2753 SourceLocation OpLoc, 2754 Expr *Callee, 2755 Expr *First, 2756 Expr *Second); 2757 2758 /// Build a new C++ "named" cast expression, such as static_cast or 2759 /// reinterpret_cast. 2760 /// 2761 /// By default, this routine dispatches to one of the more-specific routines 2762 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2763 /// Subclasses may override this routine to provide different behavior. 2764 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2765 Stmt::StmtClass Class, 2766 SourceLocation LAngleLoc, 2767 TypeSourceInfo *TInfo, 2768 SourceLocation RAngleLoc, 2769 SourceLocation LParenLoc, 2770 Expr *SubExpr, 2771 SourceLocation RParenLoc) { 2772 switch (Class) { 2773 case Stmt::CXXStaticCastExprClass: 2774 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2775 RAngleLoc, LParenLoc, 2776 SubExpr, RParenLoc); 2777 2778 case Stmt::CXXDynamicCastExprClass: 2779 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2780 RAngleLoc, LParenLoc, 2781 SubExpr, RParenLoc); 2782 2783 case Stmt::CXXReinterpretCastExprClass: 2784 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2785 RAngleLoc, LParenLoc, 2786 SubExpr, 2787 RParenLoc); 2788 2789 case Stmt::CXXConstCastExprClass: 2790 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2791 RAngleLoc, LParenLoc, 2792 SubExpr, RParenLoc); 2793 2794 case Stmt::CXXAddrspaceCastExprClass: 2795 return getDerived().RebuildCXXAddrspaceCastExpr( 2796 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2797 2798 default: 2799 llvm_unreachable("Invalid C++ named cast"); 2800 } 2801 } 2802 2803 /// Build a new C++ static_cast expression. 2804 /// 2805 /// By default, performs semantic analysis to build the new expression. 2806 /// Subclasses may override this routine to provide different behavior. 2807 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2808 SourceLocation LAngleLoc, 2809 TypeSourceInfo *TInfo, 2810 SourceLocation RAngleLoc, 2811 SourceLocation LParenLoc, 2812 Expr *SubExpr, 2813 SourceLocation RParenLoc) { 2814 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2815 TInfo, SubExpr, 2816 SourceRange(LAngleLoc, RAngleLoc), 2817 SourceRange(LParenLoc, RParenLoc)); 2818 } 2819 2820 /// Build a new C++ dynamic_cast expression. 2821 /// 2822 /// By default, performs semantic analysis to build the new expression. 2823 /// Subclasses may override this routine to provide different behavior. 2824 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2825 SourceLocation LAngleLoc, 2826 TypeSourceInfo *TInfo, 2827 SourceLocation RAngleLoc, 2828 SourceLocation LParenLoc, 2829 Expr *SubExpr, 2830 SourceLocation RParenLoc) { 2831 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2832 TInfo, SubExpr, 2833 SourceRange(LAngleLoc, RAngleLoc), 2834 SourceRange(LParenLoc, RParenLoc)); 2835 } 2836 2837 /// Build a new C++ reinterpret_cast expression. 2838 /// 2839 /// By default, performs semantic analysis to build the new expression. 2840 /// Subclasses may override this routine to provide different behavior. 2841 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2842 SourceLocation LAngleLoc, 2843 TypeSourceInfo *TInfo, 2844 SourceLocation RAngleLoc, 2845 SourceLocation LParenLoc, 2846 Expr *SubExpr, 2847 SourceLocation RParenLoc) { 2848 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2849 TInfo, SubExpr, 2850 SourceRange(LAngleLoc, RAngleLoc), 2851 SourceRange(LParenLoc, RParenLoc)); 2852 } 2853 2854 /// Build a new C++ const_cast expression. 2855 /// 2856 /// By default, performs semantic analysis to build the new expression. 2857 /// Subclasses may override this routine to provide different behavior. 2858 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2859 SourceLocation LAngleLoc, 2860 TypeSourceInfo *TInfo, 2861 SourceLocation RAngleLoc, 2862 SourceLocation LParenLoc, 2863 Expr *SubExpr, 2864 SourceLocation RParenLoc) { 2865 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2866 TInfo, SubExpr, 2867 SourceRange(LAngleLoc, RAngleLoc), 2868 SourceRange(LParenLoc, RParenLoc)); 2869 } 2870 2871 ExprResult 2872 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2873 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2874 SourceLocation LParenLoc, Expr *SubExpr, 2875 SourceLocation RParenLoc) { 2876 return getSema().BuildCXXNamedCast( 2877 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2878 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2879 } 2880 2881 /// Build a new C++ functional-style cast expression. 2882 /// 2883 /// By default, performs semantic analysis to build the new expression. 2884 /// Subclasses may override this routine to provide different behavior. 2885 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2886 SourceLocation LParenLoc, 2887 Expr *Sub, 2888 SourceLocation RParenLoc, 2889 bool ListInitialization) { 2890 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2891 MultiExprArg(&Sub, 1), RParenLoc, 2892 ListInitialization); 2893 } 2894 2895 /// Build a new C++ __builtin_bit_cast expression. 2896 /// 2897 /// By default, performs semantic analysis to build the new expression. 2898 /// Subclasses may override this routine to provide different behavior. 2899 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2900 TypeSourceInfo *TSI, Expr *Sub, 2901 SourceLocation RParenLoc) { 2902 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2903 } 2904 2905 /// Build a new C++ typeid(type) expression. 2906 /// 2907 /// By default, performs semantic analysis to build the new expression. 2908 /// Subclasses may override this routine to provide different behavior. 2909 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2910 SourceLocation TypeidLoc, 2911 TypeSourceInfo *Operand, 2912 SourceLocation RParenLoc) { 2913 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2914 RParenLoc); 2915 } 2916 2917 2918 /// Build a new C++ typeid(expr) expression. 2919 /// 2920 /// By default, performs semantic analysis to build the new expression. 2921 /// Subclasses may override this routine to provide different behavior. 2922 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2923 SourceLocation TypeidLoc, 2924 Expr *Operand, 2925 SourceLocation RParenLoc) { 2926 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2927 RParenLoc); 2928 } 2929 2930 /// Build a new C++ __uuidof(type) 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 RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2935 TypeSourceInfo *Operand, 2936 SourceLocation RParenLoc) { 2937 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2938 } 2939 2940 /// Build a new C++ __uuidof(expr) expression. 2941 /// 2942 /// By default, performs semantic analysis to build the new expression. 2943 /// Subclasses may override this routine to provide different behavior. 2944 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2945 Expr *Operand, SourceLocation RParenLoc) { 2946 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2947 } 2948 2949 /// Build a new C++ "this" expression. 2950 /// 2951 /// By default, builds a new "this" expression without performing any 2952 /// semantic analysis. Subclasses may override this routine to provide 2953 /// different behavior. 2954 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2955 QualType ThisType, 2956 bool isImplicit) { 2957 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 2958 } 2959 2960 /// Build a new C++ throw expression. 2961 /// 2962 /// By default, performs semantic analysis to build the new expression. 2963 /// Subclasses may override this routine to provide different behavior. 2964 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2965 bool IsThrownVariableInScope) { 2966 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2967 } 2968 2969 /// Build a new C++ default-argument expression. 2970 /// 2971 /// By default, builds a new default-argument expression, which does not 2972 /// require any semantic analysis. Subclasses may override this routine to 2973 /// provide different behavior. 2974 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 2975 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 2976 getSema().CurContext); 2977 } 2978 2979 /// Build a new C++11 default-initialization expression. 2980 /// 2981 /// By default, builds a new default field initialization expression, which 2982 /// does not require any semantic analysis. Subclasses may override this 2983 /// routine to provide different behavior. 2984 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2985 FieldDecl *Field) { 2986 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 2987 getSema().CurContext); 2988 } 2989 2990 /// Build a new C++ zero-initialization expression. 2991 /// 2992 /// By default, performs semantic analysis to build the new expression. 2993 /// Subclasses may override this routine to provide different behavior. 2994 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2995 SourceLocation LParenLoc, 2996 SourceLocation RParenLoc) { 2997 return getSema().BuildCXXTypeConstructExpr( 2998 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2999 } 3000 3001 /// Build a new C++ "new" expression. 3002 /// 3003 /// By default, performs semantic analysis to build the new expression. 3004 /// Subclasses may override this routine to provide different behavior. 3005 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3006 bool UseGlobal, 3007 SourceLocation PlacementLParen, 3008 MultiExprArg PlacementArgs, 3009 SourceLocation PlacementRParen, 3010 SourceRange TypeIdParens, 3011 QualType AllocatedType, 3012 TypeSourceInfo *AllocatedTypeInfo, 3013 Optional<Expr *> ArraySize, 3014 SourceRange DirectInitRange, 3015 Expr *Initializer) { 3016 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3017 PlacementLParen, 3018 PlacementArgs, 3019 PlacementRParen, 3020 TypeIdParens, 3021 AllocatedType, 3022 AllocatedTypeInfo, 3023 ArraySize, 3024 DirectInitRange, 3025 Initializer); 3026 } 3027 3028 /// Build a new C++ "delete" expression. 3029 /// 3030 /// By default, performs semantic analysis to build the new expression. 3031 /// Subclasses may override this routine to provide different behavior. 3032 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3033 bool IsGlobalDelete, 3034 bool IsArrayForm, 3035 Expr *Operand) { 3036 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3037 Operand); 3038 } 3039 3040 /// Build a new type trait expression. 3041 /// 3042 /// By default, performs semantic analysis to build the new expression. 3043 /// Subclasses may override this routine to provide different behavior. 3044 ExprResult RebuildTypeTrait(TypeTrait Trait, 3045 SourceLocation StartLoc, 3046 ArrayRef<TypeSourceInfo *> Args, 3047 SourceLocation RParenLoc) { 3048 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3049 } 3050 3051 /// Build a new array type trait expression. 3052 /// 3053 /// By default, performs semantic analysis to build the new expression. 3054 /// Subclasses may override this routine to provide different behavior. 3055 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3056 SourceLocation StartLoc, 3057 TypeSourceInfo *TSInfo, 3058 Expr *DimExpr, 3059 SourceLocation RParenLoc) { 3060 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3061 } 3062 3063 /// Build a new expression trait expression. 3064 /// 3065 /// By default, performs semantic analysis to build the new expression. 3066 /// Subclasses may override this routine to provide different behavior. 3067 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3068 SourceLocation StartLoc, 3069 Expr *Queried, 3070 SourceLocation RParenLoc) { 3071 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3072 } 3073 3074 /// Build a new (previously unresolved) declaration reference 3075 /// expression. 3076 /// 3077 /// By default, performs semantic analysis to build the new expression. 3078 /// Subclasses may override this routine to provide different behavior. 3079 ExprResult RebuildDependentScopeDeclRefExpr( 3080 NestedNameSpecifierLoc QualifierLoc, 3081 SourceLocation TemplateKWLoc, 3082 const DeclarationNameInfo &NameInfo, 3083 const TemplateArgumentListInfo *TemplateArgs, 3084 bool IsAddressOfOperand, 3085 TypeSourceInfo **RecoveryTSI) { 3086 CXXScopeSpec SS; 3087 SS.Adopt(QualifierLoc); 3088 3089 if (TemplateArgs || TemplateKWLoc.isValid()) 3090 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3091 TemplateArgs); 3092 3093 return getSema().BuildQualifiedDeclarationNameExpr( 3094 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3095 } 3096 3097 /// Build a new template-id expression. 3098 /// 3099 /// By default, performs semantic analysis to build the new expression. 3100 /// Subclasses may override this routine to provide different behavior. 3101 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3102 SourceLocation TemplateKWLoc, 3103 LookupResult &R, 3104 bool RequiresADL, 3105 const TemplateArgumentListInfo *TemplateArgs) { 3106 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3107 TemplateArgs); 3108 } 3109 3110 /// Build a new object-construction expression. 3111 /// 3112 /// By default, performs semantic analysis to build the new expression. 3113 /// Subclasses may override this routine to provide different behavior. 3114 ExprResult RebuildCXXConstructExpr(QualType T, 3115 SourceLocation Loc, 3116 CXXConstructorDecl *Constructor, 3117 bool IsElidable, 3118 MultiExprArg Args, 3119 bool HadMultipleCandidates, 3120 bool ListInitialization, 3121 bool StdInitListInitialization, 3122 bool RequiresZeroInit, 3123 CXXConstructExpr::ConstructionKind ConstructKind, 3124 SourceRange ParenRange) { 3125 // Reconstruct the constructor we originally found, which might be 3126 // different if this is a call to an inherited constructor. 3127 CXXConstructorDecl *FoundCtor = Constructor; 3128 if (Constructor->isInheritingConstructor()) 3129 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3130 3131 SmallVector<Expr*, 8> ConvertedArgs; 3132 if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs)) 3133 return ExprError(); 3134 3135 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3136 IsElidable, 3137 ConvertedArgs, 3138 HadMultipleCandidates, 3139 ListInitialization, 3140 StdInitListInitialization, 3141 RequiresZeroInit, ConstructKind, 3142 ParenRange); 3143 } 3144 3145 /// Build a new implicit construction via inherited constructor 3146 /// expression. 3147 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3148 CXXConstructorDecl *Constructor, 3149 bool ConstructsVBase, 3150 bool InheritedFromVBase) { 3151 return new (getSema().Context) CXXInheritedCtorInitExpr( 3152 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3153 } 3154 3155 /// Build a new object-construction expression. 3156 /// 3157 /// By default, performs semantic analysis to build the new expression. 3158 /// Subclasses may override this routine to provide different behavior. 3159 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3160 SourceLocation LParenOrBraceLoc, 3161 MultiExprArg Args, 3162 SourceLocation RParenOrBraceLoc, 3163 bool ListInitialization) { 3164 return getSema().BuildCXXTypeConstructExpr( 3165 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3166 } 3167 3168 /// Build a new object-construction 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 RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3173 SourceLocation LParenLoc, 3174 MultiExprArg Args, 3175 SourceLocation RParenLoc, 3176 bool ListInitialization) { 3177 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3178 RParenLoc, ListInitialization); 3179 } 3180 3181 /// Build a new member reference expression. 3182 /// 3183 /// By default, performs semantic analysis to build the new expression. 3184 /// Subclasses may override this routine to provide different behavior. 3185 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3186 QualType BaseType, 3187 bool IsArrow, 3188 SourceLocation OperatorLoc, 3189 NestedNameSpecifierLoc QualifierLoc, 3190 SourceLocation TemplateKWLoc, 3191 NamedDecl *FirstQualifierInScope, 3192 const DeclarationNameInfo &MemberNameInfo, 3193 const TemplateArgumentListInfo *TemplateArgs) { 3194 CXXScopeSpec SS; 3195 SS.Adopt(QualifierLoc); 3196 3197 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3198 OperatorLoc, IsArrow, 3199 SS, TemplateKWLoc, 3200 FirstQualifierInScope, 3201 MemberNameInfo, 3202 TemplateArgs, /*S*/nullptr); 3203 } 3204 3205 /// Build a new member reference expression. 3206 /// 3207 /// By default, performs semantic analysis to build the new expression. 3208 /// Subclasses may override this routine to provide different behavior. 3209 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3210 SourceLocation OperatorLoc, 3211 bool IsArrow, 3212 NestedNameSpecifierLoc QualifierLoc, 3213 SourceLocation TemplateKWLoc, 3214 NamedDecl *FirstQualifierInScope, 3215 LookupResult &R, 3216 const TemplateArgumentListInfo *TemplateArgs) { 3217 CXXScopeSpec SS; 3218 SS.Adopt(QualifierLoc); 3219 3220 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3221 OperatorLoc, IsArrow, 3222 SS, TemplateKWLoc, 3223 FirstQualifierInScope, 3224 R, TemplateArgs, /*S*/nullptr); 3225 } 3226 3227 /// Build a new noexcept expression. 3228 /// 3229 /// By default, performs semantic analysis to build the new expression. 3230 /// Subclasses may override this routine to provide different behavior. 3231 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3232 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3233 } 3234 3235 /// Build a new expression to compute the length of a parameter pack. 3236 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3237 NamedDecl *Pack, 3238 SourceLocation PackLoc, 3239 SourceLocation RParenLoc, 3240 Optional<unsigned> Length, 3241 ArrayRef<TemplateArgument> PartialArgs) { 3242 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3243 RParenLoc, Length, PartialArgs); 3244 } 3245 3246 /// Build a new expression representing a call to a source location 3247 /// builtin. 3248 /// 3249 /// By default, performs semantic analysis to build the new expression. 3250 /// Subclasses may override this routine to provide different behavior. 3251 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3252 SourceLocation BuiltinLoc, 3253 SourceLocation RPLoc, 3254 DeclContext *ParentContext) { 3255 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3256 } 3257 3258 /// Build a new Objective-C boxed expression. 3259 /// 3260 /// By default, performs semantic analysis to build the new expression. 3261 /// Subclasses may override this routine to provide different behavior. 3262 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3263 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3264 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3265 TemplateArgumentListInfo *TALI) { 3266 CXXScopeSpec SS; 3267 SS.Adopt(NNS); 3268 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3269 ConceptNameInfo, 3270 FoundDecl, 3271 NamedConcept, TALI); 3272 if (Result.isInvalid()) 3273 return ExprError(); 3274 return Result; 3275 } 3276 3277 /// \brief Build a new requires expression. 3278 /// 3279 /// By default, performs semantic analysis to build the new expression. 3280 /// Subclasses may override this routine to provide different behavior. 3281 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3282 RequiresExprBodyDecl *Body, 3283 ArrayRef<ParmVarDecl *> LocalParameters, 3284 ArrayRef<concepts::Requirement *> Requirements, 3285 SourceLocation ClosingBraceLoc) { 3286 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3287 LocalParameters, Requirements, ClosingBraceLoc); 3288 } 3289 3290 concepts::TypeRequirement * 3291 RebuildTypeRequirement( 3292 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3293 return SemaRef.BuildTypeRequirement(SubstDiag); 3294 } 3295 3296 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3297 return SemaRef.BuildTypeRequirement(T); 3298 } 3299 3300 concepts::ExprRequirement * 3301 RebuildExprRequirement( 3302 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3303 SourceLocation NoexceptLoc, 3304 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3305 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3306 std::move(Ret)); 3307 } 3308 3309 concepts::ExprRequirement * 3310 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3311 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3312 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3313 std::move(Ret)); 3314 } 3315 3316 concepts::NestedRequirement * 3317 RebuildNestedRequirement( 3318 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3319 return SemaRef.BuildNestedRequirement(SubstDiag); 3320 } 3321 3322 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3323 return SemaRef.BuildNestedRequirement(Constraint); 3324 } 3325 3326 /// \brief Build a new Objective-C boxed expression. 3327 /// 3328 /// By default, performs semantic analysis to build the new expression. 3329 /// Subclasses may override this routine to provide different behavior. 3330 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3331 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3332 } 3333 3334 /// Build a new Objective-C array literal. 3335 /// 3336 /// By default, performs semantic analysis to build the new expression. 3337 /// Subclasses may override this routine to provide different behavior. 3338 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3339 Expr **Elements, unsigned NumElements) { 3340 return getSema().BuildObjCArrayLiteral(Range, 3341 MultiExprArg(Elements, NumElements)); 3342 } 3343 3344 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3345 Expr *Base, Expr *Key, 3346 ObjCMethodDecl *getterMethod, 3347 ObjCMethodDecl *setterMethod) { 3348 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3349 getterMethod, setterMethod); 3350 } 3351 3352 /// Build a new Objective-C dictionary literal. 3353 /// 3354 /// By default, performs semantic analysis to build the new expression. 3355 /// Subclasses may override this routine to provide different behavior. 3356 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3357 MutableArrayRef<ObjCDictionaryElement> Elements) { 3358 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3359 } 3360 3361 /// Build a new Objective-C \@encode expression. 3362 /// 3363 /// By default, performs semantic analysis to build the new expression. 3364 /// Subclasses may override this routine to provide different behavior. 3365 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3366 TypeSourceInfo *EncodeTypeInfo, 3367 SourceLocation RParenLoc) { 3368 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3369 } 3370 3371 /// Build a new Objective-C class message. 3372 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3373 Selector Sel, 3374 ArrayRef<SourceLocation> SelectorLocs, 3375 ObjCMethodDecl *Method, 3376 SourceLocation LBracLoc, 3377 MultiExprArg Args, 3378 SourceLocation RBracLoc) { 3379 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3380 ReceiverTypeInfo->getType(), 3381 /*SuperLoc=*/SourceLocation(), 3382 Sel, Method, LBracLoc, SelectorLocs, 3383 RBracLoc, Args); 3384 } 3385 3386 /// Build a new Objective-C instance message. 3387 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3388 Selector Sel, 3389 ArrayRef<SourceLocation> SelectorLocs, 3390 ObjCMethodDecl *Method, 3391 SourceLocation LBracLoc, 3392 MultiExprArg Args, 3393 SourceLocation RBracLoc) { 3394 return SemaRef.BuildInstanceMessage(Receiver, 3395 Receiver->getType(), 3396 /*SuperLoc=*/SourceLocation(), 3397 Sel, Method, LBracLoc, SelectorLocs, 3398 RBracLoc, Args); 3399 } 3400 3401 /// Build a new Objective-C instance/class message to 'super'. 3402 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3403 Selector Sel, 3404 ArrayRef<SourceLocation> SelectorLocs, 3405 QualType SuperType, 3406 ObjCMethodDecl *Method, 3407 SourceLocation LBracLoc, 3408 MultiExprArg Args, 3409 SourceLocation RBracLoc) { 3410 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3411 SuperType, 3412 SuperLoc, 3413 Sel, Method, LBracLoc, SelectorLocs, 3414 RBracLoc, Args) 3415 : SemaRef.BuildClassMessage(nullptr, 3416 SuperType, 3417 SuperLoc, 3418 Sel, Method, LBracLoc, SelectorLocs, 3419 RBracLoc, Args); 3420 3421 3422 } 3423 3424 /// Build a new Objective-C ivar reference expression. 3425 /// 3426 /// By default, performs semantic analysis to build the new expression. 3427 /// Subclasses may override this routine to provide different behavior. 3428 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3429 SourceLocation IvarLoc, 3430 bool IsArrow, bool IsFreeIvar) { 3431 CXXScopeSpec SS; 3432 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3433 ExprResult Result = getSema().BuildMemberReferenceExpr( 3434 BaseArg, BaseArg->getType(), 3435 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3436 /*FirstQualifierInScope=*/nullptr, NameInfo, 3437 /*TemplateArgs=*/nullptr, 3438 /*S=*/nullptr); 3439 if (IsFreeIvar && Result.isUsable()) 3440 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3441 return Result; 3442 } 3443 3444 /// Build a new Objective-C property reference expression. 3445 /// 3446 /// By default, performs semantic analysis to build the new expression. 3447 /// Subclasses may override this routine to provide different behavior. 3448 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3449 ObjCPropertyDecl *Property, 3450 SourceLocation PropertyLoc) { 3451 CXXScopeSpec SS; 3452 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3453 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3454 /*FIXME:*/PropertyLoc, 3455 /*IsArrow=*/false, 3456 SS, SourceLocation(), 3457 /*FirstQualifierInScope=*/nullptr, 3458 NameInfo, 3459 /*TemplateArgs=*/nullptr, 3460 /*S=*/nullptr); 3461 } 3462 3463 /// Build a new Objective-C property reference expression. 3464 /// 3465 /// By default, performs semantic analysis to build the new expression. 3466 /// Subclasses may override this routine to provide different behavior. 3467 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3468 ObjCMethodDecl *Getter, 3469 ObjCMethodDecl *Setter, 3470 SourceLocation PropertyLoc) { 3471 // Since these expressions can only be value-dependent, we do not 3472 // need to perform semantic analysis again. 3473 return Owned( 3474 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3475 VK_LValue, OK_ObjCProperty, 3476 PropertyLoc, Base)); 3477 } 3478 3479 /// Build a new Objective-C "isa" expression. 3480 /// 3481 /// By default, performs semantic analysis to build the new expression. 3482 /// Subclasses may override this routine to provide different behavior. 3483 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3484 SourceLocation OpLoc, bool IsArrow) { 3485 CXXScopeSpec SS; 3486 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3487 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3488 OpLoc, IsArrow, 3489 SS, SourceLocation(), 3490 /*FirstQualifierInScope=*/nullptr, 3491 NameInfo, 3492 /*TemplateArgs=*/nullptr, 3493 /*S=*/nullptr); 3494 } 3495 3496 /// Build a new shuffle vector expression. 3497 /// 3498 /// By default, performs semantic analysis to build the new expression. 3499 /// Subclasses may override this routine to provide different behavior. 3500 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3501 MultiExprArg SubExprs, 3502 SourceLocation RParenLoc) { 3503 // Find the declaration for __builtin_shufflevector 3504 const IdentifierInfo &Name 3505 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3506 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3507 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3508 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3509 3510 // Build a reference to the __builtin_shufflevector builtin 3511 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3512 Expr *Callee = new (SemaRef.Context) 3513 DeclRefExpr(SemaRef.Context, Builtin, false, 3514 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3515 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3516 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3517 CK_BuiltinFnToFnPtr).get(); 3518 3519 // Build the CallExpr 3520 ExprResult TheCall = CallExpr::Create( 3521 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3522 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3523 FPOptionsOverride()); 3524 3525 // Type-check the __builtin_shufflevector expression. 3526 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3527 } 3528 3529 /// Build a new convert vector expression. 3530 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3531 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3532 SourceLocation RParenLoc) { 3533 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3534 BuiltinLoc, RParenLoc); 3535 } 3536 3537 /// Build a new template argument pack expansion. 3538 /// 3539 /// By default, performs semantic analysis to build a new pack expansion 3540 /// for a template argument. Subclasses may override this routine to provide 3541 /// different behavior. 3542 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3543 SourceLocation EllipsisLoc, 3544 Optional<unsigned> NumExpansions) { 3545 switch (Pattern.getArgument().getKind()) { 3546 case TemplateArgument::Expression: { 3547 ExprResult Result 3548 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3549 EllipsisLoc, NumExpansions); 3550 if (Result.isInvalid()) 3551 return TemplateArgumentLoc(); 3552 3553 return TemplateArgumentLoc(Result.get(), Result.get()); 3554 } 3555 3556 case TemplateArgument::Template: 3557 return TemplateArgumentLoc( 3558 SemaRef.Context, 3559 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3560 NumExpansions), 3561 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3562 EllipsisLoc); 3563 3564 case TemplateArgument::Null: 3565 case TemplateArgument::Integral: 3566 case TemplateArgument::Declaration: 3567 case TemplateArgument::Pack: 3568 case TemplateArgument::TemplateExpansion: 3569 case TemplateArgument::NullPtr: 3570 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3571 3572 case TemplateArgument::Type: 3573 if (TypeSourceInfo *Expansion 3574 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3575 EllipsisLoc, 3576 NumExpansions)) 3577 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3578 Expansion); 3579 break; 3580 } 3581 3582 return TemplateArgumentLoc(); 3583 } 3584 3585 /// Build a new expression pack expansion. 3586 /// 3587 /// By default, performs semantic analysis to build a new pack expansion 3588 /// for an expression. Subclasses may override this routine to provide 3589 /// different behavior. 3590 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3591 Optional<unsigned> NumExpansions) { 3592 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3593 } 3594 3595 /// Build a new C++1z fold-expression. 3596 /// 3597 /// By default, performs semantic analysis in order to build a new fold 3598 /// expression. 3599 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3600 SourceLocation LParenLoc, Expr *LHS, 3601 BinaryOperatorKind Operator, 3602 SourceLocation EllipsisLoc, Expr *RHS, 3603 SourceLocation RParenLoc, 3604 Optional<unsigned> NumExpansions) { 3605 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3606 EllipsisLoc, RHS, RParenLoc, 3607 NumExpansions); 3608 } 3609 3610 /// Build an empty C++1z fold-expression with the given operator. 3611 /// 3612 /// By default, produces the fallback value for the fold-expression, or 3613 /// produce an error if there is no fallback value. 3614 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3615 BinaryOperatorKind Operator) { 3616 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3617 } 3618 3619 /// Build a new atomic operation expression. 3620 /// 3621 /// By default, performs semantic analysis to build the new expression. 3622 /// Subclasses may override this routine to provide different behavior. 3623 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3624 AtomicExpr::AtomicOp Op, 3625 SourceLocation RParenLoc) { 3626 // Use this for all of the locations, since we don't know the difference 3627 // between the call and the expr at this point. 3628 SourceRange Range{BuiltinLoc, RParenLoc}; 3629 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3630 Sema::AtomicArgumentOrder::AST); 3631 } 3632 3633 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3634 ArrayRef<Expr *> SubExprs, QualType Type) { 3635 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3636 } 3637 3638 private: 3639 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3640 QualType ObjectType, 3641 NamedDecl *FirstQualifierInScope, 3642 CXXScopeSpec &SS); 3643 3644 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3645 QualType ObjectType, 3646 NamedDecl *FirstQualifierInScope, 3647 CXXScopeSpec &SS); 3648 3649 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3650 NamedDecl *FirstQualifierInScope, 3651 CXXScopeSpec &SS); 3652 3653 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3654 DependentNameTypeLoc TL, 3655 bool DeducibleTSTContext); 3656 }; 3657 3658 template <typename Derived> 3659 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3660 if (!S) 3661 return S; 3662 3663 switch (S->getStmtClass()) { 3664 case Stmt::NoStmtClass: break; 3665 3666 // Transform individual statement nodes 3667 // Pass SDK into statements that can produce a value 3668 #define STMT(Node, Parent) \ 3669 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3670 #define VALUESTMT(Node, Parent) \ 3671 case Stmt::Node##Class: \ 3672 return getDerived().Transform##Node(cast<Node>(S), SDK); 3673 #define ABSTRACT_STMT(Node) 3674 #define EXPR(Node, Parent) 3675 #include "clang/AST/StmtNodes.inc" 3676 3677 // Transform expressions by calling TransformExpr. 3678 #define STMT(Node, Parent) 3679 #define ABSTRACT_STMT(Stmt) 3680 #define EXPR(Node, Parent) case Stmt::Node##Class: 3681 #include "clang/AST/StmtNodes.inc" 3682 { 3683 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3684 3685 if (SDK == SDK_StmtExprResult) 3686 E = getSema().ActOnStmtExprResult(E); 3687 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3688 } 3689 } 3690 3691 return S; 3692 } 3693 3694 template<typename Derived> 3695 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3696 if (!S) 3697 return S; 3698 3699 switch (S->getClauseKind()) { 3700 default: break; 3701 // Transform individual clause nodes 3702 #define GEN_CLANG_CLAUSE_CLASS 3703 #define CLAUSE_CLASS(Enum, Str, Class) \ 3704 case Enum: \ 3705 return getDerived().Transform##Class(cast<Class>(S)); 3706 #include "llvm/Frontend/OpenMP/OMP.inc" 3707 } 3708 3709 return S; 3710 } 3711 3712 3713 template<typename Derived> 3714 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3715 if (!E) 3716 return E; 3717 3718 switch (E->getStmtClass()) { 3719 case Stmt::NoStmtClass: break; 3720 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3721 #define ABSTRACT_STMT(Stmt) 3722 #define EXPR(Node, Parent) \ 3723 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3724 #include "clang/AST/StmtNodes.inc" 3725 } 3726 3727 return E; 3728 } 3729 3730 template<typename Derived> 3731 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3732 bool NotCopyInit) { 3733 // Initializers are instantiated like expressions, except that various outer 3734 // layers are stripped. 3735 if (!Init) 3736 return Init; 3737 3738 if (auto *FE = dyn_cast<FullExpr>(Init)) 3739 Init = FE->getSubExpr(); 3740 3741 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3742 Init = AIL->getCommonExpr(); 3743 3744 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3745 Init = MTE->getSubExpr(); 3746 3747 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3748 Init = Binder->getSubExpr(); 3749 3750 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3751 Init = ICE->getSubExprAsWritten(); 3752 3753 if (CXXStdInitializerListExpr *ILE = 3754 dyn_cast<CXXStdInitializerListExpr>(Init)) 3755 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3756 3757 // If this is copy-initialization, we only need to reconstruct 3758 // InitListExprs. Other forms of copy-initialization will be a no-op if 3759 // the initializer is already the right type. 3760 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3761 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3762 return getDerived().TransformExpr(Init); 3763 3764 // Revert value-initialization back to empty parens. 3765 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3766 SourceRange Parens = VIE->getSourceRange(); 3767 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3768 Parens.getEnd()); 3769 } 3770 3771 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3772 if (isa<ImplicitValueInitExpr>(Init)) 3773 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3774 SourceLocation()); 3775 3776 // Revert initialization by constructor back to a parenthesized or braced list 3777 // of expressions. Any other form of initializer can just be reused directly. 3778 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3779 return getDerived().TransformExpr(Init); 3780 3781 // If the initialization implicitly converted an initializer list to a 3782 // std::initializer_list object, unwrap the std::initializer_list too. 3783 if (Construct && Construct->isStdInitListInitialization()) 3784 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3785 3786 // Enter a list-init context if this was list initialization. 3787 EnterExpressionEvaluationContext Context( 3788 getSema(), EnterExpressionEvaluationContext::InitList, 3789 Construct->isListInitialization()); 3790 3791 SmallVector<Expr*, 8> NewArgs; 3792 bool ArgChanged = false; 3793 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3794 /*IsCall*/true, NewArgs, &ArgChanged)) 3795 return ExprError(); 3796 3797 // If this was list initialization, revert to syntactic list form. 3798 if (Construct->isListInitialization()) 3799 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3800 Construct->getEndLoc()); 3801 3802 // Build a ParenListExpr to represent anything else. 3803 SourceRange Parens = Construct->getParenOrBraceRange(); 3804 if (Parens.isInvalid()) { 3805 // This was a variable declaration's initialization for which no initializer 3806 // was specified. 3807 assert(NewArgs.empty() && 3808 "no parens or braces but have direct init with arguments?"); 3809 return ExprEmpty(); 3810 } 3811 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3812 Parens.getEnd()); 3813 } 3814 3815 template<typename Derived> 3816 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3817 unsigned NumInputs, 3818 bool IsCall, 3819 SmallVectorImpl<Expr *> &Outputs, 3820 bool *ArgChanged) { 3821 for (unsigned I = 0; I != NumInputs; ++I) { 3822 // If requested, drop call arguments that need to be dropped. 3823 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3824 if (ArgChanged) 3825 *ArgChanged = true; 3826 3827 break; 3828 } 3829 3830 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3831 Expr *Pattern = Expansion->getPattern(); 3832 3833 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3834 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3835 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3836 3837 // Determine whether the set of unexpanded parameter packs can and should 3838 // be expanded. 3839 bool Expand = true; 3840 bool RetainExpansion = false; 3841 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3842 Optional<unsigned> NumExpansions = OrigNumExpansions; 3843 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3844 Pattern->getSourceRange(), 3845 Unexpanded, 3846 Expand, RetainExpansion, 3847 NumExpansions)) 3848 return true; 3849 3850 if (!Expand) { 3851 // The transform has determined that we should perform a simple 3852 // transformation on the pack expansion, producing another pack 3853 // expansion. 3854 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3855 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3856 if (OutPattern.isInvalid()) 3857 return true; 3858 3859 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3860 Expansion->getEllipsisLoc(), 3861 NumExpansions); 3862 if (Out.isInvalid()) 3863 return true; 3864 3865 if (ArgChanged) 3866 *ArgChanged = true; 3867 Outputs.push_back(Out.get()); 3868 continue; 3869 } 3870 3871 // Record right away that the argument was changed. This needs 3872 // to happen even if the array expands to nothing. 3873 if (ArgChanged) *ArgChanged = true; 3874 3875 // The transform has determined that we should perform an elementwise 3876 // expansion of the pattern. Do so. 3877 for (unsigned I = 0; I != *NumExpansions; ++I) { 3878 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3879 ExprResult Out = getDerived().TransformExpr(Pattern); 3880 if (Out.isInvalid()) 3881 return true; 3882 3883 if (Out.get()->containsUnexpandedParameterPack()) { 3884 Out = getDerived().RebuildPackExpansion( 3885 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3886 if (Out.isInvalid()) 3887 return true; 3888 } 3889 3890 Outputs.push_back(Out.get()); 3891 } 3892 3893 // If we're supposed to retain a pack expansion, do so by temporarily 3894 // forgetting the partially-substituted parameter pack. 3895 if (RetainExpansion) { 3896 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3897 3898 ExprResult Out = getDerived().TransformExpr(Pattern); 3899 if (Out.isInvalid()) 3900 return true; 3901 3902 Out = getDerived().RebuildPackExpansion( 3903 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3904 if (Out.isInvalid()) 3905 return true; 3906 3907 Outputs.push_back(Out.get()); 3908 } 3909 3910 continue; 3911 } 3912 3913 ExprResult Result = 3914 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3915 : getDerived().TransformExpr(Inputs[I]); 3916 if (Result.isInvalid()) 3917 return true; 3918 3919 if (Result.get() != Inputs[I] && ArgChanged) 3920 *ArgChanged = true; 3921 3922 Outputs.push_back(Result.get()); 3923 } 3924 3925 return false; 3926 } 3927 3928 template <typename Derived> 3929 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3930 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3931 if (Var) { 3932 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3933 getDerived().TransformDefinition(Var->getLocation(), Var)); 3934 3935 if (!ConditionVar) 3936 return Sema::ConditionError(); 3937 3938 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3939 } 3940 3941 if (Expr) { 3942 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3943 3944 if (CondExpr.isInvalid()) 3945 return Sema::ConditionError(); 3946 3947 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3948 } 3949 3950 return Sema::ConditionResult(); 3951 } 3952 3953 template<typename Derived> 3954 NestedNameSpecifierLoc 3955 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3956 NestedNameSpecifierLoc NNS, 3957 QualType ObjectType, 3958 NamedDecl *FirstQualifierInScope) { 3959 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3960 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3961 Qualifier = Qualifier.getPrefix()) 3962 Qualifiers.push_back(Qualifier); 3963 3964 CXXScopeSpec SS; 3965 while (!Qualifiers.empty()) { 3966 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3967 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3968 3969 switch (QNNS->getKind()) { 3970 case NestedNameSpecifier::Identifier: { 3971 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3972 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3973 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3974 SS, FirstQualifierInScope, false)) 3975 return NestedNameSpecifierLoc(); 3976 } 3977 break; 3978 3979 case NestedNameSpecifier::Namespace: { 3980 NamespaceDecl *NS 3981 = cast_or_null<NamespaceDecl>( 3982 getDerived().TransformDecl( 3983 Q.getLocalBeginLoc(), 3984 QNNS->getAsNamespace())); 3985 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3986 break; 3987 } 3988 3989 case NestedNameSpecifier::NamespaceAlias: { 3990 NamespaceAliasDecl *Alias 3991 = cast_or_null<NamespaceAliasDecl>( 3992 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3993 QNNS->getAsNamespaceAlias())); 3994 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3995 Q.getLocalEndLoc()); 3996 break; 3997 } 3998 3999 case NestedNameSpecifier::Global: 4000 // There is no meaningful transformation that one could perform on the 4001 // global scope. 4002 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4003 break; 4004 4005 case NestedNameSpecifier::Super: { 4006 CXXRecordDecl *RD = 4007 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4008 SourceLocation(), QNNS->getAsRecordDecl())); 4009 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4010 break; 4011 } 4012 4013 case NestedNameSpecifier::TypeSpecWithTemplate: 4014 case NestedNameSpecifier::TypeSpec: { 4015 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4016 FirstQualifierInScope, SS); 4017 4018 if (!TL) 4019 return NestedNameSpecifierLoc(); 4020 4021 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4022 (SemaRef.getLangOpts().CPlusPlus11 && 4023 TL.getType()->isEnumeralType())) { 4024 assert(!TL.getType().hasLocalQualifiers() && 4025 "Can't get cv-qualifiers here"); 4026 if (TL.getType()->isEnumeralType()) 4027 SemaRef.Diag(TL.getBeginLoc(), 4028 diag::warn_cxx98_compat_enum_nested_name_spec); 4029 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 4030 Q.getLocalEndLoc()); 4031 break; 4032 } 4033 // If the nested-name-specifier is an invalid type def, don't emit an 4034 // error because a previous error should have already been emitted. 4035 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4036 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4037 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4038 << TL.getType() << SS.getRange(); 4039 } 4040 return NestedNameSpecifierLoc(); 4041 } 4042 } 4043 4044 // The qualifier-in-scope and object type only apply to the leftmost entity. 4045 FirstQualifierInScope = nullptr; 4046 ObjectType = QualType(); 4047 } 4048 4049 // Don't rebuild the nested-name-specifier if we don't have to. 4050 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4051 !getDerived().AlwaysRebuild()) 4052 return NNS; 4053 4054 // If we can re-use the source-location data from the original 4055 // nested-name-specifier, do so. 4056 if (SS.location_size() == NNS.getDataLength() && 4057 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4058 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4059 4060 // Allocate new nested-name-specifier location information. 4061 return SS.getWithLocInContext(SemaRef.Context); 4062 } 4063 4064 template<typename Derived> 4065 DeclarationNameInfo 4066 TreeTransform<Derived> 4067 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4068 DeclarationName Name = NameInfo.getName(); 4069 if (!Name) 4070 return DeclarationNameInfo(); 4071 4072 switch (Name.getNameKind()) { 4073 case DeclarationName::Identifier: 4074 case DeclarationName::ObjCZeroArgSelector: 4075 case DeclarationName::ObjCOneArgSelector: 4076 case DeclarationName::ObjCMultiArgSelector: 4077 case DeclarationName::CXXOperatorName: 4078 case DeclarationName::CXXLiteralOperatorName: 4079 case DeclarationName::CXXUsingDirective: 4080 return NameInfo; 4081 4082 case DeclarationName::CXXDeductionGuideName: { 4083 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4084 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4085 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4086 if (!NewTemplate) 4087 return DeclarationNameInfo(); 4088 4089 DeclarationNameInfo NewNameInfo(NameInfo); 4090 NewNameInfo.setName( 4091 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4092 return NewNameInfo; 4093 } 4094 4095 case DeclarationName::CXXConstructorName: 4096 case DeclarationName::CXXDestructorName: 4097 case DeclarationName::CXXConversionFunctionName: { 4098 TypeSourceInfo *NewTInfo; 4099 CanQualType NewCanTy; 4100 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4101 NewTInfo = getDerived().TransformType(OldTInfo); 4102 if (!NewTInfo) 4103 return DeclarationNameInfo(); 4104 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4105 } 4106 else { 4107 NewTInfo = nullptr; 4108 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4109 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4110 if (NewT.isNull()) 4111 return DeclarationNameInfo(); 4112 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4113 } 4114 4115 DeclarationName NewName 4116 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4117 NewCanTy); 4118 DeclarationNameInfo NewNameInfo(NameInfo); 4119 NewNameInfo.setName(NewName); 4120 NewNameInfo.setNamedTypeInfo(NewTInfo); 4121 return NewNameInfo; 4122 } 4123 } 4124 4125 llvm_unreachable("Unknown name kind."); 4126 } 4127 4128 template<typename Derived> 4129 TemplateName 4130 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4131 TemplateName Name, 4132 SourceLocation NameLoc, 4133 QualType ObjectType, 4134 NamedDecl *FirstQualifierInScope, 4135 bool AllowInjectedClassName) { 4136 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4137 TemplateDecl *Template = QTN->getTemplateDecl(); 4138 assert(Template && "qualified template name must refer to a template"); 4139 4140 TemplateDecl *TransTemplate 4141 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4142 Template)); 4143 if (!TransTemplate) 4144 return TemplateName(); 4145 4146 if (!getDerived().AlwaysRebuild() && 4147 SS.getScopeRep() == QTN->getQualifier() && 4148 TransTemplate == Template) 4149 return Name; 4150 4151 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4152 TransTemplate); 4153 } 4154 4155 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4156 if (SS.getScopeRep()) { 4157 // These apply to the scope specifier, not the template. 4158 ObjectType = QualType(); 4159 FirstQualifierInScope = nullptr; 4160 } 4161 4162 if (!getDerived().AlwaysRebuild() && 4163 SS.getScopeRep() == DTN->getQualifier() && 4164 ObjectType.isNull()) 4165 return Name; 4166 4167 // FIXME: Preserve the location of the "template" keyword. 4168 SourceLocation TemplateKWLoc = NameLoc; 4169 4170 if (DTN->isIdentifier()) { 4171 return getDerived().RebuildTemplateName(SS, 4172 TemplateKWLoc, 4173 *DTN->getIdentifier(), 4174 NameLoc, 4175 ObjectType, 4176 FirstQualifierInScope, 4177 AllowInjectedClassName); 4178 } 4179 4180 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4181 DTN->getOperator(), NameLoc, 4182 ObjectType, AllowInjectedClassName); 4183 } 4184 4185 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4186 TemplateDecl *TransTemplate 4187 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4188 Template)); 4189 if (!TransTemplate) 4190 return TemplateName(); 4191 4192 if (!getDerived().AlwaysRebuild() && 4193 TransTemplate == Template) 4194 return Name; 4195 4196 return TemplateName(TransTemplate); 4197 } 4198 4199 if (SubstTemplateTemplateParmPackStorage *SubstPack 4200 = Name.getAsSubstTemplateTemplateParmPack()) { 4201 TemplateTemplateParmDecl *TransParam 4202 = cast_or_null<TemplateTemplateParmDecl>( 4203 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4204 if (!TransParam) 4205 return TemplateName(); 4206 4207 if (!getDerived().AlwaysRebuild() && 4208 TransParam == SubstPack->getParameterPack()) 4209 return Name; 4210 4211 return getDerived().RebuildTemplateName(TransParam, 4212 SubstPack->getArgumentPack()); 4213 } 4214 4215 // These should be getting filtered out before they reach the AST. 4216 llvm_unreachable("overloaded function decl survived to here"); 4217 } 4218 4219 template<typename Derived> 4220 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4221 const TemplateArgument &Arg, 4222 TemplateArgumentLoc &Output) { 4223 Output = getSema().getTrivialTemplateArgumentLoc( 4224 Arg, QualType(), getDerived().getBaseLocation()); 4225 } 4226 4227 template<typename Derived> 4228 bool TreeTransform<Derived>::TransformTemplateArgument( 4229 const TemplateArgumentLoc &Input, 4230 TemplateArgumentLoc &Output, bool Uneval) { 4231 const TemplateArgument &Arg = Input.getArgument(); 4232 switch (Arg.getKind()) { 4233 case TemplateArgument::Null: 4234 case TemplateArgument::Pack: 4235 llvm_unreachable("Unexpected TemplateArgument"); 4236 4237 case TemplateArgument::Integral: 4238 case TemplateArgument::NullPtr: 4239 case TemplateArgument::Declaration: { 4240 // Transform a resolved template argument straight to a resolved template 4241 // argument. We get here when substituting into an already-substituted 4242 // template type argument during concept satisfaction checking. 4243 QualType T = Arg.getNonTypeTemplateArgumentType(); 4244 QualType NewT = getDerived().TransformType(T); 4245 if (NewT.isNull()) 4246 return true; 4247 4248 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4249 ? Arg.getAsDecl() 4250 : nullptr; 4251 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4252 getDerived().getBaseLocation(), D)) 4253 : nullptr; 4254 if (D && !NewD) 4255 return true; 4256 4257 if (NewT == T && D == NewD) 4258 Output = Input; 4259 else if (Arg.getKind() == TemplateArgument::Integral) 4260 Output = TemplateArgumentLoc( 4261 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4262 TemplateArgumentLocInfo()); 4263 else if (Arg.getKind() == TemplateArgument::NullPtr) 4264 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4265 TemplateArgumentLocInfo()); 4266 else 4267 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4268 TemplateArgumentLocInfo()); 4269 4270 return false; 4271 } 4272 4273 case TemplateArgument::Type: { 4274 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4275 if (!DI) 4276 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4277 4278 DI = getDerived().TransformType(DI); 4279 if (!DI) return true; 4280 4281 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4282 return false; 4283 } 4284 4285 case TemplateArgument::Template: { 4286 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4287 if (QualifierLoc) { 4288 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4289 if (!QualifierLoc) 4290 return true; 4291 } 4292 4293 CXXScopeSpec SS; 4294 SS.Adopt(QualifierLoc); 4295 TemplateName Template 4296 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4297 Input.getTemplateNameLoc()); 4298 if (Template.isNull()) 4299 return true; 4300 4301 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4302 QualifierLoc, Input.getTemplateNameLoc()); 4303 return false; 4304 } 4305 4306 case TemplateArgument::TemplateExpansion: 4307 llvm_unreachable("Caller should expand pack expansions"); 4308 4309 case TemplateArgument::Expression: { 4310 // Template argument expressions are constant expressions. 4311 EnterExpressionEvaluationContext Unevaluated( 4312 getSema(), 4313 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4314 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4315 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4316 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4317 4318 Expr *InputExpr = Input.getSourceExpression(); 4319 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4320 4321 ExprResult E = getDerived().TransformExpr(InputExpr); 4322 E = SemaRef.ActOnConstantExpression(E); 4323 if (E.isInvalid()) return true; 4324 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4325 return false; 4326 } 4327 } 4328 4329 // Work around bogus GCC warning 4330 return true; 4331 } 4332 4333 /// Iterator adaptor that invents template argument location information 4334 /// for each of the template arguments in its underlying iterator. 4335 template<typename Derived, typename InputIterator> 4336 class TemplateArgumentLocInventIterator { 4337 TreeTransform<Derived> &Self; 4338 InputIterator Iter; 4339 4340 public: 4341 typedef TemplateArgumentLoc value_type; 4342 typedef TemplateArgumentLoc reference; 4343 typedef typename std::iterator_traits<InputIterator>::difference_type 4344 difference_type; 4345 typedef std::input_iterator_tag iterator_category; 4346 4347 class pointer { 4348 TemplateArgumentLoc Arg; 4349 4350 public: 4351 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4352 4353 const TemplateArgumentLoc *operator->() const { return &Arg; } 4354 }; 4355 4356 TemplateArgumentLocInventIterator() { } 4357 4358 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4359 InputIterator Iter) 4360 : Self(Self), Iter(Iter) { } 4361 4362 TemplateArgumentLocInventIterator &operator++() { 4363 ++Iter; 4364 return *this; 4365 } 4366 4367 TemplateArgumentLocInventIterator operator++(int) { 4368 TemplateArgumentLocInventIterator Old(*this); 4369 ++(*this); 4370 return Old; 4371 } 4372 4373 reference operator*() const { 4374 TemplateArgumentLoc Result; 4375 Self.InventTemplateArgumentLoc(*Iter, Result); 4376 return Result; 4377 } 4378 4379 pointer operator->() const { return pointer(**this); } 4380 4381 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4382 const TemplateArgumentLocInventIterator &Y) { 4383 return X.Iter == Y.Iter; 4384 } 4385 4386 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4387 const TemplateArgumentLocInventIterator &Y) { 4388 return X.Iter != Y.Iter; 4389 } 4390 }; 4391 4392 template<typename Derived> 4393 template<typename InputIterator> 4394 bool TreeTransform<Derived>::TransformTemplateArguments( 4395 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4396 bool Uneval) { 4397 for (; First != Last; ++First) { 4398 TemplateArgumentLoc Out; 4399 TemplateArgumentLoc In = *First; 4400 4401 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4402 // Unpack argument packs, which we translate them into separate 4403 // arguments. 4404 // FIXME: We could do much better if we could guarantee that the 4405 // TemplateArgumentLocInfo for the pack expansion would be usable for 4406 // all of the template arguments in the argument pack. 4407 typedef TemplateArgumentLocInventIterator<Derived, 4408 TemplateArgument::pack_iterator> 4409 PackLocIterator; 4410 if (TransformTemplateArguments(PackLocIterator(*this, 4411 In.getArgument().pack_begin()), 4412 PackLocIterator(*this, 4413 In.getArgument().pack_end()), 4414 Outputs, Uneval)) 4415 return true; 4416 4417 continue; 4418 } 4419 4420 if (In.getArgument().isPackExpansion()) { 4421 // We have a pack expansion, for which we will be substituting into 4422 // the pattern. 4423 SourceLocation Ellipsis; 4424 Optional<unsigned> OrigNumExpansions; 4425 TemplateArgumentLoc Pattern 4426 = getSema().getTemplateArgumentPackExpansionPattern( 4427 In, Ellipsis, OrigNumExpansions); 4428 4429 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4430 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4431 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4432 4433 // Determine whether the set of unexpanded parameter packs can and should 4434 // be expanded. 4435 bool Expand = true; 4436 bool RetainExpansion = false; 4437 Optional<unsigned> NumExpansions = OrigNumExpansions; 4438 if (getDerived().TryExpandParameterPacks(Ellipsis, 4439 Pattern.getSourceRange(), 4440 Unexpanded, 4441 Expand, 4442 RetainExpansion, 4443 NumExpansions)) 4444 return true; 4445 4446 if (!Expand) { 4447 // The transform has determined that we should perform a simple 4448 // transformation on the pack expansion, producing another pack 4449 // expansion. 4450 TemplateArgumentLoc OutPattern; 4451 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4452 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4453 return true; 4454 4455 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4456 NumExpansions); 4457 if (Out.getArgument().isNull()) 4458 return true; 4459 4460 Outputs.addArgument(Out); 4461 continue; 4462 } 4463 4464 // The transform has determined that we should perform an elementwise 4465 // expansion of the pattern. Do so. 4466 for (unsigned I = 0; I != *NumExpansions; ++I) { 4467 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4468 4469 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4470 return true; 4471 4472 if (Out.getArgument().containsUnexpandedParameterPack()) { 4473 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4474 OrigNumExpansions); 4475 if (Out.getArgument().isNull()) 4476 return true; 4477 } 4478 4479 Outputs.addArgument(Out); 4480 } 4481 4482 // If we're supposed to retain a pack expansion, do so by temporarily 4483 // forgetting the partially-substituted parameter pack. 4484 if (RetainExpansion) { 4485 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4486 4487 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4488 return true; 4489 4490 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4491 OrigNumExpansions); 4492 if (Out.getArgument().isNull()) 4493 return true; 4494 4495 Outputs.addArgument(Out); 4496 } 4497 4498 continue; 4499 } 4500 4501 // The simple case: 4502 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4503 return true; 4504 4505 Outputs.addArgument(Out); 4506 } 4507 4508 return false; 4509 4510 } 4511 4512 //===----------------------------------------------------------------------===// 4513 // Type transformation 4514 //===----------------------------------------------------------------------===// 4515 4516 template<typename Derived> 4517 QualType TreeTransform<Derived>::TransformType(QualType T) { 4518 if (getDerived().AlreadyTransformed(T)) 4519 return T; 4520 4521 // Temporary workaround. All of these transformations should 4522 // eventually turn into transformations on TypeLocs. 4523 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4524 getDerived().getBaseLocation()); 4525 4526 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4527 4528 if (!NewDI) 4529 return QualType(); 4530 4531 return NewDI->getType(); 4532 } 4533 4534 template<typename Derived> 4535 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4536 // Refine the base location to the type's location. 4537 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4538 getDerived().getBaseEntity()); 4539 if (getDerived().AlreadyTransformed(DI->getType())) 4540 return DI; 4541 4542 TypeLocBuilder TLB; 4543 4544 TypeLoc TL = DI->getTypeLoc(); 4545 TLB.reserve(TL.getFullDataSize()); 4546 4547 QualType Result = getDerived().TransformType(TLB, TL); 4548 if (Result.isNull()) 4549 return nullptr; 4550 4551 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4552 } 4553 4554 template<typename Derived> 4555 QualType 4556 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4557 switch (T.getTypeLocClass()) { 4558 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4559 #define TYPELOC(CLASS, PARENT) \ 4560 case TypeLoc::CLASS: \ 4561 return getDerived().Transform##CLASS##Type(TLB, \ 4562 T.castAs<CLASS##TypeLoc>()); 4563 #include "clang/AST/TypeLocNodes.def" 4564 } 4565 4566 llvm_unreachable("unhandled type loc!"); 4567 } 4568 4569 template<typename Derived> 4570 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4571 if (!isa<DependentNameType>(T)) 4572 return TransformType(T); 4573 4574 if (getDerived().AlreadyTransformed(T)) 4575 return T; 4576 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4577 getDerived().getBaseLocation()); 4578 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4579 return NewDI ? NewDI->getType() : QualType(); 4580 } 4581 4582 template<typename Derived> 4583 TypeSourceInfo * 4584 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4585 if (!isa<DependentNameType>(DI->getType())) 4586 return TransformType(DI); 4587 4588 // Refine the base location to the type's location. 4589 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4590 getDerived().getBaseEntity()); 4591 if (getDerived().AlreadyTransformed(DI->getType())) 4592 return DI; 4593 4594 TypeLocBuilder TLB; 4595 4596 TypeLoc TL = DI->getTypeLoc(); 4597 TLB.reserve(TL.getFullDataSize()); 4598 4599 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4600 if (QTL) 4601 TL = QTL.getUnqualifiedLoc(); 4602 4603 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4604 4605 QualType Result = getDerived().TransformDependentNameType( 4606 TLB, DNTL, /*DeducedTSTContext*/true); 4607 if (Result.isNull()) 4608 return nullptr; 4609 4610 if (QTL) { 4611 Result = getDerived().RebuildQualifiedType(Result, QTL); 4612 if (Result.isNull()) 4613 return nullptr; 4614 TLB.TypeWasModifiedSafely(Result); 4615 } 4616 4617 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4618 } 4619 4620 template<typename Derived> 4621 QualType 4622 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4623 QualifiedTypeLoc T) { 4624 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4625 if (Result.isNull()) 4626 return QualType(); 4627 4628 Result = getDerived().RebuildQualifiedType(Result, T); 4629 4630 if (Result.isNull()) 4631 return QualType(); 4632 4633 // RebuildQualifiedType might have updated the type, but not in a way 4634 // that invalidates the TypeLoc. (There's no location information for 4635 // qualifiers.) 4636 TLB.TypeWasModifiedSafely(Result); 4637 4638 return Result; 4639 } 4640 4641 template <typename Derived> 4642 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4643 QualifiedTypeLoc TL) { 4644 4645 SourceLocation Loc = TL.getBeginLoc(); 4646 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4647 4648 if (((T.getAddressSpace() != LangAS::Default && 4649 Quals.getAddressSpace() != LangAS::Default)) && 4650 T.getAddressSpace() != Quals.getAddressSpace()) { 4651 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4652 << TL.getType() << T; 4653 return QualType(); 4654 } 4655 4656 // C++ [dcl.fct]p7: 4657 // [When] adding cv-qualifications on top of the function type [...] the 4658 // cv-qualifiers are ignored. 4659 if (T->isFunctionType()) { 4660 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4661 Quals.getAddressSpace()); 4662 return T; 4663 } 4664 4665 // C++ [dcl.ref]p1: 4666 // when the cv-qualifiers are introduced through the use of a typedef-name 4667 // or decltype-specifier [...] the cv-qualifiers are ignored. 4668 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4669 // applied to a reference type. 4670 if (T->isReferenceType()) { 4671 // The only qualifier that applies to a reference type is restrict. 4672 if (!Quals.hasRestrict()) 4673 return T; 4674 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4675 } 4676 4677 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4678 // resulting type. 4679 if (Quals.hasObjCLifetime()) { 4680 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4681 Quals.removeObjCLifetime(); 4682 else if (T.getObjCLifetime()) { 4683 // Objective-C ARC: 4684 // A lifetime qualifier applied to a substituted template parameter 4685 // overrides the lifetime qualifier from the template argument. 4686 const AutoType *AutoTy; 4687 if (const SubstTemplateTypeParmType *SubstTypeParam 4688 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4689 QualType Replacement = SubstTypeParam->getReplacementType(); 4690 Qualifiers Qs = Replacement.getQualifiers(); 4691 Qs.removeObjCLifetime(); 4692 Replacement = SemaRef.Context.getQualifiedType( 4693 Replacement.getUnqualifiedType(), Qs); 4694 T = SemaRef.Context.getSubstTemplateTypeParmType( 4695 SubstTypeParam->getReplacedParameter(), Replacement); 4696 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4697 // 'auto' types behave the same way as template parameters. 4698 QualType Deduced = AutoTy->getDeducedType(); 4699 Qualifiers Qs = Deduced.getQualifiers(); 4700 Qs.removeObjCLifetime(); 4701 Deduced = 4702 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4703 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4704 AutoTy->isDependentType(), 4705 /*isPack=*/false, 4706 AutoTy->getTypeConstraintConcept(), 4707 AutoTy->getTypeConstraintArguments()); 4708 } else { 4709 // Otherwise, complain about the addition of a qualifier to an 4710 // already-qualified type. 4711 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4712 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4713 Quals.removeObjCLifetime(); 4714 } 4715 } 4716 } 4717 4718 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4719 } 4720 4721 template<typename Derived> 4722 TypeLoc 4723 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4724 QualType ObjectType, 4725 NamedDecl *UnqualLookup, 4726 CXXScopeSpec &SS) { 4727 if (getDerived().AlreadyTransformed(TL.getType())) 4728 return TL; 4729 4730 TypeSourceInfo *TSI = 4731 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4732 if (TSI) 4733 return TSI->getTypeLoc(); 4734 return TypeLoc(); 4735 } 4736 4737 template<typename Derived> 4738 TypeSourceInfo * 4739 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4740 QualType ObjectType, 4741 NamedDecl *UnqualLookup, 4742 CXXScopeSpec &SS) { 4743 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4744 return TSInfo; 4745 4746 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4747 UnqualLookup, SS); 4748 } 4749 4750 template <typename Derived> 4751 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4752 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4753 CXXScopeSpec &SS) { 4754 QualType T = TL.getType(); 4755 assert(!getDerived().AlreadyTransformed(T)); 4756 4757 TypeLocBuilder TLB; 4758 QualType Result; 4759 4760 if (isa<TemplateSpecializationType>(T)) { 4761 TemplateSpecializationTypeLoc SpecTL = 4762 TL.castAs<TemplateSpecializationTypeLoc>(); 4763 4764 TemplateName Template = getDerived().TransformTemplateName( 4765 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4766 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4767 if (Template.isNull()) 4768 return nullptr; 4769 4770 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4771 Template); 4772 } else if (isa<DependentTemplateSpecializationType>(T)) { 4773 DependentTemplateSpecializationTypeLoc SpecTL = 4774 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4775 4776 TemplateName Template 4777 = getDerived().RebuildTemplateName(SS, 4778 SpecTL.getTemplateKeywordLoc(), 4779 *SpecTL.getTypePtr()->getIdentifier(), 4780 SpecTL.getTemplateNameLoc(), 4781 ObjectType, UnqualLookup, 4782 /*AllowInjectedClassName*/true); 4783 if (Template.isNull()) 4784 return nullptr; 4785 4786 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4787 SpecTL, 4788 Template, 4789 SS); 4790 } else { 4791 // Nothing special needs to be done for these. 4792 Result = getDerived().TransformType(TLB, TL); 4793 } 4794 4795 if (Result.isNull()) 4796 return nullptr; 4797 4798 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4799 } 4800 4801 template <class TyLoc> static inline 4802 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4803 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4804 NewT.setNameLoc(T.getNameLoc()); 4805 return T.getType(); 4806 } 4807 4808 template<typename Derived> 4809 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4810 BuiltinTypeLoc T) { 4811 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4812 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4813 if (T.needsExtraLocalData()) 4814 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4815 return T.getType(); 4816 } 4817 4818 template<typename Derived> 4819 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4820 ComplexTypeLoc T) { 4821 // FIXME: recurse? 4822 return TransformTypeSpecType(TLB, T); 4823 } 4824 4825 template <typename Derived> 4826 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4827 AdjustedTypeLoc TL) { 4828 // Adjustments applied during transformation are handled elsewhere. 4829 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4830 } 4831 4832 template<typename Derived> 4833 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4834 DecayedTypeLoc TL) { 4835 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4836 if (OriginalType.isNull()) 4837 return QualType(); 4838 4839 QualType Result = TL.getType(); 4840 if (getDerived().AlwaysRebuild() || 4841 OriginalType != TL.getOriginalLoc().getType()) 4842 Result = SemaRef.Context.getDecayedType(OriginalType); 4843 TLB.push<DecayedTypeLoc>(Result); 4844 // Nothing to set for DecayedTypeLoc. 4845 return Result; 4846 } 4847 4848 template<typename Derived> 4849 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4850 PointerTypeLoc TL) { 4851 QualType PointeeType 4852 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4853 if (PointeeType.isNull()) 4854 return QualType(); 4855 4856 QualType Result = TL.getType(); 4857 if (PointeeType->getAs<ObjCObjectType>()) { 4858 // A dependent pointer type 'T *' has is being transformed such 4859 // that an Objective-C class type is being replaced for 'T'. The 4860 // resulting pointer type is an ObjCObjectPointerType, not a 4861 // PointerType. 4862 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4863 4864 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4865 NewT.setStarLoc(TL.getStarLoc()); 4866 return Result; 4867 } 4868 4869 if (getDerived().AlwaysRebuild() || 4870 PointeeType != TL.getPointeeLoc().getType()) { 4871 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4872 if (Result.isNull()) 4873 return QualType(); 4874 } 4875 4876 // Objective-C ARC can add lifetime qualifiers to the type that we're 4877 // pointing to. 4878 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4879 4880 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4881 NewT.setSigilLoc(TL.getSigilLoc()); 4882 return Result; 4883 } 4884 4885 template<typename Derived> 4886 QualType 4887 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4888 BlockPointerTypeLoc TL) { 4889 QualType PointeeType 4890 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4891 if (PointeeType.isNull()) 4892 return QualType(); 4893 4894 QualType Result = TL.getType(); 4895 if (getDerived().AlwaysRebuild() || 4896 PointeeType != TL.getPointeeLoc().getType()) { 4897 Result = getDerived().RebuildBlockPointerType(PointeeType, 4898 TL.getSigilLoc()); 4899 if (Result.isNull()) 4900 return QualType(); 4901 } 4902 4903 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4904 NewT.setSigilLoc(TL.getSigilLoc()); 4905 return Result; 4906 } 4907 4908 /// Transforms a reference type. Note that somewhat paradoxically we 4909 /// don't care whether the type itself is an l-value type or an r-value 4910 /// type; we only care if the type was *written* as an l-value type 4911 /// or an r-value type. 4912 template<typename Derived> 4913 QualType 4914 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4915 ReferenceTypeLoc TL) { 4916 const ReferenceType *T = TL.getTypePtr(); 4917 4918 // Note that this works with the pointee-as-written. 4919 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4920 if (PointeeType.isNull()) 4921 return QualType(); 4922 4923 QualType Result = TL.getType(); 4924 if (getDerived().AlwaysRebuild() || 4925 PointeeType != T->getPointeeTypeAsWritten()) { 4926 Result = getDerived().RebuildReferenceType(PointeeType, 4927 T->isSpelledAsLValue(), 4928 TL.getSigilLoc()); 4929 if (Result.isNull()) 4930 return QualType(); 4931 } 4932 4933 // Objective-C ARC can add lifetime qualifiers to the type that we're 4934 // referring to. 4935 TLB.TypeWasModifiedSafely( 4936 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4937 4938 // r-value references can be rebuilt as l-value references. 4939 ReferenceTypeLoc NewTL; 4940 if (isa<LValueReferenceType>(Result)) 4941 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4942 else 4943 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4944 NewTL.setSigilLoc(TL.getSigilLoc()); 4945 4946 return Result; 4947 } 4948 4949 template<typename Derived> 4950 QualType 4951 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4952 LValueReferenceTypeLoc TL) { 4953 return TransformReferenceType(TLB, TL); 4954 } 4955 4956 template<typename Derived> 4957 QualType 4958 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4959 RValueReferenceTypeLoc TL) { 4960 return TransformReferenceType(TLB, TL); 4961 } 4962 4963 template<typename Derived> 4964 QualType 4965 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4966 MemberPointerTypeLoc TL) { 4967 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4968 if (PointeeType.isNull()) 4969 return QualType(); 4970 4971 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4972 TypeSourceInfo *NewClsTInfo = nullptr; 4973 if (OldClsTInfo) { 4974 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4975 if (!NewClsTInfo) 4976 return QualType(); 4977 } 4978 4979 const MemberPointerType *T = TL.getTypePtr(); 4980 QualType OldClsType = QualType(T->getClass(), 0); 4981 QualType NewClsType; 4982 if (NewClsTInfo) 4983 NewClsType = NewClsTInfo->getType(); 4984 else { 4985 NewClsType = getDerived().TransformType(OldClsType); 4986 if (NewClsType.isNull()) 4987 return QualType(); 4988 } 4989 4990 QualType Result = TL.getType(); 4991 if (getDerived().AlwaysRebuild() || 4992 PointeeType != T->getPointeeType() || 4993 NewClsType != OldClsType) { 4994 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4995 TL.getStarLoc()); 4996 if (Result.isNull()) 4997 return QualType(); 4998 } 4999 5000 // If we had to adjust the pointee type when building a member pointer, make 5001 // sure to push TypeLoc info for it. 5002 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5003 if (MPT && PointeeType != MPT->getPointeeType()) { 5004 assert(isa<AdjustedType>(MPT->getPointeeType())); 5005 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5006 } 5007 5008 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5009 NewTL.setSigilLoc(TL.getSigilLoc()); 5010 NewTL.setClassTInfo(NewClsTInfo); 5011 5012 return Result; 5013 } 5014 5015 template<typename Derived> 5016 QualType 5017 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5018 ConstantArrayTypeLoc TL) { 5019 const ConstantArrayType *T = TL.getTypePtr(); 5020 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5021 if (ElementType.isNull()) 5022 return QualType(); 5023 5024 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5025 Expr *OldSize = TL.getSizeExpr(); 5026 if (!OldSize) 5027 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5028 Expr *NewSize = nullptr; 5029 if (OldSize) { 5030 EnterExpressionEvaluationContext Unevaluated( 5031 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5032 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5033 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5034 } 5035 5036 QualType Result = TL.getType(); 5037 if (getDerived().AlwaysRebuild() || 5038 ElementType != T->getElementType() || 5039 (T->getSizeExpr() && NewSize != OldSize)) { 5040 Result = getDerived().RebuildConstantArrayType(ElementType, 5041 T->getSizeModifier(), 5042 T->getSize(), NewSize, 5043 T->getIndexTypeCVRQualifiers(), 5044 TL.getBracketsRange()); 5045 if (Result.isNull()) 5046 return QualType(); 5047 } 5048 5049 // We might have either a ConstantArrayType or a VariableArrayType now: 5050 // a ConstantArrayType is allowed to have an element type which is a 5051 // VariableArrayType if the type is dependent. Fortunately, all array 5052 // types have the same location layout. 5053 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5054 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5055 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5056 NewTL.setSizeExpr(NewSize); 5057 5058 return Result; 5059 } 5060 5061 template<typename Derived> 5062 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5063 TypeLocBuilder &TLB, 5064 IncompleteArrayTypeLoc TL) { 5065 const IncompleteArrayType *T = TL.getTypePtr(); 5066 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5067 if (ElementType.isNull()) 5068 return QualType(); 5069 5070 QualType Result = TL.getType(); 5071 if (getDerived().AlwaysRebuild() || 5072 ElementType != T->getElementType()) { 5073 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5074 T->getSizeModifier(), 5075 T->getIndexTypeCVRQualifiers(), 5076 TL.getBracketsRange()); 5077 if (Result.isNull()) 5078 return QualType(); 5079 } 5080 5081 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5082 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5083 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5084 NewTL.setSizeExpr(nullptr); 5085 5086 return Result; 5087 } 5088 5089 template<typename Derived> 5090 QualType 5091 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5092 VariableArrayTypeLoc TL) { 5093 const VariableArrayType *T = TL.getTypePtr(); 5094 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5095 if (ElementType.isNull()) 5096 return QualType(); 5097 5098 ExprResult SizeResult; 5099 { 5100 EnterExpressionEvaluationContext Context( 5101 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5102 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5103 } 5104 if (SizeResult.isInvalid()) 5105 return QualType(); 5106 SizeResult = 5107 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5108 if (SizeResult.isInvalid()) 5109 return QualType(); 5110 5111 Expr *Size = SizeResult.get(); 5112 5113 QualType Result = TL.getType(); 5114 if (getDerived().AlwaysRebuild() || 5115 ElementType != T->getElementType() || 5116 Size != T->getSizeExpr()) { 5117 Result = getDerived().RebuildVariableArrayType(ElementType, 5118 T->getSizeModifier(), 5119 Size, 5120 T->getIndexTypeCVRQualifiers(), 5121 TL.getBracketsRange()); 5122 if (Result.isNull()) 5123 return QualType(); 5124 } 5125 5126 // We might have constant size array now, but fortunately it has the same 5127 // location layout. 5128 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5129 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5130 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5131 NewTL.setSizeExpr(Size); 5132 5133 return Result; 5134 } 5135 5136 template<typename Derived> 5137 QualType 5138 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5139 DependentSizedArrayTypeLoc TL) { 5140 const DependentSizedArrayType *T = TL.getTypePtr(); 5141 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5142 if (ElementType.isNull()) 5143 return QualType(); 5144 5145 // Array bounds are constant expressions. 5146 EnterExpressionEvaluationContext Unevaluated( 5147 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5148 5149 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5150 Expr *origSize = TL.getSizeExpr(); 5151 if (!origSize) origSize = T->getSizeExpr(); 5152 5153 ExprResult sizeResult 5154 = getDerived().TransformExpr(origSize); 5155 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5156 if (sizeResult.isInvalid()) 5157 return QualType(); 5158 5159 Expr *size = sizeResult.get(); 5160 5161 QualType Result = TL.getType(); 5162 if (getDerived().AlwaysRebuild() || 5163 ElementType != T->getElementType() || 5164 size != origSize) { 5165 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5166 T->getSizeModifier(), 5167 size, 5168 T->getIndexTypeCVRQualifiers(), 5169 TL.getBracketsRange()); 5170 if (Result.isNull()) 5171 return QualType(); 5172 } 5173 5174 // We might have any sort of array type now, but fortunately they 5175 // all have the same location layout. 5176 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5177 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5178 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5179 NewTL.setSizeExpr(size); 5180 5181 return Result; 5182 } 5183 5184 template <typename Derived> 5185 QualType TreeTransform<Derived>::TransformDependentVectorType( 5186 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5187 const DependentVectorType *T = TL.getTypePtr(); 5188 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5189 if (ElementType.isNull()) 5190 return QualType(); 5191 5192 EnterExpressionEvaluationContext Unevaluated( 5193 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5194 5195 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5196 Size = SemaRef.ActOnConstantExpression(Size); 5197 if (Size.isInvalid()) 5198 return QualType(); 5199 5200 QualType Result = TL.getType(); 5201 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5202 Size.get() != T->getSizeExpr()) { 5203 Result = getDerived().RebuildDependentVectorType( 5204 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5205 if (Result.isNull()) 5206 return QualType(); 5207 } 5208 5209 // Result might be dependent or not. 5210 if (isa<DependentVectorType>(Result)) { 5211 DependentVectorTypeLoc NewTL = 5212 TLB.push<DependentVectorTypeLoc>(Result); 5213 NewTL.setNameLoc(TL.getNameLoc()); 5214 } else { 5215 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5216 NewTL.setNameLoc(TL.getNameLoc()); 5217 } 5218 5219 return Result; 5220 } 5221 5222 template<typename Derived> 5223 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5224 TypeLocBuilder &TLB, 5225 DependentSizedExtVectorTypeLoc TL) { 5226 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5227 5228 // FIXME: ext vector locs should be nested 5229 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5230 if (ElementType.isNull()) 5231 return QualType(); 5232 5233 // Vector sizes are constant expressions. 5234 EnterExpressionEvaluationContext Unevaluated( 5235 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5236 5237 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5238 Size = SemaRef.ActOnConstantExpression(Size); 5239 if (Size.isInvalid()) 5240 return QualType(); 5241 5242 QualType Result = TL.getType(); 5243 if (getDerived().AlwaysRebuild() || 5244 ElementType != T->getElementType() || 5245 Size.get() != T->getSizeExpr()) { 5246 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5247 Size.get(), 5248 T->getAttributeLoc()); 5249 if (Result.isNull()) 5250 return QualType(); 5251 } 5252 5253 // Result might be dependent or not. 5254 if (isa<DependentSizedExtVectorType>(Result)) { 5255 DependentSizedExtVectorTypeLoc NewTL 5256 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5257 NewTL.setNameLoc(TL.getNameLoc()); 5258 } else { 5259 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5260 NewTL.setNameLoc(TL.getNameLoc()); 5261 } 5262 5263 return Result; 5264 } 5265 5266 template <typename Derived> 5267 QualType 5268 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5269 ConstantMatrixTypeLoc TL) { 5270 const ConstantMatrixType *T = TL.getTypePtr(); 5271 QualType ElementType = getDerived().TransformType(T->getElementType()); 5272 if (ElementType.isNull()) 5273 return QualType(); 5274 5275 QualType Result = TL.getType(); 5276 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5277 Result = getDerived().RebuildConstantMatrixType( 5278 ElementType, T->getNumRows(), T->getNumColumns()); 5279 if (Result.isNull()) 5280 return QualType(); 5281 } 5282 5283 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5284 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5285 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5286 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5287 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5288 5289 return Result; 5290 } 5291 5292 template <typename Derived> 5293 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5294 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5295 const DependentSizedMatrixType *T = TL.getTypePtr(); 5296 5297 QualType ElementType = getDerived().TransformType(T->getElementType()); 5298 if (ElementType.isNull()) { 5299 return QualType(); 5300 } 5301 5302 // Matrix dimensions are constant expressions. 5303 EnterExpressionEvaluationContext Unevaluated( 5304 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5305 5306 Expr *origRows = TL.getAttrRowOperand(); 5307 if (!origRows) 5308 origRows = T->getRowExpr(); 5309 Expr *origColumns = TL.getAttrColumnOperand(); 5310 if (!origColumns) 5311 origColumns = T->getColumnExpr(); 5312 5313 ExprResult rowResult = getDerived().TransformExpr(origRows); 5314 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5315 if (rowResult.isInvalid()) 5316 return QualType(); 5317 5318 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5319 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5320 if (columnResult.isInvalid()) 5321 return QualType(); 5322 5323 Expr *rows = rowResult.get(); 5324 Expr *columns = columnResult.get(); 5325 5326 QualType Result = TL.getType(); 5327 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5328 rows != origRows || columns != origColumns) { 5329 Result = getDerived().RebuildDependentSizedMatrixType( 5330 ElementType, rows, columns, T->getAttributeLoc()); 5331 5332 if (Result.isNull()) 5333 return QualType(); 5334 } 5335 5336 // We might have any sort of matrix type now, but fortunately they 5337 // all have the same location layout. 5338 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5339 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5340 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5341 NewTL.setAttrRowOperand(rows); 5342 NewTL.setAttrColumnOperand(columns); 5343 return Result; 5344 } 5345 5346 template <typename Derived> 5347 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5348 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5349 const DependentAddressSpaceType *T = TL.getTypePtr(); 5350 5351 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5352 5353 if (pointeeType.isNull()) 5354 return QualType(); 5355 5356 // Address spaces are constant expressions. 5357 EnterExpressionEvaluationContext Unevaluated( 5358 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5359 5360 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5361 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5362 if (AddrSpace.isInvalid()) 5363 return QualType(); 5364 5365 QualType Result = TL.getType(); 5366 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5367 AddrSpace.get() != T->getAddrSpaceExpr()) { 5368 Result = getDerived().RebuildDependentAddressSpaceType( 5369 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5370 if (Result.isNull()) 5371 return QualType(); 5372 } 5373 5374 // Result might be dependent or not. 5375 if (isa<DependentAddressSpaceType>(Result)) { 5376 DependentAddressSpaceTypeLoc NewTL = 5377 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5378 5379 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5380 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5381 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5382 5383 } else { 5384 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5385 Result, getDerived().getBaseLocation()); 5386 TransformType(TLB, DI->getTypeLoc()); 5387 } 5388 5389 return Result; 5390 } 5391 5392 template <typename Derived> 5393 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5394 VectorTypeLoc TL) { 5395 const VectorType *T = TL.getTypePtr(); 5396 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5397 if (ElementType.isNull()) 5398 return QualType(); 5399 5400 QualType Result = TL.getType(); 5401 if (getDerived().AlwaysRebuild() || 5402 ElementType != T->getElementType()) { 5403 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5404 T->getVectorKind()); 5405 if (Result.isNull()) 5406 return QualType(); 5407 } 5408 5409 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5410 NewTL.setNameLoc(TL.getNameLoc()); 5411 5412 return Result; 5413 } 5414 5415 template<typename Derived> 5416 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5417 ExtVectorTypeLoc TL) { 5418 const VectorType *T = TL.getTypePtr(); 5419 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5420 if (ElementType.isNull()) 5421 return QualType(); 5422 5423 QualType Result = TL.getType(); 5424 if (getDerived().AlwaysRebuild() || 5425 ElementType != T->getElementType()) { 5426 Result = getDerived().RebuildExtVectorType(ElementType, 5427 T->getNumElements(), 5428 /*FIXME*/ SourceLocation()); 5429 if (Result.isNull()) 5430 return QualType(); 5431 } 5432 5433 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5434 NewTL.setNameLoc(TL.getNameLoc()); 5435 5436 return Result; 5437 } 5438 5439 template <typename Derived> 5440 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5441 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5442 bool ExpectParameterPack) { 5443 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5444 TypeSourceInfo *NewDI = nullptr; 5445 5446 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5447 // If we're substituting into a pack expansion type and we know the 5448 // length we want to expand to, just substitute for the pattern. 5449 TypeLoc OldTL = OldDI->getTypeLoc(); 5450 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5451 5452 TypeLocBuilder TLB; 5453 TypeLoc NewTL = OldDI->getTypeLoc(); 5454 TLB.reserve(NewTL.getFullDataSize()); 5455 5456 QualType Result = getDerived().TransformType(TLB, 5457 OldExpansionTL.getPatternLoc()); 5458 if (Result.isNull()) 5459 return nullptr; 5460 5461 Result = RebuildPackExpansionType(Result, 5462 OldExpansionTL.getPatternLoc().getSourceRange(), 5463 OldExpansionTL.getEllipsisLoc(), 5464 NumExpansions); 5465 if (Result.isNull()) 5466 return nullptr; 5467 5468 PackExpansionTypeLoc NewExpansionTL 5469 = TLB.push<PackExpansionTypeLoc>(Result); 5470 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5471 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5472 } else 5473 NewDI = getDerived().TransformType(OldDI); 5474 if (!NewDI) 5475 return nullptr; 5476 5477 if (NewDI == OldDI && indexAdjustment == 0) 5478 return OldParm; 5479 5480 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5481 OldParm->getDeclContext(), 5482 OldParm->getInnerLocStart(), 5483 OldParm->getLocation(), 5484 OldParm->getIdentifier(), 5485 NewDI->getType(), 5486 NewDI, 5487 OldParm->getStorageClass(), 5488 /* DefArg */ nullptr); 5489 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5490 OldParm->getFunctionScopeIndex() + indexAdjustment); 5491 transformedLocalDecl(OldParm, {newParm}); 5492 return newParm; 5493 } 5494 5495 template <typename Derived> 5496 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5497 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5498 const QualType *ParamTypes, 5499 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5500 SmallVectorImpl<QualType> &OutParamTypes, 5501 SmallVectorImpl<ParmVarDecl *> *PVars, 5502 Sema::ExtParameterInfoBuilder &PInfos) { 5503 int indexAdjustment = 0; 5504 5505 unsigned NumParams = Params.size(); 5506 for (unsigned i = 0; i != NumParams; ++i) { 5507 if (ParmVarDecl *OldParm = Params[i]) { 5508 assert(OldParm->getFunctionScopeIndex() == i); 5509 5510 Optional<unsigned> NumExpansions; 5511 ParmVarDecl *NewParm = nullptr; 5512 if (OldParm->isParameterPack()) { 5513 // We have a function parameter pack that may need to be expanded. 5514 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5515 5516 // Find the parameter packs that could be expanded. 5517 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5518 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5519 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5520 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5521 5522 // Determine whether we should expand the parameter packs. 5523 bool ShouldExpand = false; 5524 bool RetainExpansion = false; 5525 Optional<unsigned> OrigNumExpansions; 5526 if (Unexpanded.size() > 0) { 5527 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5528 NumExpansions = OrigNumExpansions; 5529 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5530 Pattern.getSourceRange(), 5531 Unexpanded, 5532 ShouldExpand, 5533 RetainExpansion, 5534 NumExpansions)) { 5535 return true; 5536 } 5537 } else { 5538 #ifndef NDEBUG 5539 const AutoType *AT = 5540 Pattern.getType().getTypePtr()->getContainedAutoType(); 5541 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5542 "Could not find parameter packs or undeduced auto type!"); 5543 #endif 5544 } 5545 5546 if (ShouldExpand) { 5547 // Expand the function parameter pack into multiple, separate 5548 // parameters. 5549 getDerived().ExpandingFunctionParameterPack(OldParm); 5550 for (unsigned I = 0; I != *NumExpansions; ++I) { 5551 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5552 ParmVarDecl *NewParm 5553 = getDerived().TransformFunctionTypeParam(OldParm, 5554 indexAdjustment++, 5555 OrigNumExpansions, 5556 /*ExpectParameterPack=*/false); 5557 if (!NewParm) 5558 return true; 5559 5560 if (ParamInfos) 5561 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5562 OutParamTypes.push_back(NewParm->getType()); 5563 if (PVars) 5564 PVars->push_back(NewParm); 5565 } 5566 5567 // If we're supposed to retain a pack expansion, do so by temporarily 5568 // forgetting the partially-substituted parameter pack. 5569 if (RetainExpansion) { 5570 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5571 ParmVarDecl *NewParm 5572 = getDerived().TransformFunctionTypeParam(OldParm, 5573 indexAdjustment++, 5574 OrigNumExpansions, 5575 /*ExpectParameterPack=*/false); 5576 if (!NewParm) 5577 return true; 5578 5579 if (ParamInfos) 5580 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5581 OutParamTypes.push_back(NewParm->getType()); 5582 if (PVars) 5583 PVars->push_back(NewParm); 5584 } 5585 5586 // The next parameter should have the same adjustment as the 5587 // last thing we pushed, but we post-incremented indexAdjustment 5588 // on every push. Also, if we push nothing, the adjustment should 5589 // go down by one. 5590 indexAdjustment--; 5591 5592 // We're done with the pack expansion. 5593 continue; 5594 } 5595 5596 // We'll substitute the parameter now without expanding the pack 5597 // expansion. 5598 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5599 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5600 indexAdjustment, 5601 NumExpansions, 5602 /*ExpectParameterPack=*/true); 5603 assert(NewParm->isParameterPack() && 5604 "Parameter pack no longer a parameter pack after " 5605 "transformation."); 5606 } else { 5607 NewParm = getDerived().TransformFunctionTypeParam( 5608 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5609 } 5610 5611 if (!NewParm) 5612 return true; 5613 5614 if (ParamInfos) 5615 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5616 OutParamTypes.push_back(NewParm->getType()); 5617 if (PVars) 5618 PVars->push_back(NewParm); 5619 continue; 5620 } 5621 5622 // Deal with the possibility that we don't have a parameter 5623 // declaration for this parameter. 5624 QualType OldType = ParamTypes[i]; 5625 bool IsPackExpansion = false; 5626 Optional<unsigned> NumExpansions; 5627 QualType NewType; 5628 if (const PackExpansionType *Expansion 5629 = dyn_cast<PackExpansionType>(OldType)) { 5630 // We have a function parameter pack that may need to be expanded. 5631 QualType Pattern = Expansion->getPattern(); 5632 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5633 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5634 5635 // Determine whether we should expand the parameter packs. 5636 bool ShouldExpand = false; 5637 bool RetainExpansion = false; 5638 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5639 Unexpanded, 5640 ShouldExpand, 5641 RetainExpansion, 5642 NumExpansions)) { 5643 return true; 5644 } 5645 5646 if (ShouldExpand) { 5647 // Expand the function parameter pack into multiple, separate 5648 // parameters. 5649 for (unsigned I = 0; I != *NumExpansions; ++I) { 5650 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5651 QualType NewType = getDerived().TransformType(Pattern); 5652 if (NewType.isNull()) 5653 return true; 5654 5655 if (NewType->containsUnexpandedParameterPack()) { 5656 NewType = 5657 getSema().getASTContext().getPackExpansionType(NewType, None); 5658 5659 if (NewType.isNull()) 5660 return true; 5661 } 5662 5663 if (ParamInfos) 5664 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5665 OutParamTypes.push_back(NewType); 5666 if (PVars) 5667 PVars->push_back(nullptr); 5668 } 5669 5670 // We're done with the pack expansion. 5671 continue; 5672 } 5673 5674 // If we're supposed to retain a pack expansion, do so by temporarily 5675 // forgetting the partially-substituted parameter pack. 5676 if (RetainExpansion) { 5677 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5678 QualType NewType = getDerived().TransformType(Pattern); 5679 if (NewType.isNull()) 5680 return true; 5681 5682 if (ParamInfos) 5683 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5684 OutParamTypes.push_back(NewType); 5685 if (PVars) 5686 PVars->push_back(nullptr); 5687 } 5688 5689 // We'll substitute the parameter now without expanding the pack 5690 // expansion. 5691 OldType = Expansion->getPattern(); 5692 IsPackExpansion = true; 5693 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5694 NewType = getDerived().TransformType(OldType); 5695 } else { 5696 NewType = getDerived().TransformType(OldType); 5697 } 5698 5699 if (NewType.isNull()) 5700 return true; 5701 5702 if (IsPackExpansion) 5703 NewType = getSema().Context.getPackExpansionType(NewType, 5704 NumExpansions); 5705 5706 if (ParamInfos) 5707 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5708 OutParamTypes.push_back(NewType); 5709 if (PVars) 5710 PVars->push_back(nullptr); 5711 } 5712 5713 #ifndef NDEBUG 5714 if (PVars) { 5715 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5716 if (ParmVarDecl *parm = (*PVars)[i]) 5717 assert(parm->getFunctionScopeIndex() == i); 5718 } 5719 #endif 5720 5721 return false; 5722 } 5723 5724 template<typename Derived> 5725 QualType 5726 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5727 FunctionProtoTypeLoc TL) { 5728 SmallVector<QualType, 4> ExceptionStorage; 5729 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5730 return getDerived().TransformFunctionProtoType( 5731 TLB, TL, nullptr, Qualifiers(), 5732 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5733 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5734 ExceptionStorage, Changed); 5735 }); 5736 } 5737 5738 template<typename Derived> template<typename Fn> 5739 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5740 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5741 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5742 5743 // Transform the parameters and return type. 5744 // 5745 // We are required to instantiate the params and return type in source order. 5746 // When the function has a trailing return type, we instantiate the 5747 // parameters before the return type, since the return type can then refer 5748 // to the parameters themselves (via decltype, sizeof, etc.). 5749 // 5750 SmallVector<QualType, 4> ParamTypes; 5751 SmallVector<ParmVarDecl*, 4> ParamDecls; 5752 Sema::ExtParameterInfoBuilder ExtParamInfos; 5753 const FunctionProtoType *T = TL.getTypePtr(); 5754 5755 QualType ResultType; 5756 5757 if (T->hasTrailingReturn()) { 5758 if (getDerived().TransformFunctionTypeParams( 5759 TL.getBeginLoc(), TL.getParams(), 5760 TL.getTypePtr()->param_type_begin(), 5761 T->getExtParameterInfosOrNull(), 5762 ParamTypes, &ParamDecls, ExtParamInfos)) 5763 return QualType(); 5764 5765 { 5766 // C++11 [expr.prim.general]p3: 5767 // If a declaration declares a member function or member function 5768 // template of a class X, the expression this is a prvalue of type 5769 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5770 // and the end of the function-definition, member-declarator, or 5771 // declarator. 5772 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5773 5774 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5775 if (ResultType.isNull()) 5776 return QualType(); 5777 } 5778 } 5779 else { 5780 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5781 if (ResultType.isNull()) 5782 return QualType(); 5783 5784 if (getDerived().TransformFunctionTypeParams( 5785 TL.getBeginLoc(), TL.getParams(), 5786 TL.getTypePtr()->param_type_begin(), 5787 T->getExtParameterInfosOrNull(), 5788 ParamTypes, &ParamDecls, ExtParamInfos)) 5789 return QualType(); 5790 } 5791 5792 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5793 5794 bool EPIChanged = false; 5795 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5796 return QualType(); 5797 5798 // Handle extended parameter information. 5799 if (auto NewExtParamInfos = 5800 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5801 if (!EPI.ExtParameterInfos || 5802 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5803 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5804 EPIChanged = true; 5805 } 5806 EPI.ExtParameterInfos = NewExtParamInfos; 5807 } else if (EPI.ExtParameterInfos) { 5808 EPIChanged = true; 5809 EPI.ExtParameterInfos = nullptr; 5810 } 5811 5812 QualType Result = TL.getType(); 5813 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5814 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5815 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5816 if (Result.isNull()) 5817 return QualType(); 5818 } 5819 5820 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5821 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5822 NewTL.setLParenLoc(TL.getLParenLoc()); 5823 NewTL.setRParenLoc(TL.getRParenLoc()); 5824 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5825 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5826 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5827 NewTL.setParam(i, ParamDecls[i]); 5828 5829 return Result; 5830 } 5831 5832 template<typename Derived> 5833 bool TreeTransform<Derived>::TransformExceptionSpec( 5834 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5835 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5836 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5837 5838 // Instantiate a dynamic noexcept expression, if any. 5839 if (isComputedNoexcept(ESI.Type)) { 5840 EnterExpressionEvaluationContext Unevaluated( 5841 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5842 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5843 if (NoexceptExpr.isInvalid()) 5844 return true; 5845 5846 ExceptionSpecificationType EST = ESI.Type; 5847 NoexceptExpr = 5848 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5849 if (NoexceptExpr.isInvalid()) 5850 return true; 5851 5852 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5853 Changed = true; 5854 ESI.NoexceptExpr = NoexceptExpr.get(); 5855 ESI.Type = EST; 5856 } 5857 5858 if (ESI.Type != EST_Dynamic) 5859 return false; 5860 5861 // Instantiate a dynamic exception specification's type. 5862 for (QualType T : ESI.Exceptions) { 5863 if (const PackExpansionType *PackExpansion = 5864 T->getAs<PackExpansionType>()) { 5865 Changed = true; 5866 5867 // We have a pack expansion. Instantiate it. 5868 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5869 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5870 Unexpanded); 5871 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5872 5873 // Determine whether the set of unexpanded parameter packs can and 5874 // should 5875 // be expanded. 5876 bool Expand = false; 5877 bool RetainExpansion = false; 5878 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5879 // FIXME: Track the location of the ellipsis (and track source location 5880 // information for the types in the exception specification in general). 5881 if (getDerived().TryExpandParameterPacks( 5882 Loc, SourceRange(), Unexpanded, Expand, 5883 RetainExpansion, NumExpansions)) 5884 return true; 5885 5886 if (!Expand) { 5887 // We can't expand this pack expansion into separate arguments yet; 5888 // just substitute into the pattern and create a new pack expansion 5889 // type. 5890 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5891 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5892 if (U.isNull()) 5893 return true; 5894 5895 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5896 Exceptions.push_back(U); 5897 continue; 5898 } 5899 5900 // Substitute into the pack expansion pattern for each slice of the 5901 // pack. 5902 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5903 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5904 5905 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5906 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5907 return true; 5908 5909 Exceptions.push_back(U); 5910 } 5911 } else { 5912 QualType U = getDerived().TransformType(T); 5913 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5914 return true; 5915 if (T != U) 5916 Changed = true; 5917 5918 Exceptions.push_back(U); 5919 } 5920 } 5921 5922 ESI.Exceptions = Exceptions; 5923 if (ESI.Exceptions.empty()) 5924 ESI.Type = EST_DynamicNone; 5925 return false; 5926 } 5927 5928 template<typename Derived> 5929 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5930 TypeLocBuilder &TLB, 5931 FunctionNoProtoTypeLoc TL) { 5932 const FunctionNoProtoType *T = TL.getTypePtr(); 5933 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5934 if (ResultType.isNull()) 5935 return QualType(); 5936 5937 QualType Result = TL.getType(); 5938 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5939 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5940 5941 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5942 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5943 NewTL.setLParenLoc(TL.getLParenLoc()); 5944 NewTL.setRParenLoc(TL.getRParenLoc()); 5945 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5946 5947 return Result; 5948 } 5949 5950 template<typename Derived> QualType 5951 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5952 UnresolvedUsingTypeLoc TL) { 5953 const UnresolvedUsingType *T = TL.getTypePtr(); 5954 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5955 if (!D) 5956 return QualType(); 5957 5958 QualType Result = TL.getType(); 5959 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5960 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5961 if (Result.isNull()) 5962 return QualType(); 5963 } 5964 5965 // We might get an arbitrary type spec type back. We should at 5966 // least always get a type spec type, though. 5967 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5968 NewTL.setNameLoc(TL.getNameLoc()); 5969 5970 return Result; 5971 } 5972 5973 template<typename Derived> 5974 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5975 TypedefTypeLoc TL) { 5976 const TypedefType *T = TL.getTypePtr(); 5977 TypedefNameDecl *Typedef 5978 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5979 T->getDecl())); 5980 if (!Typedef) 5981 return QualType(); 5982 5983 QualType Result = TL.getType(); 5984 if (getDerived().AlwaysRebuild() || 5985 Typedef != T->getDecl()) { 5986 Result = getDerived().RebuildTypedefType(Typedef); 5987 if (Result.isNull()) 5988 return QualType(); 5989 } 5990 5991 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5992 NewTL.setNameLoc(TL.getNameLoc()); 5993 5994 return Result; 5995 } 5996 5997 template<typename Derived> 5998 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5999 TypeOfExprTypeLoc TL) { 6000 // typeof expressions are not potentially evaluated contexts 6001 EnterExpressionEvaluationContext Unevaluated( 6002 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6003 Sema::ReuseLambdaContextDecl); 6004 6005 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6006 if (E.isInvalid()) 6007 return QualType(); 6008 6009 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6010 if (E.isInvalid()) 6011 return QualType(); 6012 6013 QualType Result = TL.getType(); 6014 if (getDerived().AlwaysRebuild() || 6015 E.get() != TL.getUnderlyingExpr()) { 6016 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6017 if (Result.isNull()) 6018 return QualType(); 6019 } 6020 else E.get(); 6021 6022 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6023 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6024 NewTL.setLParenLoc(TL.getLParenLoc()); 6025 NewTL.setRParenLoc(TL.getRParenLoc()); 6026 6027 return Result; 6028 } 6029 6030 template<typename Derived> 6031 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6032 TypeOfTypeLoc TL) { 6033 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6034 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6035 if (!New_Under_TI) 6036 return QualType(); 6037 6038 QualType Result = TL.getType(); 6039 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6040 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6041 if (Result.isNull()) 6042 return QualType(); 6043 } 6044 6045 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6046 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6047 NewTL.setLParenLoc(TL.getLParenLoc()); 6048 NewTL.setRParenLoc(TL.getRParenLoc()); 6049 NewTL.setUnderlyingTInfo(New_Under_TI); 6050 6051 return Result; 6052 } 6053 6054 template<typename Derived> 6055 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6056 DecltypeTypeLoc TL) { 6057 const DecltypeType *T = TL.getTypePtr(); 6058 6059 // decltype expressions are not potentially evaluated contexts 6060 EnterExpressionEvaluationContext Unevaluated( 6061 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6062 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6063 6064 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6065 if (E.isInvalid()) 6066 return QualType(); 6067 6068 E = getSema().ActOnDecltypeExpression(E.get()); 6069 if (E.isInvalid()) 6070 return QualType(); 6071 6072 QualType Result = TL.getType(); 6073 if (getDerived().AlwaysRebuild() || 6074 E.get() != T->getUnderlyingExpr()) { 6075 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6076 if (Result.isNull()) 6077 return QualType(); 6078 } 6079 else E.get(); 6080 6081 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6082 NewTL.setNameLoc(TL.getNameLoc()); 6083 6084 return Result; 6085 } 6086 6087 template<typename Derived> 6088 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6089 TypeLocBuilder &TLB, 6090 UnaryTransformTypeLoc TL) { 6091 QualType Result = TL.getType(); 6092 if (Result->isDependentType()) { 6093 const UnaryTransformType *T = TL.getTypePtr(); 6094 QualType NewBase = 6095 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6096 Result = getDerived().RebuildUnaryTransformType(NewBase, 6097 T->getUTTKind(), 6098 TL.getKWLoc()); 6099 if (Result.isNull()) 6100 return QualType(); 6101 } 6102 6103 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6104 NewTL.setKWLoc(TL.getKWLoc()); 6105 NewTL.setParensRange(TL.getParensRange()); 6106 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6107 return Result; 6108 } 6109 6110 template<typename Derived> 6111 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6112 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6113 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6114 6115 CXXScopeSpec SS; 6116 TemplateName TemplateName = getDerived().TransformTemplateName( 6117 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6118 if (TemplateName.isNull()) 6119 return QualType(); 6120 6121 QualType OldDeduced = T->getDeducedType(); 6122 QualType NewDeduced; 6123 if (!OldDeduced.isNull()) { 6124 NewDeduced = getDerived().TransformType(OldDeduced); 6125 if (NewDeduced.isNull()) 6126 return QualType(); 6127 } 6128 6129 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6130 TemplateName, NewDeduced); 6131 if (Result.isNull()) 6132 return QualType(); 6133 6134 DeducedTemplateSpecializationTypeLoc NewTL = 6135 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6136 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6137 6138 return Result; 6139 } 6140 6141 template<typename Derived> 6142 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6143 RecordTypeLoc TL) { 6144 const RecordType *T = TL.getTypePtr(); 6145 RecordDecl *Record 6146 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6147 T->getDecl())); 6148 if (!Record) 6149 return QualType(); 6150 6151 QualType Result = TL.getType(); 6152 if (getDerived().AlwaysRebuild() || 6153 Record != T->getDecl()) { 6154 Result = getDerived().RebuildRecordType(Record); 6155 if (Result.isNull()) 6156 return QualType(); 6157 } 6158 6159 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6160 NewTL.setNameLoc(TL.getNameLoc()); 6161 6162 return Result; 6163 } 6164 6165 template<typename Derived> 6166 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6167 EnumTypeLoc TL) { 6168 const EnumType *T = TL.getTypePtr(); 6169 EnumDecl *Enum 6170 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6171 T->getDecl())); 6172 if (!Enum) 6173 return QualType(); 6174 6175 QualType Result = TL.getType(); 6176 if (getDerived().AlwaysRebuild() || 6177 Enum != T->getDecl()) { 6178 Result = getDerived().RebuildEnumType(Enum); 6179 if (Result.isNull()) 6180 return QualType(); 6181 } 6182 6183 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6184 NewTL.setNameLoc(TL.getNameLoc()); 6185 6186 return Result; 6187 } 6188 6189 template<typename Derived> 6190 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6191 TypeLocBuilder &TLB, 6192 InjectedClassNameTypeLoc TL) { 6193 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6194 TL.getTypePtr()->getDecl()); 6195 if (!D) return QualType(); 6196 6197 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6198 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6199 return T; 6200 } 6201 6202 template<typename Derived> 6203 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6204 TypeLocBuilder &TLB, 6205 TemplateTypeParmTypeLoc TL) { 6206 return TransformTypeSpecType(TLB, TL); 6207 } 6208 6209 template<typename Derived> 6210 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6211 TypeLocBuilder &TLB, 6212 SubstTemplateTypeParmTypeLoc TL) { 6213 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6214 6215 // Substitute into the replacement type, which itself might involve something 6216 // that needs to be transformed. This only tends to occur with default 6217 // template arguments of template template parameters. 6218 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6219 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6220 if (Replacement.isNull()) 6221 return QualType(); 6222 6223 // Always canonicalize the replacement type. 6224 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6225 QualType Result 6226 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6227 Replacement); 6228 6229 // Propagate type-source information. 6230 SubstTemplateTypeParmTypeLoc NewTL 6231 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6232 NewTL.setNameLoc(TL.getNameLoc()); 6233 return Result; 6234 6235 } 6236 6237 template<typename Derived> 6238 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6239 TypeLocBuilder &TLB, 6240 SubstTemplateTypeParmPackTypeLoc TL) { 6241 return TransformTypeSpecType(TLB, TL); 6242 } 6243 6244 template<typename Derived> 6245 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6246 TypeLocBuilder &TLB, 6247 TemplateSpecializationTypeLoc TL) { 6248 const TemplateSpecializationType *T = TL.getTypePtr(); 6249 6250 // The nested-name-specifier never matters in a TemplateSpecializationType, 6251 // because we can't have a dependent nested-name-specifier anyway. 6252 CXXScopeSpec SS; 6253 TemplateName Template 6254 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6255 TL.getTemplateNameLoc()); 6256 if (Template.isNull()) 6257 return QualType(); 6258 6259 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6260 } 6261 6262 template<typename Derived> 6263 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6264 AtomicTypeLoc TL) { 6265 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6266 if (ValueType.isNull()) 6267 return QualType(); 6268 6269 QualType Result = TL.getType(); 6270 if (getDerived().AlwaysRebuild() || 6271 ValueType != TL.getValueLoc().getType()) { 6272 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6273 if (Result.isNull()) 6274 return QualType(); 6275 } 6276 6277 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6278 NewTL.setKWLoc(TL.getKWLoc()); 6279 NewTL.setLParenLoc(TL.getLParenLoc()); 6280 NewTL.setRParenLoc(TL.getRParenLoc()); 6281 6282 return Result; 6283 } 6284 6285 template <typename Derived> 6286 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6287 PipeTypeLoc TL) { 6288 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6289 if (ValueType.isNull()) 6290 return QualType(); 6291 6292 QualType Result = TL.getType(); 6293 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6294 const PipeType *PT = Result->castAs<PipeType>(); 6295 bool isReadPipe = PT->isReadOnly(); 6296 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6297 if (Result.isNull()) 6298 return QualType(); 6299 } 6300 6301 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6302 NewTL.setKWLoc(TL.getKWLoc()); 6303 6304 return Result; 6305 } 6306 6307 template <typename Derived> 6308 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6309 ExtIntTypeLoc TL) { 6310 const ExtIntType *EIT = TL.getTypePtr(); 6311 QualType Result = TL.getType(); 6312 6313 if (getDerived().AlwaysRebuild()) { 6314 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6315 EIT->getNumBits(), TL.getNameLoc()); 6316 if (Result.isNull()) 6317 return QualType(); 6318 } 6319 6320 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6321 NewTL.setNameLoc(TL.getNameLoc()); 6322 return Result; 6323 } 6324 6325 template <typename Derived> 6326 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6327 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6328 const DependentExtIntType *EIT = TL.getTypePtr(); 6329 6330 EnterExpressionEvaluationContext Unevaluated( 6331 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6332 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6333 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6334 6335 if (BitsExpr.isInvalid()) 6336 return QualType(); 6337 6338 QualType Result = TL.getType(); 6339 6340 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6341 Result = getDerived().RebuildDependentExtIntType( 6342 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6343 6344 if (Result.isNull()) 6345 return QualType(); 6346 } 6347 6348 if (isa<DependentExtIntType>(Result)) { 6349 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6350 NewTL.setNameLoc(TL.getNameLoc()); 6351 } else { 6352 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6353 NewTL.setNameLoc(TL.getNameLoc()); 6354 } 6355 return Result; 6356 } 6357 6358 /// Simple iterator that traverses the template arguments in a 6359 /// container that provides a \c getArgLoc() member function. 6360 /// 6361 /// This iterator is intended to be used with the iterator form of 6362 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6363 template<typename ArgLocContainer> 6364 class TemplateArgumentLocContainerIterator { 6365 ArgLocContainer *Container; 6366 unsigned Index; 6367 6368 public: 6369 typedef TemplateArgumentLoc value_type; 6370 typedef TemplateArgumentLoc reference; 6371 typedef int difference_type; 6372 typedef std::input_iterator_tag iterator_category; 6373 6374 class pointer { 6375 TemplateArgumentLoc Arg; 6376 6377 public: 6378 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6379 6380 const TemplateArgumentLoc *operator->() const { 6381 return &Arg; 6382 } 6383 }; 6384 6385 6386 TemplateArgumentLocContainerIterator() {} 6387 6388 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6389 unsigned Index) 6390 : Container(&Container), Index(Index) { } 6391 6392 TemplateArgumentLocContainerIterator &operator++() { 6393 ++Index; 6394 return *this; 6395 } 6396 6397 TemplateArgumentLocContainerIterator operator++(int) { 6398 TemplateArgumentLocContainerIterator Old(*this); 6399 ++(*this); 6400 return Old; 6401 } 6402 6403 TemplateArgumentLoc operator*() const { 6404 return Container->getArgLoc(Index); 6405 } 6406 6407 pointer operator->() const { 6408 return pointer(Container->getArgLoc(Index)); 6409 } 6410 6411 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6412 const TemplateArgumentLocContainerIterator &Y) { 6413 return X.Container == Y.Container && X.Index == Y.Index; 6414 } 6415 6416 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6417 const TemplateArgumentLocContainerIterator &Y) { 6418 return !(X == Y); 6419 } 6420 }; 6421 6422 template<typename Derived> 6423 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6424 AutoTypeLoc TL) { 6425 const AutoType *T = TL.getTypePtr(); 6426 QualType OldDeduced = T->getDeducedType(); 6427 QualType NewDeduced; 6428 if (!OldDeduced.isNull()) { 6429 NewDeduced = getDerived().TransformType(OldDeduced); 6430 if (NewDeduced.isNull()) 6431 return QualType(); 6432 } 6433 6434 ConceptDecl *NewCD = nullptr; 6435 TemplateArgumentListInfo NewTemplateArgs; 6436 NestedNameSpecifierLoc NewNestedNameSpec; 6437 if (TL.getTypePtr()->isConstrained()) { 6438 NewCD = cast_or_null<ConceptDecl>( 6439 getDerived().TransformDecl( 6440 TL.getConceptNameLoc(), 6441 TL.getTypePtr()->getTypeConstraintConcept())); 6442 6443 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6444 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6445 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6446 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6447 ArgIterator(TL, 6448 TL.getNumArgs()), 6449 NewTemplateArgs)) 6450 return QualType(); 6451 6452 if (TL.getNestedNameSpecifierLoc()) { 6453 NewNestedNameSpec 6454 = getDerived().TransformNestedNameSpecifierLoc( 6455 TL.getNestedNameSpecifierLoc()); 6456 if (!NewNestedNameSpec) 6457 return QualType(); 6458 } 6459 } 6460 6461 QualType Result = TL.getType(); 6462 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6463 T->isDependentType()) { 6464 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6465 NewArgList.reserve(NewArgList.size()); 6466 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6467 NewArgList.push_back(ArgLoc.getArgument()); 6468 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6469 NewArgList); 6470 if (Result.isNull()) 6471 return QualType(); 6472 } 6473 6474 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6475 NewTL.setNameLoc(TL.getNameLoc()); 6476 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6477 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6478 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6479 NewTL.setFoundDecl(TL.getFoundDecl()); 6480 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6481 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6482 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6483 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6484 6485 return Result; 6486 } 6487 6488 template <typename Derived> 6489 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6490 TypeLocBuilder &TLB, 6491 TemplateSpecializationTypeLoc TL, 6492 TemplateName Template) { 6493 TemplateArgumentListInfo NewTemplateArgs; 6494 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6495 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6496 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6497 ArgIterator; 6498 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6499 ArgIterator(TL, TL.getNumArgs()), 6500 NewTemplateArgs)) 6501 return QualType(); 6502 6503 // FIXME: maybe don't rebuild if all the template arguments are the same. 6504 6505 QualType Result = 6506 getDerived().RebuildTemplateSpecializationType(Template, 6507 TL.getTemplateNameLoc(), 6508 NewTemplateArgs); 6509 6510 if (!Result.isNull()) { 6511 // Specializations of template template parameters are represented as 6512 // TemplateSpecializationTypes, and substitution of type alias templates 6513 // within a dependent context can transform them into 6514 // DependentTemplateSpecializationTypes. 6515 if (isa<DependentTemplateSpecializationType>(Result)) { 6516 DependentTemplateSpecializationTypeLoc NewTL 6517 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6518 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6519 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6520 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6521 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6522 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6523 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6524 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6525 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6526 return Result; 6527 } 6528 6529 TemplateSpecializationTypeLoc NewTL 6530 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6531 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6532 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6533 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6534 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6535 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6536 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6537 } 6538 6539 return Result; 6540 } 6541 6542 template <typename Derived> 6543 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6544 TypeLocBuilder &TLB, 6545 DependentTemplateSpecializationTypeLoc TL, 6546 TemplateName Template, 6547 CXXScopeSpec &SS) { 6548 TemplateArgumentListInfo NewTemplateArgs; 6549 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6550 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6551 typedef TemplateArgumentLocContainerIterator< 6552 DependentTemplateSpecializationTypeLoc> ArgIterator; 6553 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6554 ArgIterator(TL, TL.getNumArgs()), 6555 NewTemplateArgs)) 6556 return QualType(); 6557 6558 // FIXME: maybe don't rebuild if all the template arguments are the same. 6559 6560 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6561 QualType Result 6562 = getSema().Context.getDependentTemplateSpecializationType( 6563 TL.getTypePtr()->getKeyword(), 6564 DTN->getQualifier(), 6565 DTN->getIdentifier(), 6566 NewTemplateArgs); 6567 6568 DependentTemplateSpecializationTypeLoc NewTL 6569 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6570 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6571 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6572 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6573 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6574 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6575 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6576 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6577 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6578 return Result; 6579 } 6580 6581 QualType Result 6582 = getDerived().RebuildTemplateSpecializationType(Template, 6583 TL.getTemplateNameLoc(), 6584 NewTemplateArgs); 6585 6586 if (!Result.isNull()) { 6587 /// FIXME: Wrap this in an elaborated-type-specifier? 6588 TemplateSpecializationTypeLoc NewTL 6589 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6590 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6591 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6592 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6593 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6594 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6595 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6596 } 6597 6598 return Result; 6599 } 6600 6601 template<typename Derived> 6602 QualType 6603 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6604 ElaboratedTypeLoc TL) { 6605 const ElaboratedType *T = TL.getTypePtr(); 6606 6607 NestedNameSpecifierLoc QualifierLoc; 6608 // NOTE: the qualifier in an ElaboratedType is optional. 6609 if (TL.getQualifierLoc()) { 6610 QualifierLoc 6611 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6612 if (!QualifierLoc) 6613 return QualType(); 6614 } 6615 6616 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6617 if (NamedT.isNull()) 6618 return QualType(); 6619 6620 // C++0x [dcl.type.elab]p2: 6621 // If the identifier resolves to a typedef-name or the simple-template-id 6622 // resolves to an alias template specialization, the 6623 // elaborated-type-specifier is ill-formed. 6624 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6625 if (const TemplateSpecializationType *TST = 6626 NamedT->getAs<TemplateSpecializationType>()) { 6627 TemplateName Template = TST->getTemplateName(); 6628 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6629 Template.getAsTemplateDecl())) { 6630 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6631 diag::err_tag_reference_non_tag) 6632 << TAT << Sema::NTK_TypeAliasTemplate 6633 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6634 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6635 } 6636 } 6637 } 6638 6639 QualType Result = TL.getType(); 6640 if (getDerived().AlwaysRebuild() || 6641 QualifierLoc != TL.getQualifierLoc() || 6642 NamedT != T->getNamedType()) { 6643 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6644 T->getKeyword(), 6645 QualifierLoc, NamedT); 6646 if (Result.isNull()) 6647 return QualType(); 6648 } 6649 6650 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6651 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6652 NewTL.setQualifierLoc(QualifierLoc); 6653 return Result; 6654 } 6655 6656 template<typename Derived> 6657 QualType TreeTransform<Derived>::TransformAttributedType( 6658 TypeLocBuilder &TLB, 6659 AttributedTypeLoc TL) { 6660 const AttributedType *oldType = TL.getTypePtr(); 6661 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6662 if (modifiedType.isNull()) 6663 return QualType(); 6664 6665 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6666 const Attr *oldAttr = TL.getAttr(); 6667 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6668 if (oldAttr && !newAttr) 6669 return QualType(); 6670 6671 QualType result = TL.getType(); 6672 6673 // FIXME: dependent operand expressions? 6674 if (getDerived().AlwaysRebuild() || 6675 modifiedType != oldType->getModifiedType()) { 6676 // TODO: this is really lame; we should really be rebuilding the 6677 // equivalent type from first principles. 6678 QualType equivalentType 6679 = getDerived().TransformType(oldType->getEquivalentType()); 6680 if (equivalentType.isNull()) 6681 return QualType(); 6682 6683 // Check whether we can add nullability; it is only represented as 6684 // type sugar, and therefore cannot be diagnosed in any other way. 6685 if (auto nullability = oldType->getImmediateNullability()) { 6686 if (!modifiedType->canHaveNullability()) { 6687 SemaRef.Diag(TL.getAttr()->getLocation(), 6688 diag::err_nullability_nonpointer) 6689 << DiagNullabilityKind(*nullability, false) << modifiedType; 6690 return QualType(); 6691 } 6692 } 6693 6694 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6695 modifiedType, 6696 equivalentType); 6697 } 6698 6699 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6700 newTL.setAttr(newAttr); 6701 return result; 6702 } 6703 6704 template<typename Derived> 6705 QualType 6706 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6707 ParenTypeLoc TL) { 6708 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6709 if (Inner.isNull()) 6710 return QualType(); 6711 6712 QualType Result = TL.getType(); 6713 if (getDerived().AlwaysRebuild() || 6714 Inner != TL.getInnerLoc().getType()) { 6715 Result = getDerived().RebuildParenType(Inner); 6716 if (Result.isNull()) 6717 return QualType(); 6718 } 6719 6720 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6721 NewTL.setLParenLoc(TL.getLParenLoc()); 6722 NewTL.setRParenLoc(TL.getRParenLoc()); 6723 return Result; 6724 } 6725 6726 template <typename Derived> 6727 QualType 6728 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6729 MacroQualifiedTypeLoc TL) { 6730 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6731 if (Inner.isNull()) 6732 return QualType(); 6733 6734 QualType Result = TL.getType(); 6735 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6736 Result = 6737 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6738 if (Result.isNull()) 6739 return QualType(); 6740 } 6741 6742 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6743 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6744 return Result; 6745 } 6746 6747 template<typename Derived> 6748 QualType TreeTransform<Derived>::TransformDependentNameType( 6749 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6750 return TransformDependentNameType(TLB, TL, false); 6751 } 6752 6753 template<typename Derived> 6754 QualType TreeTransform<Derived>::TransformDependentNameType( 6755 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6756 const DependentNameType *T = TL.getTypePtr(); 6757 6758 NestedNameSpecifierLoc QualifierLoc 6759 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6760 if (!QualifierLoc) 6761 return QualType(); 6762 6763 QualType Result 6764 = getDerived().RebuildDependentNameType(T->getKeyword(), 6765 TL.getElaboratedKeywordLoc(), 6766 QualifierLoc, 6767 T->getIdentifier(), 6768 TL.getNameLoc(), 6769 DeducedTSTContext); 6770 if (Result.isNull()) 6771 return QualType(); 6772 6773 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6774 QualType NamedT = ElabT->getNamedType(); 6775 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6776 6777 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6778 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6779 NewTL.setQualifierLoc(QualifierLoc); 6780 } else { 6781 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6782 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6783 NewTL.setQualifierLoc(QualifierLoc); 6784 NewTL.setNameLoc(TL.getNameLoc()); 6785 } 6786 return Result; 6787 } 6788 6789 template<typename Derived> 6790 QualType TreeTransform<Derived>:: 6791 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6792 DependentTemplateSpecializationTypeLoc TL) { 6793 NestedNameSpecifierLoc QualifierLoc; 6794 if (TL.getQualifierLoc()) { 6795 QualifierLoc 6796 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6797 if (!QualifierLoc) 6798 return QualType(); 6799 } 6800 6801 return getDerived() 6802 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6803 } 6804 6805 template<typename Derived> 6806 QualType TreeTransform<Derived>:: 6807 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6808 DependentTemplateSpecializationTypeLoc TL, 6809 NestedNameSpecifierLoc QualifierLoc) { 6810 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6811 6812 TemplateArgumentListInfo NewTemplateArgs; 6813 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6814 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6815 6816 typedef TemplateArgumentLocContainerIterator< 6817 DependentTemplateSpecializationTypeLoc> ArgIterator; 6818 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6819 ArgIterator(TL, TL.getNumArgs()), 6820 NewTemplateArgs)) 6821 return QualType(); 6822 6823 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6824 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6825 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6826 /*AllowInjectedClassName*/ false); 6827 if (Result.isNull()) 6828 return QualType(); 6829 6830 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6831 QualType NamedT = ElabT->getNamedType(); 6832 6833 // Copy information relevant to the template specialization. 6834 TemplateSpecializationTypeLoc NamedTL 6835 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6836 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6837 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6838 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6839 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6840 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6841 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6842 6843 // Copy information relevant to the elaborated type. 6844 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6845 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6846 NewTL.setQualifierLoc(QualifierLoc); 6847 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6848 DependentTemplateSpecializationTypeLoc SpecTL 6849 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6850 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6851 SpecTL.setQualifierLoc(QualifierLoc); 6852 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6853 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6854 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6855 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6856 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6857 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6858 } else { 6859 TemplateSpecializationTypeLoc SpecTL 6860 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6861 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6862 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6863 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6864 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6865 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6866 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6867 } 6868 return Result; 6869 } 6870 6871 template<typename Derived> 6872 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6873 PackExpansionTypeLoc TL) { 6874 QualType Pattern 6875 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6876 if (Pattern.isNull()) 6877 return QualType(); 6878 6879 QualType Result = TL.getType(); 6880 if (getDerived().AlwaysRebuild() || 6881 Pattern != TL.getPatternLoc().getType()) { 6882 Result = getDerived().RebuildPackExpansionType(Pattern, 6883 TL.getPatternLoc().getSourceRange(), 6884 TL.getEllipsisLoc(), 6885 TL.getTypePtr()->getNumExpansions()); 6886 if (Result.isNull()) 6887 return QualType(); 6888 } 6889 6890 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6891 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6892 return Result; 6893 } 6894 6895 template<typename Derived> 6896 QualType 6897 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6898 ObjCInterfaceTypeLoc TL) { 6899 // ObjCInterfaceType is never dependent. 6900 TLB.pushFullCopy(TL); 6901 return TL.getType(); 6902 } 6903 6904 template<typename Derived> 6905 QualType 6906 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6907 ObjCTypeParamTypeLoc TL) { 6908 const ObjCTypeParamType *T = TL.getTypePtr(); 6909 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6910 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6911 if (!OTP) 6912 return QualType(); 6913 6914 QualType Result = TL.getType(); 6915 if (getDerived().AlwaysRebuild() || 6916 OTP != T->getDecl()) { 6917 Result = getDerived().RebuildObjCTypeParamType(OTP, 6918 TL.getProtocolLAngleLoc(), 6919 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6920 TL.getNumProtocols()), 6921 TL.getProtocolLocs(), 6922 TL.getProtocolRAngleLoc()); 6923 if (Result.isNull()) 6924 return QualType(); 6925 } 6926 6927 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6928 if (TL.getNumProtocols()) { 6929 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6930 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6931 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6932 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6933 } 6934 return Result; 6935 } 6936 6937 template<typename Derived> 6938 QualType 6939 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6940 ObjCObjectTypeLoc TL) { 6941 // Transform base type. 6942 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6943 if (BaseType.isNull()) 6944 return QualType(); 6945 6946 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6947 6948 // Transform type arguments. 6949 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6950 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6951 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6952 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6953 QualType TypeArg = TypeArgInfo->getType(); 6954 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6955 AnyChanged = true; 6956 6957 // We have a pack expansion. Instantiate it. 6958 const auto *PackExpansion = PackExpansionLoc.getType() 6959 ->castAs<PackExpansionType>(); 6960 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6961 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6962 Unexpanded); 6963 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6964 6965 // Determine whether the set of unexpanded parameter packs can 6966 // and should be expanded. 6967 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6968 bool Expand = false; 6969 bool RetainExpansion = false; 6970 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6971 if (getDerived().TryExpandParameterPacks( 6972 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6973 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6974 return QualType(); 6975 6976 if (!Expand) { 6977 // We can't expand this pack expansion into separate arguments yet; 6978 // just substitute into the pattern and create a new pack expansion 6979 // type. 6980 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6981 6982 TypeLocBuilder TypeArgBuilder; 6983 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6984 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6985 PatternLoc); 6986 if (NewPatternType.isNull()) 6987 return QualType(); 6988 6989 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6990 NewPatternType, NumExpansions); 6991 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6992 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6993 NewTypeArgInfos.push_back( 6994 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6995 continue; 6996 } 6997 6998 // Substitute into the pack expansion pattern for each slice of the 6999 // pack. 7000 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7001 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7002 7003 TypeLocBuilder TypeArgBuilder; 7004 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7005 7006 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7007 PatternLoc); 7008 if (NewTypeArg.isNull()) 7009 return QualType(); 7010 7011 NewTypeArgInfos.push_back( 7012 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7013 } 7014 7015 continue; 7016 } 7017 7018 TypeLocBuilder TypeArgBuilder; 7019 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7020 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7021 if (NewTypeArg.isNull()) 7022 return QualType(); 7023 7024 // If nothing changed, just keep the old TypeSourceInfo. 7025 if (NewTypeArg == TypeArg) { 7026 NewTypeArgInfos.push_back(TypeArgInfo); 7027 continue; 7028 } 7029 7030 NewTypeArgInfos.push_back( 7031 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7032 AnyChanged = true; 7033 } 7034 7035 QualType Result = TL.getType(); 7036 if (getDerived().AlwaysRebuild() || AnyChanged) { 7037 // Rebuild the type. 7038 Result = getDerived().RebuildObjCObjectType( 7039 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7040 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7041 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7042 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7043 7044 if (Result.isNull()) 7045 return QualType(); 7046 } 7047 7048 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7049 NewT.setHasBaseTypeAsWritten(true); 7050 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7051 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7052 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7053 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7054 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7055 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7056 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7057 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7058 return Result; 7059 } 7060 7061 template<typename Derived> 7062 QualType 7063 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7064 ObjCObjectPointerTypeLoc TL) { 7065 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7066 if (PointeeType.isNull()) 7067 return QualType(); 7068 7069 QualType Result = TL.getType(); 7070 if (getDerived().AlwaysRebuild() || 7071 PointeeType != TL.getPointeeLoc().getType()) { 7072 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7073 TL.getStarLoc()); 7074 if (Result.isNull()) 7075 return QualType(); 7076 } 7077 7078 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7079 NewT.setStarLoc(TL.getStarLoc()); 7080 return Result; 7081 } 7082 7083 //===----------------------------------------------------------------------===// 7084 // Statement transformation 7085 //===----------------------------------------------------------------------===// 7086 template<typename Derived> 7087 StmtResult 7088 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7089 return S; 7090 } 7091 7092 template<typename Derived> 7093 StmtResult 7094 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7095 return getDerived().TransformCompoundStmt(S, false); 7096 } 7097 7098 template<typename Derived> 7099 StmtResult 7100 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7101 bool IsStmtExpr) { 7102 Sema::CompoundScopeRAII CompoundScope(getSema()); 7103 7104 const Stmt *ExprResult = S->getStmtExprResult(); 7105 bool SubStmtInvalid = false; 7106 bool SubStmtChanged = false; 7107 SmallVector<Stmt*, 8> Statements; 7108 for (auto *B : S->body()) { 7109 StmtResult Result = getDerived().TransformStmt( 7110 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7111 7112 if (Result.isInvalid()) { 7113 // Immediately fail if this was a DeclStmt, since it's very 7114 // likely that this will cause problems for future statements. 7115 if (isa<DeclStmt>(B)) 7116 return StmtError(); 7117 7118 // Otherwise, just keep processing substatements and fail later. 7119 SubStmtInvalid = true; 7120 continue; 7121 } 7122 7123 SubStmtChanged = SubStmtChanged || Result.get() != B; 7124 Statements.push_back(Result.getAs<Stmt>()); 7125 } 7126 7127 if (SubStmtInvalid) 7128 return StmtError(); 7129 7130 if (!getDerived().AlwaysRebuild() && 7131 !SubStmtChanged) 7132 return S; 7133 7134 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7135 Statements, 7136 S->getRBracLoc(), 7137 IsStmtExpr); 7138 } 7139 7140 template<typename Derived> 7141 StmtResult 7142 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7143 ExprResult LHS, RHS; 7144 { 7145 EnterExpressionEvaluationContext Unevaluated( 7146 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7147 7148 // Transform the left-hand case value. 7149 LHS = getDerived().TransformExpr(S->getLHS()); 7150 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7151 if (LHS.isInvalid()) 7152 return StmtError(); 7153 7154 // Transform the right-hand case value (for the GNU case-range extension). 7155 RHS = getDerived().TransformExpr(S->getRHS()); 7156 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7157 if (RHS.isInvalid()) 7158 return StmtError(); 7159 } 7160 7161 // Build the case statement. 7162 // Case statements are always rebuilt so that they will attached to their 7163 // transformed switch statement. 7164 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7165 LHS.get(), 7166 S->getEllipsisLoc(), 7167 RHS.get(), 7168 S->getColonLoc()); 7169 if (Case.isInvalid()) 7170 return StmtError(); 7171 7172 // Transform the statement following the case 7173 StmtResult SubStmt = 7174 getDerived().TransformStmt(S->getSubStmt()); 7175 if (SubStmt.isInvalid()) 7176 return StmtError(); 7177 7178 // Attach the body to the case statement 7179 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7180 } 7181 7182 template <typename Derived> 7183 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7184 // Transform the statement following the default case 7185 StmtResult SubStmt = 7186 getDerived().TransformStmt(S->getSubStmt()); 7187 if (SubStmt.isInvalid()) 7188 return StmtError(); 7189 7190 // Default statements are always rebuilt 7191 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7192 SubStmt.get()); 7193 } 7194 7195 template<typename Derived> 7196 StmtResult 7197 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7198 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7199 if (SubStmt.isInvalid()) 7200 return StmtError(); 7201 7202 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7203 S->getDecl()); 7204 if (!LD) 7205 return StmtError(); 7206 7207 // If we're transforming "in-place" (we're not creating new local 7208 // declarations), assume we're replacing the old label statement 7209 // and clear out the reference to it. 7210 if (LD == S->getDecl()) 7211 S->getDecl()->setStmt(nullptr); 7212 7213 // FIXME: Pass the real colon location in. 7214 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7215 cast<LabelDecl>(LD), SourceLocation(), 7216 SubStmt.get()); 7217 } 7218 7219 template <typename Derived> 7220 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7221 if (!R) 7222 return R; 7223 7224 switch (R->getKind()) { 7225 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7226 #define ATTR(X) 7227 #define PRAGMA_SPELLING_ATTR(X) \ 7228 case attr::X: \ 7229 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7230 #include "clang/Basic/AttrList.inc" 7231 default: 7232 return R; 7233 } 7234 } 7235 7236 template <typename Derived> 7237 StmtResult 7238 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7239 StmtDiscardKind SDK) { 7240 bool AttrsChanged = false; 7241 SmallVector<const Attr *, 1> Attrs; 7242 7243 // Visit attributes and keep track if any are transformed. 7244 for (const auto *I : S->getAttrs()) { 7245 const Attr *R = getDerived().TransformAttr(I); 7246 AttrsChanged |= (I != R); 7247 Attrs.push_back(R); 7248 } 7249 7250 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7251 if (SubStmt.isInvalid()) 7252 return StmtError(); 7253 7254 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7255 return S; 7256 7257 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7258 SubStmt.get()); 7259 } 7260 7261 template<typename Derived> 7262 StmtResult 7263 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7264 // Transform the initialization statement 7265 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7266 if (Init.isInvalid()) 7267 return StmtError(); 7268 7269 // Transform the condition 7270 Sema::ConditionResult Cond = getDerived().TransformCondition( 7271 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7272 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7273 : Sema::ConditionKind::Boolean); 7274 if (Cond.isInvalid()) 7275 return StmtError(); 7276 7277 // If this is a constexpr if, determine which arm we should instantiate. 7278 llvm::Optional<bool> ConstexprConditionValue; 7279 if (S->isConstexpr()) 7280 ConstexprConditionValue = Cond.getKnownValue(); 7281 7282 // Transform the "then" branch. 7283 StmtResult Then; 7284 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7285 Then = getDerived().TransformStmt(S->getThen()); 7286 if (Then.isInvalid()) 7287 return StmtError(); 7288 } else { 7289 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7290 } 7291 7292 // Transform the "else" branch. 7293 StmtResult Else; 7294 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7295 Else = getDerived().TransformStmt(S->getElse()); 7296 if (Else.isInvalid()) 7297 return StmtError(); 7298 } 7299 7300 if (!getDerived().AlwaysRebuild() && 7301 Init.get() == S->getInit() && 7302 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7303 Then.get() == S->getThen() && 7304 Else.get() == S->getElse()) 7305 return S; 7306 7307 return getDerived().RebuildIfStmt( 7308 S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, 7309 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7310 } 7311 7312 template<typename Derived> 7313 StmtResult 7314 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7315 // Transform the initialization statement 7316 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7317 if (Init.isInvalid()) 7318 return StmtError(); 7319 7320 // Transform the condition. 7321 Sema::ConditionResult Cond = getDerived().TransformCondition( 7322 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7323 Sema::ConditionKind::Switch); 7324 if (Cond.isInvalid()) 7325 return StmtError(); 7326 7327 // Rebuild the switch statement. 7328 StmtResult Switch = 7329 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7330 Init.get(), Cond, S->getRParenLoc()); 7331 if (Switch.isInvalid()) 7332 return StmtError(); 7333 7334 // Transform the body of the switch statement. 7335 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7336 if (Body.isInvalid()) 7337 return StmtError(); 7338 7339 // Complete the switch statement. 7340 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7341 Body.get()); 7342 } 7343 7344 template<typename Derived> 7345 StmtResult 7346 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7347 // Transform the condition 7348 Sema::ConditionResult Cond = getDerived().TransformCondition( 7349 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7350 Sema::ConditionKind::Boolean); 7351 if (Cond.isInvalid()) 7352 return StmtError(); 7353 7354 // Transform the body 7355 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7356 if (Body.isInvalid()) 7357 return StmtError(); 7358 7359 if (!getDerived().AlwaysRebuild() && 7360 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7361 Body.get() == S->getBody()) 7362 return Owned(S); 7363 7364 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7365 Cond, S->getRParenLoc(), Body.get()); 7366 } 7367 7368 template<typename Derived> 7369 StmtResult 7370 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7371 // Transform the body 7372 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7373 if (Body.isInvalid()) 7374 return StmtError(); 7375 7376 // Transform the condition 7377 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7378 if (Cond.isInvalid()) 7379 return StmtError(); 7380 7381 if (!getDerived().AlwaysRebuild() && 7382 Cond.get() == S->getCond() && 7383 Body.get() == S->getBody()) 7384 return S; 7385 7386 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7387 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7388 S->getRParenLoc()); 7389 } 7390 7391 template<typename Derived> 7392 StmtResult 7393 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7394 if (getSema().getLangOpts().OpenMP) 7395 getSema().startOpenMPLoop(); 7396 7397 // Transform the initialization statement 7398 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7399 if (Init.isInvalid()) 7400 return StmtError(); 7401 7402 // In OpenMP loop region loop control variable must be captured and be 7403 // private. Perform analysis of first part (if any). 7404 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7405 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7406 7407 // Transform the condition 7408 Sema::ConditionResult Cond = getDerived().TransformCondition( 7409 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7410 Sema::ConditionKind::Boolean); 7411 if (Cond.isInvalid()) 7412 return StmtError(); 7413 7414 // Transform the increment 7415 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7416 if (Inc.isInvalid()) 7417 return StmtError(); 7418 7419 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7420 if (S->getInc() && !FullInc.get()) 7421 return StmtError(); 7422 7423 // Transform the body 7424 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7425 if (Body.isInvalid()) 7426 return StmtError(); 7427 7428 if (!getDerived().AlwaysRebuild() && 7429 Init.get() == S->getInit() && 7430 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7431 Inc.get() == S->getInc() && 7432 Body.get() == S->getBody()) 7433 return S; 7434 7435 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7436 Init.get(), Cond, FullInc, 7437 S->getRParenLoc(), Body.get()); 7438 } 7439 7440 template<typename Derived> 7441 StmtResult 7442 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7443 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7444 S->getLabel()); 7445 if (!LD) 7446 return StmtError(); 7447 7448 // Goto statements must always be rebuilt, to resolve the label. 7449 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7450 cast<LabelDecl>(LD)); 7451 } 7452 7453 template<typename Derived> 7454 StmtResult 7455 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7456 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7457 if (Target.isInvalid()) 7458 return StmtError(); 7459 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7460 7461 if (!getDerived().AlwaysRebuild() && 7462 Target.get() == S->getTarget()) 7463 return S; 7464 7465 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7466 Target.get()); 7467 } 7468 7469 template<typename Derived> 7470 StmtResult 7471 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7472 return S; 7473 } 7474 7475 template<typename Derived> 7476 StmtResult 7477 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7478 return S; 7479 } 7480 7481 template<typename Derived> 7482 StmtResult 7483 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7484 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7485 /*NotCopyInit*/false); 7486 if (Result.isInvalid()) 7487 return StmtError(); 7488 7489 // FIXME: We always rebuild the return statement because there is no way 7490 // to tell whether the return type of the function has changed. 7491 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7492 } 7493 7494 template<typename Derived> 7495 StmtResult 7496 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7497 bool DeclChanged = false; 7498 SmallVector<Decl *, 4> Decls; 7499 for (auto *D : S->decls()) { 7500 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7501 if (!Transformed) 7502 return StmtError(); 7503 7504 if (Transformed != D) 7505 DeclChanged = true; 7506 7507 Decls.push_back(Transformed); 7508 } 7509 7510 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7511 return S; 7512 7513 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7514 } 7515 7516 template<typename Derived> 7517 StmtResult 7518 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7519 7520 SmallVector<Expr*, 8> Constraints; 7521 SmallVector<Expr*, 8> Exprs; 7522 SmallVector<IdentifierInfo *, 4> Names; 7523 7524 ExprResult AsmString; 7525 SmallVector<Expr*, 8> Clobbers; 7526 7527 bool ExprsChanged = false; 7528 7529 // Go through the outputs. 7530 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7531 Names.push_back(S->getOutputIdentifier(I)); 7532 7533 // No need to transform the constraint literal. 7534 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7535 7536 // Transform the output expr. 7537 Expr *OutputExpr = S->getOutputExpr(I); 7538 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7539 if (Result.isInvalid()) 7540 return StmtError(); 7541 7542 ExprsChanged |= Result.get() != OutputExpr; 7543 7544 Exprs.push_back(Result.get()); 7545 } 7546 7547 // Go through the inputs. 7548 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7549 Names.push_back(S->getInputIdentifier(I)); 7550 7551 // No need to transform the constraint literal. 7552 Constraints.push_back(S->getInputConstraintLiteral(I)); 7553 7554 // Transform the input expr. 7555 Expr *InputExpr = S->getInputExpr(I); 7556 ExprResult Result = getDerived().TransformExpr(InputExpr); 7557 if (Result.isInvalid()) 7558 return StmtError(); 7559 7560 ExprsChanged |= Result.get() != InputExpr; 7561 7562 Exprs.push_back(Result.get()); 7563 } 7564 7565 // Go through the Labels. 7566 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7567 Names.push_back(S->getLabelIdentifier(I)); 7568 7569 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7570 if (Result.isInvalid()) 7571 return StmtError(); 7572 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7573 Exprs.push_back(Result.get()); 7574 } 7575 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7576 return S; 7577 7578 // Go through the clobbers. 7579 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7580 Clobbers.push_back(S->getClobberStringLiteral(I)); 7581 7582 // No need to transform the asm string literal. 7583 AsmString = S->getAsmString(); 7584 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7585 S->isVolatile(), S->getNumOutputs(), 7586 S->getNumInputs(), Names.data(), 7587 Constraints, Exprs, AsmString.get(), 7588 Clobbers, S->getNumLabels(), 7589 S->getRParenLoc()); 7590 } 7591 7592 template<typename Derived> 7593 StmtResult 7594 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7595 ArrayRef<Token> AsmToks = 7596 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7597 7598 bool HadError = false, HadChange = false; 7599 7600 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7601 SmallVector<Expr*, 8> TransformedExprs; 7602 TransformedExprs.reserve(SrcExprs.size()); 7603 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7604 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7605 if (!Result.isUsable()) { 7606 HadError = true; 7607 } else { 7608 HadChange |= (Result.get() != SrcExprs[i]); 7609 TransformedExprs.push_back(Result.get()); 7610 } 7611 } 7612 7613 if (HadError) return StmtError(); 7614 if (!HadChange && !getDerived().AlwaysRebuild()) 7615 return Owned(S); 7616 7617 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7618 AsmToks, S->getAsmString(), 7619 S->getNumOutputs(), S->getNumInputs(), 7620 S->getAllConstraints(), S->getClobbers(), 7621 TransformedExprs, S->getEndLoc()); 7622 } 7623 7624 // C++ Coroutines TS 7625 7626 template<typename Derived> 7627 StmtResult 7628 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7629 auto *ScopeInfo = SemaRef.getCurFunction(); 7630 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7631 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7632 ScopeInfo->NeedsCoroutineSuspends && 7633 ScopeInfo->CoroutineSuspends.first == nullptr && 7634 ScopeInfo->CoroutineSuspends.second == nullptr && 7635 "expected clean scope info"); 7636 7637 // Set that we have (possibly-invalid) suspend points before we do anything 7638 // that may fail. 7639 ScopeInfo->setNeedsCoroutineSuspends(false); 7640 7641 // We re-build the coroutine promise object (and the coroutine parameters its 7642 // type and constructor depend on) based on the types used in our current 7643 // function. We must do so, and set it on the current FunctionScopeInfo, 7644 // before attempting to transform the other parts of the coroutine body 7645 // statement, such as the implicit suspend statements (because those 7646 // statements reference the FunctionScopeInfo::CoroutinePromise). 7647 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7648 return StmtError(); 7649 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7650 if (!Promise) 7651 return StmtError(); 7652 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7653 ScopeInfo->CoroutinePromise = Promise; 7654 7655 // Transform the implicit coroutine statements constructed using dependent 7656 // types during the previous parse: initial and final suspensions, the return 7657 // object, and others. We also transform the coroutine function's body. 7658 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7659 if (InitSuspend.isInvalid()) 7660 return StmtError(); 7661 StmtResult FinalSuspend = 7662 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7663 if (FinalSuspend.isInvalid() || 7664 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7665 return StmtError(); 7666 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7667 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7668 7669 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7670 if (BodyRes.isInvalid()) 7671 return StmtError(); 7672 7673 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7674 if (Builder.isInvalid()) 7675 return StmtError(); 7676 7677 Expr *ReturnObject = S->getReturnValueInit(); 7678 assert(ReturnObject && "the return object is expected to be valid"); 7679 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7680 /*NoCopyInit*/ false); 7681 if (Res.isInvalid()) 7682 return StmtError(); 7683 Builder.ReturnValue = Res.get(); 7684 7685 // If during the previous parse the coroutine still had a dependent promise 7686 // statement, we may need to build some implicit coroutine statements 7687 // (such as exception and fallthrough handlers) for the first time. 7688 if (S->hasDependentPromiseType()) { 7689 // We can only build these statements, however, if the current promise type 7690 // is not dependent. 7691 if (!Promise->getType()->isDependentType()) { 7692 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7693 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7694 "these nodes should not have been built yet"); 7695 if (!Builder.buildDependentStatements()) 7696 return StmtError(); 7697 } 7698 } else { 7699 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7700 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7701 if (Res.isInvalid()) 7702 return StmtError(); 7703 Builder.OnFallthrough = Res.get(); 7704 } 7705 7706 if (auto *OnException = S->getExceptionHandler()) { 7707 StmtResult Res = getDerived().TransformStmt(OnException); 7708 if (Res.isInvalid()) 7709 return StmtError(); 7710 Builder.OnException = Res.get(); 7711 } 7712 7713 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7714 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7715 if (Res.isInvalid()) 7716 return StmtError(); 7717 Builder.ReturnStmtOnAllocFailure = Res.get(); 7718 } 7719 7720 // Transform any additional statements we may have already built 7721 assert(S->getAllocate() && S->getDeallocate() && 7722 "allocation and deallocation calls must already be built"); 7723 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7724 if (AllocRes.isInvalid()) 7725 return StmtError(); 7726 Builder.Allocate = AllocRes.get(); 7727 7728 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7729 if (DeallocRes.isInvalid()) 7730 return StmtError(); 7731 Builder.Deallocate = DeallocRes.get(); 7732 7733 assert(S->getResultDecl() && "ResultDecl must already be built"); 7734 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7735 if (ResultDecl.isInvalid()) 7736 return StmtError(); 7737 Builder.ResultDecl = ResultDecl.get(); 7738 7739 if (auto *ReturnStmt = S->getReturnStmt()) { 7740 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7741 if (Res.isInvalid()) 7742 return StmtError(); 7743 Builder.ReturnStmt = Res.get(); 7744 } 7745 } 7746 7747 return getDerived().RebuildCoroutineBodyStmt(Builder); 7748 } 7749 7750 template<typename Derived> 7751 StmtResult 7752 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7753 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7754 /*NotCopyInit*/false); 7755 if (Result.isInvalid()) 7756 return StmtError(); 7757 7758 // Always rebuild; we don't know if this needs to be injected into a new 7759 // context or if the promise type has changed. 7760 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7761 S->isImplicit()); 7762 } 7763 7764 template<typename Derived> 7765 ExprResult 7766 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7767 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7768 /*NotCopyInit*/false); 7769 if (Result.isInvalid()) 7770 return ExprError(); 7771 7772 // Always rebuild; we don't know if this needs to be injected into a new 7773 // context or if the promise type has changed. 7774 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7775 E->isImplicit()); 7776 } 7777 7778 template <typename Derived> 7779 ExprResult 7780 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7781 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7782 /*NotCopyInit*/ false); 7783 if (OperandResult.isInvalid()) 7784 return ExprError(); 7785 7786 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7787 E->getOperatorCoawaitLookup()); 7788 7789 if (LookupResult.isInvalid()) 7790 return ExprError(); 7791 7792 // Always rebuild; we don't know if this needs to be injected into a new 7793 // context or if the promise type has changed. 7794 return getDerived().RebuildDependentCoawaitExpr( 7795 E->getKeywordLoc(), OperandResult.get(), 7796 cast<UnresolvedLookupExpr>(LookupResult.get())); 7797 } 7798 7799 template<typename Derived> 7800 ExprResult 7801 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7802 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7803 /*NotCopyInit*/false); 7804 if (Result.isInvalid()) 7805 return ExprError(); 7806 7807 // Always rebuild; we don't know if this needs to be injected into a new 7808 // context or if the promise type has changed. 7809 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7810 } 7811 7812 // Objective-C Statements. 7813 7814 template<typename Derived> 7815 StmtResult 7816 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7817 // Transform the body of the @try. 7818 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7819 if (TryBody.isInvalid()) 7820 return StmtError(); 7821 7822 // Transform the @catch statements (if present). 7823 bool AnyCatchChanged = false; 7824 SmallVector<Stmt*, 8> CatchStmts; 7825 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7826 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7827 if (Catch.isInvalid()) 7828 return StmtError(); 7829 if (Catch.get() != S->getCatchStmt(I)) 7830 AnyCatchChanged = true; 7831 CatchStmts.push_back(Catch.get()); 7832 } 7833 7834 // Transform the @finally statement (if present). 7835 StmtResult Finally; 7836 if (S->getFinallyStmt()) { 7837 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7838 if (Finally.isInvalid()) 7839 return StmtError(); 7840 } 7841 7842 // If nothing changed, just retain this statement. 7843 if (!getDerived().AlwaysRebuild() && 7844 TryBody.get() == S->getTryBody() && 7845 !AnyCatchChanged && 7846 Finally.get() == S->getFinallyStmt()) 7847 return S; 7848 7849 // Build a new statement. 7850 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7851 CatchStmts, Finally.get()); 7852 } 7853 7854 template<typename Derived> 7855 StmtResult 7856 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7857 // Transform the @catch parameter, if there is one. 7858 VarDecl *Var = nullptr; 7859 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7860 TypeSourceInfo *TSInfo = nullptr; 7861 if (FromVar->getTypeSourceInfo()) { 7862 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7863 if (!TSInfo) 7864 return StmtError(); 7865 } 7866 7867 QualType T; 7868 if (TSInfo) 7869 T = TSInfo->getType(); 7870 else { 7871 T = getDerived().TransformType(FromVar->getType()); 7872 if (T.isNull()) 7873 return StmtError(); 7874 } 7875 7876 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7877 if (!Var) 7878 return StmtError(); 7879 } 7880 7881 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7882 if (Body.isInvalid()) 7883 return StmtError(); 7884 7885 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7886 S->getRParenLoc(), 7887 Var, Body.get()); 7888 } 7889 7890 template<typename Derived> 7891 StmtResult 7892 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7893 // Transform the body. 7894 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7895 if (Body.isInvalid()) 7896 return StmtError(); 7897 7898 // If nothing changed, just retain this statement. 7899 if (!getDerived().AlwaysRebuild() && 7900 Body.get() == S->getFinallyBody()) 7901 return S; 7902 7903 // Build a new statement. 7904 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7905 Body.get()); 7906 } 7907 7908 template<typename Derived> 7909 StmtResult 7910 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7911 ExprResult Operand; 7912 if (S->getThrowExpr()) { 7913 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7914 if (Operand.isInvalid()) 7915 return StmtError(); 7916 } 7917 7918 if (!getDerived().AlwaysRebuild() && 7919 Operand.get() == S->getThrowExpr()) 7920 return S; 7921 7922 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7923 } 7924 7925 template<typename Derived> 7926 StmtResult 7927 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7928 ObjCAtSynchronizedStmt *S) { 7929 // Transform the object we are locking. 7930 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7931 if (Object.isInvalid()) 7932 return StmtError(); 7933 Object = 7934 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7935 Object.get()); 7936 if (Object.isInvalid()) 7937 return StmtError(); 7938 7939 // Transform the body. 7940 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7941 if (Body.isInvalid()) 7942 return StmtError(); 7943 7944 // If nothing change, just retain the current statement. 7945 if (!getDerived().AlwaysRebuild() && 7946 Object.get() == S->getSynchExpr() && 7947 Body.get() == S->getSynchBody()) 7948 return S; 7949 7950 // Build a new statement. 7951 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7952 Object.get(), Body.get()); 7953 } 7954 7955 template<typename Derived> 7956 StmtResult 7957 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7958 ObjCAutoreleasePoolStmt *S) { 7959 // Transform the body. 7960 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7961 if (Body.isInvalid()) 7962 return StmtError(); 7963 7964 // If nothing changed, just retain this statement. 7965 if (!getDerived().AlwaysRebuild() && 7966 Body.get() == S->getSubStmt()) 7967 return S; 7968 7969 // Build a new statement. 7970 return getDerived().RebuildObjCAutoreleasePoolStmt( 7971 S->getAtLoc(), Body.get()); 7972 } 7973 7974 template<typename Derived> 7975 StmtResult 7976 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7977 ObjCForCollectionStmt *S) { 7978 // Transform the element statement. 7979 StmtResult Element = 7980 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7981 if (Element.isInvalid()) 7982 return StmtError(); 7983 7984 // Transform the collection expression. 7985 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7986 if (Collection.isInvalid()) 7987 return StmtError(); 7988 7989 // Transform the body. 7990 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7991 if (Body.isInvalid()) 7992 return StmtError(); 7993 7994 // If nothing changed, just retain this statement. 7995 if (!getDerived().AlwaysRebuild() && 7996 Element.get() == S->getElement() && 7997 Collection.get() == S->getCollection() && 7998 Body.get() == S->getBody()) 7999 return S; 8000 8001 // Build a new statement. 8002 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8003 Element.get(), 8004 Collection.get(), 8005 S->getRParenLoc(), 8006 Body.get()); 8007 } 8008 8009 template <typename Derived> 8010 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8011 // Transform the exception declaration, if any. 8012 VarDecl *Var = nullptr; 8013 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8014 TypeSourceInfo *T = 8015 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8016 if (!T) 8017 return StmtError(); 8018 8019 Var = getDerived().RebuildExceptionDecl( 8020 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8021 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8022 if (!Var || Var->isInvalidDecl()) 8023 return StmtError(); 8024 } 8025 8026 // Transform the actual exception handler. 8027 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8028 if (Handler.isInvalid()) 8029 return StmtError(); 8030 8031 if (!getDerived().AlwaysRebuild() && !Var && 8032 Handler.get() == S->getHandlerBlock()) 8033 return S; 8034 8035 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8036 } 8037 8038 template <typename Derived> 8039 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8040 // Transform the try block itself. 8041 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8042 if (TryBlock.isInvalid()) 8043 return StmtError(); 8044 8045 // Transform the handlers. 8046 bool HandlerChanged = false; 8047 SmallVector<Stmt *, 8> Handlers; 8048 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8049 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8050 if (Handler.isInvalid()) 8051 return StmtError(); 8052 8053 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8054 Handlers.push_back(Handler.getAs<Stmt>()); 8055 } 8056 8057 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8058 !HandlerChanged) 8059 return S; 8060 8061 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8062 Handlers); 8063 } 8064 8065 template<typename Derived> 8066 StmtResult 8067 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8068 StmtResult Init = 8069 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8070 if (Init.isInvalid()) 8071 return StmtError(); 8072 8073 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8074 if (Range.isInvalid()) 8075 return StmtError(); 8076 8077 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8078 if (Begin.isInvalid()) 8079 return StmtError(); 8080 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8081 if (End.isInvalid()) 8082 return StmtError(); 8083 8084 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8085 if (Cond.isInvalid()) 8086 return StmtError(); 8087 if (Cond.get()) 8088 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8089 if (Cond.isInvalid()) 8090 return StmtError(); 8091 if (Cond.get()) 8092 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8093 8094 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8095 if (Inc.isInvalid()) 8096 return StmtError(); 8097 if (Inc.get()) 8098 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8099 8100 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8101 if (LoopVar.isInvalid()) 8102 return StmtError(); 8103 8104 StmtResult NewStmt = S; 8105 if (getDerived().AlwaysRebuild() || 8106 Init.get() != S->getInit() || 8107 Range.get() != S->getRangeStmt() || 8108 Begin.get() != S->getBeginStmt() || 8109 End.get() != S->getEndStmt() || 8110 Cond.get() != S->getCond() || 8111 Inc.get() != S->getInc() || 8112 LoopVar.get() != S->getLoopVarStmt()) { 8113 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8114 S->getCoawaitLoc(), Init.get(), 8115 S->getColonLoc(), Range.get(), 8116 Begin.get(), End.get(), 8117 Cond.get(), 8118 Inc.get(), LoopVar.get(), 8119 S->getRParenLoc()); 8120 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8121 // Might not have attached any initializer to the loop variable. 8122 getSema().ActOnInitializerError( 8123 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8124 return StmtError(); 8125 } 8126 } 8127 8128 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8129 if (Body.isInvalid()) 8130 return StmtError(); 8131 8132 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8133 // it now so we have a new statement to attach the body to. 8134 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8135 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8136 S->getCoawaitLoc(), Init.get(), 8137 S->getColonLoc(), Range.get(), 8138 Begin.get(), End.get(), 8139 Cond.get(), 8140 Inc.get(), LoopVar.get(), 8141 S->getRParenLoc()); 8142 if (NewStmt.isInvalid()) 8143 return StmtError(); 8144 } 8145 8146 if (NewStmt.get() == S) 8147 return S; 8148 8149 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8150 } 8151 8152 template<typename Derived> 8153 StmtResult 8154 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8155 MSDependentExistsStmt *S) { 8156 // Transform the nested-name-specifier, if any. 8157 NestedNameSpecifierLoc QualifierLoc; 8158 if (S->getQualifierLoc()) { 8159 QualifierLoc 8160 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8161 if (!QualifierLoc) 8162 return StmtError(); 8163 } 8164 8165 // Transform the declaration name. 8166 DeclarationNameInfo NameInfo = S->getNameInfo(); 8167 if (NameInfo.getName()) { 8168 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8169 if (!NameInfo.getName()) 8170 return StmtError(); 8171 } 8172 8173 // Check whether anything changed. 8174 if (!getDerived().AlwaysRebuild() && 8175 QualifierLoc == S->getQualifierLoc() && 8176 NameInfo.getName() == S->getNameInfo().getName()) 8177 return S; 8178 8179 // Determine whether this name exists, if we can. 8180 CXXScopeSpec SS; 8181 SS.Adopt(QualifierLoc); 8182 bool Dependent = false; 8183 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8184 case Sema::IER_Exists: 8185 if (S->isIfExists()) 8186 break; 8187 8188 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8189 8190 case Sema::IER_DoesNotExist: 8191 if (S->isIfNotExists()) 8192 break; 8193 8194 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8195 8196 case Sema::IER_Dependent: 8197 Dependent = true; 8198 break; 8199 8200 case Sema::IER_Error: 8201 return StmtError(); 8202 } 8203 8204 // We need to continue with the instantiation, so do so now. 8205 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8206 if (SubStmt.isInvalid()) 8207 return StmtError(); 8208 8209 // If we have resolved the name, just transform to the substatement. 8210 if (!Dependent) 8211 return SubStmt; 8212 8213 // The name is still dependent, so build a dependent expression again. 8214 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8215 S->isIfExists(), 8216 QualifierLoc, 8217 NameInfo, 8218 SubStmt.get()); 8219 } 8220 8221 template<typename Derived> 8222 ExprResult 8223 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8224 NestedNameSpecifierLoc QualifierLoc; 8225 if (E->getQualifierLoc()) { 8226 QualifierLoc 8227 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8228 if (!QualifierLoc) 8229 return ExprError(); 8230 } 8231 8232 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8233 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8234 if (!PD) 8235 return ExprError(); 8236 8237 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8238 if (Base.isInvalid()) 8239 return ExprError(); 8240 8241 return new (SemaRef.getASTContext()) 8242 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8243 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8244 QualifierLoc, E->getMemberLoc()); 8245 } 8246 8247 template <typename Derived> 8248 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8249 MSPropertySubscriptExpr *E) { 8250 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8251 if (BaseRes.isInvalid()) 8252 return ExprError(); 8253 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8254 if (IdxRes.isInvalid()) 8255 return ExprError(); 8256 8257 if (!getDerived().AlwaysRebuild() && 8258 BaseRes.get() == E->getBase() && 8259 IdxRes.get() == E->getIdx()) 8260 return E; 8261 8262 return getDerived().RebuildArraySubscriptExpr( 8263 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8264 } 8265 8266 template <typename Derived> 8267 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8268 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8269 if (TryBlock.isInvalid()) 8270 return StmtError(); 8271 8272 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8273 if (Handler.isInvalid()) 8274 return StmtError(); 8275 8276 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8277 Handler.get() == S->getHandler()) 8278 return S; 8279 8280 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8281 TryBlock.get(), Handler.get()); 8282 } 8283 8284 template <typename Derived> 8285 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8286 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8287 if (Block.isInvalid()) 8288 return StmtError(); 8289 8290 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8291 } 8292 8293 template <typename Derived> 8294 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8295 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8296 if (FilterExpr.isInvalid()) 8297 return StmtError(); 8298 8299 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8300 if (Block.isInvalid()) 8301 return StmtError(); 8302 8303 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8304 Block.get()); 8305 } 8306 8307 template <typename Derived> 8308 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8309 if (isa<SEHFinallyStmt>(Handler)) 8310 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8311 else 8312 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8313 } 8314 8315 template<typename Derived> 8316 StmtResult 8317 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8318 return S; 8319 } 8320 8321 //===----------------------------------------------------------------------===// 8322 // OpenMP directive transformation 8323 //===----------------------------------------------------------------------===// 8324 template <typename Derived> 8325 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8326 OMPExecutableDirective *D) { 8327 8328 // Transform the clauses 8329 llvm::SmallVector<OMPClause *, 16> TClauses; 8330 ArrayRef<OMPClause *> Clauses = D->clauses(); 8331 TClauses.reserve(Clauses.size()); 8332 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8333 I != E; ++I) { 8334 if (*I) { 8335 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8336 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8337 getDerived().getSema().EndOpenMPClause(); 8338 if (Clause) 8339 TClauses.push_back(Clause); 8340 } else { 8341 TClauses.push_back(nullptr); 8342 } 8343 } 8344 StmtResult AssociatedStmt; 8345 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8346 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8347 /*CurScope=*/nullptr); 8348 StmtResult Body; 8349 { 8350 Sema::CompoundScopeRAII CompoundScope(getSema()); 8351 Stmt *CS; 8352 if (D->getDirectiveKind() == OMPD_atomic || 8353 D->getDirectiveKind() == OMPD_critical || 8354 D->getDirectiveKind() == OMPD_section || 8355 D->getDirectiveKind() == OMPD_master) 8356 CS = D->getAssociatedStmt(); 8357 else 8358 CS = D->getRawStmt(); 8359 Body = getDerived().TransformStmt(CS); 8360 } 8361 AssociatedStmt = 8362 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8363 if (AssociatedStmt.isInvalid()) { 8364 return StmtError(); 8365 } 8366 } 8367 if (TClauses.size() != Clauses.size()) { 8368 return StmtError(); 8369 } 8370 8371 // Transform directive name for 'omp critical' directive. 8372 DeclarationNameInfo DirName; 8373 if (D->getDirectiveKind() == OMPD_critical) { 8374 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8375 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8376 } 8377 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8378 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8379 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8380 } else if (D->getDirectiveKind() == OMPD_cancel) { 8381 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8382 } 8383 8384 return getDerived().RebuildOMPExecutableDirective( 8385 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8386 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8387 } 8388 8389 template <typename Derived> 8390 StmtResult 8391 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8392 DeclarationNameInfo DirName; 8393 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8394 D->getBeginLoc()); 8395 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8396 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8397 return Res; 8398 } 8399 8400 template <typename Derived> 8401 StmtResult 8402 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8403 DeclarationNameInfo DirName; 8404 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8405 D->getBeginLoc()); 8406 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8407 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8408 return Res; 8409 } 8410 8411 template <typename Derived> 8412 StmtResult 8413 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8414 DeclarationNameInfo DirName; 8415 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8416 nullptr, D->getBeginLoc()); 8417 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8418 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8419 return Res; 8420 } 8421 8422 template <typename Derived> 8423 StmtResult 8424 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8425 DeclarationNameInfo DirName; 8426 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8427 D->getBeginLoc()); 8428 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8429 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8430 return Res; 8431 } 8432 8433 template <typename Derived> 8434 StmtResult 8435 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8436 DeclarationNameInfo DirName; 8437 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8438 D->getBeginLoc()); 8439 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8440 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8441 return Res; 8442 } 8443 8444 template <typename Derived> 8445 StmtResult 8446 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8447 DeclarationNameInfo DirName; 8448 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8449 D->getBeginLoc()); 8450 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8451 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8452 return Res; 8453 } 8454 8455 template <typename Derived> 8456 StmtResult 8457 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8458 DeclarationNameInfo DirName; 8459 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8460 D->getBeginLoc()); 8461 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8462 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8463 return Res; 8464 } 8465 8466 template <typename Derived> 8467 StmtResult 8468 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8469 DeclarationNameInfo DirName; 8470 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8471 D->getBeginLoc()); 8472 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8473 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8474 return Res; 8475 } 8476 8477 template <typename Derived> 8478 StmtResult 8479 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8480 DeclarationNameInfo DirName; 8481 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8482 D->getBeginLoc()); 8483 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8484 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8485 return Res; 8486 } 8487 8488 template <typename Derived> 8489 StmtResult 8490 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8491 getDerived().getSema().StartOpenMPDSABlock( 8492 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8493 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8494 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8495 return Res; 8496 } 8497 8498 template <typename Derived> 8499 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8500 OMPParallelForDirective *D) { 8501 DeclarationNameInfo DirName; 8502 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8503 nullptr, D->getBeginLoc()); 8504 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8505 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8506 return Res; 8507 } 8508 8509 template <typename Derived> 8510 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8511 OMPParallelForSimdDirective *D) { 8512 DeclarationNameInfo DirName; 8513 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8514 nullptr, D->getBeginLoc()); 8515 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8516 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8517 return Res; 8518 } 8519 8520 template <typename Derived> 8521 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8522 OMPParallelMasterDirective *D) { 8523 DeclarationNameInfo DirName; 8524 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8525 nullptr, D->getBeginLoc()); 8526 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8527 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8528 return Res; 8529 } 8530 8531 template <typename Derived> 8532 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8533 OMPParallelSectionsDirective *D) { 8534 DeclarationNameInfo DirName; 8535 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8536 nullptr, D->getBeginLoc()); 8537 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8538 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8539 return Res; 8540 } 8541 8542 template <typename Derived> 8543 StmtResult 8544 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8545 DeclarationNameInfo DirName; 8546 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8547 D->getBeginLoc()); 8548 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8549 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8550 return Res; 8551 } 8552 8553 template <typename Derived> 8554 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8555 OMPTaskyieldDirective *D) { 8556 DeclarationNameInfo DirName; 8557 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8558 D->getBeginLoc()); 8559 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8560 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8561 return Res; 8562 } 8563 8564 template <typename Derived> 8565 StmtResult 8566 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8567 DeclarationNameInfo DirName; 8568 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8569 D->getBeginLoc()); 8570 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8571 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8572 return Res; 8573 } 8574 8575 template <typename Derived> 8576 StmtResult 8577 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8578 DeclarationNameInfo DirName; 8579 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8580 D->getBeginLoc()); 8581 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8582 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8583 return Res; 8584 } 8585 8586 template <typename Derived> 8587 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8588 OMPTaskgroupDirective *D) { 8589 DeclarationNameInfo DirName; 8590 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8591 D->getBeginLoc()); 8592 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8593 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8594 return Res; 8595 } 8596 8597 template <typename Derived> 8598 StmtResult 8599 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8600 DeclarationNameInfo DirName; 8601 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8602 D->getBeginLoc()); 8603 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8604 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8605 return Res; 8606 } 8607 8608 template <typename Derived> 8609 StmtResult 8610 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8611 DeclarationNameInfo DirName; 8612 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8613 D->getBeginLoc()); 8614 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8615 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8616 return Res; 8617 } 8618 8619 template <typename Derived> 8620 StmtResult 8621 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8622 DeclarationNameInfo DirName; 8623 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8624 D->getBeginLoc()); 8625 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8626 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8627 return Res; 8628 } 8629 8630 template <typename Derived> 8631 StmtResult 8632 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8633 DeclarationNameInfo DirName; 8634 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8635 D->getBeginLoc()); 8636 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8637 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8638 return Res; 8639 } 8640 8641 template <typename Derived> 8642 StmtResult 8643 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8644 DeclarationNameInfo DirName; 8645 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8646 D->getBeginLoc()); 8647 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8648 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8649 return Res; 8650 } 8651 8652 template <typename Derived> 8653 StmtResult 8654 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8655 DeclarationNameInfo DirName; 8656 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8657 D->getBeginLoc()); 8658 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8659 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8660 return Res; 8661 } 8662 8663 template <typename Derived> 8664 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8665 OMPTargetDataDirective *D) { 8666 DeclarationNameInfo DirName; 8667 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8668 D->getBeginLoc()); 8669 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8670 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8671 return Res; 8672 } 8673 8674 template <typename Derived> 8675 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8676 OMPTargetEnterDataDirective *D) { 8677 DeclarationNameInfo DirName; 8678 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8679 nullptr, D->getBeginLoc()); 8680 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8681 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8682 return Res; 8683 } 8684 8685 template <typename Derived> 8686 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8687 OMPTargetExitDataDirective *D) { 8688 DeclarationNameInfo DirName; 8689 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8690 nullptr, D->getBeginLoc()); 8691 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8692 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8693 return Res; 8694 } 8695 8696 template <typename Derived> 8697 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8698 OMPTargetParallelDirective *D) { 8699 DeclarationNameInfo DirName; 8700 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8701 nullptr, D->getBeginLoc()); 8702 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8703 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8704 return Res; 8705 } 8706 8707 template <typename Derived> 8708 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8709 OMPTargetParallelForDirective *D) { 8710 DeclarationNameInfo DirName; 8711 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8712 nullptr, D->getBeginLoc()); 8713 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8714 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8715 return Res; 8716 } 8717 8718 template <typename Derived> 8719 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8720 OMPTargetUpdateDirective *D) { 8721 DeclarationNameInfo DirName; 8722 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8723 nullptr, D->getBeginLoc()); 8724 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8725 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8726 return Res; 8727 } 8728 8729 template <typename Derived> 8730 StmtResult 8731 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8732 DeclarationNameInfo DirName; 8733 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8734 D->getBeginLoc()); 8735 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8736 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8737 return Res; 8738 } 8739 8740 template <typename Derived> 8741 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8742 OMPCancellationPointDirective *D) { 8743 DeclarationNameInfo DirName; 8744 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8745 nullptr, D->getBeginLoc()); 8746 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8747 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8748 return Res; 8749 } 8750 8751 template <typename Derived> 8752 StmtResult 8753 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8754 DeclarationNameInfo DirName; 8755 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8756 D->getBeginLoc()); 8757 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8758 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8759 return Res; 8760 } 8761 8762 template <typename Derived> 8763 StmtResult 8764 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8765 DeclarationNameInfo DirName; 8766 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8767 D->getBeginLoc()); 8768 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8769 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8770 return Res; 8771 } 8772 8773 template <typename Derived> 8774 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8775 OMPTaskLoopSimdDirective *D) { 8776 DeclarationNameInfo DirName; 8777 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8778 nullptr, D->getBeginLoc()); 8779 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8780 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8781 return Res; 8782 } 8783 8784 template <typename Derived> 8785 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8786 OMPMasterTaskLoopDirective *D) { 8787 DeclarationNameInfo DirName; 8788 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8789 nullptr, D->getBeginLoc()); 8790 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8791 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8792 return Res; 8793 } 8794 8795 template <typename Derived> 8796 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8797 OMPMasterTaskLoopSimdDirective *D) { 8798 DeclarationNameInfo DirName; 8799 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8800 nullptr, D->getBeginLoc()); 8801 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8802 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8803 return Res; 8804 } 8805 8806 template <typename Derived> 8807 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8808 OMPParallelMasterTaskLoopDirective *D) { 8809 DeclarationNameInfo DirName; 8810 getDerived().getSema().StartOpenMPDSABlock( 8811 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8812 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8813 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8814 return Res; 8815 } 8816 8817 template <typename Derived> 8818 StmtResult 8819 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8820 OMPParallelMasterTaskLoopSimdDirective *D) { 8821 DeclarationNameInfo DirName; 8822 getDerived().getSema().StartOpenMPDSABlock( 8823 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8824 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8825 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8826 return Res; 8827 } 8828 8829 template <typename Derived> 8830 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8831 OMPDistributeDirective *D) { 8832 DeclarationNameInfo DirName; 8833 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8834 D->getBeginLoc()); 8835 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8836 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8837 return Res; 8838 } 8839 8840 template <typename Derived> 8841 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8842 OMPDistributeParallelForDirective *D) { 8843 DeclarationNameInfo DirName; 8844 getDerived().getSema().StartOpenMPDSABlock( 8845 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8846 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8847 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8848 return Res; 8849 } 8850 8851 template <typename Derived> 8852 StmtResult 8853 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8854 OMPDistributeParallelForSimdDirective *D) { 8855 DeclarationNameInfo DirName; 8856 getDerived().getSema().StartOpenMPDSABlock( 8857 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8858 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8859 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8860 return Res; 8861 } 8862 8863 template <typename Derived> 8864 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8865 OMPDistributeSimdDirective *D) { 8866 DeclarationNameInfo DirName; 8867 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8868 nullptr, D->getBeginLoc()); 8869 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8870 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8871 return Res; 8872 } 8873 8874 template <typename Derived> 8875 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8876 OMPTargetParallelForSimdDirective *D) { 8877 DeclarationNameInfo DirName; 8878 getDerived().getSema().StartOpenMPDSABlock( 8879 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8880 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8881 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8882 return Res; 8883 } 8884 8885 template <typename Derived> 8886 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8887 OMPTargetSimdDirective *D) { 8888 DeclarationNameInfo DirName; 8889 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8890 D->getBeginLoc()); 8891 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8892 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8893 return Res; 8894 } 8895 8896 template <typename Derived> 8897 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8898 OMPTeamsDistributeDirective *D) { 8899 DeclarationNameInfo DirName; 8900 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8901 nullptr, D->getBeginLoc()); 8902 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8903 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8904 return Res; 8905 } 8906 8907 template <typename Derived> 8908 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8909 OMPTeamsDistributeSimdDirective *D) { 8910 DeclarationNameInfo DirName; 8911 getDerived().getSema().StartOpenMPDSABlock( 8912 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8913 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8914 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8915 return Res; 8916 } 8917 8918 template <typename Derived> 8919 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8920 OMPTeamsDistributeParallelForSimdDirective *D) { 8921 DeclarationNameInfo DirName; 8922 getDerived().getSema().StartOpenMPDSABlock( 8923 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8924 D->getBeginLoc()); 8925 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8926 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8927 return Res; 8928 } 8929 8930 template <typename Derived> 8931 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8932 OMPTeamsDistributeParallelForDirective *D) { 8933 DeclarationNameInfo DirName; 8934 getDerived().getSema().StartOpenMPDSABlock( 8935 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8936 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8937 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8938 return Res; 8939 } 8940 8941 template <typename Derived> 8942 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8943 OMPTargetTeamsDirective *D) { 8944 DeclarationNameInfo DirName; 8945 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8946 nullptr, D->getBeginLoc()); 8947 auto Res = getDerived().TransformOMPExecutableDirective(D); 8948 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8949 return Res; 8950 } 8951 8952 template <typename Derived> 8953 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8954 OMPTargetTeamsDistributeDirective *D) { 8955 DeclarationNameInfo DirName; 8956 getDerived().getSema().StartOpenMPDSABlock( 8957 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8958 auto Res = getDerived().TransformOMPExecutableDirective(D); 8959 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8960 return Res; 8961 } 8962 8963 template <typename Derived> 8964 StmtResult 8965 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8966 OMPTargetTeamsDistributeParallelForDirective *D) { 8967 DeclarationNameInfo DirName; 8968 getDerived().getSema().StartOpenMPDSABlock( 8969 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8970 D->getBeginLoc()); 8971 auto Res = getDerived().TransformOMPExecutableDirective(D); 8972 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8973 return Res; 8974 } 8975 8976 template <typename Derived> 8977 StmtResult TreeTransform<Derived>:: 8978 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8979 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8980 DeclarationNameInfo DirName; 8981 getDerived().getSema().StartOpenMPDSABlock( 8982 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8983 D->getBeginLoc()); 8984 auto Res = getDerived().TransformOMPExecutableDirective(D); 8985 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8986 return Res; 8987 } 8988 8989 template <typename Derived> 8990 StmtResult 8991 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8992 OMPTargetTeamsDistributeSimdDirective *D) { 8993 DeclarationNameInfo DirName; 8994 getDerived().getSema().StartOpenMPDSABlock( 8995 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8996 auto Res = getDerived().TransformOMPExecutableDirective(D); 8997 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8998 return Res; 8999 } 9000 9001 9002 //===----------------------------------------------------------------------===// 9003 // OpenMP clause transformation 9004 //===----------------------------------------------------------------------===// 9005 template <typename Derived> 9006 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9007 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9008 if (Cond.isInvalid()) 9009 return nullptr; 9010 return getDerived().RebuildOMPIfClause( 9011 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9012 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9013 } 9014 9015 template <typename Derived> 9016 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9017 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9018 if (Cond.isInvalid()) 9019 return nullptr; 9020 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9021 C->getLParenLoc(), C->getEndLoc()); 9022 } 9023 9024 template <typename Derived> 9025 OMPClause * 9026 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9027 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9028 if (NumThreads.isInvalid()) 9029 return nullptr; 9030 return getDerived().RebuildOMPNumThreadsClause( 9031 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9032 } 9033 9034 template <typename Derived> 9035 OMPClause * 9036 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9037 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9038 if (E.isInvalid()) 9039 return nullptr; 9040 return getDerived().RebuildOMPSafelenClause( 9041 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9042 } 9043 9044 template <typename Derived> 9045 OMPClause * 9046 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9047 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9048 if (E.isInvalid()) 9049 return nullptr; 9050 return getDerived().RebuildOMPAllocatorClause( 9051 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9052 } 9053 9054 template <typename Derived> 9055 OMPClause * 9056 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9057 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9058 if (E.isInvalid()) 9059 return nullptr; 9060 return getDerived().RebuildOMPSimdlenClause( 9061 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9062 } 9063 9064 template <typename Derived> 9065 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9066 SmallVector<Expr *, 4> TransformedSizes; 9067 TransformedSizes.reserve(C->getNumSizes()); 9068 bool Changed = false; 9069 for (Expr *E : C->getSizesRefs()) { 9070 if (!E) { 9071 TransformedSizes.push_back(nullptr); 9072 continue; 9073 } 9074 9075 ExprResult T = getDerived().TransformExpr(E); 9076 if (T.isInvalid()) 9077 return nullptr; 9078 if (E != T.get()) 9079 Changed = true; 9080 TransformedSizes.push_back(T.get()); 9081 } 9082 9083 if (!Changed && !getDerived().AlwaysRebuild()) 9084 return C; 9085 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9086 C->getLParenLoc(), C->getEndLoc()); 9087 } 9088 9089 template <typename Derived> 9090 OMPClause * 9091 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9092 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9093 if (E.isInvalid()) 9094 return nullptr; 9095 return getDerived().RebuildOMPCollapseClause( 9096 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9097 } 9098 9099 template <typename Derived> 9100 OMPClause * 9101 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9102 return getDerived().RebuildOMPDefaultClause( 9103 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9104 C->getLParenLoc(), C->getEndLoc()); 9105 } 9106 9107 template <typename Derived> 9108 OMPClause * 9109 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9110 return getDerived().RebuildOMPProcBindClause( 9111 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9112 C->getLParenLoc(), C->getEndLoc()); 9113 } 9114 9115 template <typename Derived> 9116 OMPClause * 9117 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9118 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9119 if (E.isInvalid()) 9120 return nullptr; 9121 return getDerived().RebuildOMPScheduleClause( 9122 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9123 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9124 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9125 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9126 } 9127 9128 template <typename Derived> 9129 OMPClause * 9130 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9131 ExprResult E; 9132 if (auto *Num = C->getNumForLoops()) { 9133 E = getDerived().TransformExpr(Num); 9134 if (E.isInvalid()) 9135 return nullptr; 9136 } 9137 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9138 C->getLParenLoc(), E.get()); 9139 } 9140 9141 template <typename Derived> 9142 OMPClause * 9143 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9144 ExprResult E; 9145 if (Expr *Evt = C->getEventHandler()) { 9146 E = getDerived().TransformExpr(Evt); 9147 if (E.isInvalid()) 9148 return nullptr; 9149 } 9150 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9151 C->getLParenLoc(), C->getEndLoc()); 9152 } 9153 9154 template <typename Derived> 9155 OMPClause * 9156 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9157 // No need to rebuild this clause, no template-dependent parameters. 9158 return C; 9159 } 9160 9161 template <typename Derived> 9162 OMPClause * 9163 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9164 // No need to rebuild this clause, no template-dependent parameters. 9165 return C; 9166 } 9167 9168 template <typename Derived> 9169 OMPClause * 9170 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9171 // No need to rebuild this clause, no template-dependent parameters. 9172 return C; 9173 } 9174 9175 template <typename Derived> 9176 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9177 // No need to rebuild this clause, no template-dependent parameters. 9178 return C; 9179 } 9180 9181 template <typename Derived> 9182 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9183 // No need to rebuild this clause, no template-dependent parameters. 9184 return C; 9185 } 9186 9187 template <typename Derived> 9188 OMPClause * 9189 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9190 // No need to rebuild this clause, no template-dependent parameters. 9191 return C; 9192 } 9193 9194 template <typename Derived> 9195 OMPClause * 9196 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9197 // No need to rebuild this clause, no template-dependent parameters. 9198 return C; 9199 } 9200 9201 template <typename Derived> 9202 OMPClause * 9203 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9204 // No need to rebuild this clause, no template-dependent parameters. 9205 return C; 9206 } 9207 9208 template <typename Derived> 9209 OMPClause * 9210 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9211 // No need to rebuild this clause, no template-dependent parameters. 9212 return C; 9213 } 9214 9215 template <typename Derived> 9216 OMPClause * 9217 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9218 // No need to rebuild this clause, no template-dependent parameters. 9219 return C; 9220 } 9221 9222 template <typename Derived> 9223 OMPClause * 9224 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9225 // No need to rebuild this clause, no template-dependent parameters. 9226 return C; 9227 } 9228 9229 template <typename Derived> 9230 OMPClause * 9231 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9232 // No need to rebuild this clause, no template-dependent parameters. 9233 return C; 9234 } 9235 9236 template <typename Derived> 9237 OMPClause * 9238 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9239 // No need to rebuild this clause, no template-dependent parameters. 9240 return C; 9241 } 9242 9243 template <typename Derived> 9244 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9245 // No need to rebuild this clause, no template-dependent parameters. 9246 return C; 9247 } 9248 9249 template <typename Derived> 9250 OMPClause * 9251 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9252 // No need to rebuild this clause, no template-dependent parameters. 9253 return C; 9254 } 9255 9256 template <typename Derived> 9257 OMPClause * 9258 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9259 // No need to rebuild this clause, no template-dependent parameters. 9260 return C; 9261 } 9262 9263 template <typename Derived> 9264 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9265 OMPUnifiedAddressClause *C) { 9266 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9267 } 9268 9269 template <typename Derived> 9270 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9271 OMPUnifiedSharedMemoryClause *C) { 9272 llvm_unreachable( 9273 "unified_shared_memory clause cannot appear in dependent context"); 9274 } 9275 9276 template <typename Derived> 9277 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9278 OMPReverseOffloadClause *C) { 9279 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9280 } 9281 9282 template <typename Derived> 9283 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9284 OMPDynamicAllocatorsClause *C) { 9285 llvm_unreachable( 9286 "dynamic_allocators clause cannot appear in dependent context"); 9287 } 9288 9289 template <typename Derived> 9290 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9291 OMPAtomicDefaultMemOrderClause *C) { 9292 llvm_unreachable( 9293 "atomic_default_mem_order clause cannot appear in dependent context"); 9294 } 9295 9296 template <typename Derived> 9297 OMPClause * 9298 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9299 llvm::SmallVector<Expr *, 16> Vars; 9300 Vars.reserve(C->varlist_size()); 9301 for (auto *VE : C->varlists()) { 9302 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9303 if (EVar.isInvalid()) 9304 return nullptr; 9305 Vars.push_back(EVar.get()); 9306 } 9307 return getDerived().RebuildOMPPrivateClause( 9308 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9309 } 9310 9311 template <typename Derived> 9312 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9313 OMPFirstprivateClause *C) { 9314 llvm::SmallVector<Expr *, 16> Vars; 9315 Vars.reserve(C->varlist_size()); 9316 for (auto *VE : C->varlists()) { 9317 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9318 if (EVar.isInvalid()) 9319 return nullptr; 9320 Vars.push_back(EVar.get()); 9321 } 9322 return getDerived().RebuildOMPFirstprivateClause( 9323 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9324 } 9325 9326 template <typename Derived> 9327 OMPClause * 9328 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9329 llvm::SmallVector<Expr *, 16> Vars; 9330 Vars.reserve(C->varlist_size()); 9331 for (auto *VE : C->varlists()) { 9332 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9333 if (EVar.isInvalid()) 9334 return nullptr; 9335 Vars.push_back(EVar.get()); 9336 } 9337 return getDerived().RebuildOMPLastprivateClause( 9338 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9339 C->getLParenLoc(), C->getEndLoc()); 9340 } 9341 9342 template <typename Derived> 9343 OMPClause * 9344 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9345 llvm::SmallVector<Expr *, 16> Vars; 9346 Vars.reserve(C->varlist_size()); 9347 for (auto *VE : C->varlists()) { 9348 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9349 if (EVar.isInvalid()) 9350 return nullptr; 9351 Vars.push_back(EVar.get()); 9352 } 9353 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9354 C->getLParenLoc(), C->getEndLoc()); 9355 } 9356 9357 template <typename Derived> 9358 OMPClause * 9359 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9360 llvm::SmallVector<Expr *, 16> Vars; 9361 Vars.reserve(C->varlist_size()); 9362 for (auto *VE : C->varlists()) { 9363 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9364 if (EVar.isInvalid()) 9365 return nullptr; 9366 Vars.push_back(EVar.get()); 9367 } 9368 CXXScopeSpec ReductionIdScopeSpec; 9369 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9370 9371 DeclarationNameInfo NameInfo = C->getNameInfo(); 9372 if (NameInfo.getName()) { 9373 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9374 if (!NameInfo.getName()) 9375 return nullptr; 9376 } 9377 // Build a list of all UDR decls with the same names ranged by the Scopes. 9378 // The Scope boundary is a duplication of the previous decl. 9379 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9380 for (auto *E : C->reduction_ops()) { 9381 // Transform all the decls. 9382 if (E) { 9383 auto *ULE = cast<UnresolvedLookupExpr>(E); 9384 UnresolvedSet<8> Decls; 9385 for (auto *D : ULE->decls()) { 9386 NamedDecl *InstD = 9387 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9388 Decls.addDecl(InstD, InstD->getAccess()); 9389 } 9390 UnresolvedReductions.push_back( 9391 UnresolvedLookupExpr::Create( 9392 SemaRef.Context, /*NamingClass=*/nullptr, 9393 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9394 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9395 Decls.begin(), Decls.end())); 9396 } else 9397 UnresolvedReductions.push_back(nullptr); 9398 } 9399 return getDerived().RebuildOMPReductionClause( 9400 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9401 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9402 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9403 } 9404 9405 template <typename Derived> 9406 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9407 OMPTaskReductionClause *C) { 9408 llvm::SmallVector<Expr *, 16> Vars; 9409 Vars.reserve(C->varlist_size()); 9410 for (auto *VE : C->varlists()) { 9411 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9412 if (EVar.isInvalid()) 9413 return nullptr; 9414 Vars.push_back(EVar.get()); 9415 } 9416 CXXScopeSpec ReductionIdScopeSpec; 9417 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9418 9419 DeclarationNameInfo NameInfo = C->getNameInfo(); 9420 if (NameInfo.getName()) { 9421 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9422 if (!NameInfo.getName()) 9423 return nullptr; 9424 } 9425 // Build a list of all UDR decls with the same names ranged by the Scopes. 9426 // The Scope boundary is a duplication of the previous decl. 9427 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9428 for (auto *E : C->reduction_ops()) { 9429 // Transform all the decls. 9430 if (E) { 9431 auto *ULE = cast<UnresolvedLookupExpr>(E); 9432 UnresolvedSet<8> Decls; 9433 for (auto *D : ULE->decls()) { 9434 NamedDecl *InstD = 9435 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9436 Decls.addDecl(InstD, InstD->getAccess()); 9437 } 9438 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9439 SemaRef.Context, /*NamingClass=*/nullptr, 9440 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9441 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9442 } else 9443 UnresolvedReductions.push_back(nullptr); 9444 } 9445 return getDerived().RebuildOMPTaskReductionClause( 9446 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9447 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9448 } 9449 9450 template <typename Derived> 9451 OMPClause * 9452 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9453 llvm::SmallVector<Expr *, 16> Vars; 9454 Vars.reserve(C->varlist_size()); 9455 for (auto *VE : C->varlists()) { 9456 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9457 if (EVar.isInvalid()) 9458 return nullptr; 9459 Vars.push_back(EVar.get()); 9460 } 9461 CXXScopeSpec ReductionIdScopeSpec; 9462 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9463 9464 DeclarationNameInfo NameInfo = C->getNameInfo(); 9465 if (NameInfo.getName()) { 9466 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9467 if (!NameInfo.getName()) 9468 return nullptr; 9469 } 9470 // Build a list of all UDR decls with the same names ranged by the Scopes. 9471 // The Scope boundary is a duplication of the previous decl. 9472 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9473 for (auto *E : C->reduction_ops()) { 9474 // Transform all the decls. 9475 if (E) { 9476 auto *ULE = cast<UnresolvedLookupExpr>(E); 9477 UnresolvedSet<8> Decls; 9478 for (auto *D : ULE->decls()) { 9479 NamedDecl *InstD = 9480 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9481 Decls.addDecl(InstD, InstD->getAccess()); 9482 } 9483 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9484 SemaRef.Context, /*NamingClass=*/nullptr, 9485 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9486 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9487 } else 9488 UnresolvedReductions.push_back(nullptr); 9489 } 9490 return getDerived().RebuildOMPInReductionClause( 9491 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9492 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9493 } 9494 9495 template <typename Derived> 9496 OMPClause * 9497 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9498 llvm::SmallVector<Expr *, 16> Vars; 9499 Vars.reserve(C->varlist_size()); 9500 for (auto *VE : C->varlists()) { 9501 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9502 if (EVar.isInvalid()) 9503 return nullptr; 9504 Vars.push_back(EVar.get()); 9505 } 9506 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9507 if (Step.isInvalid()) 9508 return nullptr; 9509 return getDerived().RebuildOMPLinearClause( 9510 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9511 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9512 } 9513 9514 template <typename Derived> 9515 OMPClause * 9516 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9517 llvm::SmallVector<Expr *, 16> Vars; 9518 Vars.reserve(C->varlist_size()); 9519 for (auto *VE : C->varlists()) { 9520 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9521 if (EVar.isInvalid()) 9522 return nullptr; 9523 Vars.push_back(EVar.get()); 9524 } 9525 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9526 if (Alignment.isInvalid()) 9527 return nullptr; 9528 return getDerived().RebuildOMPAlignedClause( 9529 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9530 C->getColonLoc(), C->getEndLoc()); 9531 } 9532 9533 template <typename Derived> 9534 OMPClause * 9535 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9536 llvm::SmallVector<Expr *, 16> Vars; 9537 Vars.reserve(C->varlist_size()); 9538 for (auto *VE : C->varlists()) { 9539 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9540 if (EVar.isInvalid()) 9541 return nullptr; 9542 Vars.push_back(EVar.get()); 9543 } 9544 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9545 C->getLParenLoc(), C->getEndLoc()); 9546 } 9547 9548 template <typename Derived> 9549 OMPClause * 9550 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *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().RebuildOMPCopyprivateClause( 9560 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9561 } 9562 9563 template <typename Derived> 9564 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9565 llvm::SmallVector<Expr *, 16> Vars; 9566 Vars.reserve(C->varlist_size()); 9567 for (auto *VE : C->varlists()) { 9568 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9569 if (EVar.isInvalid()) 9570 return nullptr; 9571 Vars.push_back(EVar.get()); 9572 } 9573 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9574 C->getLParenLoc(), C->getEndLoc()); 9575 } 9576 9577 template <typename Derived> 9578 OMPClause * 9579 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9580 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9581 if (E.isInvalid()) 9582 return nullptr; 9583 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9584 C->getLParenLoc(), C->getEndLoc()); 9585 } 9586 9587 template <typename Derived> 9588 OMPClause * 9589 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9590 llvm::SmallVector<Expr *, 16> Vars; 9591 Expr *DepModifier = C->getModifier(); 9592 if (DepModifier) { 9593 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9594 if (DepModRes.isInvalid()) 9595 return nullptr; 9596 DepModifier = DepModRes.get(); 9597 } 9598 Vars.reserve(C->varlist_size()); 9599 for (auto *VE : C->varlists()) { 9600 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9601 if (EVar.isInvalid()) 9602 return nullptr; 9603 Vars.push_back(EVar.get()); 9604 } 9605 return getDerived().RebuildOMPDependClause( 9606 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9607 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9608 C->getEndLoc()); 9609 } 9610 9611 template <typename Derived> 9612 OMPClause * 9613 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9614 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9615 if (E.isInvalid()) 9616 return nullptr; 9617 return getDerived().RebuildOMPDeviceClause( 9618 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9619 C->getModifierLoc(), C->getEndLoc()); 9620 } 9621 9622 template <typename Derived, class T> 9623 bool transformOMPMappableExprListClause( 9624 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9625 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9626 DeclarationNameInfo &MapperIdInfo, 9627 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9628 // Transform expressions in the list. 9629 Vars.reserve(C->varlist_size()); 9630 for (auto *VE : C->varlists()) { 9631 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9632 if (EVar.isInvalid()) 9633 return true; 9634 Vars.push_back(EVar.get()); 9635 } 9636 // Transform mapper scope specifier and identifier. 9637 NestedNameSpecifierLoc QualifierLoc; 9638 if (C->getMapperQualifierLoc()) { 9639 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9640 C->getMapperQualifierLoc()); 9641 if (!QualifierLoc) 9642 return true; 9643 } 9644 MapperIdScopeSpec.Adopt(QualifierLoc); 9645 MapperIdInfo = C->getMapperIdInfo(); 9646 if (MapperIdInfo.getName()) { 9647 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9648 if (!MapperIdInfo.getName()) 9649 return true; 9650 } 9651 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9652 // the previous user-defined mapper lookup in dependent environment. 9653 for (auto *E : C->mapperlists()) { 9654 // Transform all the decls. 9655 if (E) { 9656 auto *ULE = cast<UnresolvedLookupExpr>(E); 9657 UnresolvedSet<8> Decls; 9658 for (auto *D : ULE->decls()) { 9659 NamedDecl *InstD = 9660 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9661 Decls.addDecl(InstD, InstD->getAccess()); 9662 } 9663 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9664 TT.getSema().Context, /*NamingClass=*/nullptr, 9665 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9666 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9667 Decls.end())); 9668 } else { 9669 UnresolvedMappers.push_back(nullptr); 9670 } 9671 } 9672 return false; 9673 } 9674 9675 template <typename Derived> 9676 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9677 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9678 llvm::SmallVector<Expr *, 16> Vars; 9679 CXXScopeSpec MapperIdScopeSpec; 9680 DeclarationNameInfo MapperIdInfo; 9681 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9682 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9683 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9684 return nullptr; 9685 return getDerived().RebuildOMPMapClause( 9686 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9687 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9688 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9689 } 9690 9691 template <typename Derived> 9692 OMPClause * 9693 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9694 Expr *Allocator = C->getAllocator(); 9695 if (Allocator) { 9696 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9697 if (AllocatorRes.isInvalid()) 9698 return nullptr; 9699 Allocator = AllocatorRes.get(); 9700 } 9701 llvm::SmallVector<Expr *, 16> Vars; 9702 Vars.reserve(C->varlist_size()); 9703 for (auto *VE : C->varlists()) { 9704 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9705 if (EVar.isInvalid()) 9706 return nullptr; 9707 Vars.push_back(EVar.get()); 9708 } 9709 return getDerived().RebuildOMPAllocateClause( 9710 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9711 C->getEndLoc()); 9712 } 9713 9714 template <typename Derived> 9715 OMPClause * 9716 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9717 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9718 if (E.isInvalid()) 9719 return nullptr; 9720 return getDerived().RebuildOMPNumTeamsClause( 9721 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9722 } 9723 9724 template <typename Derived> 9725 OMPClause * 9726 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9727 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9728 if (E.isInvalid()) 9729 return nullptr; 9730 return getDerived().RebuildOMPThreadLimitClause( 9731 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9732 } 9733 9734 template <typename Derived> 9735 OMPClause * 9736 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9737 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9738 if (E.isInvalid()) 9739 return nullptr; 9740 return getDerived().RebuildOMPPriorityClause( 9741 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9742 } 9743 9744 template <typename Derived> 9745 OMPClause * 9746 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9747 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9748 if (E.isInvalid()) 9749 return nullptr; 9750 return getDerived().RebuildOMPGrainsizeClause( 9751 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9752 } 9753 9754 template <typename Derived> 9755 OMPClause * 9756 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9757 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9758 if (E.isInvalid()) 9759 return nullptr; 9760 return getDerived().RebuildOMPNumTasksClause( 9761 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9762 } 9763 9764 template <typename Derived> 9765 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9766 ExprResult E = getDerived().TransformExpr(C->getHint()); 9767 if (E.isInvalid()) 9768 return nullptr; 9769 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9770 C->getLParenLoc(), C->getEndLoc()); 9771 } 9772 9773 template <typename Derived> 9774 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9775 OMPDistScheduleClause *C) { 9776 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9777 if (E.isInvalid()) 9778 return nullptr; 9779 return getDerived().RebuildOMPDistScheduleClause( 9780 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9781 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9782 } 9783 9784 template <typename Derived> 9785 OMPClause * 9786 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9787 // Rebuild Defaultmap Clause since we need to invoke the checking of 9788 // defaultmap(none:variable-category) after template initialization. 9789 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9790 C->getDefaultmapKind(), 9791 C->getBeginLoc(), 9792 C->getLParenLoc(), 9793 C->getDefaultmapModifierLoc(), 9794 C->getDefaultmapKindLoc(), 9795 C->getEndLoc()); 9796 } 9797 9798 template <typename Derived> 9799 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9800 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9801 llvm::SmallVector<Expr *, 16> Vars; 9802 CXXScopeSpec MapperIdScopeSpec; 9803 DeclarationNameInfo MapperIdInfo; 9804 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9805 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9806 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9807 return nullptr; 9808 return getDerived().RebuildOMPToClause( 9809 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9810 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9811 } 9812 9813 template <typename Derived> 9814 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9815 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9816 llvm::SmallVector<Expr *, 16> Vars; 9817 CXXScopeSpec MapperIdScopeSpec; 9818 DeclarationNameInfo MapperIdInfo; 9819 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9820 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9821 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9822 return nullptr; 9823 return getDerived().RebuildOMPFromClause( 9824 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9825 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9826 } 9827 9828 template <typename Derived> 9829 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9830 OMPUseDevicePtrClause *C) { 9831 llvm::SmallVector<Expr *, 16> Vars; 9832 Vars.reserve(C->varlist_size()); 9833 for (auto *VE : C->varlists()) { 9834 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9835 if (EVar.isInvalid()) 9836 return nullptr; 9837 Vars.push_back(EVar.get()); 9838 } 9839 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9840 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9841 } 9842 9843 template <typename Derived> 9844 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 9845 OMPUseDeviceAddrClause *C) { 9846 llvm::SmallVector<Expr *, 16> Vars; 9847 Vars.reserve(C->varlist_size()); 9848 for (auto *VE : C->varlists()) { 9849 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9850 if (EVar.isInvalid()) 9851 return nullptr; 9852 Vars.push_back(EVar.get()); 9853 } 9854 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9855 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 9856 } 9857 9858 template <typename Derived> 9859 OMPClause * 9860 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9861 llvm::SmallVector<Expr *, 16> Vars; 9862 Vars.reserve(C->varlist_size()); 9863 for (auto *VE : C->varlists()) { 9864 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9865 if (EVar.isInvalid()) 9866 return nullptr; 9867 Vars.push_back(EVar.get()); 9868 } 9869 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9870 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9871 } 9872 9873 template <typename Derived> 9874 OMPClause * 9875 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9876 llvm::SmallVector<Expr *, 16> Vars; 9877 Vars.reserve(C->varlist_size()); 9878 for (auto *VE : C->varlists()) { 9879 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9880 if (EVar.isInvalid()) 9881 return nullptr; 9882 Vars.push_back(EVar.get()); 9883 } 9884 return getDerived().RebuildOMPNontemporalClause( 9885 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9886 } 9887 9888 template <typename Derived> 9889 OMPClause * 9890 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 9891 llvm::SmallVector<Expr *, 16> Vars; 9892 Vars.reserve(C->varlist_size()); 9893 for (auto *VE : C->varlists()) { 9894 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9895 if (EVar.isInvalid()) 9896 return nullptr; 9897 Vars.push_back(EVar.get()); 9898 } 9899 return getDerived().RebuildOMPInclusiveClause( 9900 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9901 } 9902 9903 template <typename Derived> 9904 OMPClause * 9905 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 9906 llvm::SmallVector<Expr *, 16> Vars; 9907 Vars.reserve(C->varlist_size()); 9908 for (auto *VE : C->varlists()) { 9909 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9910 if (EVar.isInvalid()) 9911 return nullptr; 9912 Vars.push_back(EVar.get()); 9913 } 9914 return getDerived().RebuildOMPExclusiveClause( 9915 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9916 } 9917 9918 template <typename Derived> 9919 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 9920 OMPUsesAllocatorsClause *C) { 9921 SmallVector<Sema::UsesAllocatorsData, 16> Data; 9922 Data.reserve(C->getNumberOfAllocators()); 9923 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 9924 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 9925 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 9926 if (Allocator.isInvalid()) 9927 continue; 9928 ExprResult AllocatorTraits; 9929 if (Expr *AT = D.AllocatorTraits) { 9930 AllocatorTraits = getDerived().TransformExpr(AT); 9931 if (AllocatorTraits.isInvalid()) 9932 continue; 9933 } 9934 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 9935 NewD.Allocator = Allocator.get(); 9936 NewD.AllocatorTraits = AllocatorTraits.get(); 9937 NewD.LParenLoc = D.LParenLoc; 9938 NewD.RParenLoc = D.RParenLoc; 9939 } 9940 return getDerived().RebuildOMPUsesAllocatorsClause( 9941 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9942 } 9943 9944 template <typename Derived> 9945 OMPClause * 9946 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 9947 SmallVector<Expr *, 4> Locators; 9948 Locators.reserve(C->varlist_size()); 9949 ExprResult ModifierRes; 9950 if (Expr *Modifier = C->getModifier()) { 9951 ModifierRes = getDerived().TransformExpr(Modifier); 9952 if (ModifierRes.isInvalid()) 9953 return nullptr; 9954 } 9955 for (Expr *E : C->varlists()) { 9956 ExprResult Locator = getDerived().TransformExpr(E); 9957 if (Locator.isInvalid()) 9958 continue; 9959 Locators.push_back(Locator.get()); 9960 } 9961 return getDerived().RebuildOMPAffinityClause( 9962 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 9963 ModifierRes.get(), Locators); 9964 } 9965 9966 template <typename Derived> 9967 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 9968 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 9969 C->getBeginLoc(), C->getLParenLoc(), 9970 C->getEndLoc()); 9971 } 9972 9973 //===----------------------------------------------------------------------===// 9974 // Expression transformation 9975 //===----------------------------------------------------------------------===// 9976 template<typename Derived> 9977 ExprResult 9978 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9979 return TransformExpr(E->getSubExpr()); 9980 } 9981 9982 template<typename Derived> 9983 ExprResult 9984 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9985 if (!E->isTypeDependent()) 9986 return E; 9987 9988 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9989 E->getIdentKind()); 9990 } 9991 9992 template<typename Derived> 9993 ExprResult 9994 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9995 NestedNameSpecifierLoc QualifierLoc; 9996 if (E->getQualifierLoc()) { 9997 QualifierLoc 9998 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9999 if (!QualifierLoc) 10000 return ExprError(); 10001 } 10002 10003 ValueDecl *ND 10004 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10005 E->getDecl())); 10006 if (!ND) 10007 return ExprError(); 10008 10009 NamedDecl *Found = ND; 10010 if (E->getFoundDecl() != E->getDecl()) { 10011 Found = cast_or_null<NamedDecl>( 10012 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10013 if (!Found) 10014 return ExprError(); 10015 } 10016 10017 DeclarationNameInfo NameInfo = E->getNameInfo(); 10018 if (NameInfo.getName()) { 10019 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10020 if (!NameInfo.getName()) 10021 return ExprError(); 10022 } 10023 10024 if (!getDerived().AlwaysRebuild() && 10025 QualifierLoc == E->getQualifierLoc() && 10026 ND == E->getDecl() && 10027 Found == E->getFoundDecl() && 10028 NameInfo.getName() == E->getDecl()->getDeclName() && 10029 !E->hasExplicitTemplateArgs()) { 10030 10031 // Mark it referenced in the new context regardless. 10032 // FIXME: this is a bit instantiation-specific. 10033 SemaRef.MarkDeclRefReferenced(E); 10034 10035 return E; 10036 } 10037 10038 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10039 if (E->hasExplicitTemplateArgs()) { 10040 TemplateArgs = &TransArgs; 10041 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10042 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10043 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10044 E->getNumTemplateArgs(), 10045 TransArgs)) 10046 return ExprError(); 10047 } 10048 10049 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10050 Found, TemplateArgs); 10051 } 10052 10053 template<typename Derived> 10054 ExprResult 10055 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10056 return E; 10057 } 10058 10059 template <typename Derived> 10060 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10061 FixedPointLiteral *E) { 10062 return E; 10063 } 10064 10065 template<typename Derived> 10066 ExprResult 10067 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10068 return E; 10069 } 10070 10071 template<typename Derived> 10072 ExprResult 10073 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10074 return E; 10075 } 10076 10077 template<typename Derived> 10078 ExprResult 10079 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10080 return E; 10081 } 10082 10083 template<typename Derived> 10084 ExprResult 10085 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10086 return E; 10087 } 10088 10089 template<typename Derived> 10090 ExprResult 10091 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10092 if (FunctionDecl *FD = E->getDirectCallee()) 10093 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10094 return SemaRef.MaybeBindToTemporary(E); 10095 } 10096 10097 template<typename Derived> 10098 ExprResult 10099 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10100 ExprResult ControllingExpr = 10101 getDerived().TransformExpr(E->getControllingExpr()); 10102 if (ControllingExpr.isInvalid()) 10103 return ExprError(); 10104 10105 SmallVector<Expr *, 4> AssocExprs; 10106 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10107 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10108 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10109 if (TSI) { 10110 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10111 if (!AssocType) 10112 return ExprError(); 10113 AssocTypes.push_back(AssocType); 10114 } else { 10115 AssocTypes.push_back(nullptr); 10116 } 10117 10118 ExprResult AssocExpr = 10119 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10120 if (AssocExpr.isInvalid()) 10121 return ExprError(); 10122 AssocExprs.push_back(AssocExpr.get()); 10123 } 10124 10125 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10126 E->getDefaultLoc(), 10127 E->getRParenLoc(), 10128 ControllingExpr.get(), 10129 AssocTypes, 10130 AssocExprs); 10131 } 10132 10133 template<typename Derived> 10134 ExprResult 10135 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10136 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10137 if (SubExpr.isInvalid()) 10138 return ExprError(); 10139 10140 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10141 return E; 10142 10143 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10144 E->getRParen()); 10145 } 10146 10147 /// The operand of a unary address-of operator has special rules: it's 10148 /// allowed to refer to a non-static member of a class even if there's no 'this' 10149 /// object available. 10150 template<typename Derived> 10151 ExprResult 10152 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10153 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10154 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10155 else 10156 return getDerived().TransformExpr(E); 10157 } 10158 10159 template<typename Derived> 10160 ExprResult 10161 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10162 ExprResult SubExpr; 10163 if (E->getOpcode() == UO_AddrOf) 10164 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10165 else 10166 SubExpr = TransformExpr(E->getSubExpr()); 10167 if (SubExpr.isInvalid()) 10168 return ExprError(); 10169 10170 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10171 return E; 10172 10173 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10174 E->getOpcode(), 10175 SubExpr.get()); 10176 } 10177 10178 template<typename Derived> 10179 ExprResult 10180 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10181 // Transform the type. 10182 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10183 if (!Type) 10184 return ExprError(); 10185 10186 // Transform all of the components into components similar to what the 10187 // parser uses. 10188 // FIXME: It would be slightly more efficient in the non-dependent case to 10189 // just map FieldDecls, rather than requiring the rebuilder to look for 10190 // the fields again. However, __builtin_offsetof is rare enough in 10191 // template code that we don't care. 10192 bool ExprChanged = false; 10193 typedef Sema::OffsetOfComponent Component; 10194 SmallVector<Component, 4> Components; 10195 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10196 const OffsetOfNode &ON = E->getComponent(I); 10197 Component Comp; 10198 Comp.isBrackets = true; 10199 Comp.LocStart = ON.getSourceRange().getBegin(); 10200 Comp.LocEnd = ON.getSourceRange().getEnd(); 10201 switch (ON.getKind()) { 10202 case OffsetOfNode::Array: { 10203 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10204 ExprResult Index = getDerived().TransformExpr(FromIndex); 10205 if (Index.isInvalid()) 10206 return ExprError(); 10207 10208 ExprChanged = ExprChanged || Index.get() != FromIndex; 10209 Comp.isBrackets = true; 10210 Comp.U.E = Index.get(); 10211 break; 10212 } 10213 10214 case OffsetOfNode::Field: 10215 case OffsetOfNode::Identifier: 10216 Comp.isBrackets = false; 10217 Comp.U.IdentInfo = ON.getFieldName(); 10218 if (!Comp.U.IdentInfo) 10219 continue; 10220 10221 break; 10222 10223 case OffsetOfNode::Base: 10224 // Will be recomputed during the rebuild. 10225 continue; 10226 } 10227 10228 Components.push_back(Comp); 10229 } 10230 10231 // If nothing changed, retain the existing expression. 10232 if (!getDerived().AlwaysRebuild() && 10233 Type == E->getTypeSourceInfo() && 10234 !ExprChanged) 10235 return E; 10236 10237 // Build a new offsetof expression. 10238 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10239 Components, E->getRParenLoc()); 10240 } 10241 10242 template<typename Derived> 10243 ExprResult 10244 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10245 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10246 "opaque value expression requires transformation"); 10247 return E; 10248 } 10249 10250 template<typename Derived> 10251 ExprResult 10252 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10253 return E; 10254 } 10255 10256 template <typename Derived> 10257 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10258 llvm::SmallVector<Expr *, 8> Children; 10259 bool Changed = false; 10260 for (Expr *C : E->subExpressions()) { 10261 ExprResult NewC = getDerived().TransformExpr(C); 10262 if (NewC.isInvalid()) 10263 return ExprError(); 10264 Children.push_back(NewC.get()); 10265 10266 Changed |= NewC.get() != C; 10267 } 10268 if (!getDerived().AlwaysRebuild() && !Changed) 10269 return E; 10270 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10271 Children, E->getType()); 10272 } 10273 10274 template<typename Derived> 10275 ExprResult 10276 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10277 // Rebuild the syntactic form. The original syntactic form has 10278 // opaque-value expressions in it, so strip those away and rebuild 10279 // the result. This is a really awful way of doing this, but the 10280 // better solution (rebuilding the semantic expressions and 10281 // rebinding OVEs as necessary) doesn't work; we'd need 10282 // TreeTransform to not strip away implicit conversions. 10283 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10284 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10285 if (result.isInvalid()) return ExprError(); 10286 10287 // If that gives us a pseudo-object result back, the pseudo-object 10288 // expression must have been an lvalue-to-rvalue conversion which we 10289 // should reapply. 10290 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10291 result = SemaRef.checkPseudoObjectRValue(result.get()); 10292 10293 return result; 10294 } 10295 10296 template<typename Derived> 10297 ExprResult 10298 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10299 UnaryExprOrTypeTraitExpr *E) { 10300 if (E->isArgumentType()) { 10301 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10302 10303 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10304 if (!NewT) 10305 return ExprError(); 10306 10307 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10308 return E; 10309 10310 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10311 E->getKind(), 10312 E->getSourceRange()); 10313 } 10314 10315 // C++0x [expr.sizeof]p1: 10316 // The operand is either an expression, which is an unevaluated operand 10317 // [...] 10318 EnterExpressionEvaluationContext Unevaluated( 10319 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10320 Sema::ReuseLambdaContextDecl); 10321 10322 // Try to recover if we have something like sizeof(T::X) where X is a type. 10323 // Notably, there must be *exactly* one set of parens if X is a type. 10324 TypeSourceInfo *RecoveryTSI = nullptr; 10325 ExprResult SubExpr; 10326 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10327 if (auto *DRE = 10328 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10329 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10330 PE, DRE, false, &RecoveryTSI); 10331 else 10332 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10333 10334 if (RecoveryTSI) { 10335 return getDerived().RebuildUnaryExprOrTypeTrait( 10336 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10337 } else if (SubExpr.isInvalid()) 10338 return ExprError(); 10339 10340 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10341 return E; 10342 10343 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10344 E->getOperatorLoc(), 10345 E->getKind(), 10346 E->getSourceRange()); 10347 } 10348 10349 template<typename Derived> 10350 ExprResult 10351 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10352 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10353 if (LHS.isInvalid()) 10354 return ExprError(); 10355 10356 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10357 if (RHS.isInvalid()) 10358 return ExprError(); 10359 10360 10361 if (!getDerived().AlwaysRebuild() && 10362 LHS.get() == E->getLHS() && 10363 RHS.get() == E->getRHS()) 10364 return E; 10365 10366 return getDerived().RebuildArraySubscriptExpr( 10367 LHS.get(), 10368 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10369 } 10370 10371 template <typename Derived> 10372 ExprResult 10373 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10374 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10375 if (Base.isInvalid()) 10376 return ExprError(); 10377 10378 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10379 if (RowIdx.isInvalid()) 10380 return ExprError(); 10381 10382 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10383 if (ColumnIdx.isInvalid()) 10384 return ExprError(); 10385 10386 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10387 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10388 return E; 10389 10390 return getDerived().RebuildMatrixSubscriptExpr( 10391 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10392 } 10393 10394 template <typename Derived> 10395 ExprResult 10396 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10397 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10398 if (Base.isInvalid()) 10399 return ExprError(); 10400 10401 ExprResult LowerBound; 10402 if (E->getLowerBound()) { 10403 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10404 if (LowerBound.isInvalid()) 10405 return ExprError(); 10406 } 10407 10408 ExprResult Length; 10409 if (E->getLength()) { 10410 Length = getDerived().TransformExpr(E->getLength()); 10411 if (Length.isInvalid()) 10412 return ExprError(); 10413 } 10414 10415 ExprResult Stride; 10416 if (Expr *Str = E->getStride()) { 10417 Stride = getDerived().TransformExpr(Str); 10418 if (Stride.isInvalid()) 10419 return ExprError(); 10420 } 10421 10422 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10423 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10424 return E; 10425 10426 return getDerived().RebuildOMPArraySectionExpr( 10427 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10428 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10429 E->getRBracketLoc()); 10430 } 10431 10432 template <typename Derived> 10433 ExprResult 10434 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10435 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10436 if (Base.isInvalid()) 10437 return ExprError(); 10438 10439 SmallVector<Expr *, 4> Dims; 10440 bool ErrorFound = false; 10441 for (Expr *Dim : E->getDimensions()) { 10442 ExprResult DimRes = getDerived().TransformExpr(Dim); 10443 if (DimRes.isInvalid()) { 10444 ErrorFound = true; 10445 continue; 10446 } 10447 Dims.push_back(DimRes.get()); 10448 } 10449 10450 if (ErrorFound) 10451 return ExprError(); 10452 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10453 E->getRParenLoc(), Dims, 10454 E->getBracketsRanges()); 10455 } 10456 10457 template <typename Derived> 10458 ExprResult 10459 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10460 unsigned NumIterators = E->numOfIterators(); 10461 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10462 10463 bool ErrorFound = false; 10464 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10465 for (unsigned I = 0; I < NumIterators; ++I) { 10466 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10467 Data[I].DeclIdent = D->getIdentifier(); 10468 Data[I].DeclIdentLoc = D->getLocation(); 10469 if (D->getLocation() == D->getBeginLoc()) { 10470 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10471 "Implicit type must be int."); 10472 } else { 10473 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10474 QualType DeclTy = getDerived().TransformType(D->getType()); 10475 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10476 } 10477 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10478 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10479 ExprResult End = getDerived().TransformExpr(Range.End); 10480 ExprResult Step = getDerived().TransformExpr(Range.Step); 10481 ErrorFound = ErrorFound || 10482 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10483 !Data[I].Type.get().isNull())) || 10484 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10485 if (ErrorFound) 10486 continue; 10487 Data[I].Range.Begin = Begin.get(); 10488 Data[I].Range.End = End.get(); 10489 Data[I].Range.Step = Step.get(); 10490 Data[I].AssignLoc = E->getAssignLoc(I); 10491 Data[I].ColonLoc = E->getColonLoc(I); 10492 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10493 NeedToRebuild = 10494 NeedToRebuild || 10495 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10496 D->getType().getTypePtrOrNull()) || 10497 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10498 Range.Step != Data[I].Range.Step; 10499 } 10500 if (ErrorFound) 10501 return ExprError(); 10502 if (!NeedToRebuild) 10503 return E; 10504 10505 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10506 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10507 if (!Res.isUsable()) 10508 return Res; 10509 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10510 for (unsigned I = 0; I < NumIterators; ++I) 10511 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10512 IE->getIteratorDecl(I)); 10513 return Res; 10514 } 10515 10516 template<typename Derived> 10517 ExprResult 10518 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10519 // Transform the callee. 10520 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10521 if (Callee.isInvalid()) 10522 return ExprError(); 10523 10524 // Transform arguments. 10525 bool ArgChanged = false; 10526 SmallVector<Expr*, 8> Args; 10527 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10528 &ArgChanged)) 10529 return ExprError(); 10530 10531 if (!getDerived().AlwaysRebuild() && 10532 Callee.get() == E->getCallee() && 10533 !ArgChanged) 10534 return SemaRef.MaybeBindToTemporary(E); 10535 10536 // FIXME: Wrong source location information for the '('. 10537 SourceLocation FakeLParenLoc 10538 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10539 10540 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10541 if (E->hasStoredFPFeatures()) { 10542 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10543 getSema().CurFPFeatures = 10544 NewOverrides.applyOverrides(getSema().getLangOpts()); 10545 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10546 } 10547 10548 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10549 Args, 10550 E->getRParenLoc()); 10551 } 10552 10553 template<typename Derived> 10554 ExprResult 10555 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10556 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10557 if (Base.isInvalid()) 10558 return ExprError(); 10559 10560 NestedNameSpecifierLoc QualifierLoc; 10561 if (E->hasQualifier()) { 10562 QualifierLoc 10563 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10564 10565 if (!QualifierLoc) 10566 return ExprError(); 10567 } 10568 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10569 10570 ValueDecl *Member 10571 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10572 E->getMemberDecl())); 10573 if (!Member) 10574 return ExprError(); 10575 10576 NamedDecl *FoundDecl = E->getFoundDecl(); 10577 if (FoundDecl == E->getMemberDecl()) { 10578 FoundDecl = Member; 10579 } else { 10580 FoundDecl = cast_or_null<NamedDecl>( 10581 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10582 if (!FoundDecl) 10583 return ExprError(); 10584 } 10585 10586 if (!getDerived().AlwaysRebuild() && 10587 Base.get() == E->getBase() && 10588 QualifierLoc == E->getQualifierLoc() && 10589 Member == E->getMemberDecl() && 10590 FoundDecl == E->getFoundDecl() && 10591 !E->hasExplicitTemplateArgs()) { 10592 10593 // Mark it referenced in the new context regardless. 10594 // FIXME: this is a bit instantiation-specific. 10595 SemaRef.MarkMemberReferenced(E); 10596 10597 return E; 10598 } 10599 10600 TemplateArgumentListInfo TransArgs; 10601 if (E->hasExplicitTemplateArgs()) { 10602 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10603 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10604 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10605 E->getNumTemplateArgs(), 10606 TransArgs)) 10607 return ExprError(); 10608 } 10609 10610 // FIXME: Bogus source location for the operator 10611 SourceLocation FakeOperatorLoc = 10612 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10613 10614 // FIXME: to do this check properly, we will need to preserve the 10615 // first-qualifier-in-scope here, just in case we had a dependent 10616 // base (and therefore couldn't do the check) and a 10617 // nested-name-qualifier (and therefore could do the lookup). 10618 NamedDecl *FirstQualifierInScope = nullptr; 10619 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10620 if (MemberNameInfo.getName()) { 10621 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10622 if (!MemberNameInfo.getName()) 10623 return ExprError(); 10624 } 10625 10626 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10627 E->isArrow(), 10628 QualifierLoc, 10629 TemplateKWLoc, 10630 MemberNameInfo, 10631 Member, 10632 FoundDecl, 10633 (E->hasExplicitTemplateArgs() 10634 ? &TransArgs : nullptr), 10635 FirstQualifierInScope); 10636 } 10637 10638 template<typename Derived> 10639 ExprResult 10640 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10641 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10642 if (LHS.isInvalid()) 10643 return ExprError(); 10644 10645 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10646 if (RHS.isInvalid()) 10647 return ExprError(); 10648 10649 if (!getDerived().AlwaysRebuild() && 10650 LHS.get() == E->getLHS() && 10651 RHS.get() == E->getRHS()) 10652 return E; 10653 10654 if (E->isCompoundAssignmentOp()) 10655 // FPFeatures has already been established from trailing storage 10656 return getDerived().RebuildBinaryOperator( 10657 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10658 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10659 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10660 getSema().CurFPFeatures = 10661 NewOverrides.applyOverrides(getSema().getLangOpts()); 10662 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10663 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10664 LHS.get(), RHS.get()); 10665 } 10666 10667 template <typename Derived> 10668 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10669 CXXRewrittenBinaryOperator *E) { 10670 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10671 10672 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10673 if (LHS.isInvalid()) 10674 return ExprError(); 10675 10676 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10677 if (RHS.isInvalid()) 10678 return ExprError(); 10679 10680 if (!getDerived().AlwaysRebuild() && 10681 LHS.get() == Decomp.LHS && 10682 RHS.get() == Decomp.RHS) 10683 return E; 10684 10685 // Extract the already-resolved callee declarations so that we can restrict 10686 // ourselves to using them as the unqualified lookup results when rebuilding. 10687 UnresolvedSet<2> UnqualLookups; 10688 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10689 const_cast<Expr *>(Decomp.InnerBinOp)}; 10690 for (Expr *PossibleBinOp : PossibleBinOps) { 10691 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10692 if (!Op) 10693 continue; 10694 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10695 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10696 continue; 10697 10698 // Transform the callee in case we built a call to a local extern 10699 // declaration. 10700 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10701 E->getOperatorLoc(), Callee->getFoundDecl())); 10702 if (!Found) 10703 return ExprError(); 10704 UnqualLookups.addDecl(Found); 10705 } 10706 10707 return getDerived().RebuildCXXRewrittenBinaryOperator( 10708 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10709 } 10710 10711 template<typename Derived> 10712 ExprResult 10713 TreeTransform<Derived>::TransformCompoundAssignOperator( 10714 CompoundAssignOperator *E) { 10715 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10716 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10717 getSema().CurFPFeatures = 10718 NewOverrides.applyOverrides(getSema().getLangOpts()); 10719 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10720 return getDerived().TransformBinaryOperator(E); 10721 } 10722 10723 template<typename Derived> 10724 ExprResult TreeTransform<Derived>:: 10725 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10726 // Just rebuild the common and RHS expressions and see whether we 10727 // get any changes. 10728 10729 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10730 if (commonExpr.isInvalid()) 10731 return ExprError(); 10732 10733 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10734 if (rhs.isInvalid()) 10735 return ExprError(); 10736 10737 if (!getDerived().AlwaysRebuild() && 10738 commonExpr.get() == e->getCommon() && 10739 rhs.get() == e->getFalseExpr()) 10740 return e; 10741 10742 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10743 e->getQuestionLoc(), 10744 nullptr, 10745 e->getColonLoc(), 10746 rhs.get()); 10747 } 10748 10749 template<typename Derived> 10750 ExprResult 10751 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10752 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10753 if (Cond.isInvalid()) 10754 return ExprError(); 10755 10756 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10757 if (LHS.isInvalid()) 10758 return ExprError(); 10759 10760 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10761 if (RHS.isInvalid()) 10762 return ExprError(); 10763 10764 if (!getDerived().AlwaysRebuild() && 10765 Cond.get() == E->getCond() && 10766 LHS.get() == E->getLHS() && 10767 RHS.get() == E->getRHS()) 10768 return E; 10769 10770 return getDerived().RebuildConditionalOperator(Cond.get(), 10771 E->getQuestionLoc(), 10772 LHS.get(), 10773 E->getColonLoc(), 10774 RHS.get()); 10775 } 10776 10777 template<typename Derived> 10778 ExprResult 10779 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10780 // Implicit casts are eliminated during transformation, since they 10781 // will be recomputed by semantic analysis after transformation. 10782 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10783 } 10784 10785 template<typename Derived> 10786 ExprResult 10787 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10788 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10789 if (!Type) 10790 return ExprError(); 10791 10792 ExprResult SubExpr 10793 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10794 if (SubExpr.isInvalid()) 10795 return ExprError(); 10796 10797 if (!getDerived().AlwaysRebuild() && 10798 Type == E->getTypeInfoAsWritten() && 10799 SubExpr.get() == E->getSubExpr()) 10800 return E; 10801 10802 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10803 Type, 10804 E->getRParenLoc(), 10805 SubExpr.get()); 10806 } 10807 10808 template<typename Derived> 10809 ExprResult 10810 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10811 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10812 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10813 if (!NewT) 10814 return ExprError(); 10815 10816 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10817 if (Init.isInvalid()) 10818 return ExprError(); 10819 10820 if (!getDerived().AlwaysRebuild() && 10821 OldT == NewT && 10822 Init.get() == E->getInitializer()) 10823 return SemaRef.MaybeBindToTemporary(E); 10824 10825 // Note: the expression type doesn't necessarily match the 10826 // type-as-written, but that's okay, because it should always be 10827 // derivable from the initializer. 10828 10829 return getDerived().RebuildCompoundLiteralExpr( 10830 E->getLParenLoc(), NewT, 10831 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10832 } 10833 10834 template<typename Derived> 10835 ExprResult 10836 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10837 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10838 if (Base.isInvalid()) 10839 return ExprError(); 10840 10841 if (!getDerived().AlwaysRebuild() && 10842 Base.get() == E->getBase()) 10843 return E; 10844 10845 // FIXME: Bad source location 10846 SourceLocation FakeOperatorLoc = 10847 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10848 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10849 E->getAccessorLoc(), 10850 E->getAccessor()); 10851 } 10852 10853 template<typename Derived> 10854 ExprResult 10855 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10856 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10857 E = Syntactic; 10858 10859 bool InitChanged = false; 10860 10861 EnterExpressionEvaluationContext Context( 10862 getSema(), EnterExpressionEvaluationContext::InitList); 10863 10864 SmallVector<Expr*, 4> Inits; 10865 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10866 Inits, &InitChanged)) 10867 return ExprError(); 10868 10869 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10870 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10871 // in some cases. We can't reuse it in general, because the syntactic and 10872 // semantic forms are linked, and we can't know that semantic form will 10873 // match even if the syntactic form does. 10874 } 10875 10876 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10877 E->getRBraceLoc()); 10878 } 10879 10880 template<typename Derived> 10881 ExprResult 10882 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10883 Designation Desig; 10884 10885 // transform the initializer value 10886 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10887 if (Init.isInvalid()) 10888 return ExprError(); 10889 10890 // transform the designators. 10891 SmallVector<Expr*, 4> ArrayExprs; 10892 bool ExprChanged = false; 10893 for (const DesignatedInitExpr::Designator &D : E->designators()) { 10894 if (D.isFieldDesignator()) { 10895 Desig.AddDesignator(Designator::getField(D.getFieldName(), 10896 D.getDotLoc(), 10897 D.getFieldLoc())); 10898 if (D.getField()) { 10899 FieldDecl *Field = cast_or_null<FieldDecl>( 10900 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 10901 if (Field != D.getField()) 10902 // Rebuild the expression when the transformed FieldDecl is 10903 // different to the already assigned FieldDecl. 10904 ExprChanged = true; 10905 } else { 10906 // Ensure that the designator expression is rebuilt when there isn't 10907 // a resolved FieldDecl in the designator as we don't want to assign 10908 // a FieldDecl to a pattern designator that will be instantiated again. 10909 ExprChanged = true; 10910 } 10911 continue; 10912 } 10913 10914 if (D.isArrayDesignator()) { 10915 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 10916 if (Index.isInvalid()) 10917 return ExprError(); 10918 10919 Desig.AddDesignator( 10920 Designator::getArray(Index.get(), D.getLBracketLoc())); 10921 10922 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 10923 ArrayExprs.push_back(Index.get()); 10924 continue; 10925 } 10926 10927 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 10928 ExprResult Start 10929 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 10930 if (Start.isInvalid()) 10931 return ExprError(); 10932 10933 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 10934 if (End.isInvalid()) 10935 return ExprError(); 10936 10937 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 10938 End.get(), 10939 D.getLBracketLoc(), 10940 D.getEllipsisLoc())); 10941 10942 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 10943 End.get() != E->getArrayRangeEnd(D); 10944 10945 ArrayExprs.push_back(Start.get()); 10946 ArrayExprs.push_back(End.get()); 10947 } 10948 10949 if (!getDerived().AlwaysRebuild() && 10950 Init.get() == E->getInit() && 10951 !ExprChanged) 10952 return E; 10953 10954 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 10955 E->getEqualOrColonLoc(), 10956 E->usesGNUSyntax(), Init.get()); 10957 } 10958 10959 // Seems that if TransformInitListExpr() only works on the syntactic form of an 10960 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 10961 template<typename Derived> 10962 ExprResult 10963 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 10964 DesignatedInitUpdateExpr *E) { 10965 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 10966 "initializer"); 10967 return ExprError(); 10968 } 10969 10970 template<typename Derived> 10971 ExprResult 10972 TreeTransform<Derived>::TransformNoInitExpr( 10973 NoInitExpr *E) { 10974 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 10975 return ExprError(); 10976 } 10977 10978 template<typename Derived> 10979 ExprResult 10980 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 10981 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 10982 return ExprError(); 10983 } 10984 10985 template<typename Derived> 10986 ExprResult 10987 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 10988 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 10989 return ExprError(); 10990 } 10991 10992 template<typename Derived> 10993 ExprResult 10994 TreeTransform<Derived>::TransformImplicitValueInitExpr( 10995 ImplicitValueInitExpr *E) { 10996 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 10997 10998 // FIXME: Will we ever have proper type location here? Will we actually 10999 // need to transform the type? 11000 QualType T = getDerived().TransformType(E->getType()); 11001 if (T.isNull()) 11002 return ExprError(); 11003 11004 if (!getDerived().AlwaysRebuild() && 11005 T == E->getType()) 11006 return E; 11007 11008 return getDerived().RebuildImplicitValueInitExpr(T); 11009 } 11010 11011 template<typename Derived> 11012 ExprResult 11013 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11014 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11015 if (!TInfo) 11016 return ExprError(); 11017 11018 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11019 if (SubExpr.isInvalid()) 11020 return ExprError(); 11021 11022 if (!getDerived().AlwaysRebuild() && 11023 TInfo == E->getWrittenTypeInfo() && 11024 SubExpr.get() == E->getSubExpr()) 11025 return E; 11026 11027 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11028 TInfo, E->getRParenLoc()); 11029 } 11030 11031 template<typename Derived> 11032 ExprResult 11033 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11034 bool ArgumentChanged = false; 11035 SmallVector<Expr*, 4> Inits; 11036 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11037 &ArgumentChanged)) 11038 return ExprError(); 11039 11040 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11041 Inits, 11042 E->getRParenLoc()); 11043 } 11044 11045 /// Transform an address-of-label expression. 11046 /// 11047 /// By default, the transformation of an address-of-label expression always 11048 /// rebuilds the expression, so that the label identifier can be resolved to 11049 /// the corresponding label statement by semantic analysis. 11050 template<typename Derived> 11051 ExprResult 11052 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11053 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11054 E->getLabel()); 11055 if (!LD) 11056 return ExprError(); 11057 11058 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11059 cast<LabelDecl>(LD)); 11060 } 11061 11062 template<typename Derived> 11063 ExprResult 11064 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11065 SemaRef.ActOnStartStmtExpr(); 11066 StmtResult SubStmt 11067 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11068 if (SubStmt.isInvalid()) { 11069 SemaRef.ActOnStmtExprError(); 11070 return ExprError(); 11071 } 11072 11073 unsigned OldDepth = E->getTemplateDepth(); 11074 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11075 11076 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11077 SubStmt.get() == E->getSubStmt()) { 11078 // Calling this an 'error' is unintuitive, but it does the right thing. 11079 SemaRef.ActOnStmtExprError(); 11080 return SemaRef.MaybeBindToTemporary(E); 11081 } 11082 11083 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11084 E->getRParenLoc(), NewDepth); 11085 } 11086 11087 template<typename Derived> 11088 ExprResult 11089 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11090 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11091 if (Cond.isInvalid()) 11092 return ExprError(); 11093 11094 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11095 if (LHS.isInvalid()) 11096 return ExprError(); 11097 11098 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11099 if (RHS.isInvalid()) 11100 return ExprError(); 11101 11102 if (!getDerived().AlwaysRebuild() && 11103 Cond.get() == E->getCond() && 11104 LHS.get() == E->getLHS() && 11105 RHS.get() == E->getRHS()) 11106 return E; 11107 11108 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11109 Cond.get(), LHS.get(), RHS.get(), 11110 E->getRParenLoc()); 11111 } 11112 11113 template<typename Derived> 11114 ExprResult 11115 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11116 return E; 11117 } 11118 11119 template<typename Derived> 11120 ExprResult 11121 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11122 switch (E->getOperator()) { 11123 case OO_New: 11124 case OO_Delete: 11125 case OO_Array_New: 11126 case OO_Array_Delete: 11127 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11128 11129 case OO_Call: { 11130 // This is a call to an object's operator(). 11131 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11132 11133 // Transform the object itself. 11134 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11135 if (Object.isInvalid()) 11136 return ExprError(); 11137 11138 // FIXME: Poor location information 11139 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11140 static_cast<Expr *>(Object.get())->getEndLoc()); 11141 11142 // Transform the call arguments. 11143 SmallVector<Expr*, 8> Args; 11144 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11145 Args)) 11146 return ExprError(); 11147 11148 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11149 E->getEndLoc()); 11150 } 11151 11152 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11153 case OO_##Name: 11154 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11155 #include "clang/Basic/OperatorKinds.def" 11156 case OO_Subscript: 11157 // Handled below. 11158 break; 11159 11160 case OO_Conditional: 11161 llvm_unreachable("conditional operator is not actually overloadable"); 11162 11163 case OO_None: 11164 case NUM_OVERLOADED_OPERATORS: 11165 llvm_unreachable("not an overloaded operator?"); 11166 } 11167 11168 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11169 if (Callee.isInvalid()) 11170 return ExprError(); 11171 11172 ExprResult First; 11173 if (E->getOperator() == OO_Amp) 11174 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11175 else 11176 First = getDerived().TransformExpr(E->getArg(0)); 11177 if (First.isInvalid()) 11178 return ExprError(); 11179 11180 ExprResult Second; 11181 if (E->getNumArgs() == 2) { 11182 Second = getDerived().TransformExpr(E->getArg(1)); 11183 if (Second.isInvalid()) 11184 return ExprError(); 11185 } 11186 11187 if (!getDerived().AlwaysRebuild() && 11188 Callee.get() == E->getCallee() && 11189 First.get() == E->getArg(0) && 11190 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11191 return SemaRef.MaybeBindToTemporary(E); 11192 11193 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11194 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11195 getSema().CurFPFeatures = 11196 NewOverrides.applyOverrides(getSema().getLangOpts()); 11197 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11198 11199 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11200 E->getOperatorLoc(), 11201 Callee.get(), 11202 First.get(), 11203 Second.get()); 11204 } 11205 11206 template<typename Derived> 11207 ExprResult 11208 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11209 return getDerived().TransformCallExpr(E); 11210 } 11211 11212 template <typename Derived> 11213 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11214 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11215 getSema().CurContext != E->getParentContext(); 11216 11217 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11218 return E; 11219 11220 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11221 E->getEndLoc(), 11222 getSema().CurContext); 11223 } 11224 11225 template<typename Derived> 11226 ExprResult 11227 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11228 // Transform the callee. 11229 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11230 if (Callee.isInvalid()) 11231 return ExprError(); 11232 11233 // Transform exec config. 11234 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11235 if (EC.isInvalid()) 11236 return ExprError(); 11237 11238 // Transform arguments. 11239 bool ArgChanged = false; 11240 SmallVector<Expr*, 8> Args; 11241 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11242 &ArgChanged)) 11243 return ExprError(); 11244 11245 if (!getDerived().AlwaysRebuild() && 11246 Callee.get() == E->getCallee() && 11247 !ArgChanged) 11248 return SemaRef.MaybeBindToTemporary(E); 11249 11250 // FIXME: Wrong source location information for the '('. 11251 SourceLocation FakeLParenLoc 11252 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11253 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11254 Args, 11255 E->getRParenLoc(), EC.get()); 11256 } 11257 11258 template<typename Derived> 11259 ExprResult 11260 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11261 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11262 if (!Type) 11263 return ExprError(); 11264 11265 ExprResult SubExpr 11266 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11267 if (SubExpr.isInvalid()) 11268 return ExprError(); 11269 11270 if (!getDerived().AlwaysRebuild() && 11271 Type == E->getTypeInfoAsWritten() && 11272 SubExpr.get() == E->getSubExpr()) 11273 return E; 11274 return getDerived().RebuildCXXNamedCastExpr( 11275 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11276 Type, E->getAngleBrackets().getEnd(), 11277 // FIXME. this should be '(' location 11278 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11279 } 11280 11281 template<typename Derived> 11282 ExprResult 11283 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11284 TypeSourceInfo *TSI = 11285 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11286 if (!TSI) 11287 return ExprError(); 11288 11289 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11290 if (Sub.isInvalid()) 11291 return ExprError(); 11292 11293 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11294 Sub.get(), BCE->getEndLoc()); 11295 } 11296 11297 template<typename Derived> 11298 ExprResult 11299 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11300 return getDerived().TransformCXXNamedCastExpr(E); 11301 } 11302 11303 template<typename Derived> 11304 ExprResult 11305 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11306 return getDerived().TransformCXXNamedCastExpr(E); 11307 } 11308 11309 template<typename Derived> 11310 ExprResult 11311 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11312 CXXReinterpretCastExpr *E) { 11313 return getDerived().TransformCXXNamedCastExpr(E); 11314 } 11315 11316 template<typename Derived> 11317 ExprResult 11318 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11319 return getDerived().TransformCXXNamedCastExpr(E); 11320 } 11321 11322 template<typename Derived> 11323 ExprResult 11324 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11325 return getDerived().TransformCXXNamedCastExpr(E); 11326 } 11327 11328 template<typename Derived> 11329 ExprResult 11330 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11331 CXXFunctionalCastExpr *E) { 11332 TypeSourceInfo *Type = 11333 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11334 if (!Type) 11335 return ExprError(); 11336 11337 ExprResult SubExpr 11338 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11339 if (SubExpr.isInvalid()) 11340 return ExprError(); 11341 11342 if (!getDerived().AlwaysRebuild() && 11343 Type == E->getTypeInfoAsWritten() && 11344 SubExpr.get() == E->getSubExpr()) 11345 return E; 11346 11347 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11348 E->getLParenLoc(), 11349 SubExpr.get(), 11350 E->getRParenLoc(), 11351 E->isListInitialization()); 11352 } 11353 11354 template<typename Derived> 11355 ExprResult 11356 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11357 if (E->isTypeOperand()) { 11358 TypeSourceInfo *TInfo 11359 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11360 if (!TInfo) 11361 return ExprError(); 11362 11363 if (!getDerived().AlwaysRebuild() && 11364 TInfo == E->getTypeOperandSourceInfo()) 11365 return E; 11366 11367 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11368 TInfo, E->getEndLoc()); 11369 } 11370 11371 // We don't know whether the subexpression is potentially evaluated until 11372 // after we perform semantic analysis. We speculatively assume it is 11373 // unevaluated; it will get fixed later if the subexpression is in fact 11374 // potentially evaluated. 11375 EnterExpressionEvaluationContext Unevaluated( 11376 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11377 Sema::ReuseLambdaContextDecl); 11378 11379 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11380 if (SubExpr.isInvalid()) 11381 return ExprError(); 11382 11383 if (!getDerived().AlwaysRebuild() && 11384 SubExpr.get() == E->getExprOperand()) 11385 return E; 11386 11387 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11388 SubExpr.get(), E->getEndLoc()); 11389 } 11390 11391 template<typename Derived> 11392 ExprResult 11393 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11394 if (E->isTypeOperand()) { 11395 TypeSourceInfo *TInfo 11396 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11397 if (!TInfo) 11398 return ExprError(); 11399 11400 if (!getDerived().AlwaysRebuild() && 11401 TInfo == E->getTypeOperandSourceInfo()) 11402 return E; 11403 11404 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11405 TInfo, E->getEndLoc()); 11406 } 11407 11408 EnterExpressionEvaluationContext Unevaluated( 11409 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11410 11411 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11412 if (SubExpr.isInvalid()) 11413 return ExprError(); 11414 11415 if (!getDerived().AlwaysRebuild() && 11416 SubExpr.get() == E->getExprOperand()) 11417 return E; 11418 11419 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11420 SubExpr.get(), E->getEndLoc()); 11421 } 11422 11423 template<typename Derived> 11424 ExprResult 11425 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11426 return E; 11427 } 11428 11429 template<typename Derived> 11430 ExprResult 11431 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11432 CXXNullPtrLiteralExpr *E) { 11433 return E; 11434 } 11435 11436 template<typename Derived> 11437 ExprResult 11438 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11439 QualType T = getSema().getCurrentThisType(); 11440 11441 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11442 // Mark it referenced in the new context regardless. 11443 // FIXME: this is a bit instantiation-specific. 11444 getSema().MarkThisReferenced(E); 11445 return E; 11446 } 11447 11448 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11449 } 11450 11451 template<typename Derived> 11452 ExprResult 11453 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11454 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11455 if (SubExpr.isInvalid()) 11456 return ExprError(); 11457 11458 if (!getDerived().AlwaysRebuild() && 11459 SubExpr.get() == E->getSubExpr()) 11460 return E; 11461 11462 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11463 E->isThrownVariableInScope()); 11464 } 11465 11466 template<typename Derived> 11467 ExprResult 11468 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11469 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11470 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11471 if (!Param) 11472 return ExprError(); 11473 11474 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11475 E->getUsedContext() == SemaRef.CurContext) 11476 return E; 11477 11478 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11479 } 11480 11481 template<typename Derived> 11482 ExprResult 11483 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11484 FieldDecl *Field = cast_or_null<FieldDecl>( 11485 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11486 if (!Field) 11487 return ExprError(); 11488 11489 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11490 E->getUsedContext() == SemaRef.CurContext) 11491 return E; 11492 11493 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11494 } 11495 11496 template<typename Derived> 11497 ExprResult 11498 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11499 CXXScalarValueInitExpr *E) { 11500 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11501 if (!T) 11502 return ExprError(); 11503 11504 if (!getDerived().AlwaysRebuild() && 11505 T == E->getTypeSourceInfo()) 11506 return E; 11507 11508 return getDerived().RebuildCXXScalarValueInitExpr(T, 11509 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11510 E->getRParenLoc()); 11511 } 11512 11513 template<typename Derived> 11514 ExprResult 11515 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11516 // Transform the type that we're allocating 11517 TypeSourceInfo *AllocTypeInfo = 11518 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11519 if (!AllocTypeInfo) 11520 return ExprError(); 11521 11522 // Transform the size of the array we're allocating (if any). 11523 Optional<Expr *> ArraySize; 11524 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11525 ExprResult NewArraySize; 11526 if (*OldArraySize) { 11527 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11528 if (NewArraySize.isInvalid()) 11529 return ExprError(); 11530 } 11531 ArraySize = NewArraySize.get(); 11532 } 11533 11534 // Transform the placement arguments (if any). 11535 bool ArgumentChanged = false; 11536 SmallVector<Expr*, 8> PlacementArgs; 11537 if (getDerived().TransformExprs(E->getPlacementArgs(), 11538 E->getNumPlacementArgs(), true, 11539 PlacementArgs, &ArgumentChanged)) 11540 return ExprError(); 11541 11542 // Transform the initializer (if any). 11543 Expr *OldInit = E->getInitializer(); 11544 ExprResult NewInit; 11545 if (OldInit) 11546 NewInit = getDerived().TransformInitializer(OldInit, true); 11547 if (NewInit.isInvalid()) 11548 return ExprError(); 11549 11550 // Transform new operator and delete operator. 11551 FunctionDecl *OperatorNew = nullptr; 11552 if (E->getOperatorNew()) { 11553 OperatorNew = cast_or_null<FunctionDecl>( 11554 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11555 if (!OperatorNew) 11556 return ExprError(); 11557 } 11558 11559 FunctionDecl *OperatorDelete = nullptr; 11560 if (E->getOperatorDelete()) { 11561 OperatorDelete = cast_or_null<FunctionDecl>( 11562 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11563 if (!OperatorDelete) 11564 return ExprError(); 11565 } 11566 11567 if (!getDerived().AlwaysRebuild() && 11568 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11569 ArraySize == E->getArraySize() && 11570 NewInit.get() == OldInit && 11571 OperatorNew == E->getOperatorNew() && 11572 OperatorDelete == E->getOperatorDelete() && 11573 !ArgumentChanged) { 11574 // Mark any declarations we need as referenced. 11575 // FIXME: instantiation-specific. 11576 if (OperatorNew) 11577 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11578 if (OperatorDelete) 11579 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11580 11581 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11582 QualType ElementType 11583 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11584 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11585 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11586 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11587 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11588 } 11589 } 11590 } 11591 11592 return E; 11593 } 11594 11595 QualType AllocType = AllocTypeInfo->getType(); 11596 if (!ArraySize) { 11597 // If no array size was specified, but the new expression was 11598 // instantiated with an array type (e.g., "new T" where T is 11599 // instantiated with "int[4]"), extract the outer bound from the 11600 // array type as our array size. We do this with constant and 11601 // dependently-sized array types. 11602 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11603 if (!ArrayT) { 11604 // Do nothing 11605 } else if (const ConstantArrayType *ConsArrayT 11606 = dyn_cast<ConstantArrayType>(ArrayT)) { 11607 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11608 SemaRef.Context.getSizeType(), 11609 /*FIXME:*/ E->getBeginLoc()); 11610 AllocType = ConsArrayT->getElementType(); 11611 } else if (const DependentSizedArrayType *DepArrayT 11612 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11613 if (DepArrayT->getSizeExpr()) { 11614 ArraySize = DepArrayT->getSizeExpr(); 11615 AllocType = DepArrayT->getElementType(); 11616 } 11617 } 11618 } 11619 11620 return getDerived().RebuildCXXNewExpr( 11621 E->getBeginLoc(), E->isGlobalNew(), 11622 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11623 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11624 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11625 } 11626 11627 template<typename Derived> 11628 ExprResult 11629 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11630 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11631 if (Operand.isInvalid()) 11632 return ExprError(); 11633 11634 // Transform the delete operator, if known. 11635 FunctionDecl *OperatorDelete = nullptr; 11636 if (E->getOperatorDelete()) { 11637 OperatorDelete = cast_or_null<FunctionDecl>( 11638 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11639 if (!OperatorDelete) 11640 return ExprError(); 11641 } 11642 11643 if (!getDerived().AlwaysRebuild() && 11644 Operand.get() == E->getArgument() && 11645 OperatorDelete == E->getOperatorDelete()) { 11646 // Mark any declarations we need as referenced. 11647 // FIXME: instantiation-specific. 11648 if (OperatorDelete) 11649 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11650 11651 if (!E->getArgument()->isTypeDependent()) { 11652 QualType Destroyed = SemaRef.Context.getBaseElementType( 11653 E->getDestroyedType()); 11654 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11655 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11656 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11657 SemaRef.LookupDestructor(Record)); 11658 } 11659 } 11660 11661 return E; 11662 } 11663 11664 return getDerived().RebuildCXXDeleteExpr( 11665 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11666 } 11667 11668 template<typename Derived> 11669 ExprResult 11670 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11671 CXXPseudoDestructorExpr *E) { 11672 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11673 if (Base.isInvalid()) 11674 return ExprError(); 11675 11676 ParsedType ObjectTypePtr; 11677 bool MayBePseudoDestructor = false; 11678 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11679 E->getOperatorLoc(), 11680 E->isArrow()? tok::arrow : tok::period, 11681 ObjectTypePtr, 11682 MayBePseudoDestructor); 11683 if (Base.isInvalid()) 11684 return ExprError(); 11685 11686 QualType ObjectType = ObjectTypePtr.get(); 11687 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11688 if (QualifierLoc) { 11689 QualifierLoc 11690 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11691 if (!QualifierLoc) 11692 return ExprError(); 11693 } 11694 CXXScopeSpec SS; 11695 SS.Adopt(QualifierLoc); 11696 11697 PseudoDestructorTypeStorage Destroyed; 11698 if (E->getDestroyedTypeInfo()) { 11699 TypeSourceInfo *DestroyedTypeInfo 11700 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11701 ObjectType, nullptr, SS); 11702 if (!DestroyedTypeInfo) 11703 return ExprError(); 11704 Destroyed = DestroyedTypeInfo; 11705 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11706 // We aren't likely to be able to resolve the identifier down to a type 11707 // now anyway, so just retain the identifier. 11708 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11709 E->getDestroyedTypeLoc()); 11710 } else { 11711 // Look for a destructor known with the given name. 11712 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11713 *E->getDestroyedTypeIdentifier(), 11714 E->getDestroyedTypeLoc(), 11715 /*Scope=*/nullptr, 11716 SS, ObjectTypePtr, 11717 false); 11718 if (!T) 11719 return ExprError(); 11720 11721 Destroyed 11722 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11723 E->getDestroyedTypeLoc()); 11724 } 11725 11726 TypeSourceInfo *ScopeTypeInfo = nullptr; 11727 if (E->getScopeTypeInfo()) { 11728 CXXScopeSpec EmptySS; 11729 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11730 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11731 if (!ScopeTypeInfo) 11732 return ExprError(); 11733 } 11734 11735 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11736 E->getOperatorLoc(), 11737 E->isArrow(), 11738 SS, 11739 ScopeTypeInfo, 11740 E->getColonColonLoc(), 11741 E->getTildeLoc(), 11742 Destroyed); 11743 } 11744 11745 template <typename Derived> 11746 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11747 bool RequiresADL, 11748 LookupResult &R) { 11749 // Transform all the decls. 11750 bool AllEmptyPacks = true; 11751 for (auto *OldD : Old->decls()) { 11752 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11753 if (!InstD) { 11754 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11755 // This can happen because of dependent hiding. 11756 if (isa<UsingShadowDecl>(OldD)) 11757 continue; 11758 else { 11759 R.clear(); 11760 return true; 11761 } 11762 } 11763 11764 // Expand using pack declarations. 11765 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11766 ArrayRef<NamedDecl*> Decls = SingleDecl; 11767 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11768 Decls = UPD->expansions(); 11769 11770 // Expand using declarations. 11771 for (auto *D : Decls) { 11772 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11773 for (auto *SD : UD->shadows()) 11774 R.addDecl(SD); 11775 } else { 11776 R.addDecl(D); 11777 } 11778 } 11779 11780 AllEmptyPacks &= Decls.empty(); 11781 }; 11782 11783 // C++ [temp.res]/8.4.2: 11784 // The program is ill-formed, no diagnostic required, if [...] lookup for 11785 // a name in the template definition found a using-declaration, but the 11786 // lookup in the corresponding scope in the instantiation odoes not find 11787 // any declarations because the using-declaration was a pack expansion and 11788 // the corresponding pack is empty 11789 if (AllEmptyPacks && !RequiresADL) { 11790 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11791 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11792 return true; 11793 } 11794 11795 // Resolve a kind, but don't do any further analysis. If it's 11796 // ambiguous, the callee needs to deal with it. 11797 R.resolveKind(); 11798 return false; 11799 } 11800 11801 template<typename Derived> 11802 ExprResult 11803 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11804 UnresolvedLookupExpr *Old) { 11805 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11806 Sema::LookupOrdinaryName); 11807 11808 // Transform the declaration set. 11809 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11810 return ExprError(); 11811 11812 // Rebuild the nested-name qualifier, if present. 11813 CXXScopeSpec SS; 11814 if (Old->getQualifierLoc()) { 11815 NestedNameSpecifierLoc QualifierLoc 11816 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11817 if (!QualifierLoc) 11818 return ExprError(); 11819 11820 SS.Adopt(QualifierLoc); 11821 } 11822 11823 if (Old->getNamingClass()) { 11824 CXXRecordDecl *NamingClass 11825 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11826 Old->getNameLoc(), 11827 Old->getNamingClass())); 11828 if (!NamingClass) { 11829 R.clear(); 11830 return ExprError(); 11831 } 11832 11833 R.setNamingClass(NamingClass); 11834 } 11835 11836 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11837 11838 // If we have neither explicit template arguments, nor the template keyword, 11839 // it's a normal declaration name or member reference. 11840 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11841 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11842 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11843 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11844 // give a good diagnostic. 11845 if (D && D->isCXXInstanceMember()) { 11846 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11847 /*TemplateArgs=*/nullptr, 11848 /*Scope=*/nullptr); 11849 } 11850 11851 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11852 } 11853 11854 // If we have template arguments, rebuild them, then rebuild the 11855 // templateid expression. 11856 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11857 if (Old->hasExplicitTemplateArgs() && 11858 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11859 Old->getNumTemplateArgs(), 11860 TransArgs)) { 11861 R.clear(); 11862 return ExprError(); 11863 } 11864 11865 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11866 Old->requiresADL(), &TransArgs); 11867 } 11868 11869 template<typename Derived> 11870 ExprResult 11871 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11872 bool ArgChanged = false; 11873 SmallVector<TypeSourceInfo *, 4> Args; 11874 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11875 TypeSourceInfo *From = E->getArg(I); 11876 TypeLoc FromTL = From->getTypeLoc(); 11877 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11878 TypeLocBuilder TLB; 11879 TLB.reserve(FromTL.getFullDataSize()); 11880 QualType To = getDerived().TransformType(TLB, FromTL); 11881 if (To.isNull()) 11882 return ExprError(); 11883 11884 if (To == From->getType()) 11885 Args.push_back(From); 11886 else { 11887 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11888 ArgChanged = true; 11889 } 11890 continue; 11891 } 11892 11893 ArgChanged = true; 11894 11895 // We have a pack expansion. Instantiate it. 11896 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 11897 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 11898 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11899 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 11900 11901 // Determine whether the set of unexpanded parameter packs can and should 11902 // be expanded. 11903 bool Expand = true; 11904 bool RetainExpansion = false; 11905 Optional<unsigned> OrigNumExpansions = 11906 ExpansionTL.getTypePtr()->getNumExpansions(); 11907 Optional<unsigned> NumExpansions = OrigNumExpansions; 11908 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 11909 PatternTL.getSourceRange(), 11910 Unexpanded, 11911 Expand, RetainExpansion, 11912 NumExpansions)) 11913 return ExprError(); 11914 11915 if (!Expand) { 11916 // The transform has determined that we should perform a simple 11917 // transformation on the pack expansion, producing another pack 11918 // expansion. 11919 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11920 11921 TypeLocBuilder TLB; 11922 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11923 11924 QualType To = getDerived().TransformType(TLB, PatternTL); 11925 if (To.isNull()) 11926 return ExprError(); 11927 11928 To = getDerived().RebuildPackExpansionType(To, 11929 PatternTL.getSourceRange(), 11930 ExpansionTL.getEllipsisLoc(), 11931 NumExpansions); 11932 if (To.isNull()) 11933 return ExprError(); 11934 11935 PackExpansionTypeLoc ToExpansionTL 11936 = TLB.push<PackExpansionTypeLoc>(To); 11937 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11938 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11939 continue; 11940 } 11941 11942 // Expand the pack expansion by substituting for each argument in the 11943 // pack(s). 11944 for (unsigned I = 0; I != *NumExpansions; ++I) { 11945 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 11946 TypeLocBuilder TLB; 11947 TLB.reserve(PatternTL.getFullDataSize()); 11948 QualType To = getDerived().TransformType(TLB, PatternTL); 11949 if (To.isNull()) 11950 return ExprError(); 11951 11952 if (To->containsUnexpandedParameterPack()) { 11953 To = getDerived().RebuildPackExpansionType(To, 11954 PatternTL.getSourceRange(), 11955 ExpansionTL.getEllipsisLoc(), 11956 NumExpansions); 11957 if (To.isNull()) 11958 return ExprError(); 11959 11960 PackExpansionTypeLoc ToExpansionTL 11961 = TLB.push<PackExpansionTypeLoc>(To); 11962 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11963 } 11964 11965 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11966 } 11967 11968 if (!RetainExpansion) 11969 continue; 11970 11971 // If we're supposed to retain a pack expansion, do so by temporarily 11972 // forgetting the partially-substituted parameter pack. 11973 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11974 11975 TypeLocBuilder TLB; 11976 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11977 11978 QualType To = getDerived().TransformType(TLB, PatternTL); 11979 if (To.isNull()) 11980 return ExprError(); 11981 11982 To = getDerived().RebuildPackExpansionType(To, 11983 PatternTL.getSourceRange(), 11984 ExpansionTL.getEllipsisLoc(), 11985 NumExpansions); 11986 if (To.isNull()) 11987 return ExprError(); 11988 11989 PackExpansionTypeLoc ToExpansionTL 11990 = TLB.push<PackExpansionTypeLoc>(To); 11991 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11992 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11993 } 11994 11995 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11996 return E; 11997 11998 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 11999 E->getEndLoc()); 12000 } 12001 12002 template<typename Derived> 12003 ExprResult 12004 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12005 ConceptSpecializationExpr *E) { 12006 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12007 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12008 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12009 Old->NumTemplateArgs, TransArgs)) 12010 return ExprError(); 12011 12012 return getDerived().RebuildConceptSpecializationExpr( 12013 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12014 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12015 &TransArgs); 12016 } 12017 12018 template<typename Derived> 12019 ExprResult 12020 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12021 SmallVector<ParmVarDecl*, 4> TransParams; 12022 SmallVector<QualType, 4> TransParamTypes; 12023 Sema::ExtParameterInfoBuilder ExtParamInfos; 12024 12025 // C++2a [expr.prim.req]p2 12026 // Expressions appearing within a requirement-body are unevaluated operands. 12027 EnterExpressionEvaluationContext Ctx( 12028 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12029 12030 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12031 getSema().Context, getSema().CurContext, 12032 E->getBody()->getBeginLoc()); 12033 12034 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12035 12036 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12037 E->getLocalParameters(), 12038 /*ParamTypes=*/nullptr, 12039 /*ParamInfos=*/nullptr, 12040 TransParamTypes, &TransParams, 12041 ExtParamInfos)) 12042 return ExprError(); 12043 12044 for (ParmVarDecl *Param : TransParams) 12045 Param->setDeclContext(Body); 12046 12047 SmallVector<concepts::Requirement *, 4> TransReqs; 12048 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12049 TransReqs)) 12050 return ExprError(); 12051 12052 for (concepts::Requirement *Req : TransReqs) { 12053 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12054 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12055 ER->getReturnTypeRequirement() 12056 .getTypeConstraintTemplateParameterList()->getParam(0) 12057 ->setDeclContext(Body); 12058 } 12059 } 12060 } 12061 12062 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12063 TransParams, TransReqs, 12064 E->getRBraceLoc()); 12065 } 12066 12067 template<typename Derived> 12068 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12069 ArrayRef<concepts::Requirement *> Reqs, 12070 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12071 for (concepts::Requirement *Req : Reqs) { 12072 concepts::Requirement *TransReq = nullptr; 12073 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12074 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12075 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12076 TransReq = getDerived().TransformExprRequirement(ExprReq); 12077 else 12078 TransReq = getDerived().TransformNestedRequirement( 12079 cast<concepts::NestedRequirement>(Req)); 12080 if (!TransReq) 12081 return true; 12082 Transformed.push_back(TransReq); 12083 } 12084 return false; 12085 } 12086 12087 template<typename Derived> 12088 concepts::TypeRequirement * 12089 TreeTransform<Derived>::TransformTypeRequirement( 12090 concepts::TypeRequirement *Req) { 12091 if (Req->isSubstitutionFailure()) { 12092 if (getDerived().AlwaysRebuild()) 12093 return getDerived().RebuildTypeRequirement( 12094 Req->getSubstitutionDiagnostic()); 12095 return Req; 12096 } 12097 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12098 if (!TransType) 12099 return nullptr; 12100 return getDerived().RebuildTypeRequirement(TransType); 12101 } 12102 12103 template<typename Derived> 12104 concepts::ExprRequirement * 12105 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12106 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12107 if (Req->isExprSubstitutionFailure()) 12108 TransExpr = Req->getExprSubstitutionDiagnostic(); 12109 else { 12110 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12111 if (TransExprRes.isInvalid()) 12112 return nullptr; 12113 TransExpr = TransExprRes.get(); 12114 } 12115 12116 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12117 const auto &RetReq = Req->getReturnTypeRequirement(); 12118 if (RetReq.isEmpty()) 12119 TransRetReq.emplace(); 12120 else if (RetReq.isSubstitutionFailure()) 12121 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12122 else if (RetReq.isTypeConstraint()) { 12123 TemplateParameterList *OrigTPL = 12124 RetReq.getTypeConstraintTemplateParameterList(); 12125 TemplateParameterList *TPL = 12126 getDerived().TransformTemplateParameterList(OrigTPL); 12127 if (!TPL) 12128 return nullptr; 12129 TransRetReq.emplace(TPL); 12130 } 12131 assert(TransRetReq.hasValue() && 12132 "All code paths leading here must set TransRetReq"); 12133 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12134 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12135 Req->getNoexceptLoc(), 12136 std::move(*TransRetReq)); 12137 return getDerived().RebuildExprRequirement( 12138 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12139 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12140 } 12141 12142 template<typename Derived> 12143 concepts::NestedRequirement * 12144 TreeTransform<Derived>::TransformNestedRequirement( 12145 concepts::NestedRequirement *Req) { 12146 if (Req->isSubstitutionFailure()) { 12147 if (getDerived().AlwaysRebuild()) 12148 return getDerived().RebuildNestedRequirement( 12149 Req->getSubstitutionDiagnostic()); 12150 return Req; 12151 } 12152 ExprResult TransConstraint = 12153 getDerived().TransformExpr(Req->getConstraintExpr()); 12154 if (TransConstraint.isInvalid()) 12155 return nullptr; 12156 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12157 } 12158 12159 template<typename Derived> 12160 ExprResult 12161 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12162 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12163 if (!T) 12164 return ExprError(); 12165 12166 if (!getDerived().AlwaysRebuild() && 12167 T == E->getQueriedTypeSourceInfo()) 12168 return E; 12169 12170 ExprResult SubExpr; 12171 { 12172 EnterExpressionEvaluationContext Unevaluated( 12173 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12174 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12175 if (SubExpr.isInvalid()) 12176 return ExprError(); 12177 12178 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12179 return E; 12180 } 12181 12182 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12183 SubExpr.get(), E->getEndLoc()); 12184 } 12185 12186 template<typename Derived> 12187 ExprResult 12188 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12189 ExprResult SubExpr; 12190 { 12191 EnterExpressionEvaluationContext Unevaluated( 12192 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12193 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12194 if (SubExpr.isInvalid()) 12195 return ExprError(); 12196 12197 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12198 return E; 12199 } 12200 12201 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12202 SubExpr.get(), E->getEndLoc()); 12203 } 12204 12205 template <typename Derived> 12206 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12207 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12208 TypeSourceInfo **RecoveryTSI) { 12209 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12210 DRE, AddrTaken, RecoveryTSI); 12211 12212 // Propagate both errors and recovered types, which return ExprEmpty. 12213 if (!NewDRE.isUsable()) 12214 return NewDRE; 12215 12216 // We got an expr, wrap it up in parens. 12217 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12218 return PE; 12219 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12220 PE->getRParen()); 12221 } 12222 12223 template <typename Derived> 12224 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12225 DependentScopeDeclRefExpr *E) { 12226 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12227 nullptr); 12228 } 12229 12230 template<typename Derived> 12231 ExprResult 12232 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12233 DependentScopeDeclRefExpr *E, 12234 bool IsAddressOfOperand, 12235 TypeSourceInfo **RecoveryTSI) { 12236 assert(E->getQualifierLoc()); 12237 NestedNameSpecifierLoc QualifierLoc 12238 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12239 if (!QualifierLoc) 12240 return ExprError(); 12241 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12242 12243 // TODO: If this is a conversion-function-id, verify that the 12244 // destination type name (if present) resolves the same way after 12245 // instantiation as it did in the local scope. 12246 12247 DeclarationNameInfo NameInfo 12248 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12249 if (!NameInfo.getName()) 12250 return ExprError(); 12251 12252 if (!E->hasExplicitTemplateArgs()) { 12253 if (!getDerived().AlwaysRebuild() && 12254 QualifierLoc == E->getQualifierLoc() && 12255 // Note: it is sufficient to compare the Name component of NameInfo: 12256 // if name has not changed, DNLoc has not changed either. 12257 NameInfo.getName() == E->getDeclName()) 12258 return E; 12259 12260 return getDerived().RebuildDependentScopeDeclRefExpr( 12261 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12262 IsAddressOfOperand, RecoveryTSI); 12263 } 12264 12265 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12266 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12267 E->getNumTemplateArgs(), 12268 TransArgs)) 12269 return ExprError(); 12270 12271 return getDerived().RebuildDependentScopeDeclRefExpr( 12272 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12273 RecoveryTSI); 12274 } 12275 12276 template<typename Derived> 12277 ExprResult 12278 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12279 // CXXConstructExprs other than for list-initialization and 12280 // CXXTemporaryObjectExpr are always implicit, so when we have 12281 // a 1-argument construction we just transform that argument. 12282 if (getDerived().AllowSkippingCXXConstructExpr() && 12283 ((E->getNumArgs() == 1 || 12284 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12285 (!getDerived().DropCallArgument(E->getArg(0))) && 12286 !E->isListInitialization())) 12287 return getDerived().TransformInitializer(E->getArg(0), 12288 /*DirectInit*/ false); 12289 12290 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12291 12292 QualType T = getDerived().TransformType(E->getType()); 12293 if (T.isNull()) 12294 return ExprError(); 12295 12296 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12297 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12298 if (!Constructor) 12299 return ExprError(); 12300 12301 bool ArgumentChanged = false; 12302 SmallVector<Expr*, 8> Args; 12303 { 12304 EnterExpressionEvaluationContext Context( 12305 getSema(), EnterExpressionEvaluationContext::InitList, 12306 E->isListInitialization()); 12307 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12308 &ArgumentChanged)) 12309 return ExprError(); 12310 } 12311 12312 if (!getDerived().AlwaysRebuild() && 12313 T == E->getType() && 12314 Constructor == E->getConstructor() && 12315 !ArgumentChanged) { 12316 // Mark the constructor as referenced. 12317 // FIXME: Instantiation-specific 12318 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12319 return E; 12320 } 12321 12322 return getDerived().RebuildCXXConstructExpr( 12323 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12324 E->hadMultipleCandidates(), E->isListInitialization(), 12325 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12326 E->getConstructionKind(), E->getParenOrBraceRange()); 12327 } 12328 12329 template<typename Derived> 12330 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12331 CXXInheritedCtorInitExpr *E) { 12332 QualType T = getDerived().TransformType(E->getType()); 12333 if (T.isNull()) 12334 return ExprError(); 12335 12336 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12337 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12338 if (!Constructor) 12339 return ExprError(); 12340 12341 if (!getDerived().AlwaysRebuild() && 12342 T == E->getType() && 12343 Constructor == E->getConstructor()) { 12344 // Mark the constructor as referenced. 12345 // FIXME: Instantiation-specific 12346 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12347 return E; 12348 } 12349 12350 return getDerived().RebuildCXXInheritedCtorInitExpr( 12351 T, E->getLocation(), Constructor, 12352 E->constructsVBase(), E->inheritedFromVBase()); 12353 } 12354 12355 /// Transform a C++ temporary-binding expression. 12356 /// 12357 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12358 /// transform the subexpression and return that. 12359 template<typename Derived> 12360 ExprResult 12361 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12362 return getDerived().TransformExpr(E->getSubExpr()); 12363 } 12364 12365 /// Transform a C++ expression that contains cleanups that should 12366 /// be run after the expression is evaluated. 12367 /// 12368 /// Since ExprWithCleanups nodes are implicitly generated, we 12369 /// just transform the subexpression and return that. 12370 template<typename Derived> 12371 ExprResult 12372 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12373 return getDerived().TransformExpr(E->getSubExpr()); 12374 } 12375 12376 template<typename Derived> 12377 ExprResult 12378 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12379 CXXTemporaryObjectExpr *E) { 12380 TypeSourceInfo *T = 12381 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12382 if (!T) 12383 return ExprError(); 12384 12385 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12386 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12387 if (!Constructor) 12388 return ExprError(); 12389 12390 bool ArgumentChanged = false; 12391 SmallVector<Expr*, 8> Args; 12392 Args.reserve(E->getNumArgs()); 12393 { 12394 EnterExpressionEvaluationContext Context( 12395 getSema(), EnterExpressionEvaluationContext::InitList, 12396 E->isListInitialization()); 12397 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12398 &ArgumentChanged)) 12399 return ExprError(); 12400 } 12401 12402 if (!getDerived().AlwaysRebuild() && 12403 T == E->getTypeSourceInfo() && 12404 Constructor == E->getConstructor() && 12405 !ArgumentChanged) { 12406 // FIXME: Instantiation-specific 12407 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12408 return SemaRef.MaybeBindToTemporary(E); 12409 } 12410 12411 // FIXME: We should just pass E->isListInitialization(), but we're not 12412 // prepared to handle list-initialization without a child InitListExpr. 12413 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12414 return getDerived().RebuildCXXTemporaryObjectExpr( 12415 T, LParenLoc, Args, E->getEndLoc(), 12416 /*ListInitialization=*/LParenLoc.isInvalid()); 12417 } 12418 12419 template<typename Derived> 12420 ExprResult 12421 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12422 // Transform any init-capture expressions before entering the scope of the 12423 // lambda body, because they are not semantically within that scope. 12424 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12425 struct TransformedInitCapture { 12426 // The location of the ... if the result is retaining a pack expansion. 12427 SourceLocation EllipsisLoc; 12428 // Zero or more expansions of the init-capture. 12429 SmallVector<InitCaptureInfoTy, 4> Expansions; 12430 }; 12431 SmallVector<TransformedInitCapture, 4> InitCaptures; 12432 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12433 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12434 CEnd = E->capture_end(); 12435 C != CEnd; ++C) { 12436 if (!E->isInitCapture(C)) 12437 continue; 12438 12439 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12440 VarDecl *OldVD = C->getCapturedVar(); 12441 12442 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12443 Optional<unsigned> NumExpansions) { 12444 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12445 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12446 12447 if (NewExprInitResult.isInvalid()) { 12448 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12449 return; 12450 } 12451 Expr *NewExprInit = NewExprInitResult.get(); 12452 12453 QualType NewInitCaptureType = 12454 getSema().buildLambdaInitCaptureInitialization( 12455 C->getLocation(), OldVD->getType()->isReferenceType(), 12456 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12457 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12458 NewExprInit); 12459 Result.Expansions.push_back( 12460 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12461 }; 12462 12463 // If this is an init-capture pack, consider expanding the pack now. 12464 if (OldVD->isParameterPack()) { 12465 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12466 ->getTypeLoc() 12467 .castAs<PackExpansionTypeLoc>(); 12468 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12469 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12470 12471 // Determine whether the set of unexpanded parameter packs can and should 12472 // be expanded. 12473 bool Expand = true; 12474 bool RetainExpansion = false; 12475 Optional<unsigned> OrigNumExpansions = 12476 ExpansionTL.getTypePtr()->getNumExpansions(); 12477 Optional<unsigned> NumExpansions = OrigNumExpansions; 12478 if (getDerived().TryExpandParameterPacks( 12479 ExpansionTL.getEllipsisLoc(), 12480 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12481 RetainExpansion, NumExpansions)) 12482 return ExprError(); 12483 if (Expand) { 12484 for (unsigned I = 0; I != *NumExpansions; ++I) { 12485 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12486 SubstInitCapture(SourceLocation(), None); 12487 } 12488 } 12489 if (!Expand || RetainExpansion) { 12490 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12491 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12492 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12493 } 12494 } else { 12495 SubstInitCapture(SourceLocation(), None); 12496 } 12497 } 12498 12499 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12500 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12501 12502 // Transform the template parameters, and add them to the current 12503 // instantiation scope. The null case is handled correctly. 12504 auto TPL = getDerived().TransformTemplateParameterList( 12505 E->getTemplateParameterList()); 12506 LSI->GLTemplateParameterList = TPL; 12507 12508 // Transform the type of the original lambda's call operator. 12509 // The transformation MUST be done in the CurrentInstantiationScope since 12510 // it introduces a mapping of the original to the newly created 12511 // transformed parameters. 12512 TypeSourceInfo *NewCallOpTSI = nullptr; 12513 { 12514 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12515 FunctionProtoTypeLoc OldCallOpFPTL = 12516 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12517 12518 TypeLocBuilder NewCallOpTLBuilder; 12519 SmallVector<QualType, 4> ExceptionStorage; 12520 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12521 QualType NewCallOpType = TransformFunctionProtoType( 12522 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12523 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12524 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12525 ExceptionStorage, Changed); 12526 }); 12527 if (NewCallOpType.isNull()) 12528 return ExprError(); 12529 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12530 NewCallOpType); 12531 } 12532 12533 // Transform the trailing requires clause 12534 ExprResult NewTrailingRequiresClause; 12535 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12536 // FIXME: Concepts: Substitution into requires clause should only happen 12537 // when checking satisfaction. 12538 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12539 12540 // Create the local class that will describe the lambda. 12541 // FIXME: KnownDependent below is wrong when substituting inside a templated 12542 // context that isn't a DeclContext (such as a variable template). 12543 CXXRecordDecl *OldClass = E->getLambdaClass(); 12544 CXXRecordDecl *Class 12545 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12546 NewCallOpTSI, 12547 /*KnownDependent=*/false, 12548 E->getCaptureDefault()); 12549 getDerived().transformedLocalDecl(OldClass, {Class}); 12550 12551 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12552 if (getDerived().ReplacingOriginal()) 12553 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12554 OldClass->getLambdaManglingNumber(), 12555 OldClass->getDeviceLambdaManglingNumber(), 12556 OldClass->getLambdaContextDecl()); 12557 12558 // Build the call operator. 12559 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12560 Class, E->getIntroducerRange(), NewCallOpTSI, 12561 E->getCallOperator()->getEndLoc(), 12562 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12563 E->getCallOperator()->getConstexprKind(), 12564 NewTrailingRequiresClause.get()); 12565 12566 LSI->CallOperator = NewCallOperator; 12567 12568 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12569 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12570 12571 // Number the lambda for linkage purposes if necessary. 12572 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12573 12574 // Introduce the context of the call operator. 12575 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12576 /*NewThisContext*/false); 12577 12578 // Enter the scope of the lambda. 12579 getSema().buildLambdaScope(LSI, NewCallOperator, 12580 E->getIntroducerRange(), 12581 E->getCaptureDefault(), 12582 E->getCaptureDefaultLoc(), 12583 E->hasExplicitParameters(), 12584 E->hasExplicitResultType(), 12585 E->isMutable()); 12586 12587 bool Invalid = false; 12588 12589 // Transform captures. 12590 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12591 CEnd = E->capture_end(); 12592 C != CEnd; ++C) { 12593 // When we hit the first implicit capture, tell Sema that we've finished 12594 // the list of explicit captures. 12595 if (C->isImplicit()) 12596 break; 12597 12598 // Capturing 'this' is trivial. 12599 if (C->capturesThis()) { 12600 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12601 /*BuildAndDiagnose*/ true, nullptr, 12602 C->getCaptureKind() == LCK_StarThis); 12603 continue; 12604 } 12605 // Captured expression will be recaptured during captured variables 12606 // rebuilding. 12607 if (C->capturesVLAType()) 12608 continue; 12609 12610 // Rebuild init-captures, including the implied field declaration. 12611 if (E->isInitCapture(C)) { 12612 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12613 12614 VarDecl *OldVD = C->getCapturedVar(); 12615 llvm::SmallVector<Decl*, 4> NewVDs; 12616 12617 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12618 ExprResult Init = Info.first; 12619 QualType InitQualType = Info.second; 12620 if (Init.isInvalid() || InitQualType.isNull()) { 12621 Invalid = true; 12622 break; 12623 } 12624 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12625 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12626 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12627 if (!NewVD) { 12628 Invalid = true; 12629 break; 12630 } 12631 NewVDs.push_back(NewVD); 12632 getSema().addInitCapture(LSI, NewVD); 12633 } 12634 12635 if (Invalid) 12636 break; 12637 12638 getDerived().transformedLocalDecl(OldVD, NewVDs); 12639 continue; 12640 } 12641 12642 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12643 12644 // Determine the capture kind for Sema. 12645 Sema::TryCaptureKind Kind 12646 = C->isImplicit()? Sema::TryCapture_Implicit 12647 : C->getCaptureKind() == LCK_ByCopy 12648 ? Sema::TryCapture_ExplicitByVal 12649 : Sema::TryCapture_ExplicitByRef; 12650 SourceLocation EllipsisLoc; 12651 if (C->isPackExpansion()) { 12652 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12653 bool ShouldExpand = false; 12654 bool RetainExpansion = false; 12655 Optional<unsigned> NumExpansions; 12656 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12657 C->getLocation(), 12658 Unexpanded, 12659 ShouldExpand, RetainExpansion, 12660 NumExpansions)) { 12661 Invalid = true; 12662 continue; 12663 } 12664 12665 if (ShouldExpand) { 12666 // The transform has determined that we should perform an expansion; 12667 // transform and capture each of the arguments. 12668 // expansion of the pattern. Do so. 12669 VarDecl *Pack = C->getCapturedVar(); 12670 for (unsigned I = 0; I != *NumExpansions; ++I) { 12671 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12672 VarDecl *CapturedVar 12673 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12674 Pack)); 12675 if (!CapturedVar) { 12676 Invalid = true; 12677 continue; 12678 } 12679 12680 // Capture the transformed variable. 12681 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12682 } 12683 12684 // FIXME: Retain a pack expansion if RetainExpansion is true. 12685 12686 continue; 12687 } 12688 12689 EllipsisLoc = C->getEllipsisLoc(); 12690 } 12691 12692 // Transform the captured variable. 12693 VarDecl *CapturedVar 12694 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12695 C->getCapturedVar())); 12696 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12697 Invalid = true; 12698 continue; 12699 } 12700 12701 // Capture the transformed variable. 12702 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12703 EllipsisLoc); 12704 } 12705 getSema().finishLambdaExplicitCaptures(LSI); 12706 12707 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12708 // evaluation context even if we're not transforming the function body. 12709 getSema().PushExpressionEvaluationContext( 12710 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12711 12712 // Instantiate the body of the lambda expression. 12713 StmtResult Body = 12714 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12715 12716 // ActOnLambda* will pop the function scope for us. 12717 FuncScopeCleanup.disable(); 12718 12719 if (Body.isInvalid()) { 12720 SavedContext.pop(); 12721 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12722 /*IsInstantiation=*/true); 12723 return ExprError(); 12724 } 12725 12726 // Copy the LSI before ActOnFinishFunctionBody removes it. 12727 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12728 // the call operator. 12729 auto LSICopy = *LSI; 12730 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12731 /*IsInstantiation*/ true); 12732 SavedContext.pop(); 12733 12734 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12735 &LSICopy); 12736 } 12737 12738 template<typename Derived> 12739 StmtResult 12740 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12741 return TransformStmt(S); 12742 } 12743 12744 template<typename Derived> 12745 StmtResult 12746 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12747 // Transform captures. 12748 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12749 CEnd = E->capture_end(); 12750 C != CEnd; ++C) { 12751 // When we hit the first implicit capture, tell Sema that we've finished 12752 // the list of explicit captures. 12753 if (!C->isImplicit()) 12754 continue; 12755 12756 // Capturing 'this' is trivial. 12757 if (C->capturesThis()) { 12758 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12759 /*BuildAndDiagnose*/ true, nullptr, 12760 C->getCaptureKind() == LCK_StarThis); 12761 continue; 12762 } 12763 // Captured expression will be recaptured during captured variables 12764 // rebuilding. 12765 if (C->capturesVLAType()) 12766 continue; 12767 12768 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12769 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12770 12771 // Transform the captured variable. 12772 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12773 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12774 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12775 return StmtError(); 12776 12777 // Capture the transformed variable. 12778 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12779 } 12780 12781 return S; 12782 } 12783 12784 template<typename Derived> 12785 ExprResult 12786 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12787 CXXUnresolvedConstructExpr *E) { 12788 TypeSourceInfo *T = 12789 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12790 if (!T) 12791 return ExprError(); 12792 12793 bool ArgumentChanged = false; 12794 SmallVector<Expr*, 8> Args; 12795 Args.reserve(E->getNumArgs()); 12796 { 12797 EnterExpressionEvaluationContext Context( 12798 getSema(), EnterExpressionEvaluationContext::InitList, 12799 E->isListInitialization()); 12800 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 12801 &ArgumentChanged)) 12802 return ExprError(); 12803 } 12804 12805 if (!getDerived().AlwaysRebuild() && 12806 T == E->getTypeSourceInfo() && 12807 !ArgumentChanged) 12808 return E; 12809 12810 // FIXME: we're faking the locations of the commas 12811 return getDerived().RebuildCXXUnresolvedConstructExpr( 12812 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12813 } 12814 12815 template<typename Derived> 12816 ExprResult 12817 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12818 CXXDependentScopeMemberExpr *E) { 12819 // Transform the base of the expression. 12820 ExprResult Base((Expr*) nullptr); 12821 Expr *OldBase; 12822 QualType BaseType; 12823 QualType ObjectType; 12824 if (!E->isImplicitAccess()) { 12825 OldBase = E->getBase(); 12826 Base = getDerived().TransformExpr(OldBase); 12827 if (Base.isInvalid()) 12828 return ExprError(); 12829 12830 // Start the member reference and compute the object's type. 12831 ParsedType ObjectTy; 12832 bool MayBePseudoDestructor = false; 12833 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12834 E->getOperatorLoc(), 12835 E->isArrow()? tok::arrow : tok::period, 12836 ObjectTy, 12837 MayBePseudoDestructor); 12838 if (Base.isInvalid()) 12839 return ExprError(); 12840 12841 ObjectType = ObjectTy.get(); 12842 BaseType = ((Expr*) Base.get())->getType(); 12843 } else { 12844 OldBase = nullptr; 12845 BaseType = getDerived().TransformType(E->getBaseType()); 12846 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12847 } 12848 12849 // Transform the first part of the nested-name-specifier that qualifies 12850 // the member name. 12851 NamedDecl *FirstQualifierInScope 12852 = getDerived().TransformFirstQualifierInScope( 12853 E->getFirstQualifierFoundInScope(), 12854 E->getQualifierLoc().getBeginLoc()); 12855 12856 NestedNameSpecifierLoc QualifierLoc; 12857 if (E->getQualifier()) { 12858 QualifierLoc 12859 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12860 ObjectType, 12861 FirstQualifierInScope); 12862 if (!QualifierLoc) 12863 return ExprError(); 12864 } 12865 12866 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12867 12868 // TODO: If this is a conversion-function-id, verify that the 12869 // destination type name (if present) resolves the same way after 12870 // instantiation as it did in the local scope. 12871 12872 DeclarationNameInfo NameInfo 12873 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12874 if (!NameInfo.getName()) 12875 return ExprError(); 12876 12877 if (!E->hasExplicitTemplateArgs()) { 12878 // This is a reference to a member without an explicitly-specified 12879 // template argument list. Optimize for this common case. 12880 if (!getDerived().AlwaysRebuild() && 12881 Base.get() == OldBase && 12882 BaseType == E->getBaseType() && 12883 QualifierLoc == E->getQualifierLoc() && 12884 NameInfo.getName() == E->getMember() && 12885 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12886 return E; 12887 12888 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12889 BaseType, 12890 E->isArrow(), 12891 E->getOperatorLoc(), 12892 QualifierLoc, 12893 TemplateKWLoc, 12894 FirstQualifierInScope, 12895 NameInfo, 12896 /*TemplateArgs*/nullptr); 12897 } 12898 12899 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12900 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12901 E->getNumTemplateArgs(), 12902 TransArgs)) 12903 return ExprError(); 12904 12905 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12906 BaseType, 12907 E->isArrow(), 12908 E->getOperatorLoc(), 12909 QualifierLoc, 12910 TemplateKWLoc, 12911 FirstQualifierInScope, 12912 NameInfo, 12913 &TransArgs); 12914 } 12915 12916 template<typename Derived> 12917 ExprResult 12918 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 12919 // Transform the base of the expression. 12920 ExprResult Base((Expr*) nullptr); 12921 QualType BaseType; 12922 if (!Old->isImplicitAccess()) { 12923 Base = getDerived().TransformExpr(Old->getBase()); 12924 if (Base.isInvalid()) 12925 return ExprError(); 12926 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 12927 Old->isArrow()); 12928 if (Base.isInvalid()) 12929 return ExprError(); 12930 BaseType = Base.get()->getType(); 12931 } else { 12932 BaseType = getDerived().TransformType(Old->getBaseType()); 12933 } 12934 12935 NestedNameSpecifierLoc QualifierLoc; 12936 if (Old->getQualifierLoc()) { 12937 QualifierLoc 12938 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12939 if (!QualifierLoc) 12940 return ExprError(); 12941 } 12942 12943 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12944 12945 LookupResult R(SemaRef, Old->getMemberNameInfo(), 12946 Sema::LookupOrdinaryName); 12947 12948 // Transform the declaration set. 12949 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 12950 return ExprError(); 12951 12952 // Determine the naming class. 12953 if (Old->getNamingClass()) { 12954 CXXRecordDecl *NamingClass 12955 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12956 Old->getMemberLoc(), 12957 Old->getNamingClass())); 12958 if (!NamingClass) 12959 return ExprError(); 12960 12961 R.setNamingClass(NamingClass); 12962 } 12963 12964 TemplateArgumentListInfo TransArgs; 12965 if (Old->hasExplicitTemplateArgs()) { 12966 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 12967 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 12968 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12969 Old->getNumTemplateArgs(), 12970 TransArgs)) 12971 return ExprError(); 12972 } 12973 12974 // FIXME: to do this check properly, we will need to preserve the 12975 // first-qualifier-in-scope here, just in case we had a dependent 12976 // base (and therefore couldn't do the check) and a 12977 // nested-name-qualifier (and therefore could do the lookup). 12978 NamedDecl *FirstQualifierInScope = nullptr; 12979 12980 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 12981 BaseType, 12982 Old->getOperatorLoc(), 12983 Old->isArrow(), 12984 QualifierLoc, 12985 TemplateKWLoc, 12986 FirstQualifierInScope, 12987 R, 12988 (Old->hasExplicitTemplateArgs() 12989 ? &TransArgs : nullptr)); 12990 } 12991 12992 template<typename Derived> 12993 ExprResult 12994 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 12995 EnterExpressionEvaluationContext Unevaluated( 12996 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12997 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 12998 if (SubExpr.isInvalid()) 12999 return ExprError(); 13000 13001 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13002 return E; 13003 13004 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13005 } 13006 13007 template<typename Derived> 13008 ExprResult 13009 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13010 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13011 if (Pattern.isInvalid()) 13012 return ExprError(); 13013 13014 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13015 return E; 13016 13017 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13018 E->getNumExpansions()); 13019 } 13020 13021 template<typename Derived> 13022 ExprResult 13023 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13024 // If E is not value-dependent, then nothing will change when we transform it. 13025 // Note: This is an instantiation-centric view. 13026 if (!E->isValueDependent()) 13027 return E; 13028 13029 EnterExpressionEvaluationContext Unevaluated( 13030 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13031 13032 ArrayRef<TemplateArgument> PackArgs; 13033 TemplateArgument ArgStorage; 13034 13035 // Find the argument list to transform. 13036 if (E->isPartiallySubstituted()) { 13037 PackArgs = E->getPartialArguments(); 13038 } else if (E->isValueDependent()) { 13039 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13040 bool ShouldExpand = false; 13041 bool RetainExpansion = false; 13042 Optional<unsigned> NumExpansions; 13043 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13044 Unexpanded, 13045 ShouldExpand, RetainExpansion, 13046 NumExpansions)) 13047 return ExprError(); 13048 13049 // If we need to expand the pack, build a template argument from it and 13050 // expand that. 13051 if (ShouldExpand) { 13052 auto *Pack = E->getPack(); 13053 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13054 ArgStorage = getSema().Context.getPackExpansionType( 13055 getSema().Context.getTypeDeclType(TTPD), None); 13056 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13057 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13058 } else { 13059 auto *VD = cast<ValueDecl>(Pack); 13060 ExprResult DRE = getSema().BuildDeclRefExpr( 13061 VD, VD->getType().getNonLValueExprType(getSema().Context), 13062 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 13063 E->getPackLoc()); 13064 if (DRE.isInvalid()) 13065 return ExprError(); 13066 ArgStorage = new (getSema().Context) PackExpansionExpr( 13067 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13068 } 13069 PackArgs = ArgStorage; 13070 } 13071 } 13072 13073 // If we're not expanding the pack, just transform the decl. 13074 if (!PackArgs.size()) { 13075 auto *Pack = cast_or_null<NamedDecl>( 13076 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13077 if (!Pack) 13078 return ExprError(); 13079 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13080 E->getPackLoc(), 13081 E->getRParenLoc(), None, None); 13082 } 13083 13084 // Try to compute the result without performing a partial substitution. 13085 Optional<unsigned> Result = 0; 13086 for (const TemplateArgument &Arg : PackArgs) { 13087 if (!Arg.isPackExpansion()) { 13088 Result = *Result + 1; 13089 continue; 13090 } 13091 13092 TemplateArgumentLoc ArgLoc; 13093 InventTemplateArgumentLoc(Arg, ArgLoc); 13094 13095 // Find the pattern of the pack expansion. 13096 SourceLocation Ellipsis; 13097 Optional<unsigned> OrigNumExpansions; 13098 TemplateArgumentLoc Pattern = 13099 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13100 OrigNumExpansions); 13101 13102 // Substitute under the pack expansion. Do not expand the pack (yet). 13103 TemplateArgumentLoc OutPattern; 13104 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13105 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13106 /*Uneval*/ true)) 13107 return true; 13108 13109 // See if we can determine the number of arguments from the result. 13110 Optional<unsigned> NumExpansions = 13111 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13112 if (!NumExpansions) { 13113 // No: we must be in an alias template expansion, and we're going to need 13114 // to actually expand the packs. 13115 Result = None; 13116 break; 13117 } 13118 13119 Result = *Result + *NumExpansions; 13120 } 13121 13122 // Common case: we could determine the number of expansions without 13123 // substituting. 13124 if (Result) 13125 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13126 E->getPackLoc(), 13127 E->getRParenLoc(), *Result, None); 13128 13129 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13130 E->getPackLoc()); 13131 { 13132 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13133 typedef TemplateArgumentLocInventIterator< 13134 Derived, const TemplateArgument*> PackLocIterator; 13135 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13136 PackLocIterator(*this, PackArgs.end()), 13137 TransformedPackArgs, /*Uneval*/true)) 13138 return ExprError(); 13139 } 13140 13141 // Check whether we managed to fully-expand the pack. 13142 // FIXME: Is it possible for us to do so and not hit the early exit path? 13143 SmallVector<TemplateArgument, 8> Args; 13144 bool PartialSubstitution = false; 13145 for (auto &Loc : TransformedPackArgs.arguments()) { 13146 Args.push_back(Loc.getArgument()); 13147 if (Loc.getArgument().isPackExpansion()) 13148 PartialSubstitution = true; 13149 } 13150 13151 if (PartialSubstitution) 13152 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13153 E->getPackLoc(), 13154 E->getRParenLoc(), None, Args); 13155 13156 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13157 E->getPackLoc(), E->getRParenLoc(), 13158 Args.size(), None); 13159 } 13160 13161 template<typename Derived> 13162 ExprResult 13163 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13164 SubstNonTypeTemplateParmPackExpr *E) { 13165 // Default behavior is to do nothing with this transformation. 13166 return E; 13167 } 13168 13169 template<typename Derived> 13170 ExprResult 13171 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13172 SubstNonTypeTemplateParmExpr *E) { 13173 // Default behavior is to do nothing with this transformation. 13174 return E; 13175 } 13176 13177 template<typename Derived> 13178 ExprResult 13179 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13180 // Default behavior is to do nothing with this transformation. 13181 return E; 13182 } 13183 13184 template<typename Derived> 13185 ExprResult 13186 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13187 MaterializeTemporaryExpr *E) { 13188 return getDerived().TransformExpr(E->getSubExpr()); 13189 } 13190 13191 template<typename Derived> 13192 ExprResult 13193 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13194 UnresolvedLookupExpr *Callee = nullptr; 13195 if (Expr *OldCallee = E->getCallee()) { 13196 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13197 if (CalleeResult.isInvalid()) 13198 return ExprError(); 13199 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13200 } 13201 13202 Expr *Pattern = E->getPattern(); 13203 13204 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13205 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13206 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13207 13208 // Determine whether the set of unexpanded parameter packs can and should 13209 // be expanded. 13210 bool Expand = true; 13211 bool RetainExpansion = false; 13212 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13213 NumExpansions = OrigNumExpansions; 13214 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13215 Pattern->getSourceRange(), 13216 Unexpanded, 13217 Expand, RetainExpansion, 13218 NumExpansions)) 13219 return true; 13220 13221 if (!Expand) { 13222 // Do not expand any packs here, just transform and rebuild a fold 13223 // expression. 13224 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13225 13226 ExprResult LHS = 13227 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13228 if (LHS.isInvalid()) 13229 return true; 13230 13231 ExprResult RHS = 13232 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13233 if (RHS.isInvalid()) 13234 return true; 13235 13236 if (!getDerived().AlwaysRebuild() && 13237 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13238 return E; 13239 13240 return getDerived().RebuildCXXFoldExpr( 13241 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13242 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13243 } 13244 13245 // Formally a fold expression expands to nested parenthesized expressions. 13246 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13247 // them. 13248 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13249 SemaRef.Diag(E->getEllipsisLoc(), 13250 clang::diag::err_fold_expression_limit_exceeded) 13251 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13252 << E->getSourceRange(); 13253 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13254 return ExprError(); 13255 } 13256 13257 // The transform has determined that we should perform an elementwise 13258 // expansion of the pattern. Do so. 13259 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13260 if (Result.isInvalid()) 13261 return true; 13262 bool LeftFold = E->isLeftFold(); 13263 13264 // If we're retaining an expansion for a right fold, it is the innermost 13265 // component and takes the init (if any). 13266 if (!LeftFold && RetainExpansion) { 13267 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13268 13269 ExprResult Out = getDerived().TransformExpr(Pattern); 13270 if (Out.isInvalid()) 13271 return true; 13272 13273 Result = getDerived().RebuildCXXFoldExpr( 13274 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13275 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13276 if (Result.isInvalid()) 13277 return true; 13278 } 13279 13280 for (unsigned I = 0; I != *NumExpansions; ++I) { 13281 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13282 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13283 ExprResult Out = getDerived().TransformExpr(Pattern); 13284 if (Out.isInvalid()) 13285 return true; 13286 13287 if (Out.get()->containsUnexpandedParameterPack()) { 13288 // We still have a pack; retain a pack expansion for this slice. 13289 Result = getDerived().RebuildCXXFoldExpr( 13290 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13291 E->getOperator(), E->getEllipsisLoc(), 13292 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13293 OrigNumExpansions); 13294 } else if (Result.isUsable()) { 13295 // We've got down to a single element; build a binary operator. 13296 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13297 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13298 if (Callee) 13299 Result = getDerived().RebuildCXXOperatorCallExpr( 13300 BinaryOperator::getOverloadedOperator(E->getOperator()), 13301 E->getEllipsisLoc(), Callee, LHS, RHS); 13302 else 13303 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13304 E->getOperator(), LHS, RHS); 13305 } else 13306 Result = Out; 13307 13308 if (Result.isInvalid()) 13309 return true; 13310 } 13311 13312 // If we're retaining an expansion for a left fold, it is the outermost 13313 // component and takes the complete expansion so far as its init (if any). 13314 if (LeftFold && RetainExpansion) { 13315 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13316 13317 ExprResult Out = getDerived().TransformExpr(Pattern); 13318 if (Out.isInvalid()) 13319 return true; 13320 13321 Result = getDerived().RebuildCXXFoldExpr( 13322 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13323 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13324 if (Result.isInvalid()) 13325 return true; 13326 } 13327 13328 // If we had no init and an empty pack, and we're not retaining an expansion, 13329 // then produce a fallback value or error. 13330 if (Result.isUnset()) 13331 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13332 E->getOperator()); 13333 13334 return Result; 13335 } 13336 13337 template<typename Derived> 13338 ExprResult 13339 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13340 CXXStdInitializerListExpr *E) { 13341 return getDerived().TransformExpr(E->getSubExpr()); 13342 } 13343 13344 template<typename Derived> 13345 ExprResult 13346 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13347 return SemaRef.MaybeBindToTemporary(E); 13348 } 13349 13350 template<typename Derived> 13351 ExprResult 13352 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13353 return E; 13354 } 13355 13356 template<typename Derived> 13357 ExprResult 13358 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13359 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13360 if (SubExpr.isInvalid()) 13361 return ExprError(); 13362 13363 if (!getDerived().AlwaysRebuild() && 13364 SubExpr.get() == E->getSubExpr()) 13365 return E; 13366 13367 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13368 } 13369 13370 template<typename Derived> 13371 ExprResult 13372 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13373 // Transform each of the elements. 13374 SmallVector<Expr *, 8> Elements; 13375 bool ArgChanged = false; 13376 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13377 /*IsCall=*/false, Elements, &ArgChanged)) 13378 return ExprError(); 13379 13380 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13381 return SemaRef.MaybeBindToTemporary(E); 13382 13383 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13384 Elements.data(), 13385 Elements.size()); 13386 } 13387 13388 template<typename Derived> 13389 ExprResult 13390 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13391 ObjCDictionaryLiteral *E) { 13392 // Transform each of the elements. 13393 SmallVector<ObjCDictionaryElement, 8> Elements; 13394 bool ArgChanged = false; 13395 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13396 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13397 13398 if (OrigElement.isPackExpansion()) { 13399 // This key/value element is a pack expansion. 13400 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13401 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13402 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13403 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13404 13405 // Determine whether the set of unexpanded parameter packs can 13406 // and should be expanded. 13407 bool Expand = true; 13408 bool RetainExpansion = false; 13409 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13410 Optional<unsigned> NumExpansions = OrigNumExpansions; 13411 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13412 OrigElement.Value->getEndLoc()); 13413 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13414 PatternRange, Unexpanded, Expand, 13415 RetainExpansion, NumExpansions)) 13416 return ExprError(); 13417 13418 if (!Expand) { 13419 // The transform has determined that we should perform a simple 13420 // transformation on the pack expansion, producing another pack 13421 // expansion. 13422 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13423 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13424 if (Key.isInvalid()) 13425 return ExprError(); 13426 13427 if (Key.get() != OrigElement.Key) 13428 ArgChanged = true; 13429 13430 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13431 if (Value.isInvalid()) 13432 return ExprError(); 13433 13434 if (Value.get() != OrigElement.Value) 13435 ArgChanged = true; 13436 13437 ObjCDictionaryElement Expansion = { 13438 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13439 }; 13440 Elements.push_back(Expansion); 13441 continue; 13442 } 13443 13444 // Record right away that the argument was changed. This needs 13445 // to happen even if the array expands to nothing. 13446 ArgChanged = true; 13447 13448 // The transform has determined that we should perform an elementwise 13449 // expansion of the pattern. Do so. 13450 for (unsigned I = 0; I != *NumExpansions; ++I) { 13451 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13452 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13453 if (Key.isInvalid()) 13454 return ExprError(); 13455 13456 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13457 if (Value.isInvalid()) 13458 return ExprError(); 13459 13460 ObjCDictionaryElement Element = { 13461 Key.get(), Value.get(), SourceLocation(), NumExpansions 13462 }; 13463 13464 // If any unexpanded parameter packs remain, we still have a 13465 // pack expansion. 13466 // FIXME: Can this really happen? 13467 if (Key.get()->containsUnexpandedParameterPack() || 13468 Value.get()->containsUnexpandedParameterPack()) 13469 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13470 13471 Elements.push_back(Element); 13472 } 13473 13474 // FIXME: Retain a pack expansion if RetainExpansion is true. 13475 13476 // We've finished with this pack expansion. 13477 continue; 13478 } 13479 13480 // Transform and check key. 13481 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13482 if (Key.isInvalid()) 13483 return ExprError(); 13484 13485 if (Key.get() != OrigElement.Key) 13486 ArgChanged = true; 13487 13488 // Transform and check value. 13489 ExprResult Value 13490 = getDerived().TransformExpr(OrigElement.Value); 13491 if (Value.isInvalid()) 13492 return ExprError(); 13493 13494 if (Value.get() != OrigElement.Value) 13495 ArgChanged = true; 13496 13497 ObjCDictionaryElement Element = { 13498 Key.get(), Value.get(), SourceLocation(), None 13499 }; 13500 Elements.push_back(Element); 13501 } 13502 13503 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13504 return SemaRef.MaybeBindToTemporary(E); 13505 13506 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13507 Elements); 13508 } 13509 13510 template<typename Derived> 13511 ExprResult 13512 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13513 TypeSourceInfo *EncodedTypeInfo 13514 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13515 if (!EncodedTypeInfo) 13516 return ExprError(); 13517 13518 if (!getDerived().AlwaysRebuild() && 13519 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13520 return E; 13521 13522 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13523 EncodedTypeInfo, 13524 E->getRParenLoc()); 13525 } 13526 13527 template<typename Derived> 13528 ExprResult TreeTransform<Derived>:: 13529 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13530 // This is a kind of implicit conversion, and it needs to get dropped 13531 // and recomputed for the same general reasons that ImplicitCastExprs 13532 // do, as well a more specific one: this expression is only valid when 13533 // it appears *immediately* as an argument expression. 13534 return getDerived().TransformExpr(E->getSubExpr()); 13535 } 13536 13537 template<typename Derived> 13538 ExprResult TreeTransform<Derived>:: 13539 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13540 TypeSourceInfo *TSInfo 13541 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13542 if (!TSInfo) 13543 return ExprError(); 13544 13545 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13546 if (Result.isInvalid()) 13547 return ExprError(); 13548 13549 if (!getDerived().AlwaysRebuild() && 13550 TSInfo == E->getTypeInfoAsWritten() && 13551 Result.get() == E->getSubExpr()) 13552 return E; 13553 13554 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13555 E->getBridgeKeywordLoc(), TSInfo, 13556 Result.get()); 13557 } 13558 13559 template <typename Derived> 13560 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13561 ObjCAvailabilityCheckExpr *E) { 13562 return E; 13563 } 13564 13565 template<typename Derived> 13566 ExprResult 13567 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13568 // Transform arguments. 13569 bool ArgChanged = false; 13570 SmallVector<Expr*, 8> Args; 13571 Args.reserve(E->getNumArgs()); 13572 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13573 &ArgChanged)) 13574 return ExprError(); 13575 13576 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13577 // Class message: transform the receiver type. 13578 TypeSourceInfo *ReceiverTypeInfo 13579 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13580 if (!ReceiverTypeInfo) 13581 return ExprError(); 13582 13583 // If nothing changed, just retain the existing message send. 13584 if (!getDerived().AlwaysRebuild() && 13585 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13586 return SemaRef.MaybeBindToTemporary(E); 13587 13588 // Build a new class message send. 13589 SmallVector<SourceLocation, 16> SelLocs; 13590 E->getSelectorLocs(SelLocs); 13591 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13592 E->getSelector(), 13593 SelLocs, 13594 E->getMethodDecl(), 13595 E->getLeftLoc(), 13596 Args, 13597 E->getRightLoc()); 13598 } 13599 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13600 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13601 if (!E->getMethodDecl()) 13602 return ExprError(); 13603 13604 // Build a new class message send to 'super'. 13605 SmallVector<SourceLocation, 16> SelLocs; 13606 E->getSelectorLocs(SelLocs); 13607 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13608 E->getSelector(), 13609 SelLocs, 13610 E->getReceiverType(), 13611 E->getMethodDecl(), 13612 E->getLeftLoc(), 13613 Args, 13614 E->getRightLoc()); 13615 } 13616 13617 // Instance message: transform the receiver 13618 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13619 "Only class and instance messages may be instantiated"); 13620 ExprResult Receiver 13621 = getDerived().TransformExpr(E->getInstanceReceiver()); 13622 if (Receiver.isInvalid()) 13623 return ExprError(); 13624 13625 // If nothing changed, just retain the existing message send. 13626 if (!getDerived().AlwaysRebuild() && 13627 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13628 return SemaRef.MaybeBindToTemporary(E); 13629 13630 // Build a new instance message send. 13631 SmallVector<SourceLocation, 16> SelLocs; 13632 E->getSelectorLocs(SelLocs); 13633 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13634 E->getSelector(), 13635 SelLocs, 13636 E->getMethodDecl(), 13637 E->getLeftLoc(), 13638 Args, 13639 E->getRightLoc()); 13640 } 13641 13642 template<typename Derived> 13643 ExprResult 13644 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13645 return E; 13646 } 13647 13648 template<typename Derived> 13649 ExprResult 13650 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13651 return E; 13652 } 13653 13654 template<typename Derived> 13655 ExprResult 13656 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13657 // Transform the base expression. 13658 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13659 if (Base.isInvalid()) 13660 return ExprError(); 13661 13662 // We don't need to transform the ivar; it will never change. 13663 13664 // If nothing changed, just retain the existing expression. 13665 if (!getDerived().AlwaysRebuild() && 13666 Base.get() == E->getBase()) 13667 return E; 13668 13669 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13670 E->getLocation(), 13671 E->isArrow(), E->isFreeIvar()); 13672 } 13673 13674 template<typename Derived> 13675 ExprResult 13676 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13677 // 'super' and types never change. Property never changes. Just 13678 // retain the existing expression. 13679 if (!E->isObjectReceiver()) 13680 return E; 13681 13682 // Transform the base expression. 13683 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13684 if (Base.isInvalid()) 13685 return ExprError(); 13686 13687 // We don't need to transform the property; it will never change. 13688 13689 // If nothing changed, just retain the existing expression. 13690 if (!getDerived().AlwaysRebuild() && 13691 Base.get() == E->getBase()) 13692 return E; 13693 13694 if (E->isExplicitProperty()) 13695 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13696 E->getExplicitProperty(), 13697 E->getLocation()); 13698 13699 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13700 SemaRef.Context.PseudoObjectTy, 13701 E->getImplicitPropertyGetter(), 13702 E->getImplicitPropertySetter(), 13703 E->getLocation()); 13704 } 13705 13706 template<typename Derived> 13707 ExprResult 13708 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13709 // Transform the base expression. 13710 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13711 if (Base.isInvalid()) 13712 return ExprError(); 13713 13714 // Transform the key expression. 13715 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13716 if (Key.isInvalid()) 13717 return ExprError(); 13718 13719 // If nothing changed, just retain the existing expression. 13720 if (!getDerived().AlwaysRebuild() && 13721 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13722 return E; 13723 13724 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13725 Base.get(), Key.get(), 13726 E->getAtIndexMethodDecl(), 13727 E->setAtIndexMethodDecl()); 13728 } 13729 13730 template<typename Derived> 13731 ExprResult 13732 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13733 // Transform the base expression. 13734 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13735 if (Base.isInvalid()) 13736 return ExprError(); 13737 13738 // If nothing changed, just retain the existing expression. 13739 if (!getDerived().AlwaysRebuild() && 13740 Base.get() == E->getBase()) 13741 return E; 13742 13743 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13744 E->getOpLoc(), 13745 E->isArrow()); 13746 } 13747 13748 template<typename Derived> 13749 ExprResult 13750 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13751 bool ArgumentChanged = false; 13752 SmallVector<Expr*, 8> SubExprs; 13753 SubExprs.reserve(E->getNumSubExprs()); 13754 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13755 SubExprs, &ArgumentChanged)) 13756 return ExprError(); 13757 13758 if (!getDerived().AlwaysRebuild() && 13759 !ArgumentChanged) 13760 return E; 13761 13762 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13763 SubExprs, 13764 E->getRParenLoc()); 13765 } 13766 13767 template<typename Derived> 13768 ExprResult 13769 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13770 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13771 if (SrcExpr.isInvalid()) 13772 return ExprError(); 13773 13774 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13775 if (!Type) 13776 return ExprError(); 13777 13778 if (!getDerived().AlwaysRebuild() && 13779 Type == E->getTypeSourceInfo() && 13780 SrcExpr.get() == E->getSrcExpr()) 13781 return E; 13782 13783 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13784 SrcExpr.get(), Type, 13785 E->getRParenLoc()); 13786 } 13787 13788 template<typename Derived> 13789 ExprResult 13790 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13791 BlockDecl *oldBlock = E->getBlockDecl(); 13792 13793 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13794 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13795 13796 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13797 blockScope->TheDecl->setBlockMissingReturnType( 13798 oldBlock->blockMissingReturnType()); 13799 13800 SmallVector<ParmVarDecl*, 4> params; 13801 SmallVector<QualType, 4> paramTypes; 13802 13803 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13804 13805 // Parameter substitution. 13806 Sema::ExtParameterInfoBuilder extParamInfos; 13807 if (getDerived().TransformFunctionTypeParams( 13808 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13809 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13810 extParamInfos)) { 13811 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13812 return ExprError(); 13813 } 13814 13815 QualType exprResultType = 13816 getDerived().TransformType(exprFunctionType->getReturnType()); 13817 13818 auto epi = exprFunctionType->getExtProtoInfo(); 13819 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13820 13821 QualType functionType = 13822 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13823 blockScope->FunctionType = functionType; 13824 13825 // Set the parameters on the block decl. 13826 if (!params.empty()) 13827 blockScope->TheDecl->setParams(params); 13828 13829 if (!oldBlock->blockMissingReturnType()) { 13830 blockScope->HasImplicitReturnType = false; 13831 blockScope->ReturnType = exprResultType; 13832 } 13833 13834 // Transform the body 13835 StmtResult body = getDerived().TransformStmt(E->getBody()); 13836 if (body.isInvalid()) { 13837 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13838 return ExprError(); 13839 } 13840 13841 #ifndef NDEBUG 13842 // In builds with assertions, make sure that we captured everything we 13843 // captured before. 13844 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13845 for (const auto &I : oldBlock->captures()) { 13846 VarDecl *oldCapture = I.getVariable(); 13847 13848 // Ignore parameter packs. 13849 if (oldCapture->isParameterPack()) 13850 continue; 13851 13852 VarDecl *newCapture = 13853 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13854 oldCapture)); 13855 assert(blockScope->CaptureMap.count(newCapture)); 13856 } 13857 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13858 } 13859 #endif 13860 13861 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13862 /*Scope=*/nullptr); 13863 } 13864 13865 template<typename Derived> 13866 ExprResult 13867 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13868 llvm_unreachable("Cannot transform asType expressions yet"); 13869 } 13870 13871 template<typename Derived> 13872 ExprResult 13873 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13874 bool ArgumentChanged = false; 13875 SmallVector<Expr*, 8> SubExprs; 13876 SubExprs.reserve(E->getNumSubExprs()); 13877 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13878 SubExprs, &ArgumentChanged)) 13879 return ExprError(); 13880 13881 if (!getDerived().AlwaysRebuild() && 13882 !ArgumentChanged) 13883 return E; 13884 13885 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13886 E->getOp(), E->getRParenLoc()); 13887 } 13888 13889 //===----------------------------------------------------------------------===// 13890 // Type reconstruction 13891 //===----------------------------------------------------------------------===// 13892 13893 template<typename Derived> 13894 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 13895 SourceLocation Star) { 13896 return SemaRef.BuildPointerType(PointeeType, Star, 13897 getDerived().getBaseEntity()); 13898 } 13899 13900 template<typename Derived> 13901 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 13902 SourceLocation Star) { 13903 return SemaRef.BuildBlockPointerType(PointeeType, Star, 13904 getDerived().getBaseEntity()); 13905 } 13906 13907 template<typename Derived> 13908 QualType 13909 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 13910 bool WrittenAsLValue, 13911 SourceLocation Sigil) { 13912 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 13913 Sigil, getDerived().getBaseEntity()); 13914 } 13915 13916 template<typename Derived> 13917 QualType 13918 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 13919 QualType ClassType, 13920 SourceLocation Sigil) { 13921 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 13922 getDerived().getBaseEntity()); 13923 } 13924 13925 template<typename Derived> 13926 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 13927 const ObjCTypeParamDecl *Decl, 13928 SourceLocation ProtocolLAngleLoc, 13929 ArrayRef<ObjCProtocolDecl *> Protocols, 13930 ArrayRef<SourceLocation> ProtocolLocs, 13931 SourceLocation ProtocolRAngleLoc) { 13932 return SemaRef.BuildObjCTypeParamType(Decl, 13933 ProtocolLAngleLoc, Protocols, 13934 ProtocolLocs, ProtocolRAngleLoc, 13935 /*FailOnError=*/true); 13936 } 13937 13938 template<typename Derived> 13939 QualType TreeTransform<Derived>::RebuildObjCObjectType( 13940 QualType BaseType, 13941 SourceLocation Loc, 13942 SourceLocation TypeArgsLAngleLoc, 13943 ArrayRef<TypeSourceInfo *> TypeArgs, 13944 SourceLocation TypeArgsRAngleLoc, 13945 SourceLocation ProtocolLAngleLoc, 13946 ArrayRef<ObjCProtocolDecl *> Protocols, 13947 ArrayRef<SourceLocation> ProtocolLocs, 13948 SourceLocation ProtocolRAngleLoc) { 13949 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 13950 TypeArgs, TypeArgsRAngleLoc, 13951 ProtocolLAngleLoc, Protocols, ProtocolLocs, 13952 ProtocolRAngleLoc, 13953 /*FailOnError=*/true); 13954 } 13955 13956 template<typename Derived> 13957 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 13958 QualType PointeeType, 13959 SourceLocation Star) { 13960 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 13961 } 13962 13963 template<typename Derived> 13964 QualType 13965 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 13966 ArrayType::ArraySizeModifier SizeMod, 13967 const llvm::APInt *Size, 13968 Expr *SizeExpr, 13969 unsigned IndexTypeQuals, 13970 SourceRange BracketsRange) { 13971 if (SizeExpr || !Size) 13972 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 13973 IndexTypeQuals, BracketsRange, 13974 getDerived().getBaseEntity()); 13975 13976 QualType Types[] = { 13977 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 13978 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 13979 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 13980 }; 13981 const unsigned NumTypes = llvm::array_lengthof(Types); 13982 QualType SizeType; 13983 for (unsigned I = 0; I != NumTypes; ++I) 13984 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 13985 SizeType = Types[I]; 13986 break; 13987 } 13988 13989 // Note that we can return a VariableArrayType here in the case where 13990 // the element type was a dependent VariableArrayType. 13991 IntegerLiteral *ArraySize 13992 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 13993 /*FIXME*/BracketsRange.getBegin()); 13994 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 13995 IndexTypeQuals, BracketsRange, 13996 getDerived().getBaseEntity()); 13997 } 13998 13999 template<typename Derived> 14000 QualType 14001 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14002 ArrayType::ArraySizeModifier SizeMod, 14003 const llvm::APInt &Size, 14004 Expr *SizeExpr, 14005 unsigned IndexTypeQuals, 14006 SourceRange BracketsRange) { 14007 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14008 IndexTypeQuals, BracketsRange); 14009 } 14010 14011 template<typename Derived> 14012 QualType 14013 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14014 ArrayType::ArraySizeModifier SizeMod, 14015 unsigned IndexTypeQuals, 14016 SourceRange BracketsRange) { 14017 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14018 IndexTypeQuals, BracketsRange); 14019 } 14020 14021 template<typename Derived> 14022 QualType 14023 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14024 ArrayType::ArraySizeModifier SizeMod, 14025 Expr *SizeExpr, 14026 unsigned IndexTypeQuals, 14027 SourceRange BracketsRange) { 14028 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14029 SizeExpr, 14030 IndexTypeQuals, BracketsRange); 14031 } 14032 14033 template<typename Derived> 14034 QualType 14035 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14036 ArrayType::ArraySizeModifier SizeMod, 14037 Expr *SizeExpr, 14038 unsigned IndexTypeQuals, 14039 SourceRange BracketsRange) { 14040 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14041 SizeExpr, 14042 IndexTypeQuals, BracketsRange); 14043 } 14044 14045 template <typename Derived> 14046 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14047 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14048 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14049 AttributeLoc); 14050 } 14051 14052 template <typename Derived> 14053 QualType 14054 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14055 unsigned NumElements, 14056 VectorType::VectorKind VecKind) { 14057 // FIXME: semantic checking! 14058 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14059 } 14060 14061 template <typename Derived> 14062 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14063 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14064 VectorType::VectorKind VecKind) { 14065 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14066 } 14067 14068 template<typename Derived> 14069 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14070 unsigned NumElements, 14071 SourceLocation AttributeLoc) { 14072 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14073 NumElements, true); 14074 IntegerLiteral *VectorSize 14075 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14076 AttributeLoc); 14077 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14078 } 14079 14080 template<typename Derived> 14081 QualType 14082 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14083 Expr *SizeExpr, 14084 SourceLocation AttributeLoc) { 14085 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14086 } 14087 14088 template <typename Derived> 14089 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14090 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14091 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14092 NumColumns); 14093 } 14094 14095 template <typename Derived> 14096 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14097 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14098 SourceLocation AttributeLoc) { 14099 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14100 AttributeLoc); 14101 } 14102 14103 template<typename Derived> 14104 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14105 QualType T, 14106 MutableArrayRef<QualType> ParamTypes, 14107 const FunctionProtoType::ExtProtoInfo &EPI) { 14108 return SemaRef.BuildFunctionType(T, ParamTypes, 14109 getDerived().getBaseLocation(), 14110 getDerived().getBaseEntity(), 14111 EPI); 14112 } 14113 14114 template<typename Derived> 14115 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14116 return SemaRef.Context.getFunctionNoProtoType(T); 14117 } 14118 14119 template<typename Derived> 14120 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14121 Decl *D) { 14122 assert(D && "no decl found"); 14123 if (D->isInvalidDecl()) return QualType(); 14124 14125 // FIXME: Doesn't account for ObjCInterfaceDecl! 14126 TypeDecl *Ty; 14127 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14128 // A valid resolved using typename pack expansion decl can have multiple 14129 // UsingDecls, but they must each have exactly one type, and it must be 14130 // the same type in every case. But we must have at least one expansion! 14131 if (UPD->expansions().empty()) { 14132 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14133 << UPD->isCXXClassMember() << UPD; 14134 return QualType(); 14135 } 14136 14137 // We might still have some unresolved types. Try to pick a resolved type 14138 // if we can. The final instantiation will check that the remaining 14139 // unresolved types instantiate to the type we pick. 14140 QualType FallbackT; 14141 QualType T; 14142 for (auto *E : UPD->expansions()) { 14143 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14144 if (ThisT.isNull()) 14145 continue; 14146 else if (ThisT->getAs<UnresolvedUsingType>()) 14147 FallbackT = ThisT; 14148 else if (T.isNull()) 14149 T = ThisT; 14150 else 14151 assert(getSema().Context.hasSameType(ThisT, T) && 14152 "mismatched resolved types in using pack expansion"); 14153 } 14154 return T.isNull() ? FallbackT : T; 14155 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14156 assert(Using->hasTypename() && 14157 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14158 14159 // A valid resolved using typename decl points to exactly one type decl. 14160 assert(++Using->shadow_begin() == Using->shadow_end()); 14161 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 14162 } else { 14163 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14164 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14165 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14166 } 14167 14168 return SemaRef.Context.getTypeDeclType(Ty); 14169 } 14170 14171 template<typename Derived> 14172 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14173 SourceLocation Loc) { 14174 return SemaRef.BuildTypeofExprType(E, Loc); 14175 } 14176 14177 template<typename Derived> 14178 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14179 return SemaRef.Context.getTypeOfType(Underlying); 14180 } 14181 14182 template<typename Derived> 14183 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14184 SourceLocation Loc) { 14185 return SemaRef.BuildDecltypeType(E, Loc); 14186 } 14187 14188 template<typename Derived> 14189 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14190 UnaryTransformType::UTTKind UKind, 14191 SourceLocation Loc) { 14192 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14193 } 14194 14195 template<typename Derived> 14196 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14197 TemplateName Template, 14198 SourceLocation TemplateNameLoc, 14199 TemplateArgumentListInfo &TemplateArgs) { 14200 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14201 } 14202 14203 template<typename Derived> 14204 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14205 SourceLocation KWLoc) { 14206 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14207 } 14208 14209 template<typename Derived> 14210 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14211 SourceLocation KWLoc, 14212 bool isReadPipe) { 14213 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14214 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14215 } 14216 14217 template <typename Derived> 14218 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14219 unsigned NumBits, 14220 SourceLocation Loc) { 14221 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14222 NumBits, true); 14223 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14224 SemaRef.Context.IntTy, Loc); 14225 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14226 } 14227 14228 template <typename Derived> 14229 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14230 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14231 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14232 } 14233 14234 template<typename Derived> 14235 TemplateName 14236 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14237 bool TemplateKW, 14238 TemplateDecl *Template) { 14239 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14240 Template); 14241 } 14242 14243 template<typename Derived> 14244 TemplateName 14245 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14246 SourceLocation TemplateKWLoc, 14247 const IdentifierInfo &Name, 14248 SourceLocation NameLoc, 14249 QualType ObjectType, 14250 NamedDecl *FirstQualifierInScope, 14251 bool AllowInjectedClassName) { 14252 UnqualifiedId TemplateName; 14253 TemplateName.setIdentifier(&Name, NameLoc); 14254 Sema::TemplateTy Template; 14255 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14256 TemplateName, ParsedType::make(ObjectType), 14257 /*EnteringContext=*/false, Template, 14258 AllowInjectedClassName); 14259 return Template.get(); 14260 } 14261 14262 template<typename Derived> 14263 TemplateName 14264 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14265 SourceLocation TemplateKWLoc, 14266 OverloadedOperatorKind Operator, 14267 SourceLocation NameLoc, 14268 QualType ObjectType, 14269 bool AllowInjectedClassName) { 14270 UnqualifiedId Name; 14271 // FIXME: Bogus location information. 14272 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14273 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14274 Sema::TemplateTy Template; 14275 getSema().ActOnTemplateName( 14276 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14277 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14278 return Template.get(); 14279 } 14280 14281 template<typename Derived> 14282 ExprResult 14283 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14284 SourceLocation OpLoc, 14285 Expr *OrigCallee, 14286 Expr *First, 14287 Expr *Second) { 14288 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14289 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14290 14291 if (First->getObjectKind() == OK_ObjCProperty) { 14292 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14293 if (BinaryOperator::isAssignmentOp(Opc)) 14294 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14295 First, Second); 14296 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14297 if (Result.isInvalid()) 14298 return ExprError(); 14299 First = Result.get(); 14300 } 14301 14302 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14303 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14304 if (Result.isInvalid()) 14305 return ExprError(); 14306 Second = Result.get(); 14307 } 14308 14309 // Determine whether this should be a builtin operation. 14310 if (Op == OO_Subscript) { 14311 if (!First->getType()->isOverloadableType() && 14312 !Second->getType()->isOverloadableType()) 14313 return getSema().CreateBuiltinArraySubscriptExpr( 14314 First, Callee->getBeginLoc(), Second, OpLoc); 14315 } else if (Op == OO_Arrow) { 14316 // -> is never a builtin operation. 14317 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14318 } else if (Second == nullptr || isPostIncDec) { 14319 if (!First->getType()->isOverloadableType() || 14320 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14321 // The argument is not of overloadable type, or this is an expression 14322 // of the form &Class::member, so try to create a built-in unary 14323 // operation. 14324 UnaryOperatorKind Opc 14325 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14326 14327 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14328 } 14329 } else { 14330 if (!First->getType()->isOverloadableType() && 14331 !Second->getType()->isOverloadableType()) { 14332 // Neither of the arguments is an overloadable type, so try to 14333 // create a built-in binary operation. 14334 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14335 ExprResult Result 14336 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14337 if (Result.isInvalid()) 14338 return ExprError(); 14339 14340 return Result; 14341 } 14342 } 14343 14344 // Compute the transformed set of functions (and function templates) to be 14345 // used during overload resolution. 14346 UnresolvedSet<16> Functions; 14347 bool RequiresADL; 14348 14349 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14350 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14351 // If the overload could not be resolved in the template definition 14352 // (because we had a dependent argument), ADL is performed as part of 14353 // template instantiation. 14354 RequiresADL = ULE->requiresADL(); 14355 } else { 14356 // If we've resolved this to a particular non-member function, just call 14357 // that function. If we resolved it to a member function, 14358 // CreateOverloaded* will find that function for us. 14359 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14360 if (!isa<CXXMethodDecl>(ND)) 14361 Functions.addDecl(ND); 14362 RequiresADL = false; 14363 } 14364 14365 // Add any functions found via argument-dependent lookup. 14366 Expr *Args[2] = { First, Second }; 14367 unsigned NumArgs = 1 + (Second != nullptr); 14368 14369 // Create the overloaded operator invocation for unary operators. 14370 if (NumArgs == 1 || isPostIncDec) { 14371 UnaryOperatorKind Opc 14372 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14373 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14374 RequiresADL); 14375 } 14376 14377 if (Op == OO_Subscript) { 14378 SourceLocation LBrace; 14379 SourceLocation RBrace; 14380 14381 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14382 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14383 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14384 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14385 } else { 14386 LBrace = Callee->getBeginLoc(); 14387 RBrace = OpLoc; 14388 } 14389 14390 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14391 First, Second); 14392 } 14393 14394 // Create the overloaded operator invocation for binary operators. 14395 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14396 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14397 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14398 if (Result.isInvalid()) 14399 return ExprError(); 14400 14401 return Result; 14402 } 14403 14404 template<typename Derived> 14405 ExprResult 14406 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14407 SourceLocation OperatorLoc, 14408 bool isArrow, 14409 CXXScopeSpec &SS, 14410 TypeSourceInfo *ScopeType, 14411 SourceLocation CCLoc, 14412 SourceLocation TildeLoc, 14413 PseudoDestructorTypeStorage Destroyed) { 14414 QualType BaseType = Base->getType(); 14415 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14416 (!isArrow && !BaseType->getAs<RecordType>()) || 14417 (isArrow && BaseType->getAs<PointerType>() && 14418 !BaseType->castAs<PointerType>()->getPointeeType() 14419 ->template getAs<RecordType>())){ 14420 // This pseudo-destructor expression is still a pseudo-destructor. 14421 return SemaRef.BuildPseudoDestructorExpr( 14422 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14423 CCLoc, TildeLoc, Destroyed); 14424 } 14425 14426 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14427 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14428 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14429 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14430 NameInfo.setNamedTypeInfo(DestroyedType); 14431 14432 // The scope type is now known to be a valid nested name specifier 14433 // component. Tack it on to the end of the nested name specifier. 14434 if (ScopeType) { 14435 if (!ScopeType->getType()->getAs<TagType>()) { 14436 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14437 diag::err_expected_class_or_namespace) 14438 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14439 return ExprError(); 14440 } 14441 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14442 CCLoc); 14443 } 14444 14445 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14446 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14447 OperatorLoc, isArrow, 14448 SS, TemplateKWLoc, 14449 /*FIXME: FirstQualifier*/ nullptr, 14450 NameInfo, 14451 /*TemplateArgs*/ nullptr, 14452 /*S*/nullptr); 14453 } 14454 14455 template<typename Derived> 14456 StmtResult 14457 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14458 SourceLocation Loc = S->getBeginLoc(); 14459 CapturedDecl *CD = S->getCapturedDecl(); 14460 unsigned NumParams = CD->getNumParams(); 14461 unsigned ContextParamPos = CD->getContextParamPosition(); 14462 SmallVector<Sema::CapturedParamNameType, 4> Params; 14463 for (unsigned I = 0; I < NumParams; ++I) { 14464 if (I != ContextParamPos) { 14465 Params.push_back( 14466 std::make_pair( 14467 CD->getParam(I)->getName(), 14468 getDerived().TransformType(CD->getParam(I)->getType()))); 14469 } else { 14470 Params.push_back(std::make_pair(StringRef(), QualType())); 14471 } 14472 } 14473 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14474 S->getCapturedRegionKind(), Params); 14475 StmtResult Body; 14476 { 14477 Sema::CompoundScopeRAII CompoundScope(getSema()); 14478 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14479 } 14480 14481 if (Body.isInvalid()) { 14482 getSema().ActOnCapturedRegionError(); 14483 return StmtError(); 14484 } 14485 14486 return getSema().ActOnCapturedRegionEnd(Body.get()); 14487 } 14488 14489 } // end namespace clang 14490 14491 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14492