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/OpenMPKinds.h" 32 #include "clang/Sema/Designator.h" 33 #include "clang/Sema/Lookup.h" 34 #include "clang/Sema/Ownership.h" 35 #include "clang/Sema/ParsedTemplate.h" 36 #include "clang/Sema/ScopeInfo.h" 37 #include "clang/Sema/SemaDiagnostic.h" 38 #include "clang/Sema/SemaInternal.h" 39 #include "llvm/ADT/ArrayRef.h" 40 #include "llvm/Support/ErrorHandling.h" 41 #include <algorithm> 42 43 using namespace llvm::omp; 44 45 namespace clang { 46 using namespace sema; 47 48 /// A semantic tree transformation that allows one to transform one 49 /// abstract syntax tree into another. 50 /// 51 /// A new tree transformation is defined by creating a new subclass \c X of 52 /// \c TreeTransform<X> and then overriding certain operations to provide 53 /// behavior specific to that transformation. For example, template 54 /// instantiation is implemented as a tree transformation where the 55 /// transformation of TemplateTypeParmType nodes involves substituting the 56 /// template arguments for their corresponding template parameters; a similar 57 /// transformation is performed for non-type template parameters and 58 /// template template parameters. 59 /// 60 /// This tree-transformation template uses static polymorphism to allow 61 /// subclasses to customize any of its operations. Thus, a subclass can 62 /// override any of the transformation or rebuild operators by providing an 63 /// operation with the same signature as the default implementation. The 64 /// overriding function should not be virtual. 65 /// 66 /// Semantic tree transformations are split into two stages, either of which 67 /// can be replaced by a subclass. The "transform" step transforms an AST node 68 /// or the parts of an AST node using the various transformation functions, 69 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 70 /// node of the appropriate kind from the pieces. The default transformation 71 /// routines recursively transform the operands to composite AST nodes (e.g., 72 /// the pointee type of a PointerType node) and, if any of those operand nodes 73 /// were changed by the transformation, invokes the rebuild operation to create 74 /// a new AST node. 75 /// 76 /// Subclasses can customize the transformation at various levels. The 77 /// most coarse-grained transformations involve replacing TransformType(), 78 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 79 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 80 /// new implementations. 81 /// 82 /// For more fine-grained transformations, subclasses can replace any of the 83 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 84 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 85 /// replacing TransformTemplateTypeParmType() allows template instantiation 86 /// to substitute template arguments for their corresponding template 87 /// parameters. Additionally, subclasses can override the \c RebuildXXX 88 /// functions to control how AST nodes are rebuilt when their operands change. 89 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 90 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 91 /// be able to use more efficient rebuild steps. 92 /// 93 /// There are a handful of other functions that can be overridden, allowing one 94 /// to avoid traversing nodes that don't need any transformation 95 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 96 /// operands have not changed (\c AlwaysRebuild()), and customize the 97 /// default locations and entity names used for type-checking 98 /// (\c getBaseLocation(), \c getBaseEntity()). 99 template<typename Derived> 100 class TreeTransform { 101 /// Private RAII object that helps us forget and then re-remember 102 /// the template argument corresponding to a partially-substituted parameter 103 /// pack. 104 class ForgetPartiallySubstitutedPackRAII { 105 Derived &Self; 106 TemplateArgument Old; 107 108 public: 109 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 110 Old = Self.ForgetPartiallySubstitutedPack(); 111 } 112 113 ~ForgetPartiallySubstitutedPackRAII() { 114 Self.RememberPartiallySubstitutedPack(Old); 115 } 116 }; 117 118 protected: 119 Sema &SemaRef; 120 121 /// The set of local declarations that have been transformed, for 122 /// cases where we are forced to build new declarations within the transformer 123 /// rather than in the subclass (e.g., lambda closure types). 124 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 125 126 public: 127 /// Initializes a new tree transformer. 128 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 129 130 /// Retrieves a reference to the derived class. 131 Derived &getDerived() { return static_cast<Derived&>(*this); } 132 133 /// Retrieves a reference to the derived class. 134 const Derived &getDerived() const { 135 return static_cast<const Derived&>(*this); 136 } 137 138 static inline ExprResult Owned(Expr *E) { return E; } 139 static inline StmtResult Owned(Stmt *S) { return S; } 140 141 /// Retrieves a reference to the semantic analysis object used for 142 /// this tree transform. 143 Sema &getSema() const { return SemaRef; } 144 145 /// Whether the transformation should always rebuild AST nodes, even 146 /// if none of the children have changed. 147 /// 148 /// Subclasses may override this function to specify when the transformation 149 /// should rebuild all AST nodes. 150 /// 151 /// We must always rebuild all AST nodes when performing variadic template 152 /// pack expansion, in order to avoid violating the AST invariant that each 153 /// statement node appears at most once in its containing declaration. 154 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 155 156 /// Whether the transformation is forming an expression or statement that 157 /// replaces the original. In this case, we'll reuse mangling numbers from 158 /// existing lambdas. 159 bool ReplacingOriginal() { return false; } 160 161 /// Wether CXXConstructExpr can be skipped when they are implicit. 162 /// They will be reconstructed when used if needed. 163 /// This is usefull when the user that cause rebuilding of the 164 /// CXXConstructExpr is outside of the expression at which the TreeTransform 165 /// started. 166 bool AllowSkippingCXXConstructExpr() { return true; } 167 168 /// Returns the location of the entity being transformed, if that 169 /// information was not available elsewhere in the AST. 170 /// 171 /// By default, returns no source-location information. Subclasses can 172 /// provide an alternative implementation that provides better location 173 /// information. 174 SourceLocation getBaseLocation() { return SourceLocation(); } 175 176 /// Returns the name of the entity being transformed, if that 177 /// information was not available elsewhere in the AST. 178 /// 179 /// By default, returns an empty name. Subclasses can provide an alternative 180 /// implementation with a more precise name. 181 DeclarationName getBaseEntity() { return DeclarationName(); } 182 183 /// Sets the "base" location and entity when that 184 /// information is known based on another transformation. 185 /// 186 /// By default, the source location and entity are ignored. Subclasses can 187 /// override this function to provide a customized implementation. 188 void setBase(SourceLocation Loc, DeclarationName Entity) { } 189 190 /// RAII object that temporarily sets the base location and entity 191 /// used for reporting diagnostics in types. 192 class TemporaryBase { 193 TreeTransform &Self; 194 SourceLocation OldLocation; 195 DeclarationName OldEntity; 196 197 public: 198 TemporaryBase(TreeTransform &Self, SourceLocation Location, 199 DeclarationName Entity) : Self(Self) { 200 OldLocation = Self.getDerived().getBaseLocation(); 201 OldEntity = Self.getDerived().getBaseEntity(); 202 203 if (Location.isValid()) 204 Self.getDerived().setBase(Location, Entity); 205 } 206 207 ~TemporaryBase() { 208 Self.getDerived().setBase(OldLocation, OldEntity); 209 } 210 }; 211 212 /// Determine whether the given type \p T has already been 213 /// transformed. 214 /// 215 /// Subclasses can provide an alternative implementation of this routine 216 /// to short-circuit evaluation when it is known that a given type will 217 /// not change. For example, template instantiation need not traverse 218 /// non-dependent types. 219 bool AlreadyTransformed(QualType T) { 220 return T.isNull(); 221 } 222 223 /// Transform a template parameter depth level. 224 /// 225 /// During a transformation that transforms template parameters, this maps 226 /// an old template parameter depth to a new depth. 227 unsigned TransformTemplateDepth(unsigned Depth) { 228 return Depth; 229 } 230 231 /// Determine whether the given call argument should be dropped, e.g., 232 /// because it is a default argument. 233 /// 234 /// Subclasses can provide an alternative implementation of this routine to 235 /// determine which kinds of call arguments get dropped. By default, 236 /// CXXDefaultArgument nodes are dropped (prior to transformation). 237 bool DropCallArgument(Expr *E) { 238 return E->isDefaultArgument(); 239 } 240 241 /// Determine whether we should expand a pack expansion with the 242 /// given set of parameter packs into separate arguments by repeatedly 243 /// transforming the pattern. 244 /// 245 /// By default, the transformer never tries to expand pack expansions. 246 /// Subclasses can override this routine to provide different behavior. 247 /// 248 /// \param EllipsisLoc The location of the ellipsis that identifies the 249 /// pack expansion. 250 /// 251 /// \param PatternRange The source range that covers the entire pattern of 252 /// the pack expansion. 253 /// 254 /// \param Unexpanded The set of unexpanded parameter packs within the 255 /// pattern. 256 /// 257 /// \param ShouldExpand Will be set to \c true if the transformer should 258 /// expand the corresponding pack expansions into separate arguments. When 259 /// set, \c NumExpansions must also be set. 260 /// 261 /// \param RetainExpansion Whether the caller should add an unexpanded 262 /// pack expansion after all of the expanded arguments. This is used 263 /// when extending explicitly-specified template argument packs per 264 /// C++0x [temp.arg.explicit]p9. 265 /// 266 /// \param NumExpansions The number of separate arguments that will be in 267 /// the expanded form of the corresponding pack expansion. This is both an 268 /// input and an output parameter, which can be set by the caller if the 269 /// number of expansions is known a priori (e.g., due to a prior substitution) 270 /// and will be set by the callee when the number of expansions is known. 271 /// The callee must set this value when \c ShouldExpand is \c true; it may 272 /// set this value in other cases. 273 /// 274 /// \returns true if an error occurred (e.g., because the parameter packs 275 /// are to be instantiated with arguments of different lengths), false 276 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 277 /// must be set. 278 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 279 SourceRange PatternRange, 280 ArrayRef<UnexpandedParameterPack> Unexpanded, 281 bool &ShouldExpand, 282 bool &RetainExpansion, 283 Optional<unsigned> &NumExpansions) { 284 ShouldExpand = false; 285 return false; 286 } 287 288 /// "Forget" about the partially-substituted pack template argument, 289 /// when performing an instantiation that must preserve the parameter pack 290 /// use. 291 /// 292 /// This routine is meant to be overridden by the template instantiator. 293 TemplateArgument ForgetPartiallySubstitutedPack() { 294 return TemplateArgument(); 295 } 296 297 /// "Remember" the partially-substituted pack template argument 298 /// after performing an instantiation that must preserve the parameter pack 299 /// use. 300 /// 301 /// This routine is meant to be overridden by the template instantiator. 302 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 303 304 /// Note to the derived class when a function parameter pack is 305 /// being expanded. 306 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 307 308 /// Transforms the given type into another type. 309 /// 310 /// By default, this routine transforms a type by creating a 311 /// TypeSourceInfo for it and delegating to the appropriate 312 /// function. This is expensive, but we don't mind, because 313 /// this method is deprecated anyway; all users should be 314 /// switched to storing TypeSourceInfos. 315 /// 316 /// \returns the transformed type. 317 QualType TransformType(QualType T); 318 319 /// Transforms the given type-with-location into a new 320 /// type-with-location. 321 /// 322 /// By default, this routine transforms a type by delegating to the 323 /// appropriate TransformXXXType to build a new type. Subclasses 324 /// may override this function (to take over all type 325 /// transformations) or some set of the TransformXXXType functions 326 /// to alter the transformation. 327 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 328 329 /// Transform the given type-with-location into a new 330 /// type, collecting location information in the given builder 331 /// as necessary. 332 /// 333 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 334 335 /// Transform a type that is permitted to produce a 336 /// DeducedTemplateSpecializationType. 337 /// 338 /// This is used in the (relatively rare) contexts where it is acceptable 339 /// for transformation to produce a class template type with deduced 340 /// template arguments. 341 /// @{ 342 QualType TransformTypeWithDeducedTST(QualType T); 343 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 344 /// @} 345 346 /// The reason why the value of a statement is not discarded, if any. 347 enum StmtDiscardKind { 348 SDK_Discarded, 349 SDK_NotDiscarded, 350 SDK_StmtExprResult, 351 }; 352 353 /// Transform the given statement. 354 /// 355 /// By default, this routine transforms a statement by delegating to the 356 /// appropriate TransformXXXStmt function to transform a specific kind of 357 /// statement or the TransformExpr() function to transform an expression. 358 /// Subclasses may override this function to transform statements using some 359 /// other mechanism. 360 /// 361 /// \returns the transformed statement. 362 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 363 364 /// Transform the given statement. 365 /// 366 /// By default, this routine transforms a statement by delegating to the 367 /// appropriate TransformOMPXXXClause function to transform a specific kind 368 /// of clause. Subclasses may override this function to transform statements 369 /// using some other mechanism. 370 /// 371 /// \returns the transformed OpenMP clause. 372 OMPClause *TransformOMPClause(OMPClause *S); 373 374 /// Transform the given attribute. 375 /// 376 /// By default, this routine transforms a statement by delegating to the 377 /// appropriate TransformXXXAttr function to transform a specific kind 378 /// of attribute. Subclasses may override this function to transform 379 /// attributed statements using some other mechanism. 380 /// 381 /// \returns the transformed attribute 382 const Attr *TransformAttr(const Attr *S); 383 384 /// Transform the specified attribute. 385 /// 386 /// Subclasses should override the transformation of attributes with a pragma 387 /// spelling to transform expressions stored within the attribute. 388 /// 389 /// \returns the transformed attribute. 390 #define ATTR(X) 391 #define PRAGMA_SPELLING_ATTR(X) \ 392 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 393 #include "clang/Basic/AttrList.inc" 394 395 /// Transform the given expression. 396 /// 397 /// By default, this routine transforms an expression by delegating to the 398 /// appropriate TransformXXXExpr function to build a new expression. 399 /// Subclasses may override this function to transform expressions using some 400 /// other mechanism. 401 /// 402 /// \returns the transformed expression. 403 ExprResult TransformExpr(Expr *E); 404 405 /// Transform the given initializer. 406 /// 407 /// By default, this routine transforms an initializer by stripping off the 408 /// semantic nodes added by initialization, then passing the result to 409 /// TransformExpr or TransformExprs. 410 /// 411 /// \returns the transformed initializer. 412 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 413 414 /// Transform the given list of expressions. 415 /// 416 /// This routine transforms a list of expressions by invoking 417 /// \c TransformExpr() for each subexpression. However, it also provides 418 /// support for variadic templates by expanding any pack expansions (if the 419 /// derived class permits such expansion) along the way. When pack expansions 420 /// are present, the number of outputs may not equal the number of inputs. 421 /// 422 /// \param Inputs The set of expressions to be transformed. 423 /// 424 /// \param NumInputs The number of expressions in \c Inputs. 425 /// 426 /// \param IsCall If \c true, then this transform is being performed on 427 /// function-call arguments, and any arguments that should be dropped, will 428 /// be. 429 /// 430 /// \param Outputs The transformed input expressions will be added to this 431 /// vector. 432 /// 433 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 434 /// due to transformation. 435 /// 436 /// \returns true if an error occurred, false otherwise. 437 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 438 SmallVectorImpl<Expr *> &Outputs, 439 bool *ArgChanged = nullptr); 440 441 /// Transform the given declaration, which is referenced from a type 442 /// or expression. 443 /// 444 /// By default, acts as the identity function on declarations, unless the 445 /// transformer has had to transform the declaration itself. Subclasses 446 /// may override this function to provide alternate behavior. 447 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 448 llvm::DenseMap<Decl *, Decl *>::iterator Known 449 = TransformedLocalDecls.find(D); 450 if (Known != TransformedLocalDecls.end()) 451 return Known->second; 452 453 return D; 454 } 455 456 /// Transform the specified condition. 457 /// 458 /// By default, this transforms the variable and expression and rebuilds 459 /// the condition. 460 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 461 Expr *Expr, 462 Sema::ConditionKind Kind); 463 464 /// Transform the attributes associated with the given declaration and 465 /// place them on the new declaration. 466 /// 467 /// By default, this operation does nothing. Subclasses may override this 468 /// behavior to transform attributes. 469 void transformAttrs(Decl *Old, Decl *New) { } 470 471 /// Note that a local declaration has been transformed by this 472 /// transformer. 473 /// 474 /// Local declarations are typically transformed via a call to 475 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 476 /// the transformer itself has to transform the declarations. This routine 477 /// can be overridden by a subclass that keeps track of such mappings. 478 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 479 assert(New.size() == 1 && 480 "must override transformedLocalDecl if performing pack expansion"); 481 TransformedLocalDecls[Old] = New.front(); 482 } 483 484 /// Transform the definition of the given declaration. 485 /// 486 /// By default, invokes TransformDecl() to transform the declaration. 487 /// Subclasses may override this function to provide alternate behavior. 488 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 489 return getDerived().TransformDecl(Loc, D); 490 } 491 492 /// Transform the given declaration, which was the first part of a 493 /// nested-name-specifier in a member access expression. 494 /// 495 /// This specific declaration transformation only applies to the first 496 /// identifier in a nested-name-specifier of a member access expression, e.g., 497 /// the \c T in \c x->T::member 498 /// 499 /// By default, invokes TransformDecl() to transform the declaration. 500 /// Subclasses may override this function to provide alternate behavior. 501 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 502 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 503 } 504 505 /// Transform the set of declarations in an OverloadExpr. 506 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 507 LookupResult &R); 508 509 /// Transform the given nested-name-specifier with source-location 510 /// information. 511 /// 512 /// By default, transforms all of the types and declarations within the 513 /// nested-name-specifier. Subclasses may override this function to provide 514 /// alternate behavior. 515 NestedNameSpecifierLoc 516 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 517 QualType ObjectType = QualType(), 518 NamedDecl *FirstQualifierInScope = nullptr); 519 520 /// Transform the given declaration name. 521 /// 522 /// By default, transforms the types of conversion function, constructor, 523 /// and destructor names and then (if needed) rebuilds the declaration name. 524 /// Identifiers and selectors are returned unmodified. Sublcasses may 525 /// override this function to provide alternate behavior. 526 DeclarationNameInfo 527 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 528 529 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 530 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 531 concepts::TypeRequirement * 532 TransformTypeRequirement(concepts::TypeRequirement *Req); 533 concepts::ExprRequirement * 534 TransformExprRequirement(concepts::ExprRequirement *Req); 535 concepts::NestedRequirement * 536 TransformNestedRequirement(concepts::NestedRequirement *Req); 537 538 /// Transform the given template name. 539 /// 540 /// \param SS The nested-name-specifier that qualifies the template 541 /// name. This nested-name-specifier must already have been transformed. 542 /// 543 /// \param Name The template name to transform. 544 /// 545 /// \param NameLoc The source location of the template name. 546 /// 547 /// \param ObjectType If we're translating a template name within a member 548 /// access expression, this is the type of the object whose member template 549 /// is being referenced. 550 /// 551 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 552 /// also refers to a name within the current (lexical) scope, this is the 553 /// declaration it refers to. 554 /// 555 /// By default, transforms the template name by transforming the declarations 556 /// and nested-name-specifiers that occur within the template name. 557 /// Subclasses may override this function to provide alternate behavior. 558 TemplateName 559 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 560 SourceLocation NameLoc, 561 QualType ObjectType = QualType(), 562 NamedDecl *FirstQualifierInScope = nullptr, 563 bool AllowInjectedClassName = false); 564 565 /// Transform the given template argument. 566 /// 567 /// By default, this operation transforms the type, expression, or 568 /// declaration stored within the template argument and constructs a 569 /// new template argument from the transformed result. Subclasses may 570 /// override this function to provide alternate behavior. 571 /// 572 /// Returns true if there was an error. 573 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 574 TemplateArgumentLoc &Output, 575 bool Uneval = false); 576 577 /// Transform the given set of template arguments. 578 /// 579 /// By default, this operation transforms all of the template arguments 580 /// in the input set using \c TransformTemplateArgument(), and appends 581 /// the transformed arguments to the output list. 582 /// 583 /// Note that this overload of \c TransformTemplateArguments() is merely 584 /// a convenience function. Subclasses that wish to override this behavior 585 /// should override the iterator-based member template version. 586 /// 587 /// \param Inputs The set of template arguments to be transformed. 588 /// 589 /// \param NumInputs The number of template arguments in \p Inputs. 590 /// 591 /// \param Outputs The set of transformed template arguments output by this 592 /// routine. 593 /// 594 /// Returns true if an error occurred. 595 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 596 unsigned NumInputs, 597 TemplateArgumentListInfo &Outputs, 598 bool Uneval = false) { 599 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 600 Uneval); 601 } 602 603 /// Transform the given set of template arguments. 604 /// 605 /// By default, this operation transforms all of the template arguments 606 /// in the input set using \c TransformTemplateArgument(), and appends 607 /// the transformed arguments to the output list. 608 /// 609 /// \param First An iterator to the first template argument. 610 /// 611 /// \param Last An iterator one step past the last template argument. 612 /// 613 /// \param Outputs The set of transformed template arguments output by this 614 /// routine. 615 /// 616 /// Returns true if an error occurred. 617 template<typename InputIterator> 618 bool TransformTemplateArguments(InputIterator First, 619 InputIterator Last, 620 TemplateArgumentListInfo &Outputs, 621 bool Uneval = false); 622 623 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 624 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 625 TemplateArgumentLoc &ArgLoc); 626 627 /// Fakes up a TypeSourceInfo for a type. 628 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 629 return SemaRef.Context.getTrivialTypeSourceInfo(T, 630 getDerived().getBaseLocation()); 631 } 632 633 #define ABSTRACT_TYPELOC(CLASS, PARENT) 634 #define TYPELOC(CLASS, PARENT) \ 635 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 636 #include "clang/AST/TypeLocNodes.def" 637 638 template<typename Fn> 639 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 640 FunctionProtoTypeLoc TL, 641 CXXRecordDecl *ThisContext, 642 Qualifiers ThisTypeQuals, 643 Fn TransformExceptionSpec); 644 645 bool TransformExceptionSpec(SourceLocation Loc, 646 FunctionProtoType::ExceptionSpecInfo &ESI, 647 SmallVectorImpl<QualType> &Exceptions, 648 bool &Changed); 649 650 StmtResult TransformSEHHandler(Stmt *Handler); 651 652 QualType 653 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 654 TemplateSpecializationTypeLoc TL, 655 TemplateName Template); 656 657 QualType 658 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 659 DependentTemplateSpecializationTypeLoc TL, 660 TemplateName Template, 661 CXXScopeSpec &SS); 662 663 QualType TransformDependentTemplateSpecializationType( 664 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 665 NestedNameSpecifierLoc QualifierLoc); 666 667 /// Transforms the parameters of a function type into the 668 /// given vectors. 669 /// 670 /// The result vectors should be kept in sync; null entries in the 671 /// variables vector are acceptable. 672 /// 673 /// Return true on error. 674 bool TransformFunctionTypeParams( 675 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 676 const QualType *ParamTypes, 677 const FunctionProtoType::ExtParameterInfo *ParamInfos, 678 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 679 Sema::ExtParameterInfoBuilder &PInfos); 680 681 /// Transforms a single function-type parameter. Return null 682 /// on error. 683 /// 684 /// \param indexAdjustment - A number to add to the parameter's 685 /// scope index; can be negative 686 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 687 int indexAdjustment, 688 Optional<unsigned> NumExpansions, 689 bool ExpectParameterPack); 690 691 /// Transform the body of a lambda-expression. 692 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 693 /// Alternative implementation of TransformLambdaBody that skips transforming 694 /// the body. 695 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 696 697 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 698 699 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 700 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 701 702 TemplateParameterList *TransformTemplateParameterList( 703 TemplateParameterList *TPL) { 704 return TPL; 705 } 706 707 ExprResult TransformAddressOfOperand(Expr *E); 708 709 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 710 bool IsAddressOfOperand, 711 TypeSourceInfo **RecoveryTSI); 712 713 ExprResult TransformParenDependentScopeDeclRefExpr( 714 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 715 TypeSourceInfo **RecoveryTSI); 716 717 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 718 719 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 720 // amount of stack usage with clang. 721 #define STMT(Node, Parent) \ 722 LLVM_ATTRIBUTE_NOINLINE \ 723 StmtResult Transform##Node(Node *S); 724 #define VALUESTMT(Node, Parent) \ 725 LLVM_ATTRIBUTE_NOINLINE \ 726 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 727 #define EXPR(Node, Parent) \ 728 LLVM_ATTRIBUTE_NOINLINE \ 729 ExprResult Transform##Node(Node *E); 730 #define ABSTRACT_STMT(Stmt) 731 #include "clang/AST/StmtNodes.inc" 732 733 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 734 LLVM_ATTRIBUTE_NOINLINE \ 735 OMPClause *Transform ## Class(Class *S); 736 #include "llvm/Frontend/OpenMP/OMPKinds.def" 737 738 /// Build a new qualified type given its unqualified type and type location. 739 /// 740 /// By default, this routine adds type qualifiers only to types that can 741 /// have qualifiers, and silently suppresses those qualifiers that are not 742 /// permitted. Subclasses may override this routine to provide different 743 /// behavior. 744 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 745 746 /// Build a new pointer type given its pointee type. 747 /// 748 /// By default, performs semantic analysis when building the pointer type. 749 /// Subclasses may override this routine to provide different behavior. 750 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 751 752 /// Build a new block pointer type given its pointee type. 753 /// 754 /// By default, performs semantic analysis when building the block pointer 755 /// type. Subclasses may override this routine to provide different behavior. 756 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 757 758 /// Build a new reference type given the type it references. 759 /// 760 /// By default, performs semantic analysis when building the 761 /// reference type. Subclasses may override this routine to provide 762 /// different behavior. 763 /// 764 /// \param LValue whether the type was written with an lvalue sigil 765 /// or an rvalue sigil. 766 QualType RebuildReferenceType(QualType ReferentType, 767 bool LValue, 768 SourceLocation Sigil); 769 770 /// Build a new member pointer type given the pointee type and the 771 /// class type it refers into. 772 /// 773 /// By default, performs semantic analysis when building the member pointer 774 /// type. Subclasses may override this routine to provide different behavior. 775 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 776 SourceLocation Sigil); 777 778 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 779 SourceLocation ProtocolLAngleLoc, 780 ArrayRef<ObjCProtocolDecl *> Protocols, 781 ArrayRef<SourceLocation> ProtocolLocs, 782 SourceLocation ProtocolRAngleLoc); 783 784 /// Build an Objective-C object type. 785 /// 786 /// By default, performs semantic analysis when building the object type. 787 /// Subclasses may override this routine to provide different behavior. 788 QualType RebuildObjCObjectType(QualType BaseType, 789 SourceLocation Loc, 790 SourceLocation TypeArgsLAngleLoc, 791 ArrayRef<TypeSourceInfo *> TypeArgs, 792 SourceLocation TypeArgsRAngleLoc, 793 SourceLocation ProtocolLAngleLoc, 794 ArrayRef<ObjCProtocolDecl *> Protocols, 795 ArrayRef<SourceLocation> ProtocolLocs, 796 SourceLocation ProtocolRAngleLoc); 797 798 /// Build a new Objective-C object pointer type given the pointee type. 799 /// 800 /// By default, directly builds the pointer type, with no additional semantic 801 /// analysis. 802 QualType RebuildObjCObjectPointerType(QualType PointeeType, 803 SourceLocation Star); 804 805 /// Build a new array type given the element type, size 806 /// modifier, size of the array (if known), size expression, and index type 807 /// qualifiers. 808 /// 809 /// By default, performs semantic analysis when building the array type. 810 /// Subclasses may override this routine to provide different behavior. 811 /// Also by default, all of the other Rebuild*Array 812 QualType RebuildArrayType(QualType ElementType, 813 ArrayType::ArraySizeModifier SizeMod, 814 const llvm::APInt *Size, 815 Expr *SizeExpr, 816 unsigned IndexTypeQuals, 817 SourceRange BracketsRange); 818 819 /// Build a new constant array type given the element type, size 820 /// modifier, (known) size of the array, and index type qualifiers. 821 /// 822 /// By default, performs semantic analysis when building the array type. 823 /// Subclasses may override this routine to provide different behavior. 824 QualType RebuildConstantArrayType(QualType ElementType, 825 ArrayType::ArraySizeModifier SizeMod, 826 const llvm::APInt &Size, 827 Expr *SizeExpr, 828 unsigned IndexTypeQuals, 829 SourceRange BracketsRange); 830 831 /// Build a new incomplete array type given the element type, size 832 /// modifier, and index type qualifiers. 833 /// 834 /// By default, performs semantic analysis when building the array type. 835 /// Subclasses may override this routine to provide different behavior. 836 QualType RebuildIncompleteArrayType(QualType ElementType, 837 ArrayType::ArraySizeModifier SizeMod, 838 unsigned IndexTypeQuals, 839 SourceRange BracketsRange); 840 841 /// Build a new variable-length array type given the element type, 842 /// size modifier, size expression, and index type qualifiers. 843 /// 844 /// By default, performs semantic analysis when building the array type. 845 /// Subclasses may override this routine to provide different behavior. 846 QualType RebuildVariableArrayType(QualType ElementType, 847 ArrayType::ArraySizeModifier SizeMod, 848 Expr *SizeExpr, 849 unsigned IndexTypeQuals, 850 SourceRange BracketsRange); 851 852 /// Build a new dependent-sized array type given the element type, 853 /// size modifier, size expression, and index type qualifiers. 854 /// 855 /// By default, performs semantic analysis when building the array type. 856 /// Subclasses may override this routine to provide different behavior. 857 QualType RebuildDependentSizedArrayType(QualType ElementType, 858 ArrayType::ArraySizeModifier SizeMod, 859 Expr *SizeExpr, 860 unsigned IndexTypeQuals, 861 SourceRange BracketsRange); 862 863 /// Build a new vector type given the element type and 864 /// number of elements. 865 /// 866 /// By default, performs semantic analysis when building the vector type. 867 /// Subclasses may override this routine to provide different behavior. 868 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 869 VectorType::VectorKind VecKind); 870 871 /// Build a new potentially dependently-sized extended vector type 872 /// given the element type and number of elements. 873 /// 874 /// By default, performs semantic analysis when building the vector type. 875 /// Subclasses may override this routine to provide different behavior. 876 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 877 SourceLocation AttributeLoc, 878 VectorType::VectorKind); 879 880 /// Build a new extended vector type given the element type and 881 /// number of elements. 882 /// 883 /// By default, performs semantic analysis when building the vector type. 884 /// Subclasses may override this routine to provide different behavior. 885 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 886 SourceLocation AttributeLoc); 887 888 /// Build a new potentially dependently-sized extended vector type 889 /// given the element type and number of elements. 890 /// 891 /// By default, performs semantic analysis when building the vector type. 892 /// Subclasses may override this routine to provide different behavior. 893 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 894 Expr *SizeExpr, 895 SourceLocation AttributeLoc); 896 897 /// Build a new matrix type given the element type and dimensions. 898 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 899 unsigned NumColumns); 900 901 /// Build a new matrix type given the type and dependently-defined 902 /// dimensions. 903 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 904 Expr *ColumnExpr, 905 SourceLocation AttributeLoc); 906 907 /// Build a new DependentAddressSpaceType or return the pointee 908 /// type variable with the correct address space (retrieved from 909 /// AddrSpaceExpr) applied to it. The former will be returned in cases 910 /// where the address space remains dependent. 911 /// 912 /// By default, performs semantic analysis when building the type with address 913 /// space applied. Subclasses may override this routine to provide different 914 /// behavior. 915 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 916 Expr *AddrSpaceExpr, 917 SourceLocation AttributeLoc); 918 919 /// Build a new function type. 920 /// 921 /// By default, performs semantic analysis when building the function type. 922 /// Subclasses may override this routine to provide different behavior. 923 QualType RebuildFunctionProtoType(QualType T, 924 MutableArrayRef<QualType> ParamTypes, 925 const FunctionProtoType::ExtProtoInfo &EPI); 926 927 /// Build a new unprototyped function type. 928 QualType RebuildFunctionNoProtoType(QualType ResultType); 929 930 /// Rebuild an unresolved typename type, given the decl that 931 /// the UnresolvedUsingTypenameDecl was transformed to. 932 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 933 934 /// Build a new typedef type. 935 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 936 return SemaRef.Context.getTypeDeclType(Typedef); 937 } 938 939 /// Build a new MacroDefined type. 940 QualType RebuildMacroQualifiedType(QualType T, 941 const IdentifierInfo *MacroII) { 942 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 943 } 944 945 /// Build a new class/struct/union type. 946 QualType RebuildRecordType(RecordDecl *Record) { 947 return SemaRef.Context.getTypeDeclType(Record); 948 } 949 950 /// Build a new Enum type. 951 QualType RebuildEnumType(EnumDecl *Enum) { 952 return SemaRef.Context.getTypeDeclType(Enum); 953 } 954 955 /// Build a new typeof(expr) type. 956 /// 957 /// By default, performs semantic analysis when building the typeof type. 958 /// Subclasses may override this routine to provide different behavior. 959 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 960 961 /// Build a new typeof(type) type. 962 /// 963 /// By default, builds a new TypeOfType with the given underlying type. 964 QualType RebuildTypeOfType(QualType Underlying); 965 966 /// Build a new unary transform type. 967 QualType RebuildUnaryTransformType(QualType BaseType, 968 UnaryTransformType::UTTKind UKind, 969 SourceLocation Loc); 970 971 /// Build a new C++11 decltype type. 972 /// 973 /// By default, performs semantic analysis when building the decltype type. 974 /// Subclasses may override this routine to provide different behavior. 975 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 976 977 /// Build a new C++11 auto type. 978 /// 979 /// By default, builds a new AutoType with the given deduced type. 980 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 981 ConceptDecl *TypeConstraintConcept, 982 ArrayRef<TemplateArgument> TypeConstraintArgs) { 983 // Note, IsDependent is always false here: we implicitly convert an 'auto' 984 // which has been deduced to a dependent type into an undeduced 'auto', so 985 // that we'll retry deduction after the transformation. 986 return SemaRef.Context.getAutoType(Deduced, Keyword, 987 /*IsDependent*/ false, /*IsPack=*/false, 988 TypeConstraintConcept, 989 TypeConstraintArgs); 990 } 991 992 /// By default, builds a new DeducedTemplateSpecializationType with the given 993 /// deduced type. 994 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 995 QualType Deduced) { 996 return SemaRef.Context.getDeducedTemplateSpecializationType( 997 Template, Deduced, /*IsDependent*/ false); 998 } 999 1000 /// Build a new template specialization type. 1001 /// 1002 /// By default, performs semantic analysis when building the template 1003 /// specialization type. Subclasses may override this routine to provide 1004 /// different behavior. 1005 QualType RebuildTemplateSpecializationType(TemplateName Template, 1006 SourceLocation TemplateLoc, 1007 TemplateArgumentListInfo &Args); 1008 1009 /// Build a new parenthesized type. 1010 /// 1011 /// By default, builds a new ParenType type from the inner type. 1012 /// Subclasses may override this routine to provide different behavior. 1013 QualType RebuildParenType(QualType InnerType) { 1014 return SemaRef.BuildParenType(InnerType); 1015 } 1016 1017 /// Build a new qualified name type. 1018 /// 1019 /// By default, builds a new ElaboratedType type from the keyword, 1020 /// the nested-name-specifier and the named type. 1021 /// Subclasses may override this routine to provide different behavior. 1022 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1023 ElaboratedTypeKeyword Keyword, 1024 NestedNameSpecifierLoc QualifierLoc, 1025 QualType Named) { 1026 return SemaRef.Context.getElaboratedType(Keyword, 1027 QualifierLoc.getNestedNameSpecifier(), 1028 Named); 1029 } 1030 1031 /// Build a new typename type that refers to a template-id. 1032 /// 1033 /// By default, builds a new DependentNameType type from the 1034 /// nested-name-specifier and the given type. Subclasses may override 1035 /// this routine to provide different behavior. 1036 QualType RebuildDependentTemplateSpecializationType( 1037 ElaboratedTypeKeyword Keyword, 1038 NestedNameSpecifierLoc QualifierLoc, 1039 SourceLocation TemplateKWLoc, 1040 const IdentifierInfo *Name, 1041 SourceLocation NameLoc, 1042 TemplateArgumentListInfo &Args, 1043 bool AllowInjectedClassName) { 1044 // Rebuild the template name. 1045 // TODO: avoid TemplateName abstraction 1046 CXXScopeSpec SS; 1047 SS.Adopt(QualifierLoc); 1048 TemplateName InstName = getDerived().RebuildTemplateName( 1049 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1050 AllowInjectedClassName); 1051 1052 if (InstName.isNull()) 1053 return QualType(); 1054 1055 // If it's still dependent, make a dependent specialization. 1056 if (InstName.getAsDependentTemplateName()) 1057 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1058 QualifierLoc.getNestedNameSpecifier(), 1059 Name, 1060 Args); 1061 1062 // Otherwise, make an elaborated type wrapping a non-dependent 1063 // specialization. 1064 QualType T = 1065 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1066 if (T.isNull()) return QualType(); 1067 1068 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1069 return T; 1070 1071 return SemaRef.Context.getElaboratedType(Keyword, 1072 QualifierLoc.getNestedNameSpecifier(), 1073 T); 1074 } 1075 1076 /// Build a new typename type that refers to an identifier. 1077 /// 1078 /// By default, performs semantic analysis when building the typename type 1079 /// (or elaborated type). Subclasses may override this routine to provide 1080 /// different behavior. 1081 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1082 SourceLocation KeywordLoc, 1083 NestedNameSpecifierLoc QualifierLoc, 1084 const IdentifierInfo *Id, 1085 SourceLocation IdLoc, 1086 bool DeducedTSTContext) { 1087 CXXScopeSpec SS; 1088 SS.Adopt(QualifierLoc); 1089 1090 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1091 // If the name is still dependent, just build a new dependent name type. 1092 if (!SemaRef.computeDeclContext(SS)) 1093 return SemaRef.Context.getDependentNameType(Keyword, 1094 QualifierLoc.getNestedNameSpecifier(), 1095 Id); 1096 } 1097 1098 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1099 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1100 *Id, IdLoc, DeducedTSTContext); 1101 } 1102 1103 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1104 1105 // We had a dependent elaborated-type-specifier that has been transformed 1106 // into a non-dependent elaborated-type-specifier. Find the tag we're 1107 // referring to. 1108 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1109 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1110 if (!DC) 1111 return QualType(); 1112 1113 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1114 return QualType(); 1115 1116 TagDecl *Tag = nullptr; 1117 SemaRef.LookupQualifiedName(Result, DC); 1118 switch (Result.getResultKind()) { 1119 case LookupResult::NotFound: 1120 case LookupResult::NotFoundInCurrentInstantiation: 1121 break; 1122 1123 case LookupResult::Found: 1124 Tag = Result.getAsSingle<TagDecl>(); 1125 break; 1126 1127 case LookupResult::FoundOverloaded: 1128 case LookupResult::FoundUnresolvedValue: 1129 llvm_unreachable("Tag lookup cannot find non-tags"); 1130 1131 case LookupResult::Ambiguous: 1132 // Let the LookupResult structure handle ambiguities. 1133 return QualType(); 1134 } 1135 1136 if (!Tag) { 1137 // Check where the name exists but isn't a tag type and use that to emit 1138 // better diagnostics. 1139 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1140 SemaRef.LookupQualifiedName(Result, DC); 1141 switch (Result.getResultKind()) { 1142 case LookupResult::Found: 1143 case LookupResult::FoundOverloaded: 1144 case LookupResult::FoundUnresolvedValue: { 1145 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1146 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1147 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1148 << NTK << Kind; 1149 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1150 break; 1151 } 1152 default: 1153 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1154 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1155 break; 1156 } 1157 return QualType(); 1158 } 1159 1160 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1161 IdLoc, Id)) { 1162 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1163 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1164 return QualType(); 1165 } 1166 1167 // Build the elaborated-type-specifier type. 1168 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1169 return SemaRef.Context.getElaboratedType(Keyword, 1170 QualifierLoc.getNestedNameSpecifier(), 1171 T); 1172 } 1173 1174 /// Build a new pack expansion type. 1175 /// 1176 /// By default, builds a new PackExpansionType type from the given pattern. 1177 /// Subclasses may override this routine to provide different behavior. 1178 QualType RebuildPackExpansionType(QualType Pattern, 1179 SourceRange PatternRange, 1180 SourceLocation EllipsisLoc, 1181 Optional<unsigned> NumExpansions) { 1182 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1183 NumExpansions); 1184 } 1185 1186 /// Build a new atomic type given its value type. 1187 /// 1188 /// By default, performs semantic analysis when building the atomic type. 1189 /// Subclasses may override this routine to provide different behavior. 1190 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1191 1192 /// Build a new pipe type given its value type. 1193 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1194 bool isReadPipe); 1195 1196 /// Build an extended int given its value type. 1197 QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits, 1198 SourceLocation Loc); 1199 1200 /// Build a dependent extended int given its value type. 1201 QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr, 1202 SourceLocation Loc); 1203 1204 /// Build a new template name given a nested name specifier, a flag 1205 /// indicating whether the "template" keyword was provided, and the template 1206 /// that the template name refers to. 1207 /// 1208 /// By default, builds the new template name directly. Subclasses may override 1209 /// this routine to provide different behavior. 1210 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1211 bool TemplateKW, 1212 TemplateDecl *Template); 1213 1214 /// Build a new template name given a nested name specifier and the 1215 /// name that is referred to as a template. 1216 /// 1217 /// By default, performs semantic analysis to determine whether the name can 1218 /// be resolved to a specific template, then builds the appropriate kind of 1219 /// template name. Subclasses may override this routine to provide different 1220 /// behavior. 1221 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1222 SourceLocation TemplateKWLoc, 1223 const IdentifierInfo &Name, 1224 SourceLocation NameLoc, QualType ObjectType, 1225 NamedDecl *FirstQualifierInScope, 1226 bool AllowInjectedClassName); 1227 1228 /// Build a new template name given a nested name specifier and the 1229 /// overloaded operator name that is referred to as a template. 1230 /// 1231 /// By default, performs semantic analysis to determine whether the name can 1232 /// be resolved to a specific template, then builds the appropriate kind of 1233 /// template name. Subclasses may override this routine to provide different 1234 /// behavior. 1235 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1236 SourceLocation TemplateKWLoc, 1237 OverloadedOperatorKind Operator, 1238 SourceLocation NameLoc, QualType ObjectType, 1239 bool AllowInjectedClassName); 1240 1241 /// Build a new template name given a template template parameter pack 1242 /// and the 1243 /// 1244 /// By default, performs semantic analysis to determine whether the name can 1245 /// be resolved to a specific template, then builds the appropriate kind of 1246 /// template name. Subclasses may override this routine to provide different 1247 /// behavior. 1248 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1249 const TemplateArgument &ArgPack) { 1250 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1251 } 1252 1253 /// Build a new compound statement. 1254 /// 1255 /// By default, performs semantic analysis to build the new statement. 1256 /// Subclasses may override this routine to provide different behavior. 1257 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1258 MultiStmtArg Statements, 1259 SourceLocation RBraceLoc, 1260 bool IsStmtExpr) { 1261 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1262 IsStmtExpr); 1263 } 1264 1265 /// Build a new case statement. 1266 /// 1267 /// By default, performs semantic analysis to build the new statement. 1268 /// Subclasses may override this routine to provide different behavior. 1269 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1270 Expr *LHS, 1271 SourceLocation EllipsisLoc, 1272 Expr *RHS, 1273 SourceLocation ColonLoc) { 1274 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1275 ColonLoc); 1276 } 1277 1278 /// Attach the body to a new case statement. 1279 /// 1280 /// By default, performs semantic analysis to build the new statement. 1281 /// Subclasses may override this routine to provide different behavior. 1282 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1283 getSema().ActOnCaseStmtBody(S, Body); 1284 return S; 1285 } 1286 1287 /// Build a new default statement. 1288 /// 1289 /// By default, performs semantic analysis to build the new statement. 1290 /// Subclasses may override this routine to provide different behavior. 1291 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1292 SourceLocation ColonLoc, 1293 Stmt *SubStmt) { 1294 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1295 /*CurScope=*/nullptr); 1296 } 1297 1298 /// Build a new label statement. 1299 /// 1300 /// By default, performs semantic analysis to build the new statement. 1301 /// Subclasses may override this routine to provide different behavior. 1302 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1303 SourceLocation ColonLoc, Stmt *SubStmt) { 1304 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1305 } 1306 1307 /// Build a new label statement. 1308 /// 1309 /// By default, performs semantic analysis to build the new statement. 1310 /// Subclasses may override this routine to provide different behavior. 1311 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1312 ArrayRef<const Attr*> Attrs, 1313 Stmt *SubStmt) { 1314 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1315 } 1316 1317 /// Build a new "if" statement. 1318 /// 1319 /// By default, performs semantic analysis to build the new statement. 1320 /// Subclasses may override this routine to provide different behavior. 1321 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1322 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1323 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1324 SourceLocation ElseLoc, Stmt *Else) { 1325 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond, 1326 RParenLoc, Then, ElseLoc, Else); 1327 } 1328 1329 /// Start building a new switch statement. 1330 /// 1331 /// By default, performs semantic analysis to build the new statement. 1332 /// Subclasses may override this routine to provide different behavior. 1333 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1334 SourceLocation LParenLoc, Stmt *Init, 1335 Sema::ConditionResult Cond, 1336 SourceLocation RParenLoc) { 1337 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1338 RParenLoc); 1339 } 1340 1341 /// Attach the body to the switch statement. 1342 /// 1343 /// By default, performs semantic analysis to build the new statement. 1344 /// Subclasses may override this routine to provide different behavior. 1345 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1346 Stmt *Switch, Stmt *Body) { 1347 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1348 } 1349 1350 /// Build a new while statement. 1351 /// 1352 /// By default, performs semantic analysis to build the new statement. 1353 /// Subclasses may override this routine to provide different behavior. 1354 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1355 Sema::ConditionResult Cond, 1356 SourceLocation RParenLoc, Stmt *Body) { 1357 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1358 } 1359 1360 /// Build a new do-while statement. 1361 /// 1362 /// By default, performs semantic analysis to build the new statement. 1363 /// Subclasses may override this routine to provide different behavior. 1364 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1365 SourceLocation WhileLoc, SourceLocation LParenLoc, 1366 Expr *Cond, SourceLocation RParenLoc) { 1367 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1368 Cond, RParenLoc); 1369 } 1370 1371 /// Build a new for statement. 1372 /// 1373 /// By default, performs semantic analysis to build the new statement. 1374 /// Subclasses may override this routine to provide different behavior. 1375 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1376 Stmt *Init, Sema::ConditionResult Cond, 1377 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1378 Stmt *Body) { 1379 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1380 Inc, RParenLoc, Body); 1381 } 1382 1383 /// Build a new goto statement. 1384 /// 1385 /// By default, performs semantic analysis to build the new statement. 1386 /// Subclasses may override this routine to provide different behavior. 1387 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1388 LabelDecl *Label) { 1389 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1390 } 1391 1392 /// Build a new indirect goto statement. 1393 /// 1394 /// By default, performs semantic analysis to build the new statement. 1395 /// Subclasses may override this routine to provide different behavior. 1396 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1397 SourceLocation StarLoc, 1398 Expr *Target) { 1399 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1400 } 1401 1402 /// Build a new return statement. 1403 /// 1404 /// By default, performs semantic analysis to build the new statement. 1405 /// Subclasses may override this routine to provide different behavior. 1406 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1407 return getSema().BuildReturnStmt(ReturnLoc, Result); 1408 } 1409 1410 /// Build a new declaration statement. 1411 /// 1412 /// By default, performs semantic analysis to build the new statement. 1413 /// Subclasses may override this routine to provide different behavior. 1414 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1415 SourceLocation StartLoc, SourceLocation EndLoc) { 1416 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1417 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1418 } 1419 1420 /// Build a new inline asm statement. 1421 /// 1422 /// By default, performs semantic analysis to build the new statement. 1423 /// Subclasses may override this routine to provide different behavior. 1424 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1425 bool IsVolatile, unsigned NumOutputs, 1426 unsigned NumInputs, IdentifierInfo **Names, 1427 MultiExprArg Constraints, MultiExprArg Exprs, 1428 Expr *AsmString, MultiExprArg Clobbers, 1429 unsigned NumLabels, 1430 SourceLocation RParenLoc) { 1431 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1432 NumInputs, Names, Constraints, Exprs, 1433 AsmString, Clobbers, NumLabels, RParenLoc); 1434 } 1435 1436 /// Build a new MS style inline asm statement. 1437 /// 1438 /// By default, performs semantic analysis to build the new statement. 1439 /// Subclasses may override this routine to provide different behavior. 1440 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1441 ArrayRef<Token> AsmToks, 1442 StringRef AsmString, 1443 unsigned NumOutputs, unsigned NumInputs, 1444 ArrayRef<StringRef> Constraints, 1445 ArrayRef<StringRef> Clobbers, 1446 ArrayRef<Expr*> Exprs, 1447 SourceLocation EndLoc) { 1448 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1449 NumOutputs, NumInputs, 1450 Constraints, Clobbers, Exprs, EndLoc); 1451 } 1452 1453 /// Build a new co_return statement. 1454 /// 1455 /// By default, performs semantic analysis to build the new statement. 1456 /// Subclasses may override this routine to provide different behavior. 1457 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1458 bool IsImplicit) { 1459 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1460 } 1461 1462 /// Build a new co_await expression. 1463 /// 1464 /// By default, performs semantic analysis to build the new expression. 1465 /// Subclasses may override this routine to provide different behavior. 1466 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1467 bool IsImplicit) { 1468 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1469 } 1470 1471 /// Build a new co_await expression. 1472 /// 1473 /// By default, performs semantic analysis to build the new expression. 1474 /// Subclasses may override this routine to provide different behavior. 1475 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1476 Expr *Result, 1477 UnresolvedLookupExpr *Lookup) { 1478 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1479 } 1480 1481 /// Build a new co_yield expression. 1482 /// 1483 /// By default, performs semantic analysis to build the new expression. 1484 /// Subclasses may override this routine to provide different behavior. 1485 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1486 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1487 } 1488 1489 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1490 return getSema().BuildCoroutineBodyStmt(Args); 1491 } 1492 1493 /// Build a new Objective-C \@try statement. 1494 /// 1495 /// By default, performs semantic analysis to build the new statement. 1496 /// Subclasses may override this routine to provide different behavior. 1497 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1498 Stmt *TryBody, 1499 MultiStmtArg CatchStmts, 1500 Stmt *Finally) { 1501 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1502 Finally); 1503 } 1504 1505 /// Rebuild an Objective-C exception declaration. 1506 /// 1507 /// By default, performs semantic analysis to build the new declaration. 1508 /// Subclasses may override this routine to provide different behavior. 1509 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1510 TypeSourceInfo *TInfo, QualType T) { 1511 return getSema().BuildObjCExceptionDecl(TInfo, T, 1512 ExceptionDecl->getInnerLocStart(), 1513 ExceptionDecl->getLocation(), 1514 ExceptionDecl->getIdentifier()); 1515 } 1516 1517 /// Build a new Objective-C \@catch statement. 1518 /// 1519 /// By default, performs semantic analysis to build the new statement. 1520 /// Subclasses may override this routine to provide different behavior. 1521 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1522 SourceLocation RParenLoc, 1523 VarDecl *Var, 1524 Stmt *Body) { 1525 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1526 Var, Body); 1527 } 1528 1529 /// Build a new Objective-C \@finally statement. 1530 /// 1531 /// By default, performs semantic analysis to build the new statement. 1532 /// Subclasses may override this routine to provide different behavior. 1533 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1534 Stmt *Body) { 1535 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1536 } 1537 1538 /// Build a new Objective-C \@throw statement. 1539 /// 1540 /// By default, performs semantic analysis to build the new statement. 1541 /// Subclasses may override this routine to provide different behavior. 1542 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1543 Expr *Operand) { 1544 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1545 } 1546 1547 /// Build a new OpenMP executable directive. 1548 /// 1549 /// By default, performs semantic analysis to build the new statement. 1550 /// Subclasses may override this routine to provide different behavior. 1551 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1552 DeclarationNameInfo DirName, 1553 OpenMPDirectiveKind CancelRegion, 1554 ArrayRef<OMPClause *> Clauses, 1555 Stmt *AStmt, SourceLocation StartLoc, 1556 SourceLocation EndLoc) { 1557 return getSema().ActOnOpenMPExecutableDirective( 1558 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1559 } 1560 1561 /// Build a new OpenMP 'if' clause. 1562 /// 1563 /// By default, performs semantic analysis to build the new OpenMP clause. 1564 /// Subclasses may override this routine to provide different behavior. 1565 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1566 Expr *Condition, SourceLocation StartLoc, 1567 SourceLocation LParenLoc, 1568 SourceLocation NameModifierLoc, 1569 SourceLocation ColonLoc, 1570 SourceLocation EndLoc) { 1571 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1572 LParenLoc, NameModifierLoc, ColonLoc, 1573 EndLoc); 1574 } 1575 1576 /// Build a new OpenMP 'final' clause. 1577 /// 1578 /// By default, performs semantic analysis to build the new OpenMP clause. 1579 /// Subclasses may override this routine to provide different behavior. 1580 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1581 SourceLocation LParenLoc, 1582 SourceLocation EndLoc) { 1583 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1584 EndLoc); 1585 } 1586 1587 /// Build a new OpenMP 'num_threads' clause. 1588 /// 1589 /// By default, performs semantic analysis to build the new OpenMP clause. 1590 /// Subclasses may override this routine to provide different behavior. 1591 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1592 SourceLocation StartLoc, 1593 SourceLocation LParenLoc, 1594 SourceLocation EndLoc) { 1595 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1596 LParenLoc, EndLoc); 1597 } 1598 1599 /// Build a new OpenMP 'safelen' clause. 1600 /// 1601 /// By default, performs semantic analysis to build the new OpenMP clause. 1602 /// Subclasses may override this routine to provide different behavior. 1603 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1604 SourceLocation LParenLoc, 1605 SourceLocation EndLoc) { 1606 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1607 } 1608 1609 /// Build a new OpenMP 'simdlen' clause. 1610 /// 1611 /// By default, performs semantic analysis to build the new OpenMP clause. 1612 /// Subclasses may override this routine to provide different behavior. 1613 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1614 SourceLocation LParenLoc, 1615 SourceLocation EndLoc) { 1616 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1617 } 1618 1619 /// Build a new OpenMP 'allocator' clause. 1620 /// 1621 /// By default, performs semantic analysis to build the new OpenMP clause. 1622 /// Subclasses may override this routine to provide different behavior. 1623 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1624 SourceLocation LParenLoc, 1625 SourceLocation EndLoc) { 1626 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1627 } 1628 1629 /// Build a new OpenMP 'collapse' clause. 1630 /// 1631 /// By default, performs semantic analysis to build the new OpenMP clause. 1632 /// Subclasses may override this routine to provide different behavior. 1633 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1634 SourceLocation LParenLoc, 1635 SourceLocation EndLoc) { 1636 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1637 EndLoc); 1638 } 1639 1640 /// Build a new OpenMP 'default' clause. 1641 /// 1642 /// By default, performs semantic analysis to build the new OpenMP clause. 1643 /// Subclasses may override this routine to provide different behavior. 1644 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1645 SourceLocation StartLoc, 1646 SourceLocation LParenLoc, 1647 SourceLocation EndLoc) { 1648 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1649 StartLoc, LParenLoc, EndLoc); 1650 } 1651 1652 /// Build a new OpenMP 'proc_bind' clause. 1653 /// 1654 /// By default, performs semantic analysis to build the new OpenMP clause. 1655 /// Subclasses may override this routine to provide different behavior. 1656 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1657 SourceLocation KindKwLoc, 1658 SourceLocation StartLoc, 1659 SourceLocation LParenLoc, 1660 SourceLocation EndLoc) { 1661 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1662 StartLoc, LParenLoc, EndLoc); 1663 } 1664 1665 /// Build a new OpenMP 'schedule' clause. 1666 /// 1667 /// By default, performs semantic analysis to build the new OpenMP clause. 1668 /// Subclasses may override this routine to provide different behavior. 1669 OMPClause *RebuildOMPScheduleClause( 1670 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1671 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1672 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1673 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1674 return getSema().ActOnOpenMPScheduleClause( 1675 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1676 CommaLoc, EndLoc); 1677 } 1678 1679 /// Build a new OpenMP 'ordered' clause. 1680 /// 1681 /// By default, performs semantic analysis to build the new OpenMP clause. 1682 /// Subclasses may override this routine to provide different behavior. 1683 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1684 SourceLocation EndLoc, 1685 SourceLocation LParenLoc, Expr *Num) { 1686 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1687 } 1688 1689 /// Build a new OpenMP 'private' clause. 1690 /// 1691 /// By default, performs semantic analysis to build the new OpenMP clause. 1692 /// Subclasses may override this routine to provide different behavior. 1693 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1694 SourceLocation StartLoc, 1695 SourceLocation LParenLoc, 1696 SourceLocation EndLoc) { 1697 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1698 EndLoc); 1699 } 1700 1701 /// Build a new OpenMP 'firstprivate' clause. 1702 /// 1703 /// By default, performs semantic analysis to build the new OpenMP clause. 1704 /// Subclasses may override this routine to provide different behavior. 1705 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1706 SourceLocation StartLoc, 1707 SourceLocation LParenLoc, 1708 SourceLocation EndLoc) { 1709 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1710 EndLoc); 1711 } 1712 1713 /// Build a new OpenMP 'lastprivate' clause. 1714 /// 1715 /// By default, performs semantic analysis to build the new OpenMP clause. 1716 /// Subclasses may override this routine to provide different behavior. 1717 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1718 OpenMPLastprivateModifier LPKind, 1719 SourceLocation LPKindLoc, 1720 SourceLocation ColonLoc, 1721 SourceLocation StartLoc, 1722 SourceLocation LParenLoc, 1723 SourceLocation EndLoc) { 1724 return getSema().ActOnOpenMPLastprivateClause( 1725 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1726 } 1727 1728 /// Build a new OpenMP 'shared' clause. 1729 /// 1730 /// By default, performs semantic analysis to build the new OpenMP clause. 1731 /// Subclasses may override this routine to provide different behavior. 1732 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1733 SourceLocation StartLoc, 1734 SourceLocation LParenLoc, 1735 SourceLocation EndLoc) { 1736 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1737 EndLoc); 1738 } 1739 1740 /// Build a new OpenMP 'reduction' clause. 1741 /// 1742 /// By default, performs semantic analysis to build the new statement. 1743 /// Subclasses may override this routine to provide different behavior. 1744 OMPClause *RebuildOMPReductionClause( 1745 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1746 SourceLocation StartLoc, SourceLocation LParenLoc, 1747 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1748 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1749 const DeclarationNameInfo &ReductionId, 1750 ArrayRef<Expr *> UnresolvedReductions) { 1751 return getSema().ActOnOpenMPReductionClause( 1752 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1753 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1754 } 1755 1756 /// Build a new OpenMP 'task_reduction' clause. 1757 /// 1758 /// By default, performs semantic analysis to build the new statement. 1759 /// Subclasses may override this routine to provide different behavior. 1760 OMPClause *RebuildOMPTaskReductionClause( 1761 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1762 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1763 CXXScopeSpec &ReductionIdScopeSpec, 1764 const DeclarationNameInfo &ReductionId, 1765 ArrayRef<Expr *> UnresolvedReductions) { 1766 return getSema().ActOnOpenMPTaskReductionClause( 1767 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1768 ReductionId, UnresolvedReductions); 1769 } 1770 1771 /// Build a new OpenMP 'in_reduction' clause. 1772 /// 1773 /// By default, performs semantic analysis to build the new statement. 1774 /// Subclasses may override this routine to provide different behavior. 1775 OMPClause * 1776 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1777 SourceLocation LParenLoc, SourceLocation ColonLoc, 1778 SourceLocation EndLoc, 1779 CXXScopeSpec &ReductionIdScopeSpec, 1780 const DeclarationNameInfo &ReductionId, 1781 ArrayRef<Expr *> UnresolvedReductions) { 1782 return getSema().ActOnOpenMPInReductionClause( 1783 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1784 ReductionId, UnresolvedReductions); 1785 } 1786 1787 /// Build a new OpenMP 'linear' clause. 1788 /// 1789 /// By default, performs semantic analysis to build the new OpenMP clause. 1790 /// Subclasses may override this routine to provide different behavior. 1791 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1792 SourceLocation StartLoc, 1793 SourceLocation LParenLoc, 1794 OpenMPLinearClauseKind Modifier, 1795 SourceLocation ModifierLoc, 1796 SourceLocation ColonLoc, 1797 SourceLocation EndLoc) { 1798 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1799 Modifier, ModifierLoc, ColonLoc, 1800 EndLoc); 1801 } 1802 1803 /// Build a new OpenMP 'aligned' clause. 1804 /// 1805 /// By default, performs semantic analysis to build the new OpenMP clause. 1806 /// Subclasses may override this routine to provide different behavior. 1807 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1808 SourceLocation StartLoc, 1809 SourceLocation LParenLoc, 1810 SourceLocation ColonLoc, 1811 SourceLocation EndLoc) { 1812 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1813 LParenLoc, ColonLoc, EndLoc); 1814 } 1815 1816 /// Build a new OpenMP 'copyin' clause. 1817 /// 1818 /// By default, performs semantic analysis to build the new OpenMP clause. 1819 /// Subclasses may override this routine to provide different behavior. 1820 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1821 SourceLocation StartLoc, 1822 SourceLocation LParenLoc, 1823 SourceLocation EndLoc) { 1824 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1825 EndLoc); 1826 } 1827 1828 /// Build a new OpenMP 'copyprivate' clause. 1829 /// 1830 /// By default, performs semantic analysis to build the new OpenMP clause. 1831 /// Subclasses may override this routine to provide different behavior. 1832 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1833 SourceLocation StartLoc, 1834 SourceLocation LParenLoc, 1835 SourceLocation EndLoc) { 1836 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1837 EndLoc); 1838 } 1839 1840 /// Build a new OpenMP 'flush' pseudo clause. 1841 /// 1842 /// By default, performs semantic analysis to build the new OpenMP clause. 1843 /// Subclasses may override this routine to provide different behavior. 1844 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1845 SourceLocation StartLoc, 1846 SourceLocation LParenLoc, 1847 SourceLocation EndLoc) { 1848 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1849 EndLoc); 1850 } 1851 1852 /// Build a new OpenMP 'depobj' pseudo clause. 1853 /// 1854 /// By default, performs semantic analysis to build the new OpenMP clause. 1855 /// Subclasses may override this routine to provide different behavior. 1856 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1857 SourceLocation LParenLoc, 1858 SourceLocation EndLoc) { 1859 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1860 EndLoc); 1861 } 1862 1863 /// Build a new OpenMP 'depend' pseudo clause. 1864 /// 1865 /// By default, performs semantic analysis to build the new OpenMP clause. 1866 /// Subclasses may override this routine to provide different behavior. 1867 OMPClause * 1868 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1869 SourceLocation DepLoc, SourceLocation ColonLoc, 1870 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1871 SourceLocation LParenLoc, SourceLocation EndLoc) { 1872 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1873 ColonLoc, VarList, StartLoc, 1874 LParenLoc, EndLoc); 1875 } 1876 1877 /// Build a new OpenMP 'device' clause. 1878 /// 1879 /// By default, performs semantic analysis to build the new statement. 1880 /// Subclasses may override this routine to provide different behavior. 1881 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1882 Expr *Device, SourceLocation StartLoc, 1883 SourceLocation LParenLoc, 1884 SourceLocation ModifierLoc, 1885 SourceLocation EndLoc) { 1886 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1887 LParenLoc, ModifierLoc, EndLoc); 1888 } 1889 1890 /// Build a new OpenMP 'map' clause. 1891 /// 1892 /// By default, performs semantic analysis to build the new OpenMP clause. 1893 /// Subclasses may override this routine to provide different behavior. 1894 OMPClause *RebuildOMPMapClause( 1895 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1896 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1897 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1898 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1899 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1900 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1901 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1902 MapperIdScopeSpec, MapperId, MapType, 1903 IsMapTypeImplicit, MapLoc, ColonLoc, 1904 VarList, Locs, UnresolvedMappers); 1905 } 1906 1907 /// Build a new OpenMP 'allocate' clause. 1908 /// 1909 /// By default, performs semantic analysis to build the new OpenMP clause. 1910 /// Subclasses may override this routine to provide different behavior. 1911 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1912 SourceLocation StartLoc, 1913 SourceLocation LParenLoc, 1914 SourceLocation ColonLoc, 1915 SourceLocation EndLoc) { 1916 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1917 LParenLoc, ColonLoc, EndLoc); 1918 } 1919 1920 /// Build a new OpenMP 'num_teams' clause. 1921 /// 1922 /// By default, performs semantic analysis to build the new statement. 1923 /// Subclasses may override this routine to provide different behavior. 1924 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1925 SourceLocation LParenLoc, 1926 SourceLocation EndLoc) { 1927 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1928 EndLoc); 1929 } 1930 1931 /// Build a new OpenMP 'thread_limit' clause. 1932 /// 1933 /// By default, performs semantic analysis to build the new statement. 1934 /// Subclasses may override this routine to provide different behavior. 1935 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1936 SourceLocation StartLoc, 1937 SourceLocation LParenLoc, 1938 SourceLocation EndLoc) { 1939 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1940 LParenLoc, EndLoc); 1941 } 1942 1943 /// Build a new OpenMP 'priority' clause. 1944 /// 1945 /// By default, performs semantic analysis to build the new statement. 1946 /// Subclasses may override this routine to provide different behavior. 1947 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1948 SourceLocation LParenLoc, 1949 SourceLocation EndLoc) { 1950 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1951 EndLoc); 1952 } 1953 1954 /// Build a new OpenMP 'grainsize' clause. 1955 /// 1956 /// By default, performs semantic analysis to build the new statement. 1957 /// Subclasses may override this routine to provide different behavior. 1958 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1959 SourceLocation LParenLoc, 1960 SourceLocation EndLoc) { 1961 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1962 EndLoc); 1963 } 1964 1965 /// Build a new OpenMP 'num_tasks' clause. 1966 /// 1967 /// By default, performs semantic analysis to build the new statement. 1968 /// Subclasses may override this routine to provide different behavior. 1969 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1970 SourceLocation LParenLoc, 1971 SourceLocation EndLoc) { 1972 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1973 EndLoc); 1974 } 1975 1976 /// Build a new OpenMP 'hint' clause. 1977 /// 1978 /// By default, performs semantic analysis to build the new statement. 1979 /// Subclasses may override this routine to provide different behavior. 1980 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1981 SourceLocation LParenLoc, 1982 SourceLocation EndLoc) { 1983 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1984 } 1985 1986 /// Build a new OpenMP 'detach' clause. 1987 /// 1988 /// By default, performs semantic analysis to build the new statement. 1989 /// Subclasses may override this routine to provide different behavior. 1990 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 1991 SourceLocation LParenLoc, 1992 SourceLocation EndLoc) { 1993 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 1994 } 1995 1996 /// Build a new OpenMP 'dist_schedule' clause. 1997 /// 1998 /// By default, performs semantic analysis to build the new OpenMP clause. 1999 /// Subclasses may override this routine to provide different behavior. 2000 OMPClause * 2001 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2002 Expr *ChunkSize, SourceLocation StartLoc, 2003 SourceLocation LParenLoc, SourceLocation KindLoc, 2004 SourceLocation CommaLoc, SourceLocation EndLoc) { 2005 return getSema().ActOnOpenMPDistScheduleClause( 2006 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2007 } 2008 2009 /// Build a new OpenMP 'to' clause. 2010 /// 2011 /// By default, performs semantic analysis to build the new statement. 2012 /// Subclasses may override this routine to provide different behavior. 2013 OMPClause * 2014 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2015 ArrayRef<SourceLocation> MotionModifiersLoc, 2016 CXXScopeSpec &MapperIdScopeSpec, 2017 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2018 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2019 ArrayRef<Expr *> UnresolvedMappers) { 2020 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2021 MapperIdScopeSpec, MapperId, ColonLoc, 2022 VarList, Locs, UnresolvedMappers); 2023 } 2024 2025 /// Build a new OpenMP 'from' clause. 2026 /// 2027 /// By default, performs semantic analysis to build the new statement. 2028 /// Subclasses may override this routine to provide different behavior. 2029 OMPClause * 2030 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2031 ArrayRef<SourceLocation> MotionModifiersLoc, 2032 CXXScopeSpec &MapperIdScopeSpec, 2033 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2034 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2035 ArrayRef<Expr *> UnresolvedMappers) { 2036 return getSema().ActOnOpenMPFromClause( 2037 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2038 ColonLoc, VarList, Locs, UnresolvedMappers); 2039 } 2040 2041 /// Build a new OpenMP 'use_device_ptr' clause. 2042 /// 2043 /// By default, performs semantic analysis to build the new OpenMP clause. 2044 /// Subclasses may override this routine to provide different behavior. 2045 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2046 const OMPVarListLocTy &Locs) { 2047 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2048 } 2049 2050 /// Build a new OpenMP 'use_device_addr' 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 *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2055 const OMPVarListLocTy &Locs) { 2056 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2057 } 2058 2059 /// Build a new OpenMP 'is_device_ptr' 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 *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2064 const OMPVarListLocTy &Locs) { 2065 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2066 } 2067 2068 /// Build a new OpenMP 'defaultmap' 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 *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2073 OpenMPDefaultmapClauseKind Kind, 2074 SourceLocation StartLoc, 2075 SourceLocation LParenLoc, 2076 SourceLocation MLoc, 2077 SourceLocation KindLoc, 2078 SourceLocation EndLoc) { 2079 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2080 MLoc, KindLoc, EndLoc); 2081 } 2082 2083 /// Build a new OpenMP 'nontemporal' clause. 2084 /// 2085 /// By default, performs semantic analysis to build the new OpenMP clause. 2086 /// Subclasses may override this routine to provide different behavior. 2087 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2088 SourceLocation StartLoc, 2089 SourceLocation LParenLoc, 2090 SourceLocation EndLoc) { 2091 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2092 EndLoc); 2093 } 2094 2095 /// Build a new OpenMP 'inclusive' clause. 2096 /// 2097 /// By default, performs semantic analysis to build the new OpenMP clause. 2098 /// Subclasses may override this routine to provide different behavior. 2099 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2100 SourceLocation StartLoc, 2101 SourceLocation LParenLoc, 2102 SourceLocation EndLoc) { 2103 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2104 EndLoc); 2105 } 2106 2107 /// Build a new OpenMP 'exclusive' clause. 2108 /// 2109 /// By default, performs semantic analysis to build the new OpenMP clause. 2110 /// Subclasses may override this routine to provide different behavior. 2111 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2112 SourceLocation StartLoc, 2113 SourceLocation LParenLoc, 2114 SourceLocation EndLoc) { 2115 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2116 EndLoc); 2117 } 2118 2119 /// Build a new OpenMP 'uses_allocators' clause. 2120 /// 2121 /// By default, performs semantic analysis to build the new OpenMP clause. 2122 /// Subclasses may override this routine to provide different behavior. 2123 OMPClause *RebuildOMPUsesAllocatorsClause( 2124 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2125 SourceLocation LParenLoc, SourceLocation EndLoc) { 2126 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2127 Data); 2128 } 2129 2130 /// Build a new OpenMP 'affinity' clause. 2131 /// 2132 /// By default, performs semantic analysis to build the new OpenMP clause. 2133 /// Subclasses may override this routine to provide different behavior. 2134 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2135 SourceLocation LParenLoc, 2136 SourceLocation ColonLoc, 2137 SourceLocation EndLoc, Expr *Modifier, 2138 ArrayRef<Expr *> Locators) { 2139 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2140 EndLoc, Modifier, Locators); 2141 } 2142 2143 /// Build a new OpenMP 'order' clause. 2144 /// 2145 /// By default, performs semantic analysis to build the new OpenMP clause. 2146 /// Subclasses may override this routine to provide different behavior. 2147 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2148 SourceLocation KindKwLoc, 2149 SourceLocation StartLoc, 2150 SourceLocation LParenLoc, 2151 SourceLocation EndLoc) { 2152 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2153 LParenLoc, EndLoc); 2154 } 2155 2156 /// Rebuild the operand to an Objective-C \@synchronized statement. 2157 /// 2158 /// By default, performs semantic analysis to build the new statement. 2159 /// Subclasses may override this routine to provide different behavior. 2160 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2161 Expr *object) { 2162 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2163 } 2164 2165 /// Build a new 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 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2170 Expr *Object, Stmt *Body) { 2171 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2172 } 2173 2174 /// Build a new Objective-C \@autoreleasepool 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 RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2179 Stmt *Body) { 2180 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2181 } 2182 2183 /// Build a new Objective-C fast enumeration 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 RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2188 Stmt *Element, 2189 Expr *Collection, 2190 SourceLocation RParenLoc, 2191 Stmt *Body) { 2192 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2193 Element, 2194 Collection, 2195 RParenLoc); 2196 if (ForEachStmt.isInvalid()) 2197 return StmtError(); 2198 2199 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2200 } 2201 2202 /// Build a new C++ exception declaration. 2203 /// 2204 /// By default, performs semantic analysis to build the new decaration. 2205 /// Subclasses may override this routine to provide different behavior. 2206 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2207 TypeSourceInfo *Declarator, 2208 SourceLocation StartLoc, 2209 SourceLocation IdLoc, 2210 IdentifierInfo *Id) { 2211 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2212 StartLoc, IdLoc, Id); 2213 if (Var) 2214 getSema().CurContext->addDecl(Var); 2215 return Var; 2216 } 2217 2218 /// Build a new C++ catch statement. 2219 /// 2220 /// By default, performs semantic analysis to build the new statement. 2221 /// Subclasses may override this routine to provide different behavior. 2222 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2223 VarDecl *ExceptionDecl, 2224 Stmt *Handler) { 2225 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2226 Handler)); 2227 } 2228 2229 /// Build a new C++ try statement. 2230 /// 2231 /// By default, performs semantic analysis to build the new statement. 2232 /// Subclasses may override this routine to provide different behavior. 2233 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2234 ArrayRef<Stmt *> Handlers) { 2235 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2236 } 2237 2238 /// Build a new C++0x range-based for 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 RebuildCXXForRangeStmt(SourceLocation ForLoc, 2243 SourceLocation CoawaitLoc, Stmt *Init, 2244 SourceLocation ColonLoc, Stmt *Range, 2245 Stmt *Begin, Stmt *End, Expr *Cond, 2246 Expr *Inc, Stmt *LoopVar, 2247 SourceLocation RParenLoc) { 2248 // If we've just learned that the range is actually an Objective-C 2249 // collection, treat this as an Objective-C fast enumeration loop. 2250 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2251 if (RangeStmt->isSingleDecl()) { 2252 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2253 if (RangeVar->isInvalidDecl()) 2254 return StmtError(); 2255 2256 Expr *RangeExpr = RangeVar->getInit(); 2257 if (!RangeExpr->isTypeDependent() && 2258 RangeExpr->getType()->isObjCObjectPointerType()) { 2259 // FIXME: Support init-statements in Objective-C++20 ranged for 2260 // statement. 2261 if (Init) { 2262 return SemaRef.Diag(Init->getBeginLoc(), 2263 diag::err_objc_for_range_init_stmt) 2264 << Init->getSourceRange(); 2265 } 2266 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2267 RangeExpr, RParenLoc); 2268 } 2269 } 2270 } 2271 } 2272 2273 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2274 Range, Begin, End, Cond, Inc, LoopVar, 2275 RParenLoc, Sema::BFRK_Rebuild); 2276 } 2277 2278 /// Build a new C++0x range-based for statement. 2279 /// 2280 /// By default, performs semantic analysis to build the new statement. 2281 /// Subclasses may override this routine to provide different behavior. 2282 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2283 bool IsIfExists, 2284 NestedNameSpecifierLoc QualifierLoc, 2285 DeclarationNameInfo NameInfo, 2286 Stmt *Nested) { 2287 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2288 QualifierLoc, NameInfo, Nested); 2289 } 2290 2291 /// Attach body to a C++0x range-based for statement. 2292 /// 2293 /// By default, performs semantic analysis to finish the new statement. 2294 /// Subclasses may override this routine to provide different behavior. 2295 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2296 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2297 } 2298 2299 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2300 Stmt *TryBlock, Stmt *Handler) { 2301 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2302 } 2303 2304 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2305 Stmt *Block) { 2306 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2307 } 2308 2309 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2310 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2311 } 2312 2313 /// Build a new predefined expression. 2314 /// 2315 /// By default, performs semantic analysis to build the new expression. 2316 /// Subclasses may override this routine to provide different behavior. 2317 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2318 PredefinedExpr::IdentKind IK) { 2319 return getSema().BuildPredefinedExpr(Loc, IK); 2320 } 2321 2322 /// Build a new expression that references a declaration. 2323 /// 2324 /// By default, performs semantic analysis to build the new expression. 2325 /// Subclasses may override this routine to provide different behavior. 2326 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2327 LookupResult &R, 2328 bool RequiresADL) { 2329 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2330 } 2331 2332 2333 /// Build a new expression that references a declaration. 2334 /// 2335 /// By default, performs semantic analysis to build the new expression. 2336 /// Subclasses may override this routine to provide different behavior. 2337 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2338 ValueDecl *VD, 2339 const DeclarationNameInfo &NameInfo, 2340 NamedDecl *Found, 2341 TemplateArgumentListInfo *TemplateArgs) { 2342 CXXScopeSpec SS; 2343 SS.Adopt(QualifierLoc); 2344 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2345 TemplateArgs); 2346 } 2347 2348 /// Build a new expression in parentheses. 2349 /// 2350 /// By default, performs semantic analysis to build the new expression. 2351 /// Subclasses may override this routine to provide different behavior. 2352 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2353 SourceLocation RParen) { 2354 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2355 } 2356 2357 /// Build a new pseudo-destructor expression. 2358 /// 2359 /// By default, performs semantic analysis to build the new expression. 2360 /// Subclasses may override this routine to provide different behavior. 2361 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2362 SourceLocation OperatorLoc, 2363 bool isArrow, 2364 CXXScopeSpec &SS, 2365 TypeSourceInfo *ScopeType, 2366 SourceLocation CCLoc, 2367 SourceLocation TildeLoc, 2368 PseudoDestructorTypeStorage Destroyed); 2369 2370 /// Build a new unary operator expression. 2371 /// 2372 /// By default, performs semantic analysis to build the new expression. 2373 /// Subclasses may override this routine to provide different behavior. 2374 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2375 UnaryOperatorKind Opc, 2376 Expr *SubExpr) { 2377 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2378 } 2379 2380 /// Build a new builtin offsetof expression. 2381 /// 2382 /// By default, performs semantic analysis to build the new expression. 2383 /// Subclasses may override this routine to provide different behavior. 2384 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2385 TypeSourceInfo *Type, 2386 ArrayRef<Sema::OffsetOfComponent> Components, 2387 SourceLocation RParenLoc) { 2388 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2389 RParenLoc); 2390 } 2391 2392 /// Build a new sizeof, alignof or vec_step expression with a 2393 /// type argument. 2394 /// 2395 /// By default, performs semantic analysis to build the new expression. 2396 /// Subclasses may override this routine to provide different behavior. 2397 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2398 SourceLocation OpLoc, 2399 UnaryExprOrTypeTrait ExprKind, 2400 SourceRange R) { 2401 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2402 } 2403 2404 /// Build a new sizeof, alignof or vec step expression with an 2405 /// expression argument. 2406 /// 2407 /// By default, performs semantic analysis to build the new expression. 2408 /// Subclasses may override this routine to provide different behavior. 2409 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2410 UnaryExprOrTypeTrait ExprKind, 2411 SourceRange R) { 2412 ExprResult Result 2413 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2414 if (Result.isInvalid()) 2415 return ExprError(); 2416 2417 return Result; 2418 } 2419 2420 /// Build a new array subscript expression. 2421 /// 2422 /// By default, performs semantic analysis to build the new expression. 2423 /// Subclasses may override this routine to provide different behavior. 2424 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2425 SourceLocation LBracketLoc, 2426 Expr *RHS, 2427 SourceLocation RBracketLoc) { 2428 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2429 LBracketLoc, RHS, 2430 RBracketLoc); 2431 } 2432 2433 /// Build a new matrix subscript expression. 2434 /// 2435 /// By default, performs semantic analysis to build the new expression. 2436 /// Subclasses may override this routine to provide different behavior. 2437 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2438 Expr *ColumnIdx, 2439 SourceLocation RBracketLoc) { 2440 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2441 RBracketLoc); 2442 } 2443 2444 /// Build a new array section expression. 2445 /// 2446 /// By default, performs semantic analysis to build the new expression. 2447 /// Subclasses may override this routine to provide different behavior. 2448 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2449 Expr *LowerBound, 2450 SourceLocation ColonLocFirst, 2451 SourceLocation ColonLocSecond, 2452 Expr *Length, Expr *Stride, 2453 SourceLocation RBracketLoc) { 2454 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2455 ColonLocFirst, ColonLocSecond, 2456 Length, Stride, RBracketLoc); 2457 } 2458 2459 /// Build a new array shaping expression. 2460 /// 2461 /// By default, performs semantic analysis to build the new expression. 2462 /// Subclasses may override this routine to provide different behavior. 2463 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2464 SourceLocation RParenLoc, 2465 ArrayRef<Expr *> Dims, 2466 ArrayRef<SourceRange> BracketsRanges) { 2467 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2468 BracketsRanges); 2469 } 2470 2471 /// Build a new iterator expression. 2472 /// 2473 /// By default, performs semantic analysis to build the new expression. 2474 /// Subclasses may override this routine to provide different behavior. 2475 ExprResult RebuildOMPIteratorExpr( 2476 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2477 ArrayRef<Sema::OMPIteratorData> Data) { 2478 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2479 LLoc, RLoc, Data); 2480 } 2481 2482 /// Build a new call expression. 2483 /// 2484 /// By default, performs semantic analysis to build the new expression. 2485 /// Subclasses may override this routine to provide different behavior. 2486 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2487 MultiExprArg Args, 2488 SourceLocation RParenLoc, 2489 Expr *ExecConfig = nullptr) { 2490 return getSema().ActOnCallExpr( 2491 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2492 } 2493 2494 /// Build a new member access expression. 2495 /// 2496 /// By default, performs semantic analysis to build the new expression. 2497 /// Subclasses may override this routine to provide different behavior. 2498 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2499 bool isArrow, 2500 NestedNameSpecifierLoc QualifierLoc, 2501 SourceLocation TemplateKWLoc, 2502 const DeclarationNameInfo &MemberNameInfo, 2503 ValueDecl *Member, 2504 NamedDecl *FoundDecl, 2505 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2506 NamedDecl *FirstQualifierInScope) { 2507 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2508 isArrow); 2509 if (!Member->getDeclName()) { 2510 // We have a reference to an unnamed field. This is always the 2511 // base of an anonymous struct/union member access, i.e. the 2512 // field is always of record type. 2513 assert(Member->getType()->isRecordType() && 2514 "unnamed member not of record type?"); 2515 2516 BaseResult = 2517 getSema().PerformObjectMemberConversion(BaseResult.get(), 2518 QualifierLoc.getNestedNameSpecifier(), 2519 FoundDecl, Member); 2520 if (BaseResult.isInvalid()) 2521 return ExprError(); 2522 Base = BaseResult.get(); 2523 2524 CXXScopeSpec EmptySS; 2525 return getSema().BuildFieldReferenceExpr( 2526 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2527 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2528 } 2529 2530 CXXScopeSpec SS; 2531 SS.Adopt(QualifierLoc); 2532 2533 Base = BaseResult.get(); 2534 QualType BaseType = Base->getType(); 2535 2536 if (isArrow && !BaseType->isPointerType()) 2537 return ExprError(); 2538 2539 // FIXME: this involves duplicating earlier analysis in a lot of 2540 // cases; we should avoid this when possible. 2541 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2542 R.addDecl(FoundDecl); 2543 R.resolveKind(); 2544 2545 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2546 SS, TemplateKWLoc, 2547 FirstQualifierInScope, 2548 R, ExplicitTemplateArgs, 2549 /*S*/nullptr); 2550 } 2551 2552 /// Build a new binary operator expression. 2553 /// 2554 /// By default, performs semantic analysis to build the new expression. 2555 /// Subclasses may override this routine to provide different behavior. 2556 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2557 BinaryOperatorKind Opc, 2558 Expr *LHS, Expr *RHS) { 2559 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2560 } 2561 2562 /// Build a new rewritten operator expression. 2563 /// 2564 /// By default, performs semantic analysis to build the new expression. 2565 /// Subclasses may override this routine to provide different behavior. 2566 ExprResult RebuildCXXRewrittenBinaryOperator( 2567 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2568 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2569 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2570 RHS, /*RequiresADL*/false); 2571 } 2572 2573 /// Build a new conditional operator expression. 2574 /// 2575 /// By default, performs semantic analysis to build the new expression. 2576 /// Subclasses may override this routine to provide different behavior. 2577 ExprResult RebuildConditionalOperator(Expr *Cond, 2578 SourceLocation QuestionLoc, 2579 Expr *LHS, 2580 SourceLocation ColonLoc, 2581 Expr *RHS) { 2582 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2583 LHS, RHS); 2584 } 2585 2586 /// Build a new C-style cast expression. 2587 /// 2588 /// By default, performs semantic analysis to build the new expression. 2589 /// Subclasses may override this routine to provide different behavior. 2590 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2591 TypeSourceInfo *TInfo, 2592 SourceLocation RParenLoc, 2593 Expr *SubExpr) { 2594 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2595 SubExpr); 2596 } 2597 2598 /// Build a new compound literal expression. 2599 /// 2600 /// By default, performs semantic analysis to build the new expression. 2601 /// Subclasses may override this routine to provide different behavior. 2602 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2603 TypeSourceInfo *TInfo, 2604 SourceLocation RParenLoc, 2605 Expr *Init) { 2606 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2607 Init); 2608 } 2609 2610 /// Build a new extended vector element access expression. 2611 /// 2612 /// By default, performs semantic analysis to build the new expression. 2613 /// Subclasses may override this routine to provide different behavior. 2614 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2615 SourceLocation OpLoc, 2616 SourceLocation AccessorLoc, 2617 IdentifierInfo &Accessor) { 2618 2619 CXXScopeSpec SS; 2620 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2621 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2622 OpLoc, /*IsArrow*/ false, 2623 SS, SourceLocation(), 2624 /*FirstQualifierInScope*/ nullptr, 2625 NameInfo, 2626 /* TemplateArgs */ nullptr, 2627 /*S*/ nullptr); 2628 } 2629 2630 /// Build a new initializer list expression. 2631 /// 2632 /// By default, performs semantic analysis to build the new expression. 2633 /// Subclasses may override this routine to provide different behavior. 2634 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2635 MultiExprArg Inits, 2636 SourceLocation RBraceLoc) { 2637 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2638 } 2639 2640 /// Build a new designated initializer expression. 2641 /// 2642 /// By default, performs semantic analysis to build the new expression. 2643 /// Subclasses may override this routine to provide different behavior. 2644 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2645 MultiExprArg ArrayExprs, 2646 SourceLocation EqualOrColonLoc, 2647 bool GNUSyntax, 2648 Expr *Init) { 2649 ExprResult Result 2650 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2651 Init); 2652 if (Result.isInvalid()) 2653 return ExprError(); 2654 2655 return Result; 2656 } 2657 2658 /// Build a new value-initialized expression. 2659 /// 2660 /// By default, builds the implicit value initialization without performing 2661 /// any semantic analysis. Subclasses may override this routine to provide 2662 /// different behavior. 2663 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2664 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2665 } 2666 2667 /// Build a new \c va_arg expression. 2668 /// 2669 /// By default, performs semantic analysis to build the new expression. 2670 /// Subclasses may override this routine to provide different behavior. 2671 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2672 Expr *SubExpr, TypeSourceInfo *TInfo, 2673 SourceLocation RParenLoc) { 2674 return getSema().BuildVAArgExpr(BuiltinLoc, 2675 SubExpr, TInfo, 2676 RParenLoc); 2677 } 2678 2679 /// Build a new expression list in parentheses. 2680 /// 2681 /// By default, performs semantic analysis to build the new expression. 2682 /// Subclasses may override this routine to provide different behavior. 2683 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2684 MultiExprArg SubExprs, 2685 SourceLocation RParenLoc) { 2686 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2687 } 2688 2689 /// Build a new address-of-label expression. 2690 /// 2691 /// By default, performs semantic analysis, using the name of the label 2692 /// rather than attempting to map the label statement itself. 2693 /// Subclasses may override this routine to provide different behavior. 2694 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2695 SourceLocation LabelLoc, LabelDecl *Label) { 2696 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2697 } 2698 2699 /// Build a new GNU statement expression. 2700 /// 2701 /// By default, performs semantic analysis to build the new expression. 2702 /// Subclasses may override this routine to provide different behavior. 2703 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2704 SourceLocation RParenLoc, unsigned TemplateDepth) { 2705 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2706 TemplateDepth); 2707 } 2708 2709 /// Build a new __builtin_choose_expr expression. 2710 /// 2711 /// By default, performs semantic analysis to build the new expression. 2712 /// Subclasses may override this routine to provide different behavior. 2713 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2714 Expr *Cond, Expr *LHS, Expr *RHS, 2715 SourceLocation RParenLoc) { 2716 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2717 Cond, LHS, RHS, 2718 RParenLoc); 2719 } 2720 2721 /// Build a new generic selection expression. 2722 /// 2723 /// By default, performs semantic analysis to build the new expression. 2724 /// Subclasses may override this routine to provide different behavior. 2725 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2726 SourceLocation DefaultLoc, 2727 SourceLocation RParenLoc, 2728 Expr *ControllingExpr, 2729 ArrayRef<TypeSourceInfo *> Types, 2730 ArrayRef<Expr *> Exprs) { 2731 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2732 ControllingExpr, Types, Exprs); 2733 } 2734 2735 /// Build a new overloaded operator call expression. 2736 /// 2737 /// By default, performs semantic analysis to build the new expression. 2738 /// The semantic analysis provides the behavior of template instantiation, 2739 /// copying with transformations that turn what looks like an overloaded 2740 /// operator call into a use of a builtin operator, performing 2741 /// argument-dependent lookup, etc. Subclasses may override this routine to 2742 /// provide different behavior. 2743 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2744 SourceLocation OpLoc, 2745 Expr *Callee, 2746 Expr *First, 2747 Expr *Second); 2748 2749 /// Build a new C++ "named" cast expression, such as static_cast or 2750 /// reinterpret_cast. 2751 /// 2752 /// By default, this routine dispatches to one of the more-specific routines 2753 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2754 /// Subclasses may override this routine to provide different behavior. 2755 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2756 Stmt::StmtClass Class, 2757 SourceLocation LAngleLoc, 2758 TypeSourceInfo *TInfo, 2759 SourceLocation RAngleLoc, 2760 SourceLocation LParenLoc, 2761 Expr *SubExpr, 2762 SourceLocation RParenLoc) { 2763 switch (Class) { 2764 case Stmt::CXXStaticCastExprClass: 2765 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2766 RAngleLoc, LParenLoc, 2767 SubExpr, RParenLoc); 2768 2769 case Stmt::CXXDynamicCastExprClass: 2770 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2771 RAngleLoc, LParenLoc, 2772 SubExpr, RParenLoc); 2773 2774 case Stmt::CXXReinterpretCastExprClass: 2775 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2776 RAngleLoc, LParenLoc, 2777 SubExpr, 2778 RParenLoc); 2779 2780 case Stmt::CXXConstCastExprClass: 2781 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2782 RAngleLoc, LParenLoc, 2783 SubExpr, RParenLoc); 2784 2785 case Stmt::CXXAddrspaceCastExprClass: 2786 return getDerived().RebuildCXXAddrspaceCastExpr( 2787 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2788 2789 default: 2790 llvm_unreachable("Invalid C++ named cast"); 2791 } 2792 } 2793 2794 /// Build a new C++ static_cast expression. 2795 /// 2796 /// By default, performs semantic analysis to build the new expression. 2797 /// Subclasses may override this routine to provide different behavior. 2798 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2799 SourceLocation LAngleLoc, 2800 TypeSourceInfo *TInfo, 2801 SourceLocation RAngleLoc, 2802 SourceLocation LParenLoc, 2803 Expr *SubExpr, 2804 SourceLocation RParenLoc) { 2805 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2806 TInfo, SubExpr, 2807 SourceRange(LAngleLoc, RAngleLoc), 2808 SourceRange(LParenLoc, RParenLoc)); 2809 } 2810 2811 /// Build a new C++ dynamic_cast expression. 2812 /// 2813 /// By default, performs semantic analysis to build the new expression. 2814 /// Subclasses may override this routine to provide different behavior. 2815 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2816 SourceLocation LAngleLoc, 2817 TypeSourceInfo *TInfo, 2818 SourceLocation RAngleLoc, 2819 SourceLocation LParenLoc, 2820 Expr *SubExpr, 2821 SourceLocation RParenLoc) { 2822 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2823 TInfo, SubExpr, 2824 SourceRange(LAngleLoc, RAngleLoc), 2825 SourceRange(LParenLoc, RParenLoc)); 2826 } 2827 2828 /// Build a new C++ reinterpret_cast expression. 2829 /// 2830 /// By default, performs semantic analysis to build the new expression. 2831 /// Subclasses may override this routine to provide different behavior. 2832 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2833 SourceLocation LAngleLoc, 2834 TypeSourceInfo *TInfo, 2835 SourceLocation RAngleLoc, 2836 SourceLocation LParenLoc, 2837 Expr *SubExpr, 2838 SourceLocation RParenLoc) { 2839 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2840 TInfo, SubExpr, 2841 SourceRange(LAngleLoc, RAngleLoc), 2842 SourceRange(LParenLoc, RParenLoc)); 2843 } 2844 2845 /// Build a new C++ const_cast expression. 2846 /// 2847 /// By default, performs semantic analysis to build the new expression. 2848 /// Subclasses may override this routine to provide different behavior. 2849 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2850 SourceLocation LAngleLoc, 2851 TypeSourceInfo *TInfo, 2852 SourceLocation RAngleLoc, 2853 SourceLocation LParenLoc, 2854 Expr *SubExpr, 2855 SourceLocation RParenLoc) { 2856 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2857 TInfo, SubExpr, 2858 SourceRange(LAngleLoc, RAngleLoc), 2859 SourceRange(LParenLoc, RParenLoc)); 2860 } 2861 2862 ExprResult 2863 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2864 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2865 SourceLocation LParenLoc, Expr *SubExpr, 2866 SourceLocation RParenLoc) { 2867 return getSema().BuildCXXNamedCast( 2868 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2869 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2870 } 2871 2872 /// Build a new C++ functional-style cast expression. 2873 /// 2874 /// By default, performs semantic analysis to build the new expression. 2875 /// Subclasses may override this routine to provide different behavior. 2876 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2877 SourceLocation LParenLoc, 2878 Expr *Sub, 2879 SourceLocation RParenLoc, 2880 bool ListInitialization) { 2881 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2882 MultiExprArg(&Sub, 1), RParenLoc, 2883 ListInitialization); 2884 } 2885 2886 /// Build a new C++ __builtin_bit_cast expression. 2887 /// 2888 /// By default, performs semantic analysis to build the new expression. 2889 /// Subclasses may override this routine to provide different behavior. 2890 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2891 TypeSourceInfo *TSI, Expr *Sub, 2892 SourceLocation RParenLoc) { 2893 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2894 } 2895 2896 /// Build a new C++ typeid(type) expression. 2897 /// 2898 /// By default, performs semantic analysis to build the new expression. 2899 /// Subclasses may override this routine to provide different behavior. 2900 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2901 SourceLocation TypeidLoc, 2902 TypeSourceInfo *Operand, 2903 SourceLocation RParenLoc) { 2904 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2905 RParenLoc); 2906 } 2907 2908 2909 /// Build a new C++ typeid(expr) expression. 2910 /// 2911 /// By default, performs semantic analysis to build the new expression. 2912 /// Subclasses may override this routine to provide different behavior. 2913 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2914 SourceLocation TypeidLoc, 2915 Expr *Operand, 2916 SourceLocation RParenLoc) { 2917 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2918 RParenLoc); 2919 } 2920 2921 /// Build a new C++ __uuidof(type) expression. 2922 /// 2923 /// By default, performs semantic analysis to build the new expression. 2924 /// Subclasses may override this routine to provide different behavior. 2925 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2926 TypeSourceInfo *Operand, 2927 SourceLocation RParenLoc) { 2928 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2929 } 2930 2931 /// Build a new C++ __uuidof(expr) expression. 2932 /// 2933 /// By default, performs semantic analysis to build the new expression. 2934 /// Subclasses may override this routine to provide different behavior. 2935 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2936 Expr *Operand, SourceLocation RParenLoc) { 2937 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2938 } 2939 2940 /// Build a new C++ "this" expression. 2941 /// 2942 /// By default, builds a new "this" expression without performing any 2943 /// semantic analysis. Subclasses may override this routine to provide 2944 /// different behavior. 2945 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2946 QualType ThisType, 2947 bool isImplicit) { 2948 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 2949 } 2950 2951 /// Build a new C++ throw expression. 2952 /// 2953 /// By default, performs semantic analysis to build the new expression. 2954 /// Subclasses may override this routine to provide different behavior. 2955 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2956 bool IsThrownVariableInScope) { 2957 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2958 } 2959 2960 /// Build a new C++ default-argument expression. 2961 /// 2962 /// By default, builds a new default-argument expression, which does not 2963 /// require any semantic analysis. Subclasses may override this routine to 2964 /// provide different behavior. 2965 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 2966 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 2967 getSema().CurContext); 2968 } 2969 2970 /// Build a new C++11 default-initialization expression. 2971 /// 2972 /// By default, builds a new default field initialization expression, which 2973 /// does not require any semantic analysis. Subclasses may override this 2974 /// routine to provide different behavior. 2975 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2976 FieldDecl *Field) { 2977 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 2978 getSema().CurContext); 2979 } 2980 2981 /// Build a new C++ zero-initialization expression. 2982 /// 2983 /// By default, performs semantic analysis to build the new expression. 2984 /// Subclasses may override this routine to provide different behavior. 2985 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2986 SourceLocation LParenLoc, 2987 SourceLocation RParenLoc) { 2988 return getSema().BuildCXXTypeConstructExpr( 2989 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2990 } 2991 2992 /// Build a new C++ "new" expression. 2993 /// 2994 /// By default, performs semantic analysis to build the new expression. 2995 /// Subclasses may override this routine to provide different behavior. 2996 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2997 bool UseGlobal, 2998 SourceLocation PlacementLParen, 2999 MultiExprArg PlacementArgs, 3000 SourceLocation PlacementRParen, 3001 SourceRange TypeIdParens, 3002 QualType AllocatedType, 3003 TypeSourceInfo *AllocatedTypeInfo, 3004 Optional<Expr *> ArraySize, 3005 SourceRange DirectInitRange, 3006 Expr *Initializer) { 3007 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3008 PlacementLParen, 3009 PlacementArgs, 3010 PlacementRParen, 3011 TypeIdParens, 3012 AllocatedType, 3013 AllocatedTypeInfo, 3014 ArraySize, 3015 DirectInitRange, 3016 Initializer); 3017 } 3018 3019 /// Build a new C++ "delete" expression. 3020 /// 3021 /// By default, performs semantic analysis to build the new expression. 3022 /// Subclasses may override this routine to provide different behavior. 3023 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3024 bool IsGlobalDelete, 3025 bool IsArrayForm, 3026 Expr *Operand) { 3027 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3028 Operand); 3029 } 3030 3031 /// Build a new type trait expression. 3032 /// 3033 /// By default, performs semantic analysis to build the new expression. 3034 /// Subclasses may override this routine to provide different behavior. 3035 ExprResult RebuildTypeTrait(TypeTrait Trait, 3036 SourceLocation StartLoc, 3037 ArrayRef<TypeSourceInfo *> Args, 3038 SourceLocation RParenLoc) { 3039 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3040 } 3041 3042 /// Build a new array type trait expression. 3043 /// 3044 /// By default, performs semantic analysis to build the new expression. 3045 /// Subclasses may override this routine to provide different behavior. 3046 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3047 SourceLocation StartLoc, 3048 TypeSourceInfo *TSInfo, 3049 Expr *DimExpr, 3050 SourceLocation RParenLoc) { 3051 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3052 } 3053 3054 /// Build a new expression trait expression. 3055 /// 3056 /// By default, performs semantic analysis to build the new expression. 3057 /// Subclasses may override this routine to provide different behavior. 3058 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3059 SourceLocation StartLoc, 3060 Expr *Queried, 3061 SourceLocation RParenLoc) { 3062 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3063 } 3064 3065 /// Build a new (previously unresolved) declaration reference 3066 /// expression. 3067 /// 3068 /// By default, performs semantic analysis to build the new expression. 3069 /// Subclasses may override this routine to provide different behavior. 3070 ExprResult RebuildDependentScopeDeclRefExpr( 3071 NestedNameSpecifierLoc QualifierLoc, 3072 SourceLocation TemplateKWLoc, 3073 const DeclarationNameInfo &NameInfo, 3074 const TemplateArgumentListInfo *TemplateArgs, 3075 bool IsAddressOfOperand, 3076 TypeSourceInfo **RecoveryTSI) { 3077 CXXScopeSpec SS; 3078 SS.Adopt(QualifierLoc); 3079 3080 if (TemplateArgs || TemplateKWLoc.isValid()) 3081 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3082 TemplateArgs); 3083 3084 return getSema().BuildQualifiedDeclarationNameExpr( 3085 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3086 } 3087 3088 /// Build a new template-id expression. 3089 /// 3090 /// By default, performs semantic analysis to build the new expression. 3091 /// Subclasses may override this routine to provide different behavior. 3092 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3093 SourceLocation TemplateKWLoc, 3094 LookupResult &R, 3095 bool RequiresADL, 3096 const TemplateArgumentListInfo *TemplateArgs) { 3097 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3098 TemplateArgs); 3099 } 3100 3101 /// Build a new object-construction expression. 3102 /// 3103 /// By default, performs semantic analysis to build the new expression. 3104 /// Subclasses may override this routine to provide different behavior. 3105 ExprResult RebuildCXXConstructExpr(QualType T, 3106 SourceLocation Loc, 3107 CXXConstructorDecl *Constructor, 3108 bool IsElidable, 3109 MultiExprArg Args, 3110 bool HadMultipleCandidates, 3111 bool ListInitialization, 3112 bool StdInitListInitialization, 3113 bool RequiresZeroInit, 3114 CXXConstructExpr::ConstructionKind ConstructKind, 3115 SourceRange ParenRange) { 3116 // Reconstruct the constructor we originally found, which might be 3117 // different if this is a call to an inherited constructor. 3118 CXXConstructorDecl *FoundCtor = Constructor; 3119 if (Constructor->isInheritingConstructor()) 3120 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3121 3122 SmallVector<Expr*, 8> ConvertedArgs; 3123 if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs)) 3124 return ExprError(); 3125 3126 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3127 IsElidable, 3128 ConvertedArgs, 3129 HadMultipleCandidates, 3130 ListInitialization, 3131 StdInitListInitialization, 3132 RequiresZeroInit, ConstructKind, 3133 ParenRange); 3134 } 3135 3136 /// Build a new implicit construction via inherited constructor 3137 /// expression. 3138 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3139 CXXConstructorDecl *Constructor, 3140 bool ConstructsVBase, 3141 bool InheritedFromVBase) { 3142 return new (getSema().Context) CXXInheritedCtorInitExpr( 3143 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3144 } 3145 3146 /// Build a new object-construction expression. 3147 /// 3148 /// By default, performs semantic analysis to build the new expression. 3149 /// Subclasses may override this routine to provide different behavior. 3150 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3151 SourceLocation LParenOrBraceLoc, 3152 MultiExprArg Args, 3153 SourceLocation RParenOrBraceLoc, 3154 bool ListInitialization) { 3155 return getSema().BuildCXXTypeConstructExpr( 3156 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3157 } 3158 3159 /// Build a new object-construction expression. 3160 /// 3161 /// By default, performs semantic analysis to build the new expression. 3162 /// Subclasses may override this routine to provide different behavior. 3163 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3164 SourceLocation LParenLoc, 3165 MultiExprArg Args, 3166 SourceLocation RParenLoc, 3167 bool ListInitialization) { 3168 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3169 RParenLoc, ListInitialization); 3170 } 3171 3172 /// Build a new member reference expression. 3173 /// 3174 /// By default, performs semantic analysis to build the new expression. 3175 /// Subclasses may override this routine to provide different behavior. 3176 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3177 QualType BaseType, 3178 bool IsArrow, 3179 SourceLocation OperatorLoc, 3180 NestedNameSpecifierLoc QualifierLoc, 3181 SourceLocation TemplateKWLoc, 3182 NamedDecl *FirstQualifierInScope, 3183 const DeclarationNameInfo &MemberNameInfo, 3184 const TemplateArgumentListInfo *TemplateArgs) { 3185 CXXScopeSpec SS; 3186 SS.Adopt(QualifierLoc); 3187 3188 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3189 OperatorLoc, IsArrow, 3190 SS, TemplateKWLoc, 3191 FirstQualifierInScope, 3192 MemberNameInfo, 3193 TemplateArgs, /*S*/nullptr); 3194 } 3195 3196 /// Build a new member reference expression. 3197 /// 3198 /// By default, performs semantic analysis to build the new expression. 3199 /// Subclasses may override this routine to provide different behavior. 3200 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3201 SourceLocation OperatorLoc, 3202 bool IsArrow, 3203 NestedNameSpecifierLoc QualifierLoc, 3204 SourceLocation TemplateKWLoc, 3205 NamedDecl *FirstQualifierInScope, 3206 LookupResult &R, 3207 const TemplateArgumentListInfo *TemplateArgs) { 3208 CXXScopeSpec SS; 3209 SS.Adopt(QualifierLoc); 3210 3211 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3212 OperatorLoc, IsArrow, 3213 SS, TemplateKWLoc, 3214 FirstQualifierInScope, 3215 R, TemplateArgs, /*S*/nullptr); 3216 } 3217 3218 /// Build a new noexcept expression. 3219 /// 3220 /// By default, performs semantic analysis to build the new expression. 3221 /// Subclasses may override this routine to provide different behavior. 3222 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3223 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3224 } 3225 3226 /// Build a new expression to compute the length of a parameter pack. 3227 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3228 NamedDecl *Pack, 3229 SourceLocation PackLoc, 3230 SourceLocation RParenLoc, 3231 Optional<unsigned> Length, 3232 ArrayRef<TemplateArgument> PartialArgs) { 3233 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3234 RParenLoc, Length, PartialArgs); 3235 } 3236 3237 /// Build a new expression representing a call to a source location 3238 /// builtin. 3239 /// 3240 /// By default, performs semantic analysis to build the new expression. 3241 /// Subclasses may override this routine to provide different behavior. 3242 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3243 SourceLocation BuiltinLoc, 3244 SourceLocation RPLoc, 3245 DeclContext *ParentContext) { 3246 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3247 } 3248 3249 /// Build a new Objective-C boxed expression. 3250 /// 3251 /// By default, performs semantic analysis to build the new expression. 3252 /// Subclasses may override this routine to provide different behavior. 3253 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3254 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3255 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3256 TemplateArgumentListInfo *TALI) { 3257 CXXScopeSpec SS; 3258 SS.Adopt(NNS); 3259 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3260 ConceptNameInfo, 3261 FoundDecl, 3262 NamedConcept, TALI); 3263 if (Result.isInvalid()) 3264 return ExprError(); 3265 return Result; 3266 } 3267 3268 /// \brief Build a new requires expression. 3269 /// 3270 /// By default, performs semantic analysis to build the new expression. 3271 /// Subclasses may override this routine to provide different behavior. 3272 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3273 RequiresExprBodyDecl *Body, 3274 ArrayRef<ParmVarDecl *> LocalParameters, 3275 ArrayRef<concepts::Requirement *> Requirements, 3276 SourceLocation ClosingBraceLoc) { 3277 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3278 LocalParameters, Requirements, ClosingBraceLoc); 3279 } 3280 3281 concepts::TypeRequirement * 3282 RebuildTypeRequirement( 3283 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3284 return SemaRef.BuildTypeRequirement(SubstDiag); 3285 } 3286 3287 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3288 return SemaRef.BuildTypeRequirement(T); 3289 } 3290 3291 concepts::ExprRequirement * 3292 RebuildExprRequirement( 3293 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3294 SourceLocation NoexceptLoc, 3295 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3296 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3297 std::move(Ret)); 3298 } 3299 3300 concepts::ExprRequirement * 3301 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3302 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3303 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3304 std::move(Ret)); 3305 } 3306 3307 concepts::NestedRequirement * 3308 RebuildNestedRequirement( 3309 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3310 return SemaRef.BuildNestedRequirement(SubstDiag); 3311 } 3312 3313 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3314 return SemaRef.BuildNestedRequirement(Constraint); 3315 } 3316 3317 /// \brief Build a new Objective-C boxed expression. 3318 /// 3319 /// By default, performs semantic analysis to build the new expression. 3320 /// Subclasses may override this routine to provide different behavior. 3321 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3322 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3323 } 3324 3325 /// Build a new Objective-C array literal. 3326 /// 3327 /// By default, performs semantic analysis to build the new expression. 3328 /// Subclasses may override this routine to provide different behavior. 3329 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3330 Expr **Elements, unsigned NumElements) { 3331 return getSema().BuildObjCArrayLiteral(Range, 3332 MultiExprArg(Elements, NumElements)); 3333 } 3334 3335 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3336 Expr *Base, Expr *Key, 3337 ObjCMethodDecl *getterMethod, 3338 ObjCMethodDecl *setterMethod) { 3339 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3340 getterMethod, setterMethod); 3341 } 3342 3343 /// Build a new Objective-C dictionary literal. 3344 /// 3345 /// By default, performs semantic analysis to build the new expression. 3346 /// Subclasses may override this routine to provide different behavior. 3347 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3348 MutableArrayRef<ObjCDictionaryElement> Elements) { 3349 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3350 } 3351 3352 /// Build a new Objective-C \@encode expression. 3353 /// 3354 /// By default, performs semantic analysis to build the new expression. 3355 /// Subclasses may override this routine to provide different behavior. 3356 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3357 TypeSourceInfo *EncodeTypeInfo, 3358 SourceLocation RParenLoc) { 3359 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3360 } 3361 3362 /// Build a new Objective-C class message. 3363 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3364 Selector Sel, 3365 ArrayRef<SourceLocation> SelectorLocs, 3366 ObjCMethodDecl *Method, 3367 SourceLocation LBracLoc, 3368 MultiExprArg Args, 3369 SourceLocation RBracLoc) { 3370 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3371 ReceiverTypeInfo->getType(), 3372 /*SuperLoc=*/SourceLocation(), 3373 Sel, Method, LBracLoc, SelectorLocs, 3374 RBracLoc, Args); 3375 } 3376 3377 /// Build a new Objective-C instance message. 3378 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3379 Selector Sel, 3380 ArrayRef<SourceLocation> SelectorLocs, 3381 ObjCMethodDecl *Method, 3382 SourceLocation LBracLoc, 3383 MultiExprArg Args, 3384 SourceLocation RBracLoc) { 3385 return SemaRef.BuildInstanceMessage(Receiver, 3386 Receiver->getType(), 3387 /*SuperLoc=*/SourceLocation(), 3388 Sel, Method, LBracLoc, SelectorLocs, 3389 RBracLoc, Args); 3390 } 3391 3392 /// Build a new Objective-C instance/class message to 'super'. 3393 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3394 Selector Sel, 3395 ArrayRef<SourceLocation> SelectorLocs, 3396 QualType SuperType, 3397 ObjCMethodDecl *Method, 3398 SourceLocation LBracLoc, 3399 MultiExprArg Args, 3400 SourceLocation RBracLoc) { 3401 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3402 SuperType, 3403 SuperLoc, 3404 Sel, Method, LBracLoc, SelectorLocs, 3405 RBracLoc, Args) 3406 : SemaRef.BuildClassMessage(nullptr, 3407 SuperType, 3408 SuperLoc, 3409 Sel, Method, LBracLoc, SelectorLocs, 3410 RBracLoc, Args); 3411 3412 3413 } 3414 3415 /// Build a new Objective-C ivar reference expression. 3416 /// 3417 /// By default, performs semantic analysis to build the new expression. 3418 /// Subclasses may override this routine to provide different behavior. 3419 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3420 SourceLocation IvarLoc, 3421 bool IsArrow, bool IsFreeIvar) { 3422 CXXScopeSpec SS; 3423 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3424 ExprResult Result = getSema().BuildMemberReferenceExpr( 3425 BaseArg, BaseArg->getType(), 3426 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3427 /*FirstQualifierInScope=*/nullptr, NameInfo, 3428 /*TemplateArgs=*/nullptr, 3429 /*S=*/nullptr); 3430 if (IsFreeIvar && Result.isUsable()) 3431 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3432 return Result; 3433 } 3434 3435 /// Build a new Objective-C property reference expression. 3436 /// 3437 /// By default, performs semantic analysis to build the new expression. 3438 /// Subclasses may override this routine to provide different behavior. 3439 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3440 ObjCPropertyDecl *Property, 3441 SourceLocation PropertyLoc) { 3442 CXXScopeSpec SS; 3443 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3444 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3445 /*FIXME:*/PropertyLoc, 3446 /*IsArrow=*/false, 3447 SS, SourceLocation(), 3448 /*FirstQualifierInScope=*/nullptr, 3449 NameInfo, 3450 /*TemplateArgs=*/nullptr, 3451 /*S=*/nullptr); 3452 } 3453 3454 /// Build a new Objective-C property reference expression. 3455 /// 3456 /// By default, performs semantic analysis to build the new expression. 3457 /// Subclasses may override this routine to provide different behavior. 3458 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3459 ObjCMethodDecl *Getter, 3460 ObjCMethodDecl *Setter, 3461 SourceLocation PropertyLoc) { 3462 // Since these expressions can only be value-dependent, we do not 3463 // need to perform semantic analysis again. 3464 return Owned( 3465 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3466 VK_LValue, OK_ObjCProperty, 3467 PropertyLoc, Base)); 3468 } 3469 3470 /// Build a new Objective-C "isa" expression. 3471 /// 3472 /// By default, performs semantic analysis to build the new expression. 3473 /// Subclasses may override this routine to provide different behavior. 3474 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3475 SourceLocation OpLoc, bool IsArrow) { 3476 CXXScopeSpec SS; 3477 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3478 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3479 OpLoc, IsArrow, 3480 SS, SourceLocation(), 3481 /*FirstQualifierInScope=*/nullptr, 3482 NameInfo, 3483 /*TemplateArgs=*/nullptr, 3484 /*S=*/nullptr); 3485 } 3486 3487 /// Build a new shuffle vector expression. 3488 /// 3489 /// By default, performs semantic analysis to build the new expression. 3490 /// Subclasses may override this routine to provide different behavior. 3491 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3492 MultiExprArg SubExprs, 3493 SourceLocation RParenLoc) { 3494 // Find the declaration for __builtin_shufflevector 3495 const IdentifierInfo &Name 3496 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3497 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3498 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3499 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3500 3501 // Build a reference to the __builtin_shufflevector builtin 3502 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3503 Expr *Callee = new (SemaRef.Context) 3504 DeclRefExpr(SemaRef.Context, Builtin, false, 3505 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3506 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3507 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3508 CK_BuiltinFnToFnPtr).get(); 3509 3510 // Build the CallExpr 3511 ExprResult TheCall = CallExpr::Create( 3512 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3513 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3514 FPOptionsOverride()); 3515 3516 // Type-check the __builtin_shufflevector expression. 3517 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3518 } 3519 3520 /// Build a new convert vector expression. 3521 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3522 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3523 SourceLocation RParenLoc) { 3524 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3525 BuiltinLoc, RParenLoc); 3526 } 3527 3528 /// Build a new template argument pack expansion. 3529 /// 3530 /// By default, performs semantic analysis to build a new pack expansion 3531 /// for a template argument. Subclasses may override this routine to provide 3532 /// different behavior. 3533 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3534 SourceLocation EllipsisLoc, 3535 Optional<unsigned> NumExpansions) { 3536 switch (Pattern.getArgument().getKind()) { 3537 case TemplateArgument::Expression: { 3538 ExprResult Result 3539 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3540 EllipsisLoc, NumExpansions); 3541 if (Result.isInvalid()) 3542 return TemplateArgumentLoc(); 3543 3544 return TemplateArgumentLoc(Result.get(), Result.get()); 3545 } 3546 3547 case TemplateArgument::Template: 3548 return TemplateArgumentLoc(TemplateArgument( 3549 Pattern.getArgument().getAsTemplate(), 3550 NumExpansions), 3551 Pattern.getTemplateQualifierLoc(), 3552 Pattern.getTemplateNameLoc(), 3553 EllipsisLoc); 3554 3555 case TemplateArgument::Null: 3556 case TemplateArgument::Integral: 3557 case TemplateArgument::Declaration: 3558 case TemplateArgument::Pack: 3559 case TemplateArgument::TemplateExpansion: 3560 case TemplateArgument::NullPtr: 3561 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3562 3563 case TemplateArgument::Type: 3564 if (TypeSourceInfo *Expansion 3565 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3566 EllipsisLoc, 3567 NumExpansions)) 3568 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3569 Expansion); 3570 break; 3571 } 3572 3573 return TemplateArgumentLoc(); 3574 } 3575 3576 /// Build a new expression pack expansion. 3577 /// 3578 /// By default, performs semantic analysis to build a new pack expansion 3579 /// for an expression. Subclasses may override this routine to provide 3580 /// different behavior. 3581 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3582 Optional<unsigned> NumExpansions) { 3583 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3584 } 3585 3586 /// Build a new C++1z fold-expression. 3587 /// 3588 /// By default, performs semantic analysis in order to build a new fold 3589 /// expression. 3590 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3591 SourceLocation LParenLoc, Expr *LHS, 3592 BinaryOperatorKind Operator, 3593 SourceLocation EllipsisLoc, Expr *RHS, 3594 SourceLocation RParenLoc, 3595 Optional<unsigned> NumExpansions) { 3596 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3597 EllipsisLoc, RHS, RParenLoc, 3598 NumExpansions); 3599 } 3600 3601 /// Build an empty C++1z fold-expression with the given operator. 3602 /// 3603 /// By default, produces the fallback value for the fold-expression, or 3604 /// produce an error if there is no fallback value. 3605 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3606 BinaryOperatorKind Operator) { 3607 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3608 } 3609 3610 /// Build a new atomic operation expression. 3611 /// 3612 /// By default, performs semantic analysis to build the new expression. 3613 /// Subclasses may override this routine to provide different behavior. 3614 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3615 AtomicExpr::AtomicOp Op, 3616 SourceLocation RParenLoc) { 3617 // Use this for all of the locations, since we don't know the difference 3618 // between the call and the expr at this point. 3619 SourceRange Range{BuiltinLoc, RParenLoc}; 3620 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3621 Sema::AtomicArgumentOrder::AST); 3622 } 3623 3624 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3625 ArrayRef<Expr *> SubExprs, QualType Type) { 3626 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3627 } 3628 3629 private: 3630 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3631 QualType ObjectType, 3632 NamedDecl *FirstQualifierInScope, 3633 CXXScopeSpec &SS); 3634 3635 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3636 QualType ObjectType, 3637 NamedDecl *FirstQualifierInScope, 3638 CXXScopeSpec &SS); 3639 3640 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3641 NamedDecl *FirstQualifierInScope, 3642 CXXScopeSpec &SS); 3643 3644 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3645 DependentNameTypeLoc TL, 3646 bool DeducibleTSTContext); 3647 }; 3648 3649 template <typename Derived> 3650 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3651 if (!S) 3652 return S; 3653 3654 switch (S->getStmtClass()) { 3655 case Stmt::NoStmtClass: break; 3656 3657 // Transform individual statement nodes 3658 // Pass SDK into statements that can produce a value 3659 #define STMT(Node, Parent) \ 3660 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3661 #define VALUESTMT(Node, Parent) \ 3662 case Stmt::Node##Class: \ 3663 return getDerived().Transform##Node(cast<Node>(S), SDK); 3664 #define ABSTRACT_STMT(Node) 3665 #define EXPR(Node, Parent) 3666 #include "clang/AST/StmtNodes.inc" 3667 3668 // Transform expressions by calling TransformExpr. 3669 #define STMT(Node, Parent) 3670 #define ABSTRACT_STMT(Stmt) 3671 #define EXPR(Node, Parent) case Stmt::Node##Class: 3672 #include "clang/AST/StmtNodes.inc" 3673 { 3674 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3675 3676 if (SDK == SDK_StmtExprResult) 3677 E = getSema().ActOnStmtExprResult(E); 3678 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3679 } 3680 } 3681 3682 return S; 3683 } 3684 3685 template<typename Derived> 3686 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3687 if (!S) 3688 return S; 3689 3690 switch (S->getClauseKind()) { 3691 default: break; 3692 // Transform individual clause nodes 3693 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 3694 case Enum: \ 3695 return getDerived().Transform ## Class(cast<Class>(S)); 3696 #include "llvm/Frontend/OpenMP/OMPKinds.def" 3697 } 3698 3699 return S; 3700 } 3701 3702 3703 template<typename Derived> 3704 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3705 if (!E) 3706 return E; 3707 3708 switch (E->getStmtClass()) { 3709 case Stmt::NoStmtClass: break; 3710 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3711 #define ABSTRACT_STMT(Stmt) 3712 #define EXPR(Node, Parent) \ 3713 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3714 #include "clang/AST/StmtNodes.inc" 3715 } 3716 3717 return E; 3718 } 3719 3720 template<typename Derived> 3721 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3722 bool NotCopyInit) { 3723 // Initializers are instantiated like expressions, except that various outer 3724 // layers are stripped. 3725 if (!Init) 3726 return Init; 3727 3728 if (auto *FE = dyn_cast<FullExpr>(Init)) 3729 Init = FE->getSubExpr(); 3730 3731 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3732 Init = AIL->getCommonExpr(); 3733 3734 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3735 Init = MTE->getSubExpr(); 3736 3737 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3738 Init = Binder->getSubExpr(); 3739 3740 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3741 Init = ICE->getSubExprAsWritten(); 3742 3743 if (CXXStdInitializerListExpr *ILE = 3744 dyn_cast<CXXStdInitializerListExpr>(Init)) 3745 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3746 3747 // If this is copy-initialization, we only need to reconstruct 3748 // InitListExprs. Other forms of copy-initialization will be a no-op if 3749 // the initializer is already the right type. 3750 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3751 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3752 return getDerived().TransformExpr(Init); 3753 3754 // Revert value-initialization back to empty parens. 3755 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3756 SourceRange Parens = VIE->getSourceRange(); 3757 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3758 Parens.getEnd()); 3759 } 3760 3761 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3762 if (isa<ImplicitValueInitExpr>(Init)) 3763 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3764 SourceLocation()); 3765 3766 // Revert initialization by constructor back to a parenthesized or braced list 3767 // of expressions. Any other form of initializer can just be reused directly. 3768 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3769 return getDerived().TransformExpr(Init); 3770 3771 // If the initialization implicitly converted an initializer list to a 3772 // std::initializer_list object, unwrap the std::initializer_list too. 3773 if (Construct && Construct->isStdInitListInitialization()) 3774 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3775 3776 // Enter a list-init context if this was list initialization. 3777 EnterExpressionEvaluationContext Context( 3778 getSema(), EnterExpressionEvaluationContext::InitList, 3779 Construct->isListInitialization()); 3780 3781 SmallVector<Expr*, 8> NewArgs; 3782 bool ArgChanged = false; 3783 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3784 /*IsCall*/true, NewArgs, &ArgChanged)) 3785 return ExprError(); 3786 3787 // If this was list initialization, revert to syntactic list form. 3788 if (Construct->isListInitialization()) 3789 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3790 Construct->getEndLoc()); 3791 3792 // Build a ParenListExpr to represent anything else. 3793 SourceRange Parens = Construct->getParenOrBraceRange(); 3794 if (Parens.isInvalid()) { 3795 // This was a variable declaration's initialization for which no initializer 3796 // was specified. 3797 assert(NewArgs.empty() && 3798 "no parens or braces but have direct init with arguments?"); 3799 return ExprEmpty(); 3800 } 3801 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3802 Parens.getEnd()); 3803 } 3804 3805 template<typename Derived> 3806 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3807 unsigned NumInputs, 3808 bool IsCall, 3809 SmallVectorImpl<Expr *> &Outputs, 3810 bool *ArgChanged) { 3811 for (unsigned I = 0; I != NumInputs; ++I) { 3812 // If requested, drop call arguments that need to be dropped. 3813 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3814 if (ArgChanged) 3815 *ArgChanged = true; 3816 3817 break; 3818 } 3819 3820 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3821 Expr *Pattern = Expansion->getPattern(); 3822 3823 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3824 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3825 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3826 3827 // Determine whether the set of unexpanded parameter packs can and should 3828 // be expanded. 3829 bool Expand = true; 3830 bool RetainExpansion = false; 3831 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3832 Optional<unsigned> NumExpansions = OrigNumExpansions; 3833 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3834 Pattern->getSourceRange(), 3835 Unexpanded, 3836 Expand, RetainExpansion, 3837 NumExpansions)) 3838 return true; 3839 3840 if (!Expand) { 3841 // The transform has determined that we should perform a simple 3842 // transformation on the pack expansion, producing another pack 3843 // expansion. 3844 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3845 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3846 if (OutPattern.isInvalid()) 3847 return true; 3848 3849 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3850 Expansion->getEllipsisLoc(), 3851 NumExpansions); 3852 if (Out.isInvalid()) 3853 return true; 3854 3855 if (ArgChanged) 3856 *ArgChanged = true; 3857 Outputs.push_back(Out.get()); 3858 continue; 3859 } 3860 3861 // Record right away that the argument was changed. This needs 3862 // to happen even if the array expands to nothing. 3863 if (ArgChanged) *ArgChanged = true; 3864 3865 // The transform has determined that we should perform an elementwise 3866 // expansion of the pattern. Do so. 3867 for (unsigned I = 0; I != *NumExpansions; ++I) { 3868 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3869 ExprResult Out = getDerived().TransformExpr(Pattern); 3870 if (Out.isInvalid()) 3871 return true; 3872 3873 if (Out.get()->containsUnexpandedParameterPack()) { 3874 Out = getDerived().RebuildPackExpansion( 3875 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3876 if (Out.isInvalid()) 3877 return true; 3878 } 3879 3880 Outputs.push_back(Out.get()); 3881 } 3882 3883 // If we're supposed to retain a pack expansion, do so by temporarily 3884 // forgetting the partially-substituted parameter pack. 3885 if (RetainExpansion) { 3886 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3887 3888 ExprResult Out = getDerived().TransformExpr(Pattern); 3889 if (Out.isInvalid()) 3890 return true; 3891 3892 Out = getDerived().RebuildPackExpansion( 3893 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3894 if (Out.isInvalid()) 3895 return true; 3896 3897 Outputs.push_back(Out.get()); 3898 } 3899 3900 continue; 3901 } 3902 3903 ExprResult Result = 3904 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3905 : getDerived().TransformExpr(Inputs[I]); 3906 if (Result.isInvalid()) 3907 return true; 3908 3909 if (Result.get() != Inputs[I] && ArgChanged) 3910 *ArgChanged = true; 3911 3912 Outputs.push_back(Result.get()); 3913 } 3914 3915 return false; 3916 } 3917 3918 template <typename Derived> 3919 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3920 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3921 if (Var) { 3922 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3923 getDerived().TransformDefinition(Var->getLocation(), Var)); 3924 3925 if (!ConditionVar) 3926 return Sema::ConditionError(); 3927 3928 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3929 } 3930 3931 if (Expr) { 3932 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3933 3934 if (CondExpr.isInvalid()) 3935 return Sema::ConditionError(); 3936 3937 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3938 } 3939 3940 return Sema::ConditionResult(); 3941 } 3942 3943 template<typename Derived> 3944 NestedNameSpecifierLoc 3945 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3946 NestedNameSpecifierLoc NNS, 3947 QualType ObjectType, 3948 NamedDecl *FirstQualifierInScope) { 3949 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3950 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3951 Qualifier = Qualifier.getPrefix()) 3952 Qualifiers.push_back(Qualifier); 3953 3954 CXXScopeSpec SS; 3955 while (!Qualifiers.empty()) { 3956 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3957 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3958 3959 switch (QNNS->getKind()) { 3960 case NestedNameSpecifier::Identifier: { 3961 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3962 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3963 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3964 SS, FirstQualifierInScope, false)) 3965 return NestedNameSpecifierLoc(); 3966 } 3967 break; 3968 3969 case NestedNameSpecifier::Namespace: { 3970 NamespaceDecl *NS 3971 = cast_or_null<NamespaceDecl>( 3972 getDerived().TransformDecl( 3973 Q.getLocalBeginLoc(), 3974 QNNS->getAsNamespace())); 3975 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3976 break; 3977 } 3978 3979 case NestedNameSpecifier::NamespaceAlias: { 3980 NamespaceAliasDecl *Alias 3981 = cast_or_null<NamespaceAliasDecl>( 3982 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3983 QNNS->getAsNamespaceAlias())); 3984 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3985 Q.getLocalEndLoc()); 3986 break; 3987 } 3988 3989 case NestedNameSpecifier::Global: 3990 // There is no meaningful transformation that one could perform on the 3991 // global scope. 3992 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3993 break; 3994 3995 case NestedNameSpecifier::Super: { 3996 CXXRecordDecl *RD = 3997 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3998 SourceLocation(), QNNS->getAsRecordDecl())); 3999 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4000 break; 4001 } 4002 4003 case NestedNameSpecifier::TypeSpecWithTemplate: 4004 case NestedNameSpecifier::TypeSpec: { 4005 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4006 FirstQualifierInScope, SS); 4007 4008 if (!TL) 4009 return NestedNameSpecifierLoc(); 4010 4011 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4012 (SemaRef.getLangOpts().CPlusPlus11 && 4013 TL.getType()->isEnumeralType())) { 4014 assert(!TL.getType().hasLocalQualifiers() && 4015 "Can't get cv-qualifiers here"); 4016 if (TL.getType()->isEnumeralType()) 4017 SemaRef.Diag(TL.getBeginLoc(), 4018 diag::warn_cxx98_compat_enum_nested_name_spec); 4019 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 4020 Q.getLocalEndLoc()); 4021 break; 4022 } 4023 // If the nested-name-specifier is an invalid type def, don't emit an 4024 // error because a previous error should have already been emitted. 4025 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4026 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4027 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4028 << TL.getType() << SS.getRange(); 4029 } 4030 return NestedNameSpecifierLoc(); 4031 } 4032 } 4033 4034 // The qualifier-in-scope and object type only apply to the leftmost entity. 4035 FirstQualifierInScope = nullptr; 4036 ObjectType = QualType(); 4037 } 4038 4039 // Don't rebuild the nested-name-specifier if we don't have to. 4040 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4041 !getDerived().AlwaysRebuild()) 4042 return NNS; 4043 4044 // If we can re-use the source-location data from the original 4045 // nested-name-specifier, do so. 4046 if (SS.location_size() == NNS.getDataLength() && 4047 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4048 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4049 4050 // Allocate new nested-name-specifier location information. 4051 return SS.getWithLocInContext(SemaRef.Context); 4052 } 4053 4054 template<typename Derived> 4055 DeclarationNameInfo 4056 TreeTransform<Derived> 4057 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4058 DeclarationName Name = NameInfo.getName(); 4059 if (!Name) 4060 return DeclarationNameInfo(); 4061 4062 switch (Name.getNameKind()) { 4063 case DeclarationName::Identifier: 4064 case DeclarationName::ObjCZeroArgSelector: 4065 case DeclarationName::ObjCOneArgSelector: 4066 case DeclarationName::ObjCMultiArgSelector: 4067 case DeclarationName::CXXOperatorName: 4068 case DeclarationName::CXXLiteralOperatorName: 4069 case DeclarationName::CXXUsingDirective: 4070 return NameInfo; 4071 4072 case DeclarationName::CXXDeductionGuideName: { 4073 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4074 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4075 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4076 if (!NewTemplate) 4077 return DeclarationNameInfo(); 4078 4079 DeclarationNameInfo NewNameInfo(NameInfo); 4080 NewNameInfo.setName( 4081 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4082 return NewNameInfo; 4083 } 4084 4085 case DeclarationName::CXXConstructorName: 4086 case DeclarationName::CXXDestructorName: 4087 case DeclarationName::CXXConversionFunctionName: { 4088 TypeSourceInfo *NewTInfo; 4089 CanQualType NewCanTy; 4090 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4091 NewTInfo = getDerived().TransformType(OldTInfo); 4092 if (!NewTInfo) 4093 return DeclarationNameInfo(); 4094 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4095 } 4096 else { 4097 NewTInfo = nullptr; 4098 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4099 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4100 if (NewT.isNull()) 4101 return DeclarationNameInfo(); 4102 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4103 } 4104 4105 DeclarationName NewName 4106 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4107 NewCanTy); 4108 DeclarationNameInfo NewNameInfo(NameInfo); 4109 NewNameInfo.setName(NewName); 4110 NewNameInfo.setNamedTypeInfo(NewTInfo); 4111 return NewNameInfo; 4112 } 4113 } 4114 4115 llvm_unreachable("Unknown name kind."); 4116 } 4117 4118 template<typename Derived> 4119 TemplateName 4120 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4121 TemplateName Name, 4122 SourceLocation NameLoc, 4123 QualType ObjectType, 4124 NamedDecl *FirstQualifierInScope, 4125 bool AllowInjectedClassName) { 4126 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4127 TemplateDecl *Template = QTN->getTemplateDecl(); 4128 assert(Template && "qualified template name must refer to a template"); 4129 4130 TemplateDecl *TransTemplate 4131 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4132 Template)); 4133 if (!TransTemplate) 4134 return TemplateName(); 4135 4136 if (!getDerived().AlwaysRebuild() && 4137 SS.getScopeRep() == QTN->getQualifier() && 4138 TransTemplate == Template) 4139 return Name; 4140 4141 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4142 TransTemplate); 4143 } 4144 4145 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4146 if (SS.getScopeRep()) { 4147 // These apply to the scope specifier, not the template. 4148 ObjectType = QualType(); 4149 FirstQualifierInScope = nullptr; 4150 } 4151 4152 if (!getDerived().AlwaysRebuild() && 4153 SS.getScopeRep() == DTN->getQualifier() && 4154 ObjectType.isNull()) 4155 return Name; 4156 4157 // FIXME: Preserve the location of the "template" keyword. 4158 SourceLocation TemplateKWLoc = NameLoc; 4159 4160 if (DTN->isIdentifier()) { 4161 return getDerived().RebuildTemplateName(SS, 4162 TemplateKWLoc, 4163 *DTN->getIdentifier(), 4164 NameLoc, 4165 ObjectType, 4166 FirstQualifierInScope, 4167 AllowInjectedClassName); 4168 } 4169 4170 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4171 DTN->getOperator(), NameLoc, 4172 ObjectType, AllowInjectedClassName); 4173 } 4174 4175 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4176 TemplateDecl *TransTemplate 4177 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4178 Template)); 4179 if (!TransTemplate) 4180 return TemplateName(); 4181 4182 if (!getDerived().AlwaysRebuild() && 4183 TransTemplate == Template) 4184 return Name; 4185 4186 return TemplateName(TransTemplate); 4187 } 4188 4189 if (SubstTemplateTemplateParmPackStorage *SubstPack 4190 = Name.getAsSubstTemplateTemplateParmPack()) { 4191 TemplateTemplateParmDecl *TransParam 4192 = cast_or_null<TemplateTemplateParmDecl>( 4193 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4194 if (!TransParam) 4195 return TemplateName(); 4196 4197 if (!getDerived().AlwaysRebuild() && 4198 TransParam == SubstPack->getParameterPack()) 4199 return Name; 4200 4201 return getDerived().RebuildTemplateName(TransParam, 4202 SubstPack->getArgumentPack()); 4203 } 4204 4205 // These should be getting filtered out before they reach the AST. 4206 llvm_unreachable("overloaded function decl survived to here"); 4207 } 4208 4209 template<typename Derived> 4210 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4211 const TemplateArgument &Arg, 4212 TemplateArgumentLoc &Output) { 4213 Output = getSema().getTrivialTemplateArgumentLoc( 4214 Arg, QualType(), getDerived().getBaseLocation()); 4215 } 4216 4217 template<typename Derived> 4218 bool TreeTransform<Derived>::TransformTemplateArgument( 4219 const TemplateArgumentLoc &Input, 4220 TemplateArgumentLoc &Output, bool Uneval) { 4221 const TemplateArgument &Arg = Input.getArgument(); 4222 switch (Arg.getKind()) { 4223 case TemplateArgument::Null: 4224 case TemplateArgument::Pack: 4225 llvm_unreachable("Unexpected TemplateArgument"); 4226 4227 case TemplateArgument::Integral: 4228 case TemplateArgument::NullPtr: 4229 case TemplateArgument::Declaration: { 4230 // Transform a resolved template argument straight to a resolved template 4231 // argument. We get here when substituting into an already-substituted 4232 // template type argument during concept satisfaction checking. 4233 QualType T = Arg.getNonTypeTemplateArgumentType(); 4234 QualType NewT = getDerived().TransformType(T); 4235 if (NewT.isNull()) 4236 return true; 4237 4238 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4239 ? Arg.getAsDecl() 4240 : nullptr; 4241 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4242 getDerived().getBaseLocation(), D)) 4243 : nullptr; 4244 if (D && !NewD) 4245 return true; 4246 4247 if (NewT == T && D == NewD) 4248 Output = Input; 4249 else if (Arg.getKind() == TemplateArgument::Integral) 4250 Output = TemplateArgumentLoc( 4251 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4252 TemplateArgumentLocInfo()); 4253 else if (Arg.getKind() == TemplateArgument::NullPtr) 4254 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4255 TemplateArgumentLocInfo()); 4256 else 4257 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4258 TemplateArgumentLocInfo()); 4259 4260 return false; 4261 } 4262 4263 case TemplateArgument::Type: { 4264 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4265 if (!DI) 4266 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4267 4268 DI = getDerived().TransformType(DI); 4269 if (!DI) return true; 4270 4271 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4272 return false; 4273 } 4274 4275 case TemplateArgument::Template: { 4276 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4277 if (QualifierLoc) { 4278 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4279 if (!QualifierLoc) 4280 return true; 4281 } 4282 4283 CXXScopeSpec SS; 4284 SS.Adopt(QualifierLoc); 4285 TemplateName Template 4286 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4287 Input.getTemplateNameLoc()); 4288 if (Template.isNull()) 4289 return true; 4290 4291 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 4292 Input.getTemplateNameLoc()); 4293 return false; 4294 } 4295 4296 case TemplateArgument::TemplateExpansion: 4297 llvm_unreachable("Caller should expand pack expansions"); 4298 4299 case TemplateArgument::Expression: { 4300 // Template argument expressions are constant expressions. 4301 EnterExpressionEvaluationContext Unevaluated( 4302 getSema(), 4303 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4304 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4305 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4306 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4307 4308 Expr *InputExpr = Input.getSourceExpression(); 4309 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4310 4311 ExprResult E = getDerived().TransformExpr(InputExpr); 4312 E = SemaRef.ActOnConstantExpression(E); 4313 if (E.isInvalid()) return true; 4314 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4315 return false; 4316 } 4317 } 4318 4319 // Work around bogus GCC warning 4320 return true; 4321 } 4322 4323 /// Iterator adaptor that invents template argument location information 4324 /// for each of the template arguments in its underlying iterator. 4325 template<typename Derived, typename InputIterator> 4326 class TemplateArgumentLocInventIterator { 4327 TreeTransform<Derived> &Self; 4328 InputIterator Iter; 4329 4330 public: 4331 typedef TemplateArgumentLoc value_type; 4332 typedef TemplateArgumentLoc reference; 4333 typedef typename std::iterator_traits<InputIterator>::difference_type 4334 difference_type; 4335 typedef std::input_iterator_tag iterator_category; 4336 4337 class pointer { 4338 TemplateArgumentLoc Arg; 4339 4340 public: 4341 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4342 4343 const TemplateArgumentLoc *operator->() const { return &Arg; } 4344 }; 4345 4346 TemplateArgumentLocInventIterator() { } 4347 4348 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4349 InputIterator Iter) 4350 : Self(Self), Iter(Iter) { } 4351 4352 TemplateArgumentLocInventIterator &operator++() { 4353 ++Iter; 4354 return *this; 4355 } 4356 4357 TemplateArgumentLocInventIterator operator++(int) { 4358 TemplateArgumentLocInventIterator Old(*this); 4359 ++(*this); 4360 return Old; 4361 } 4362 4363 reference operator*() const { 4364 TemplateArgumentLoc Result; 4365 Self.InventTemplateArgumentLoc(*Iter, Result); 4366 return Result; 4367 } 4368 4369 pointer operator->() const { return pointer(**this); } 4370 4371 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4372 const TemplateArgumentLocInventIterator &Y) { 4373 return X.Iter == Y.Iter; 4374 } 4375 4376 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4377 const TemplateArgumentLocInventIterator &Y) { 4378 return X.Iter != Y.Iter; 4379 } 4380 }; 4381 4382 template<typename Derived> 4383 template<typename InputIterator> 4384 bool TreeTransform<Derived>::TransformTemplateArguments( 4385 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4386 bool Uneval) { 4387 for (; First != Last; ++First) { 4388 TemplateArgumentLoc Out; 4389 TemplateArgumentLoc In = *First; 4390 4391 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4392 // Unpack argument packs, which we translate them into separate 4393 // arguments. 4394 // FIXME: We could do much better if we could guarantee that the 4395 // TemplateArgumentLocInfo for the pack expansion would be usable for 4396 // all of the template arguments in the argument pack. 4397 typedef TemplateArgumentLocInventIterator<Derived, 4398 TemplateArgument::pack_iterator> 4399 PackLocIterator; 4400 if (TransformTemplateArguments(PackLocIterator(*this, 4401 In.getArgument().pack_begin()), 4402 PackLocIterator(*this, 4403 In.getArgument().pack_end()), 4404 Outputs, Uneval)) 4405 return true; 4406 4407 continue; 4408 } 4409 4410 if (In.getArgument().isPackExpansion()) { 4411 // We have a pack expansion, for which we will be substituting into 4412 // the pattern. 4413 SourceLocation Ellipsis; 4414 Optional<unsigned> OrigNumExpansions; 4415 TemplateArgumentLoc Pattern 4416 = getSema().getTemplateArgumentPackExpansionPattern( 4417 In, Ellipsis, OrigNumExpansions); 4418 4419 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4420 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4421 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4422 4423 // Determine whether the set of unexpanded parameter packs can and should 4424 // be expanded. 4425 bool Expand = true; 4426 bool RetainExpansion = false; 4427 Optional<unsigned> NumExpansions = OrigNumExpansions; 4428 if (getDerived().TryExpandParameterPacks(Ellipsis, 4429 Pattern.getSourceRange(), 4430 Unexpanded, 4431 Expand, 4432 RetainExpansion, 4433 NumExpansions)) 4434 return true; 4435 4436 if (!Expand) { 4437 // The transform has determined that we should perform a simple 4438 // transformation on the pack expansion, producing another pack 4439 // expansion. 4440 TemplateArgumentLoc OutPattern; 4441 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4442 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4443 return true; 4444 4445 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4446 NumExpansions); 4447 if (Out.getArgument().isNull()) 4448 return true; 4449 4450 Outputs.addArgument(Out); 4451 continue; 4452 } 4453 4454 // The transform has determined that we should perform an elementwise 4455 // expansion of the pattern. Do so. 4456 for (unsigned I = 0; I != *NumExpansions; ++I) { 4457 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4458 4459 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4460 return true; 4461 4462 if (Out.getArgument().containsUnexpandedParameterPack()) { 4463 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4464 OrigNumExpansions); 4465 if (Out.getArgument().isNull()) 4466 return true; 4467 } 4468 4469 Outputs.addArgument(Out); 4470 } 4471 4472 // If we're supposed to retain a pack expansion, do so by temporarily 4473 // forgetting the partially-substituted parameter pack. 4474 if (RetainExpansion) { 4475 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4476 4477 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4478 return true; 4479 4480 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4481 OrigNumExpansions); 4482 if (Out.getArgument().isNull()) 4483 return true; 4484 4485 Outputs.addArgument(Out); 4486 } 4487 4488 continue; 4489 } 4490 4491 // The simple case: 4492 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4493 return true; 4494 4495 Outputs.addArgument(Out); 4496 } 4497 4498 return false; 4499 4500 } 4501 4502 //===----------------------------------------------------------------------===// 4503 // Type transformation 4504 //===----------------------------------------------------------------------===// 4505 4506 template<typename Derived> 4507 QualType TreeTransform<Derived>::TransformType(QualType T) { 4508 if (getDerived().AlreadyTransformed(T)) 4509 return T; 4510 4511 // Temporary workaround. All of these transformations should 4512 // eventually turn into transformations on TypeLocs. 4513 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4514 getDerived().getBaseLocation()); 4515 4516 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4517 4518 if (!NewDI) 4519 return QualType(); 4520 4521 return NewDI->getType(); 4522 } 4523 4524 template<typename Derived> 4525 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4526 // Refine the base location to the type's location. 4527 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4528 getDerived().getBaseEntity()); 4529 if (getDerived().AlreadyTransformed(DI->getType())) 4530 return DI; 4531 4532 TypeLocBuilder TLB; 4533 4534 TypeLoc TL = DI->getTypeLoc(); 4535 TLB.reserve(TL.getFullDataSize()); 4536 4537 QualType Result = getDerived().TransformType(TLB, TL); 4538 if (Result.isNull()) 4539 return nullptr; 4540 4541 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4542 } 4543 4544 template<typename Derived> 4545 QualType 4546 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4547 switch (T.getTypeLocClass()) { 4548 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4549 #define TYPELOC(CLASS, PARENT) \ 4550 case TypeLoc::CLASS: \ 4551 return getDerived().Transform##CLASS##Type(TLB, \ 4552 T.castAs<CLASS##TypeLoc>()); 4553 #include "clang/AST/TypeLocNodes.def" 4554 } 4555 4556 llvm_unreachable("unhandled type loc!"); 4557 } 4558 4559 template<typename Derived> 4560 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4561 if (!isa<DependentNameType>(T)) 4562 return TransformType(T); 4563 4564 if (getDerived().AlreadyTransformed(T)) 4565 return T; 4566 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4567 getDerived().getBaseLocation()); 4568 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4569 return NewDI ? NewDI->getType() : QualType(); 4570 } 4571 4572 template<typename Derived> 4573 TypeSourceInfo * 4574 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4575 if (!isa<DependentNameType>(DI->getType())) 4576 return TransformType(DI); 4577 4578 // Refine the base location to the type's location. 4579 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4580 getDerived().getBaseEntity()); 4581 if (getDerived().AlreadyTransformed(DI->getType())) 4582 return DI; 4583 4584 TypeLocBuilder TLB; 4585 4586 TypeLoc TL = DI->getTypeLoc(); 4587 TLB.reserve(TL.getFullDataSize()); 4588 4589 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4590 if (QTL) 4591 TL = QTL.getUnqualifiedLoc(); 4592 4593 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4594 4595 QualType Result = getDerived().TransformDependentNameType( 4596 TLB, DNTL, /*DeducedTSTContext*/true); 4597 if (Result.isNull()) 4598 return nullptr; 4599 4600 if (QTL) { 4601 Result = getDerived().RebuildQualifiedType(Result, QTL); 4602 if (Result.isNull()) 4603 return nullptr; 4604 TLB.TypeWasModifiedSafely(Result); 4605 } 4606 4607 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4608 } 4609 4610 template<typename Derived> 4611 QualType 4612 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4613 QualifiedTypeLoc T) { 4614 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4615 if (Result.isNull()) 4616 return QualType(); 4617 4618 Result = getDerived().RebuildQualifiedType(Result, T); 4619 4620 if (Result.isNull()) 4621 return QualType(); 4622 4623 // RebuildQualifiedType might have updated the type, but not in a way 4624 // that invalidates the TypeLoc. (There's no location information for 4625 // qualifiers.) 4626 TLB.TypeWasModifiedSafely(Result); 4627 4628 return Result; 4629 } 4630 4631 template <typename Derived> 4632 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4633 QualifiedTypeLoc TL) { 4634 4635 SourceLocation Loc = TL.getBeginLoc(); 4636 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4637 4638 if (((T.getAddressSpace() != LangAS::Default && 4639 Quals.getAddressSpace() != LangAS::Default)) && 4640 T.getAddressSpace() != Quals.getAddressSpace()) { 4641 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4642 << TL.getType() << T; 4643 return QualType(); 4644 } 4645 4646 // C++ [dcl.fct]p7: 4647 // [When] adding cv-qualifications on top of the function type [...] the 4648 // cv-qualifiers are ignored. 4649 if (T->isFunctionType()) { 4650 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4651 Quals.getAddressSpace()); 4652 return T; 4653 } 4654 4655 // C++ [dcl.ref]p1: 4656 // when the cv-qualifiers are introduced through the use of a typedef-name 4657 // or decltype-specifier [...] the cv-qualifiers are ignored. 4658 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4659 // applied to a reference type. 4660 if (T->isReferenceType()) { 4661 // The only qualifier that applies to a reference type is restrict. 4662 if (!Quals.hasRestrict()) 4663 return T; 4664 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4665 } 4666 4667 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4668 // resulting type. 4669 if (Quals.hasObjCLifetime()) { 4670 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4671 Quals.removeObjCLifetime(); 4672 else if (T.getObjCLifetime()) { 4673 // Objective-C ARC: 4674 // A lifetime qualifier applied to a substituted template parameter 4675 // overrides the lifetime qualifier from the template argument. 4676 const AutoType *AutoTy; 4677 if (const SubstTemplateTypeParmType *SubstTypeParam 4678 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4679 QualType Replacement = SubstTypeParam->getReplacementType(); 4680 Qualifiers Qs = Replacement.getQualifiers(); 4681 Qs.removeObjCLifetime(); 4682 Replacement = SemaRef.Context.getQualifiedType( 4683 Replacement.getUnqualifiedType(), Qs); 4684 T = SemaRef.Context.getSubstTemplateTypeParmType( 4685 SubstTypeParam->getReplacedParameter(), Replacement); 4686 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4687 // 'auto' types behave the same way as template parameters. 4688 QualType Deduced = AutoTy->getDeducedType(); 4689 Qualifiers Qs = Deduced.getQualifiers(); 4690 Qs.removeObjCLifetime(); 4691 Deduced = 4692 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4693 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4694 AutoTy->isDependentType(), 4695 /*isPack=*/false, 4696 AutoTy->getTypeConstraintConcept(), 4697 AutoTy->getTypeConstraintArguments()); 4698 } else { 4699 // Otherwise, complain about the addition of a qualifier to an 4700 // already-qualified type. 4701 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4702 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4703 Quals.removeObjCLifetime(); 4704 } 4705 } 4706 } 4707 4708 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4709 } 4710 4711 template<typename Derived> 4712 TypeLoc 4713 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4714 QualType ObjectType, 4715 NamedDecl *UnqualLookup, 4716 CXXScopeSpec &SS) { 4717 if (getDerived().AlreadyTransformed(TL.getType())) 4718 return TL; 4719 4720 TypeSourceInfo *TSI = 4721 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4722 if (TSI) 4723 return TSI->getTypeLoc(); 4724 return TypeLoc(); 4725 } 4726 4727 template<typename Derived> 4728 TypeSourceInfo * 4729 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4730 QualType ObjectType, 4731 NamedDecl *UnqualLookup, 4732 CXXScopeSpec &SS) { 4733 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4734 return TSInfo; 4735 4736 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4737 UnqualLookup, SS); 4738 } 4739 4740 template <typename Derived> 4741 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4742 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4743 CXXScopeSpec &SS) { 4744 QualType T = TL.getType(); 4745 assert(!getDerived().AlreadyTransformed(T)); 4746 4747 TypeLocBuilder TLB; 4748 QualType Result; 4749 4750 if (isa<TemplateSpecializationType>(T)) { 4751 TemplateSpecializationTypeLoc SpecTL = 4752 TL.castAs<TemplateSpecializationTypeLoc>(); 4753 4754 TemplateName Template = getDerived().TransformTemplateName( 4755 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4756 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4757 if (Template.isNull()) 4758 return nullptr; 4759 4760 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4761 Template); 4762 } else if (isa<DependentTemplateSpecializationType>(T)) { 4763 DependentTemplateSpecializationTypeLoc SpecTL = 4764 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4765 4766 TemplateName Template 4767 = getDerived().RebuildTemplateName(SS, 4768 SpecTL.getTemplateKeywordLoc(), 4769 *SpecTL.getTypePtr()->getIdentifier(), 4770 SpecTL.getTemplateNameLoc(), 4771 ObjectType, UnqualLookup, 4772 /*AllowInjectedClassName*/true); 4773 if (Template.isNull()) 4774 return nullptr; 4775 4776 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4777 SpecTL, 4778 Template, 4779 SS); 4780 } else { 4781 // Nothing special needs to be done for these. 4782 Result = getDerived().TransformType(TLB, TL); 4783 } 4784 4785 if (Result.isNull()) 4786 return nullptr; 4787 4788 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4789 } 4790 4791 template <class TyLoc> static inline 4792 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4793 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4794 NewT.setNameLoc(T.getNameLoc()); 4795 return T.getType(); 4796 } 4797 4798 template<typename Derived> 4799 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4800 BuiltinTypeLoc T) { 4801 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4802 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4803 if (T.needsExtraLocalData()) 4804 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4805 return T.getType(); 4806 } 4807 4808 template<typename Derived> 4809 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4810 ComplexTypeLoc T) { 4811 // FIXME: recurse? 4812 return TransformTypeSpecType(TLB, T); 4813 } 4814 4815 template <typename Derived> 4816 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4817 AdjustedTypeLoc TL) { 4818 // Adjustments applied during transformation are handled elsewhere. 4819 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4820 } 4821 4822 template<typename Derived> 4823 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4824 DecayedTypeLoc TL) { 4825 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4826 if (OriginalType.isNull()) 4827 return QualType(); 4828 4829 QualType Result = TL.getType(); 4830 if (getDerived().AlwaysRebuild() || 4831 OriginalType != TL.getOriginalLoc().getType()) 4832 Result = SemaRef.Context.getDecayedType(OriginalType); 4833 TLB.push<DecayedTypeLoc>(Result); 4834 // Nothing to set for DecayedTypeLoc. 4835 return Result; 4836 } 4837 4838 template<typename Derived> 4839 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4840 PointerTypeLoc TL) { 4841 QualType PointeeType 4842 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4843 if (PointeeType.isNull()) 4844 return QualType(); 4845 4846 QualType Result = TL.getType(); 4847 if (PointeeType->getAs<ObjCObjectType>()) { 4848 // A dependent pointer type 'T *' has is being transformed such 4849 // that an Objective-C class type is being replaced for 'T'. The 4850 // resulting pointer type is an ObjCObjectPointerType, not a 4851 // PointerType. 4852 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4853 4854 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4855 NewT.setStarLoc(TL.getStarLoc()); 4856 return Result; 4857 } 4858 4859 if (getDerived().AlwaysRebuild() || 4860 PointeeType != TL.getPointeeLoc().getType()) { 4861 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4862 if (Result.isNull()) 4863 return QualType(); 4864 } 4865 4866 // Objective-C ARC can add lifetime qualifiers to the type that we're 4867 // pointing to. 4868 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4869 4870 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4871 NewT.setSigilLoc(TL.getSigilLoc()); 4872 return Result; 4873 } 4874 4875 template<typename Derived> 4876 QualType 4877 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4878 BlockPointerTypeLoc TL) { 4879 QualType PointeeType 4880 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4881 if (PointeeType.isNull()) 4882 return QualType(); 4883 4884 QualType Result = TL.getType(); 4885 if (getDerived().AlwaysRebuild() || 4886 PointeeType != TL.getPointeeLoc().getType()) { 4887 Result = getDerived().RebuildBlockPointerType(PointeeType, 4888 TL.getSigilLoc()); 4889 if (Result.isNull()) 4890 return QualType(); 4891 } 4892 4893 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4894 NewT.setSigilLoc(TL.getSigilLoc()); 4895 return Result; 4896 } 4897 4898 /// Transforms a reference type. Note that somewhat paradoxically we 4899 /// don't care whether the type itself is an l-value type or an r-value 4900 /// type; we only care if the type was *written* as an l-value type 4901 /// or an r-value type. 4902 template<typename Derived> 4903 QualType 4904 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4905 ReferenceTypeLoc TL) { 4906 const ReferenceType *T = TL.getTypePtr(); 4907 4908 // Note that this works with the pointee-as-written. 4909 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4910 if (PointeeType.isNull()) 4911 return QualType(); 4912 4913 QualType Result = TL.getType(); 4914 if (getDerived().AlwaysRebuild() || 4915 PointeeType != T->getPointeeTypeAsWritten()) { 4916 Result = getDerived().RebuildReferenceType(PointeeType, 4917 T->isSpelledAsLValue(), 4918 TL.getSigilLoc()); 4919 if (Result.isNull()) 4920 return QualType(); 4921 } 4922 4923 // Objective-C ARC can add lifetime qualifiers to the type that we're 4924 // referring to. 4925 TLB.TypeWasModifiedSafely( 4926 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4927 4928 // r-value references can be rebuilt as l-value references. 4929 ReferenceTypeLoc NewTL; 4930 if (isa<LValueReferenceType>(Result)) 4931 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4932 else 4933 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4934 NewTL.setSigilLoc(TL.getSigilLoc()); 4935 4936 return Result; 4937 } 4938 4939 template<typename Derived> 4940 QualType 4941 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4942 LValueReferenceTypeLoc TL) { 4943 return TransformReferenceType(TLB, TL); 4944 } 4945 4946 template<typename Derived> 4947 QualType 4948 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4949 RValueReferenceTypeLoc TL) { 4950 return TransformReferenceType(TLB, TL); 4951 } 4952 4953 template<typename Derived> 4954 QualType 4955 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4956 MemberPointerTypeLoc TL) { 4957 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4958 if (PointeeType.isNull()) 4959 return QualType(); 4960 4961 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4962 TypeSourceInfo *NewClsTInfo = nullptr; 4963 if (OldClsTInfo) { 4964 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4965 if (!NewClsTInfo) 4966 return QualType(); 4967 } 4968 4969 const MemberPointerType *T = TL.getTypePtr(); 4970 QualType OldClsType = QualType(T->getClass(), 0); 4971 QualType NewClsType; 4972 if (NewClsTInfo) 4973 NewClsType = NewClsTInfo->getType(); 4974 else { 4975 NewClsType = getDerived().TransformType(OldClsType); 4976 if (NewClsType.isNull()) 4977 return QualType(); 4978 } 4979 4980 QualType Result = TL.getType(); 4981 if (getDerived().AlwaysRebuild() || 4982 PointeeType != T->getPointeeType() || 4983 NewClsType != OldClsType) { 4984 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4985 TL.getStarLoc()); 4986 if (Result.isNull()) 4987 return QualType(); 4988 } 4989 4990 // If we had to adjust the pointee type when building a member pointer, make 4991 // sure to push TypeLoc info for it. 4992 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4993 if (MPT && PointeeType != MPT->getPointeeType()) { 4994 assert(isa<AdjustedType>(MPT->getPointeeType())); 4995 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4996 } 4997 4998 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4999 NewTL.setSigilLoc(TL.getSigilLoc()); 5000 NewTL.setClassTInfo(NewClsTInfo); 5001 5002 return Result; 5003 } 5004 5005 template<typename Derived> 5006 QualType 5007 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5008 ConstantArrayTypeLoc TL) { 5009 const ConstantArrayType *T = TL.getTypePtr(); 5010 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5011 if (ElementType.isNull()) 5012 return QualType(); 5013 5014 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5015 Expr *OldSize = TL.getSizeExpr(); 5016 if (!OldSize) 5017 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5018 Expr *NewSize = nullptr; 5019 if (OldSize) { 5020 EnterExpressionEvaluationContext Unevaluated( 5021 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5022 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5023 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5024 } 5025 5026 QualType Result = TL.getType(); 5027 if (getDerived().AlwaysRebuild() || 5028 ElementType != T->getElementType() || 5029 (T->getSizeExpr() && NewSize != OldSize)) { 5030 Result = getDerived().RebuildConstantArrayType(ElementType, 5031 T->getSizeModifier(), 5032 T->getSize(), NewSize, 5033 T->getIndexTypeCVRQualifiers(), 5034 TL.getBracketsRange()); 5035 if (Result.isNull()) 5036 return QualType(); 5037 } 5038 5039 // We might have either a ConstantArrayType or a VariableArrayType now: 5040 // a ConstantArrayType is allowed to have an element type which is a 5041 // VariableArrayType if the type is dependent. Fortunately, all array 5042 // types have the same location layout. 5043 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5044 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5045 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5046 NewTL.setSizeExpr(NewSize); 5047 5048 return Result; 5049 } 5050 5051 template<typename Derived> 5052 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5053 TypeLocBuilder &TLB, 5054 IncompleteArrayTypeLoc TL) { 5055 const IncompleteArrayType *T = TL.getTypePtr(); 5056 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5057 if (ElementType.isNull()) 5058 return QualType(); 5059 5060 QualType Result = TL.getType(); 5061 if (getDerived().AlwaysRebuild() || 5062 ElementType != T->getElementType()) { 5063 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5064 T->getSizeModifier(), 5065 T->getIndexTypeCVRQualifiers(), 5066 TL.getBracketsRange()); 5067 if (Result.isNull()) 5068 return QualType(); 5069 } 5070 5071 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5072 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5073 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5074 NewTL.setSizeExpr(nullptr); 5075 5076 return Result; 5077 } 5078 5079 template<typename Derived> 5080 QualType 5081 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5082 VariableArrayTypeLoc TL) { 5083 const VariableArrayType *T = TL.getTypePtr(); 5084 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5085 if (ElementType.isNull()) 5086 return QualType(); 5087 5088 ExprResult SizeResult; 5089 { 5090 EnterExpressionEvaluationContext Context( 5091 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5092 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5093 } 5094 if (SizeResult.isInvalid()) 5095 return QualType(); 5096 SizeResult = 5097 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5098 if (SizeResult.isInvalid()) 5099 return QualType(); 5100 5101 Expr *Size = SizeResult.get(); 5102 5103 QualType Result = TL.getType(); 5104 if (getDerived().AlwaysRebuild() || 5105 ElementType != T->getElementType() || 5106 Size != T->getSizeExpr()) { 5107 Result = getDerived().RebuildVariableArrayType(ElementType, 5108 T->getSizeModifier(), 5109 Size, 5110 T->getIndexTypeCVRQualifiers(), 5111 TL.getBracketsRange()); 5112 if (Result.isNull()) 5113 return QualType(); 5114 } 5115 5116 // We might have constant size array now, but fortunately it has the same 5117 // location layout. 5118 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5119 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5120 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5121 NewTL.setSizeExpr(Size); 5122 5123 return Result; 5124 } 5125 5126 template<typename Derived> 5127 QualType 5128 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5129 DependentSizedArrayTypeLoc TL) { 5130 const DependentSizedArrayType *T = TL.getTypePtr(); 5131 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5132 if (ElementType.isNull()) 5133 return QualType(); 5134 5135 // Array bounds are constant expressions. 5136 EnterExpressionEvaluationContext Unevaluated( 5137 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5138 5139 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5140 Expr *origSize = TL.getSizeExpr(); 5141 if (!origSize) origSize = T->getSizeExpr(); 5142 5143 ExprResult sizeResult 5144 = getDerived().TransformExpr(origSize); 5145 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5146 if (sizeResult.isInvalid()) 5147 return QualType(); 5148 5149 Expr *size = sizeResult.get(); 5150 5151 QualType Result = TL.getType(); 5152 if (getDerived().AlwaysRebuild() || 5153 ElementType != T->getElementType() || 5154 size != origSize) { 5155 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5156 T->getSizeModifier(), 5157 size, 5158 T->getIndexTypeCVRQualifiers(), 5159 TL.getBracketsRange()); 5160 if (Result.isNull()) 5161 return QualType(); 5162 } 5163 5164 // We might have any sort of array type now, but fortunately they 5165 // all have the same location layout. 5166 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5167 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5168 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5169 NewTL.setSizeExpr(size); 5170 5171 return Result; 5172 } 5173 5174 template <typename Derived> 5175 QualType TreeTransform<Derived>::TransformDependentVectorType( 5176 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5177 const DependentVectorType *T = TL.getTypePtr(); 5178 QualType ElementType = getDerived().TransformType(T->getElementType()); 5179 if (ElementType.isNull()) 5180 return QualType(); 5181 5182 EnterExpressionEvaluationContext Unevaluated( 5183 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5184 5185 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5186 Size = SemaRef.ActOnConstantExpression(Size); 5187 if (Size.isInvalid()) 5188 return QualType(); 5189 5190 QualType Result = TL.getType(); 5191 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5192 Size.get() != T->getSizeExpr()) { 5193 Result = getDerived().RebuildDependentVectorType( 5194 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5195 if (Result.isNull()) 5196 return QualType(); 5197 } 5198 5199 // Result might be dependent or not. 5200 if (isa<DependentVectorType>(Result)) { 5201 DependentVectorTypeLoc NewTL = 5202 TLB.push<DependentVectorTypeLoc>(Result); 5203 NewTL.setNameLoc(TL.getNameLoc()); 5204 } else { 5205 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5206 NewTL.setNameLoc(TL.getNameLoc()); 5207 } 5208 5209 return Result; 5210 } 5211 5212 template<typename Derived> 5213 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5214 TypeLocBuilder &TLB, 5215 DependentSizedExtVectorTypeLoc TL) { 5216 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5217 5218 // FIXME: ext vector locs should be nested 5219 QualType ElementType = getDerived().TransformType(T->getElementType()); 5220 if (ElementType.isNull()) 5221 return QualType(); 5222 5223 // Vector sizes are constant expressions. 5224 EnterExpressionEvaluationContext Unevaluated( 5225 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5226 5227 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5228 Size = SemaRef.ActOnConstantExpression(Size); 5229 if (Size.isInvalid()) 5230 return QualType(); 5231 5232 QualType Result = TL.getType(); 5233 if (getDerived().AlwaysRebuild() || 5234 ElementType != T->getElementType() || 5235 Size.get() != T->getSizeExpr()) { 5236 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5237 Size.get(), 5238 T->getAttributeLoc()); 5239 if (Result.isNull()) 5240 return QualType(); 5241 } 5242 5243 // Result might be dependent or not. 5244 if (isa<DependentSizedExtVectorType>(Result)) { 5245 DependentSizedExtVectorTypeLoc NewTL 5246 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5247 NewTL.setNameLoc(TL.getNameLoc()); 5248 } else { 5249 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5250 NewTL.setNameLoc(TL.getNameLoc()); 5251 } 5252 5253 return Result; 5254 } 5255 5256 template <typename Derived> 5257 QualType 5258 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5259 ConstantMatrixTypeLoc TL) { 5260 const ConstantMatrixType *T = TL.getTypePtr(); 5261 QualType ElementType = getDerived().TransformType(T->getElementType()); 5262 if (ElementType.isNull()) 5263 return QualType(); 5264 5265 QualType Result = TL.getType(); 5266 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5267 Result = getDerived().RebuildConstantMatrixType( 5268 ElementType, T->getNumRows(), T->getNumColumns()); 5269 if (Result.isNull()) 5270 return QualType(); 5271 } 5272 5273 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5274 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5275 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5276 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5277 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5278 5279 return Result; 5280 } 5281 5282 template <typename Derived> 5283 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5284 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5285 const DependentSizedMatrixType *T = TL.getTypePtr(); 5286 5287 QualType ElementType = getDerived().TransformType(T->getElementType()); 5288 if (ElementType.isNull()) { 5289 return QualType(); 5290 } 5291 5292 // Matrix dimensions are constant expressions. 5293 EnterExpressionEvaluationContext Unevaluated( 5294 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5295 5296 Expr *origRows = TL.getAttrRowOperand(); 5297 if (!origRows) 5298 origRows = T->getRowExpr(); 5299 Expr *origColumns = TL.getAttrColumnOperand(); 5300 if (!origColumns) 5301 origColumns = T->getColumnExpr(); 5302 5303 ExprResult rowResult = getDerived().TransformExpr(origRows); 5304 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5305 if (rowResult.isInvalid()) 5306 return QualType(); 5307 5308 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5309 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5310 if (columnResult.isInvalid()) 5311 return QualType(); 5312 5313 Expr *rows = rowResult.get(); 5314 Expr *columns = columnResult.get(); 5315 5316 QualType Result = TL.getType(); 5317 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5318 rows != origRows || columns != origColumns) { 5319 Result = getDerived().RebuildDependentSizedMatrixType( 5320 ElementType, rows, columns, T->getAttributeLoc()); 5321 5322 if (Result.isNull()) 5323 return QualType(); 5324 } 5325 5326 // We might have any sort of matrix type now, but fortunately they 5327 // all have the same location layout. 5328 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5329 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5330 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5331 NewTL.setAttrRowOperand(rows); 5332 NewTL.setAttrColumnOperand(columns); 5333 return Result; 5334 } 5335 5336 template <typename Derived> 5337 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5338 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5339 const DependentAddressSpaceType *T = TL.getTypePtr(); 5340 5341 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5342 5343 if (pointeeType.isNull()) 5344 return QualType(); 5345 5346 // Address spaces are constant expressions. 5347 EnterExpressionEvaluationContext Unevaluated( 5348 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5349 5350 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5351 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5352 if (AddrSpace.isInvalid()) 5353 return QualType(); 5354 5355 QualType Result = TL.getType(); 5356 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5357 AddrSpace.get() != T->getAddrSpaceExpr()) { 5358 Result = getDerived().RebuildDependentAddressSpaceType( 5359 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5360 if (Result.isNull()) 5361 return QualType(); 5362 } 5363 5364 // Result might be dependent or not. 5365 if (isa<DependentAddressSpaceType>(Result)) { 5366 DependentAddressSpaceTypeLoc NewTL = 5367 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5368 5369 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5370 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5371 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5372 5373 } else { 5374 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5375 Result, getDerived().getBaseLocation()); 5376 TransformType(TLB, DI->getTypeLoc()); 5377 } 5378 5379 return Result; 5380 } 5381 5382 template <typename Derived> 5383 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5384 VectorTypeLoc TL) { 5385 const VectorType *T = TL.getTypePtr(); 5386 QualType ElementType = getDerived().TransformType(T->getElementType()); 5387 if (ElementType.isNull()) 5388 return QualType(); 5389 5390 QualType Result = TL.getType(); 5391 if (getDerived().AlwaysRebuild() || 5392 ElementType != T->getElementType()) { 5393 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5394 T->getVectorKind()); 5395 if (Result.isNull()) 5396 return QualType(); 5397 } 5398 5399 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5400 NewTL.setNameLoc(TL.getNameLoc()); 5401 5402 return Result; 5403 } 5404 5405 template<typename Derived> 5406 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5407 ExtVectorTypeLoc TL) { 5408 const VectorType *T = TL.getTypePtr(); 5409 QualType ElementType = getDerived().TransformType(T->getElementType()); 5410 if (ElementType.isNull()) 5411 return QualType(); 5412 5413 QualType Result = TL.getType(); 5414 if (getDerived().AlwaysRebuild() || 5415 ElementType != T->getElementType()) { 5416 Result = getDerived().RebuildExtVectorType(ElementType, 5417 T->getNumElements(), 5418 /*FIXME*/ SourceLocation()); 5419 if (Result.isNull()) 5420 return QualType(); 5421 } 5422 5423 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5424 NewTL.setNameLoc(TL.getNameLoc()); 5425 5426 return Result; 5427 } 5428 5429 template <typename Derived> 5430 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5431 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5432 bool ExpectParameterPack) { 5433 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5434 TypeSourceInfo *NewDI = nullptr; 5435 5436 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5437 // If we're substituting into a pack expansion type and we know the 5438 // length we want to expand to, just substitute for the pattern. 5439 TypeLoc OldTL = OldDI->getTypeLoc(); 5440 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5441 5442 TypeLocBuilder TLB; 5443 TypeLoc NewTL = OldDI->getTypeLoc(); 5444 TLB.reserve(NewTL.getFullDataSize()); 5445 5446 QualType Result = getDerived().TransformType(TLB, 5447 OldExpansionTL.getPatternLoc()); 5448 if (Result.isNull()) 5449 return nullptr; 5450 5451 Result = RebuildPackExpansionType(Result, 5452 OldExpansionTL.getPatternLoc().getSourceRange(), 5453 OldExpansionTL.getEllipsisLoc(), 5454 NumExpansions); 5455 if (Result.isNull()) 5456 return nullptr; 5457 5458 PackExpansionTypeLoc NewExpansionTL 5459 = TLB.push<PackExpansionTypeLoc>(Result); 5460 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5461 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5462 } else 5463 NewDI = getDerived().TransformType(OldDI); 5464 if (!NewDI) 5465 return nullptr; 5466 5467 if (NewDI == OldDI && indexAdjustment == 0) 5468 return OldParm; 5469 5470 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5471 OldParm->getDeclContext(), 5472 OldParm->getInnerLocStart(), 5473 OldParm->getLocation(), 5474 OldParm->getIdentifier(), 5475 NewDI->getType(), 5476 NewDI, 5477 OldParm->getStorageClass(), 5478 /* DefArg */ nullptr); 5479 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5480 OldParm->getFunctionScopeIndex() + indexAdjustment); 5481 return newParm; 5482 } 5483 5484 template <typename Derived> 5485 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5486 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5487 const QualType *ParamTypes, 5488 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5489 SmallVectorImpl<QualType> &OutParamTypes, 5490 SmallVectorImpl<ParmVarDecl *> *PVars, 5491 Sema::ExtParameterInfoBuilder &PInfos) { 5492 int indexAdjustment = 0; 5493 5494 unsigned NumParams = Params.size(); 5495 for (unsigned i = 0; i != NumParams; ++i) { 5496 if (ParmVarDecl *OldParm = Params[i]) { 5497 assert(OldParm->getFunctionScopeIndex() == i); 5498 5499 Optional<unsigned> NumExpansions; 5500 ParmVarDecl *NewParm = nullptr; 5501 if (OldParm->isParameterPack()) { 5502 // We have a function parameter pack that may need to be expanded. 5503 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5504 5505 // Find the parameter packs that could be expanded. 5506 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5507 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5508 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5509 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5510 5511 // Determine whether we should expand the parameter packs. 5512 bool ShouldExpand = false; 5513 bool RetainExpansion = false; 5514 Optional<unsigned> OrigNumExpansions; 5515 if (Unexpanded.size() > 0) { 5516 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5517 NumExpansions = OrigNumExpansions; 5518 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5519 Pattern.getSourceRange(), 5520 Unexpanded, 5521 ShouldExpand, 5522 RetainExpansion, 5523 NumExpansions)) { 5524 return true; 5525 } 5526 } else { 5527 #ifndef NDEBUG 5528 const AutoType *AT = 5529 Pattern.getType().getTypePtr()->getContainedAutoType(); 5530 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5531 "Could not find parameter packs or undeduced auto type!"); 5532 #endif 5533 } 5534 5535 if (ShouldExpand) { 5536 // Expand the function parameter pack into multiple, separate 5537 // parameters. 5538 getDerived().ExpandingFunctionParameterPack(OldParm); 5539 for (unsigned I = 0; I != *NumExpansions; ++I) { 5540 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5541 ParmVarDecl *NewParm 5542 = getDerived().TransformFunctionTypeParam(OldParm, 5543 indexAdjustment++, 5544 OrigNumExpansions, 5545 /*ExpectParameterPack=*/false); 5546 if (!NewParm) 5547 return true; 5548 5549 if (ParamInfos) 5550 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5551 OutParamTypes.push_back(NewParm->getType()); 5552 if (PVars) 5553 PVars->push_back(NewParm); 5554 } 5555 5556 // If we're supposed to retain a pack expansion, do so by temporarily 5557 // forgetting the partially-substituted parameter pack. 5558 if (RetainExpansion) { 5559 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5560 ParmVarDecl *NewParm 5561 = getDerived().TransformFunctionTypeParam(OldParm, 5562 indexAdjustment++, 5563 OrigNumExpansions, 5564 /*ExpectParameterPack=*/false); 5565 if (!NewParm) 5566 return true; 5567 5568 if (ParamInfos) 5569 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5570 OutParamTypes.push_back(NewParm->getType()); 5571 if (PVars) 5572 PVars->push_back(NewParm); 5573 } 5574 5575 // The next parameter should have the same adjustment as the 5576 // last thing we pushed, but we post-incremented indexAdjustment 5577 // on every push. Also, if we push nothing, the adjustment should 5578 // go down by one. 5579 indexAdjustment--; 5580 5581 // We're done with the pack expansion. 5582 continue; 5583 } 5584 5585 // We'll substitute the parameter now without expanding the pack 5586 // expansion. 5587 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5588 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5589 indexAdjustment, 5590 NumExpansions, 5591 /*ExpectParameterPack=*/true); 5592 assert(NewParm->isParameterPack() && 5593 "Parameter pack no longer a parameter pack after " 5594 "transformation."); 5595 } else { 5596 NewParm = getDerived().TransformFunctionTypeParam( 5597 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5598 } 5599 5600 if (!NewParm) 5601 return true; 5602 5603 if (ParamInfos) 5604 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5605 OutParamTypes.push_back(NewParm->getType()); 5606 if (PVars) 5607 PVars->push_back(NewParm); 5608 continue; 5609 } 5610 5611 // Deal with the possibility that we don't have a parameter 5612 // declaration for this parameter. 5613 QualType OldType = ParamTypes[i]; 5614 bool IsPackExpansion = false; 5615 Optional<unsigned> NumExpansions; 5616 QualType NewType; 5617 if (const PackExpansionType *Expansion 5618 = dyn_cast<PackExpansionType>(OldType)) { 5619 // We have a function parameter pack that may need to be expanded. 5620 QualType Pattern = Expansion->getPattern(); 5621 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5622 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5623 5624 // Determine whether we should expand the parameter packs. 5625 bool ShouldExpand = false; 5626 bool RetainExpansion = false; 5627 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5628 Unexpanded, 5629 ShouldExpand, 5630 RetainExpansion, 5631 NumExpansions)) { 5632 return true; 5633 } 5634 5635 if (ShouldExpand) { 5636 // Expand the function parameter pack into multiple, separate 5637 // parameters. 5638 for (unsigned I = 0; I != *NumExpansions; ++I) { 5639 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5640 QualType NewType = getDerived().TransformType(Pattern); 5641 if (NewType.isNull()) 5642 return true; 5643 5644 if (NewType->containsUnexpandedParameterPack()) { 5645 NewType = 5646 getSema().getASTContext().getPackExpansionType(NewType, None); 5647 5648 if (NewType.isNull()) 5649 return true; 5650 } 5651 5652 if (ParamInfos) 5653 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5654 OutParamTypes.push_back(NewType); 5655 if (PVars) 5656 PVars->push_back(nullptr); 5657 } 5658 5659 // We're done with the pack expansion. 5660 continue; 5661 } 5662 5663 // If we're supposed to retain a pack expansion, do so by temporarily 5664 // forgetting the partially-substituted parameter pack. 5665 if (RetainExpansion) { 5666 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5667 QualType NewType = getDerived().TransformType(Pattern); 5668 if (NewType.isNull()) 5669 return true; 5670 5671 if (ParamInfos) 5672 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5673 OutParamTypes.push_back(NewType); 5674 if (PVars) 5675 PVars->push_back(nullptr); 5676 } 5677 5678 // We'll substitute the parameter now without expanding the pack 5679 // expansion. 5680 OldType = Expansion->getPattern(); 5681 IsPackExpansion = true; 5682 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5683 NewType = getDerived().TransformType(OldType); 5684 } else { 5685 NewType = getDerived().TransformType(OldType); 5686 } 5687 5688 if (NewType.isNull()) 5689 return true; 5690 5691 if (IsPackExpansion) 5692 NewType = getSema().Context.getPackExpansionType(NewType, 5693 NumExpansions); 5694 5695 if (ParamInfos) 5696 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5697 OutParamTypes.push_back(NewType); 5698 if (PVars) 5699 PVars->push_back(nullptr); 5700 } 5701 5702 #ifndef NDEBUG 5703 if (PVars) { 5704 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5705 if (ParmVarDecl *parm = (*PVars)[i]) 5706 assert(parm->getFunctionScopeIndex() == i); 5707 } 5708 #endif 5709 5710 return false; 5711 } 5712 5713 template<typename Derived> 5714 QualType 5715 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5716 FunctionProtoTypeLoc TL) { 5717 SmallVector<QualType, 4> ExceptionStorage; 5718 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5719 return getDerived().TransformFunctionProtoType( 5720 TLB, TL, nullptr, Qualifiers(), 5721 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5722 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5723 ExceptionStorage, Changed); 5724 }); 5725 } 5726 5727 template<typename Derived> template<typename Fn> 5728 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5729 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5730 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5731 5732 // Transform the parameters and return type. 5733 // 5734 // We are required to instantiate the params and return type in source order. 5735 // When the function has a trailing return type, we instantiate the 5736 // parameters before the return type, since the return type can then refer 5737 // to the parameters themselves (via decltype, sizeof, etc.). 5738 // 5739 SmallVector<QualType, 4> ParamTypes; 5740 SmallVector<ParmVarDecl*, 4> ParamDecls; 5741 Sema::ExtParameterInfoBuilder ExtParamInfos; 5742 const FunctionProtoType *T = TL.getTypePtr(); 5743 5744 QualType ResultType; 5745 5746 if (T->hasTrailingReturn()) { 5747 if (getDerived().TransformFunctionTypeParams( 5748 TL.getBeginLoc(), TL.getParams(), 5749 TL.getTypePtr()->param_type_begin(), 5750 T->getExtParameterInfosOrNull(), 5751 ParamTypes, &ParamDecls, ExtParamInfos)) 5752 return QualType(); 5753 5754 { 5755 // C++11 [expr.prim.general]p3: 5756 // If a declaration declares a member function or member function 5757 // template of a class X, the expression this is a prvalue of type 5758 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5759 // and the end of the function-definition, member-declarator, or 5760 // declarator. 5761 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5762 5763 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5764 if (ResultType.isNull()) 5765 return QualType(); 5766 } 5767 } 5768 else { 5769 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5770 if (ResultType.isNull()) 5771 return QualType(); 5772 5773 if (getDerived().TransformFunctionTypeParams( 5774 TL.getBeginLoc(), TL.getParams(), 5775 TL.getTypePtr()->param_type_begin(), 5776 T->getExtParameterInfosOrNull(), 5777 ParamTypes, &ParamDecls, ExtParamInfos)) 5778 return QualType(); 5779 } 5780 5781 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5782 5783 bool EPIChanged = false; 5784 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5785 return QualType(); 5786 5787 // Handle extended parameter information. 5788 if (auto NewExtParamInfos = 5789 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5790 if (!EPI.ExtParameterInfos || 5791 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5792 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5793 EPIChanged = true; 5794 } 5795 EPI.ExtParameterInfos = NewExtParamInfos; 5796 } else if (EPI.ExtParameterInfos) { 5797 EPIChanged = true; 5798 EPI.ExtParameterInfos = nullptr; 5799 } 5800 5801 QualType Result = TL.getType(); 5802 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5803 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5804 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5805 if (Result.isNull()) 5806 return QualType(); 5807 } 5808 5809 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5810 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5811 NewTL.setLParenLoc(TL.getLParenLoc()); 5812 NewTL.setRParenLoc(TL.getRParenLoc()); 5813 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5814 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5815 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5816 NewTL.setParam(i, ParamDecls[i]); 5817 5818 return Result; 5819 } 5820 5821 template<typename Derived> 5822 bool TreeTransform<Derived>::TransformExceptionSpec( 5823 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5824 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5825 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5826 5827 // Instantiate a dynamic noexcept expression, if any. 5828 if (isComputedNoexcept(ESI.Type)) { 5829 EnterExpressionEvaluationContext Unevaluated( 5830 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5831 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5832 if (NoexceptExpr.isInvalid()) 5833 return true; 5834 5835 ExceptionSpecificationType EST = ESI.Type; 5836 NoexceptExpr = 5837 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5838 if (NoexceptExpr.isInvalid()) 5839 return true; 5840 5841 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5842 Changed = true; 5843 ESI.NoexceptExpr = NoexceptExpr.get(); 5844 ESI.Type = EST; 5845 } 5846 5847 if (ESI.Type != EST_Dynamic) 5848 return false; 5849 5850 // Instantiate a dynamic exception specification's type. 5851 for (QualType T : ESI.Exceptions) { 5852 if (const PackExpansionType *PackExpansion = 5853 T->getAs<PackExpansionType>()) { 5854 Changed = true; 5855 5856 // We have a pack expansion. Instantiate it. 5857 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5858 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5859 Unexpanded); 5860 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5861 5862 // Determine whether the set of unexpanded parameter packs can and 5863 // should 5864 // be expanded. 5865 bool Expand = false; 5866 bool RetainExpansion = false; 5867 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5868 // FIXME: Track the location of the ellipsis (and track source location 5869 // information for the types in the exception specification in general). 5870 if (getDerived().TryExpandParameterPacks( 5871 Loc, SourceRange(), Unexpanded, Expand, 5872 RetainExpansion, NumExpansions)) 5873 return true; 5874 5875 if (!Expand) { 5876 // We can't expand this pack expansion into separate arguments yet; 5877 // just substitute into the pattern and create a new pack expansion 5878 // type. 5879 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5880 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5881 if (U.isNull()) 5882 return true; 5883 5884 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5885 Exceptions.push_back(U); 5886 continue; 5887 } 5888 5889 // Substitute into the pack expansion pattern for each slice of the 5890 // pack. 5891 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5892 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5893 5894 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5895 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5896 return true; 5897 5898 Exceptions.push_back(U); 5899 } 5900 } else { 5901 QualType U = getDerived().TransformType(T); 5902 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5903 return true; 5904 if (T != U) 5905 Changed = true; 5906 5907 Exceptions.push_back(U); 5908 } 5909 } 5910 5911 ESI.Exceptions = Exceptions; 5912 if (ESI.Exceptions.empty()) 5913 ESI.Type = EST_DynamicNone; 5914 return false; 5915 } 5916 5917 template<typename Derived> 5918 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5919 TypeLocBuilder &TLB, 5920 FunctionNoProtoTypeLoc TL) { 5921 const FunctionNoProtoType *T = TL.getTypePtr(); 5922 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5923 if (ResultType.isNull()) 5924 return QualType(); 5925 5926 QualType Result = TL.getType(); 5927 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5928 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5929 5930 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5931 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5932 NewTL.setLParenLoc(TL.getLParenLoc()); 5933 NewTL.setRParenLoc(TL.getRParenLoc()); 5934 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5935 5936 return Result; 5937 } 5938 5939 template<typename Derived> QualType 5940 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5941 UnresolvedUsingTypeLoc TL) { 5942 const UnresolvedUsingType *T = TL.getTypePtr(); 5943 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5944 if (!D) 5945 return QualType(); 5946 5947 QualType Result = TL.getType(); 5948 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5949 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5950 if (Result.isNull()) 5951 return QualType(); 5952 } 5953 5954 // We might get an arbitrary type spec type back. We should at 5955 // least always get a type spec type, though. 5956 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5957 NewTL.setNameLoc(TL.getNameLoc()); 5958 5959 return Result; 5960 } 5961 5962 template<typename Derived> 5963 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5964 TypedefTypeLoc TL) { 5965 const TypedefType *T = TL.getTypePtr(); 5966 TypedefNameDecl *Typedef 5967 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5968 T->getDecl())); 5969 if (!Typedef) 5970 return QualType(); 5971 5972 QualType Result = TL.getType(); 5973 if (getDerived().AlwaysRebuild() || 5974 Typedef != T->getDecl()) { 5975 Result = getDerived().RebuildTypedefType(Typedef); 5976 if (Result.isNull()) 5977 return QualType(); 5978 } 5979 5980 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5981 NewTL.setNameLoc(TL.getNameLoc()); 5982 5983 return Result; 5984 } 5985 5986 template<typename Derived> 5987 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5988 TypeOfExprTypeLoc TL) { 5989 // typeof expressions are not potentially evaluated contexts 5990 EnterExpressionEvaluationContext Unevaluated( 5991 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5992 Sema::ReuseLambdaContextDecl); 5993 5994 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5995 if (E.isInvalid()) 5996 return QualType(); 5997 5998 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5999 if (E.isInvalid()) 6000 return QualType(); 6001 6002 QualType Result = TL.getType(); 6003 if (getDerived().AlwaysRebuild() || 6004 E.get() != TL.getUnderlyingExpr()) { 6005 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6006 if (Result.isNull()) 6007 return QualType(); 6008 } 6009 else E.get(); 6010 6011 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6012 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6013 NewTL.setLParenLoc(TL.getLParenLoc()); 6014 NewTL.setRParenLoc(TL.getRParenLoc()); 6015 6016 return Result; 6017 } 6018 6019 template<typename Derived> 6020 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6021 TypeOfTypeLoc TL) { 6022 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6023 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6024 if (!New_Under_TI) 6025 return QualType(); 6026 6027 QualType Result = TL.getType(); 6028 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6029 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6030 if (Result.isNull()) 6031 return QualType(); 6032 } 6033 6034 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6035 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6036 NewTL.setLParenLoc(TL.getLParenLoc()); 6037 NewTL.setRParenLoc(TL.getRParenLoc()); 6038 NewTL.setUnderlyingTInfo(New_Under_TI); 6039 6040 return Result; 6041 } 6042 6043 template<typename Derived> 6044 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6045 DecltypeTypeLoc TL) { 6046 const DecltypeType *T = TL.getTypePtr(); 6047 6048 // decltype expressions are not potentially evaluated contexts 6049 EnterExpressionEvaluationContext Unevaluated( 6050 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6051 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6052 6053 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6054 if (E.isInvalid()) 6055 return QualType(); 6056 6057 E = getSema().ActOnDecltypeExpression(E.get()); 6058 if (E.isInvalid()) 6059 return QualType(); 6060 6061 QualType Result = TL.getType(); 6062 if (getDerived().AlwaysRebuild() || 6063 E.get() != T->getUnderlyingExpr()) { 6064 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6065 if (Result.isNull()) 6066 return QualType(); 6067 } 6068 else E.get(); 6069 6070 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6071 NewTL.setNameLoc(TL.getNameLoc()); 6072 6073 return Result; 6074 } 6075 6076 template<typename Derived> 6077 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6078 TypeLocBuilder &TLB, 6079 UnaryTransformTypeLoc TL) { 6080 QualType Result = TL.getType(); 6081 if (Result->isDependentType()) { 6082 const UnaryTransformType *T = TL.getTypePtr(); 6083 QualType NewBase = 6084 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6085 Result = getDerived().RebuildUnaryTransformType(NewBase, 6086 T->getUTTKind(), 6087 TL.getKWLoc()); 6088 if (Result.isNull()) 6089 return QualType(); 6090 } 6091 6092 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6093 NewTL.setKWLoc(TL.getKWLoc()); 6094 NewTL.setParensRange(TL.getParensRange()); 6095 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6096 return Result; 6097 } 6098 6099 template<typename Derived> 6100 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6101 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6102 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6103 6104 CXXScopeSpec SS; 6105 TemplateName TemplateName = getDerived().TransformTemplateName( 6106 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6107 if (TemplateName.isNull()) 6108 return QualType(); 6109 6110 QualType OldDeduced = T->getDeducedType(); 6111 QualType NewDeduced; 6112 if (!OldDeduced.isNull()) { 6113 NewDeduced = getDerived().TransformType(OldDeduced); 6114 if (NewDeduced.isNull()) 6115 return QualType(); 6116 } 6117 6118 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6119 TemplateName, NewDeduced); 6120 if (Result.isNull()) 6121 return QualType(); 6122 6123 DeducedTemplateSpecializationTypeLoc NewTL = 6124 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6125 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6126 6127 return Result; 6128 } 6129 6130 template<typename Derived> 6131 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6132 RecordTypeLoc TL) { 6133 const RecordType *T = TL.getTypePtr(); 6134 RecordDecl *Record 6135 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6136 T->getDecl())); 6137 if (!Record) 6138 return QualType(); 6139 6140 QualType Result = TL.getType(); 6141 if (getDerived().AlwaysRebuild() || 6142 Record != T->getDecl()) { 6143 Result = getDerived().RebuildRecordType(Record); 6144 if (Result.isNull()) 6145 return QualType(); 6146 } 6147 6148 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6149 NewTL.setNameLoc(TL.getNameLoc()); 6150 6151 return Result; 6152 } 6153 6154 template<typename Derived> 6155 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6156 EnumTypeLoc TL) { 6157 const EnumType *T = TL.getTypePtr(); 6158 EnumDecl *Enum 6159 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6160 T->getDecl())); 6161 if (!Enum) 6162 return QualType(); 6163 6164 QualType Result = TL.getType(); 6165 if (getDerived().AlwaysRebuild() || 6166 Enum != T->getDecl()) { 6167 Result = getDerived().RebuildEnumType(Enum); 6168 if (Result.isNull()) 6169 return QualType(); 6170 } 6171 6172 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6173 NewTL.setNameLoc(TL.getNameLoc()); 6174 6175 return Result; 6176 } 6177 6178 template<typename Derived> 6179 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6180 TypeLocBuilder &TLB, 6181 InjectedClassNameTypeLoc TL) { 6182 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6183 TL.getTypePtr()->getDecl()); 6184 if (!D) return QualType(); 6185 6186 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6187 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6188 return T; 6189 } 6190 6191 template<typename Derived> 6192 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6193 TypeLocBuilder &TLB, 6194 TemplateTypeParmTypeLoc TL) { 6195 return TransformTypeSpecType(TLB, TL); 6196 } 6197 6198 template<typename Derived> 6199 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6200 TypeLocBuilder &TLB, 6201 SubstTemplateTypeParmTypeLoc TL) { 6202 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6203 6204 // Substitute into the replacement type, which itself might involve something 6205 // that needs to be transformed. This only tends to occur with default 6206 // template arguments of template template parameters. 6207 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6208 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6209 if (Replacement.isNull()) 6210 return QualType(); 6211 6212 // Always canonicalize the replacement type. 6213 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6214 QualType Result 6215 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6216 Replacement); 6217 6218 // Propagate type-source information. 6219 SubstTemplateTypeParmTypeLoc NewTL 6220 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6221 NewTL.setNameLoc(TL.getNameLoc()); 6222 return Result; 6223 6224 } 6225 6226 template<typename Derived> 6227 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6228 TypeLocBuilder &TLB, 6229 SubstTemplateTypeParmPackTypeLoc TL) { 6230 return TransformTypeSpecType(TLB, TL); 6231 } 6232 6233 template<typename Derived> 6234 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6235 TypeLocBuilder &TLB, 6236 TemplateSpecializationTypeLoc TL) { 6237 const TemplateSpecializationType *T = TL.getTypePtr(); 6238 6239 // The nested-name-specifier never matters in a TemplateSpecializationType, 6240 // because we can't have a dependent nested-name-specifier anyway. 6241 CXXScopeSpec SS; 6242 TemplateName Template 6243 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6244 TL.getTemplateNameLoc()); 6245 if (Template.isNull()) 6246 return QualType(); 6247 6248 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6249 } 6250 6251 template<typename Derived> 6252 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6253 AtomicTypeLoc TL) { 6254 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6255 if (ValueType.isNull()) 6256 return QualType(); 6257 6258 QualType Result = TL.getType(); 6259 if (getDerived().AlwaysRebuild() || 6260 ValueType != TL.getValueLoc().getType()) { 6261 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6262 if (Result.isNull()) 6263 return QualType(); 6264 } 6265 6266 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6267 NewTL.setKWLoc(TL.getKWLoc()); 6268 NewTL.setLParenLoc(TL.getLParenLoc()); 6269 NewTL.setRParenLoc(TL.getRParenLoc()); 6270 6271 return Result; 6272 } 6273 6274 template <typename Derived> 6275 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6276 PipeTypeLoc TL) { 6277 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6278 if (ValueType.isNull()) 6279 return QualType(); 6280 6281 QualType Result = TL.getType(); 6282 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6283 const PipeType *PT = Result->castAs<PipeType>(); 6284 bool isReadPipe = PT->isReadOnly(); 6285 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6286 if (Result.isNull()) 6287 return QualType(); 6288 } 6289 6290 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6291 NewTL.setKWLoc(TL.getKWLoc()); 6292 6293 return Result; 6294 } 6295 6296 template <typename Derived> 6297 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6298 ExtIntTypeLoc TL) { 6299 const ExtIntType *EIT = TL.getTypePtr(); 6300 QualType Result = TL.getType(); 6301 6302 if (getDerived().AlwaysRebuild()) { 6303 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6304 EIT->getNumBits(), TL.getNameLoc()); 6305 if (Result.isNull()) 6306 return QualType(); 6307 } 6308 6309 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6310 NewTL.setNameLoc(TL.getNameLoc()); 6311 return Result; 6312 } 6313 6314 template <typename Derived> 6315 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6316 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6317 const DependentExtIntType *EIT = TL.getTypePtr(); 6318 6319 EnterExpressionEvaluationContext Unevaluated( 6320 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6321 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6322 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6323 6324 if (BitsExpr.isInvalid()) 6325 return QualType(); 6326 6327 QualType Result = TL.getType(); 6328 6329 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6330 Result = getDerived().RebuildDependentExtIntType( 6331 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6332 6333 if (Result.isNull()) 6334 return QualType(); 6335 } 6336 6337 if (isa<DependentExtIntType>(Result)) { 6338 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6339 NewTL.setNameLoc(TL.getNameLoc()); 6340 } else { 6341 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6342 NewTL.setNameLoc(TL.getNameLoc()); 6343 } 6344 return Result; 6345 } 6346 6347 /// Simple iterator that traverses the template arguments in a 6348 /// container that provides a \c getArgLoc() member function. 6349 /// 6350 /// This iterator is intended to be used with the iterator form of 6351 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6352 template<typename ArgLocContainer> 6353 class TemplateArgumentLocContainerIterator { 6354 ArgLocContainer *Container; 6355 unsigned Index; 6356 6357 public: 6358 typedef TemplateArgumentLoc value_type; 6359 typedef TemplateArgumentLoc reference; 6360 typedef int difference_type; 6361 typedef std::input_iterator_tag iterator_category; 6362 6363 class pointer { 6364 TemplateArgumentLoc Arg; 6365 6366 public: 6367 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6368 6369 const TemplateArgumentLoc *operator->() const { 6370 return &Arg; 6371 } 6372 }; 6373 6374 6375 TemplateArgumentLocContainerIterator() {} 6376 6377 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6378 unsigned Index) 6379 : Container(&Container), Index(Index) { } 6380 6381 TemplateArgumentLocContainerIterator &operator++() { 6382 ++Index; 6383 return *this; 6384 } 6385 6386 TemplateArgumentLocContainerIterator operator++(int) { 6387 TemplateArgumentLocContainerIterator Old(*this); 6388 ++(*this); 6389 return Old; 6390 } 6391 6392 TemplateArgumentLoc operator*() const { 6393 return Container->getArgLoc(Index); 6394 } 6395 6396 pointer operator->() const { 6397 return pointer(Container->getArgLoc(Index)); 6398 } 6399 6400 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6401 const TemplateArgumentLocContainerIterator &Y) { 6402 return X.Container == Y.Container && X.Index == Y.Index; 6403 } 6404 6405 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6406 const TemplateArgumentLocContainerIterator &Y) { 6407 return !(X == Y); 6408 } 6409 }; 6410 6411 template<typename Derived> 6412 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6413 AutoTypeLoc TL) { 6414 const AutoType *T = TL.getTypePtr(); 6415 QualType OldDeduced = T->getDeducedType(); 6416 QualType NewDeduced; 6417 if (!OldDeduced.isNull()) { 6418 NewDeduced = getDerived().TransformType(OldDeduced); 6419 if (NewDeduced.isNull()) 6420 return QualType(); 6421 } 6422 6423 ConceptDecl *NewCD = nullptr; 6424 TemplateArgumentListInfo NewTemplateArgs; 6425 NestedNameSpecifierLoc NewNestedNameSpec; 6426 if (TL.getTypePtr()->isConstrained()) { 6427 NewCD = cast_or_null<ConceptDecl>( 6428 getDerived().TransformDecl( 6429 TL.getConceptNameLoc(), 6430 TL.getTypePtr()->getTypeConstraintConcept())); 6431 6432 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6433 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6434 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6435 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6436 ArgIterator(TL, 6437 TL.getNumArgs()), 6438 NewTemplateArgs)) 6439 return QualType(); 6440 6441 if (TL.getNestedNameSpecifierLoc()) { 6442 NewNestedNameSpec 6443 = getDerived().TransformNestedNameSpecifierLoc( 6444 TL.getNestedNameSpecifierLoc()); 6445 if (!NewNestedNameSpec) 6446 return QualType(); 6447 } 6448 } 6449 6450 QualType Result = TL.getType(); 6451 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6452 T->isDependentType()) { 6453 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6454 NewArgList.reserve(NewArgList.size()); 6455 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6456 NewArgList.push_back(ArgLoc.getArgument()); 6457 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6458 NewArgList); 6459 if (Result.isNull()) 6460 return QualType(); 6461 } 6462 6463 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6464 NewTL.setNameLoc(TL.getNameLoc()); 6465 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6466 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6467 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6468 NewTL.setFoundDecl(TL.getFoundDecl()); 6469 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6470 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6471 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6472 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6473 6474 return Result; 6475 } 6476 6477 template <typename Derived> 6478 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6479 TypeLocBuilder &TLB, 6480 TemplateSpecializationTypeLoc TL, 6481 TemplateName Template) { 6482 TemplateArgumentListInfo NewTemplateArgs; 6483 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6484 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6485 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6486 ArgIterator; 6487 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6488 ArgIterator(TL, TL.getNumArgs()), 6489 NewTemplateArgs)) 6490 return QualType(); 6491 6492 // FIXME: maybe don't rebuild if all the template arguments are the same. 6493 6494 QualType Result = 6495 getDerived().RebuildTemplateSpecializationType(Template, 6496 TL.getTemplateNameLoc(), 6497 NewTemplateArgs); 6498 6499 if (!Result.isNull()) { 6500 // Specializations of template template parameters are represented as 6501 // TemplateSpecializationTypes, and substitution of type alias templates 6502 // within a dependent context can transform them into 6503 // DependentTemplateSpecializationTypes. 6504 if (isa<DependentTemplateSpecializationType>(Result)) { 6505 DependentTemplateSpecializationTypeLoc NewTL 6506 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6507 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6508 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6509 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6510 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6511 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6512 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6513 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6514 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6515 return Result; 6516 } 6517 6518 TemplateSpecializationTypeLoc NewTL 6519 = TLB.push<TemplateSpecializationTypeLoc>(Result); 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 } 6527 6528 return Result; 6529 } 6530 6531 template <typename Derived> 6532 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6533 TypeLocBuilder &TLB, 6534 DependentTemplateSpecializationTypeLoc TL, 6535 TemplateName Template, 6536 CXXScopeSpec &SS) { 6537 TemplateArgumentListInfo NewTemplateArgs; 6538 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6539 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6540 typedef TemplateArgumentLocContainerIterator< 6541 DependentTemplateSpecializationTypeLoc> ArgIterator; 6542 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6543 ArgIterator(TL, TL.getNumArgs()), 6544 NewTemplateArgs)) 6545 return QualType(); 6546 6547 // FIXME: maybe don't rebuild if all the template arguments are the same. 6548 6549 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6550 QualType Result 6551 = getSema().Context.getDependentTemplateSpecializationType( 6552 TL.getTypePtr()->getKeyword(), 6553 DTN->getQualifier(), 6554 DTN->getIdentifier(), 6555 NewTemplateArgs); 6556 6557 DependentTemplateSpecializationTypeLoc NewTL 6558 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6559 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6560 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6561 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6562 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6563 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6564 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6565 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6566 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6567 return Result; 6568 } 6569 6570 QualType Result 6571 = getDerived().RebuildTemplateSpecializationType(Template, 6572 TL.getTemplateNameLoc(), 6573 NewTemplateArgs); 6574 6575 if (!Result.isNull()) { 6576 /// FIXME: Wrap this in an elaborated-type-specifier? 6577 TemplateSpecializationTypeLoc NewTL 6578 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6579 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6580 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6581 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6582 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6583 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6584 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6585 } 6586 6587 return Result; 6588 } 6589 6590 template<typename Derived> 6591 QualType 6592 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6593 ElaboratedTypeLoc TL) { 6594 const ElaboratedType *T = TL.getTypePtr(); 6595 6596 NestedNameSpecifierLoc QualifierLoc; 6597 // NOTE: the qualifier in an ElaboratedType is optional. 6598 if (TL.getQualifierLoc()) { 6599 QualifierLoc 6600 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6601 if (!QualifierLoc) 6602 return QualType(); 6603 } 6604 6605 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6606 if (NamedT.isNull()) 6607 return QualType(); 6608 6609 // C++0x [dcl.type.elab]p2: 6610 // If the identifier resolves to a typedef-name or the simple-template-id 6611 // resolves to an alias template specialization, the 6612 // elaborated-type-specifier is ill-formed. 6613 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6614 if (const TemplateSpecializationType *TST = 6615 NamedT->getAs<TemplateSpecializationType>()) { 6616 TemplateName Template = TST->getTemplateName(); 6617 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6618 Template.getAsTemplateDecl())) { 6619 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6620 diag::err_tag_reference_non_tag) 6621 << TAT << Sema::NTK_TypeAliasTemplate 6622 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6623 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6624 } 6625 } 6626 } 6627 6628 QualType Result = TL.getType(); 6629 if (getDerived().AlwaysRebuild() || 6630 QualifierLoc != TL.getQualifierLoc() || 6631 NamedT != T->getNamedType()) { 6632 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6633 T->getKeyword(), 6634 QualifierLoc, NamedT); 6635 if (Result.isNull()) 6636 return QualType(); 6637 } 6638 6639 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6640 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6641 NewTL.setQualifierLoc(QualifierLoc); 6642 return Result; 6643 } 6644 6645 template<typename Derived> 6646 QualType TreeTransform<Derived>::TransformAttributedType( 6647 TypeLocBuilder &TLB, 6648 AttributedTypeLoc TL) { 6649 const AttributedType *oldType = TL.getTypePtr(); 6650 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6651 if (modifiedType.isNull()) 6652 return QualType(); 6653 6654 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6655 const Attr *oldAttr = TL.getAttr(); 6656 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6657 if (oldAttr && !newAttr) 6658 return QualType(); 6659 6660 QualType result = TL.getType(); 6661 6662 // FIXME: dependent operand expressions? 6663 if (getDerived().AlwaysRebuild() || 6664 modifiedType != oldType->getModifiedType()) { 6665 // TODO: this is really lame; we should really be rebuilding the 6666 // equivalent type from first principles. 6667 QualType equivalentType 6668 = getDerived().TransformType(oldType->getEquivalentType()); 6669 if (equivalentType.isNull()) 6670 return QualType(); 6671 6672 // Check whether we can add nullability; it is only represented as 6673 // type sugar, and therefore cannot be diagnosed in any other way. 6674 if (auto nullability = oldType->getImmediateNullability()) { 6675 if (!modifiedType->canHaveNullability()) { 6676 SemaRef.Diag(TL.getAttr()->getLocation(), 6677 diag::err_nullability_nonpointer) 6678 << DiagNullabilityKind(*nullability, false) << modifiedType; 6679 return QualType(); 6680 } 6681 } 6682 6683 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6684 modifiedType, 6685 equivalentType); 6686 } 6687 6688 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6689 newTL.setAttr(newAttr); 6690 return result; 6691 } 6692 6693 template<typename Derived> 6694 QualType 6695 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6696 ParenTypeLoc TL) { 6697 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6698 if (Inner.isNull()) 6699 return QualType(); 6700 6701 QualType Result = TL.getType(); 6702 if (getDerived().AlwaysRebuild() || 6703 Inner != TL.getInnerLoc().getType()) { 6704 Result = getDerived().RebuildParenType(Inner); 6705 if (Result.isNull()) 6706 return QualType(); 6707 } 6708 6709 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6710 NewTL.setLParenLoc(TL.getLParenLoc()); 6711 NewTL.setRParenLoc(TL.getRParenLoc()); 6712 return Result; 6713 } 6714 6715 template <typename Derived> 6716 QualType 6717 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6718 MacroQualifiedTypeLoc TL) { 6719 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6720 if (Inner.isNull()) 6721 return QualType(); 6722 6723 QualType Result = TL.getType(); 6724 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6725 Result = 6726 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6727 if (Result.isNull()) 6728 return QualType(); 6729 } 6730 6731 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6732 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6733 return Result; 6734 } 6735 6736 template<typename Derived> 6737 QualType TreeTransform<Derived>::TransformDependentNameType( 6738 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6739 return TransformDependentNameType(TLB, TL, false); 6740 } 6741 6742 template<typename Derived> 6743 QualType TreeTransform<Derived>::TransformDependentNameType( 6744 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6745 const DependentNameType *T = TL.getTypePtr(); 6746 6747 NestedNameSpecifierLoc QualifierLoc 6748 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6749 if (!QualifierLoc) 6750 return QualType(); 6751 6752 QualType Result 6753 = getDerived().RebuildDependentNameType(T->getKeyword(), 6754 TL.getElaboratedKeywordLoc(), 6755 QualifierLoc, 6756 T->getIdentifier(), 6757 TL.getNameLoc(), 6758 DeducedTSTContext); 6759 if (Result.isNull()) 6760 return QualType(); 6761 6762 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6763 QualType NamedT = ElabT->getNamedType(); 6764 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6765 6766 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6767 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6768 NewTL.setQualifierLoc(QualifierLoc); 6769 } else { 6770 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6771 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6772 NewTL.setQualifierLoc(QualifierLoc); 6773 NewTL.setNameLoc(TL.getNameLoc()); 6774 } 6775 return Result; 6776 } 6777 6778 template<typename Derived> 6779 QualType TreeTransform<Derived>:: 6780 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6781 DependentTemplateSpecializationTypeLoc TL) { 6782 NestedNameSpecifierLoc QualifierLoc; 6783 if (TL.getQualifierLoc()) { 6784 QualifierLoc 6785 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6786 if (!QualifierLoc) 6787 return QualType(); 6788 } 6789 6790 return getDerived() 6791 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6792 } 6793 6794 template<typename Derived> 6795 QualType TreeTransform<Derived>:: 6796 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6797 DependentTemplateSpecializationTypeLoc TL, 6798 NestedNameSpecifierLoc QualifierLoc) { 6799 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6800 6801 TemplateArgumentListInfo NewTemplateArgs; 6802 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6803 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6804 6805 typedef TemplateArgumentLocContainerIterator< 6806 DependentTemplateSpecializationTypeLoc> ArgIterator; 6807 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6808 ArgIterator(TL, TL.getNumArgs()), 6809 NewTemplateArgs)) 6810 return QualType(); 6811 6812 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6813 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6814 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6815 /*AllowInjectedClassName*/ false); 6816 if (Result.isNull()) 6817 return QualType(); 6818 6819 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6820 QualType NamedT = ElabT->getNamedType(); 6821 6822 // Copy information relevant to the template specialization. 6823 TemplateSpecializationTypeLoc NamedTL 6824 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6825 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6826 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6827 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6828 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6829 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6830 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6831 6832 // Copy information relevant to the elaborated type. 6833 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6834 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6835 NewTL.setQualifierLoc(QualifierLoc); 6836 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6837 DependentTemplateSpecializationTypeLoc SpecTL 6838 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6839 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6840 SpecTL.setQualifierLoc(QualifierLoc); 6841 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6842 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6843 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6844 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6845 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6846 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6847 } else { 6848 TemplateSpecializationTypeLoc SpecTL 6849 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6850 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6851 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6852 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6853 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6854 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6855 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6856 } 6857 return Result; 6858 } 6859 6860 template<typename Derived> 6861 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6862 PackExpansionTypeLoc TL) { 6863 QualType Pattern 6864 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6865 if (Pattern.isNull()) 6866 return QualType(); 6867 6868 QualType Result = TL.getType(); 6869 if (getDerived().AlwaysRebuild() || 6870 Pattern != TL.getPatternLoc().getType()) { 6871 Result = getDerived().RebuildPackExpansionType(Pattern, 6872 TL.getPatternLoc().getSourceRange(), 6873 TL.getEllipsisLoc(), 6874 TL.getTypePtr()->getNumExpansions()); 6875 if (Result.isNull()) 6876 return QualType(); 6877 } 6878 6879 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6880 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6881 return Result; 6882 } 6883 6884 template<typename Derived> 6885 QualType 6886 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6887 ObjCInterfaceTypeLoc TL) { 6888 // ObjCInterfaceType is never dependent. 6889 TLB.pushFullCopy(TL); 6890 return TL.getType(); 6891 } 6892 6893 template<typename Derived> 6894 QualType 6895 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6896 ObjCTypeParamTypeLoc TL) { 6897 const ObjCTypeParamType *T = TL.getTypePtr(); 6898 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6899 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6900 if (!OTP) 6901 return QualType(); 6902 6903 QualType Result = TL.getType(); 6904 if (getDerived().AlwaysRebuild() || 6905 OTP != T->getDecl()) { 6906 Result = getDerived().RebuildObjCTypeParamType(OTP, 6907 TL.getProtocolLAngleLoc(), 6908 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6909 TL.getNumProtocols()), 6910 TL.getProtocolLocs(), 6911 TL.getProtocolRAngleLoc()); 6912 if (Result.isNull()) 6913 return QualType(); 6914 } 6915 6916 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6917 if (TL.getNumProtocols()) { 6918 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6919 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6920 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6921 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6922 } 6923 return Result; 6924 } 6925 6926 template<typename Derived> 6927 QualType 6928 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6929 ObjCObjectTypeLoc TL) { 6930 // Transform base type. 6931 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6932 if (BaseType.isNull()) 6933 return QualType(); 6934 6935 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6936 6937 // Transform type arguments. 6938 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6939 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6940 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6941 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6942 QualType TypeArg = TypeArgInfo->getType(); 6943 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6944 AnyChanged = true; 6945 6946 // We have a pack expansion. Instantiate it. 6947 const auto *PackExpansion = PackExpansionLoc.getType() 6948 ->castAs<PackExpansionType>(); 6949 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6950 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6951 Unexpanded); 6952 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6953 6954 // Determine whether the set of unexpanded parameter packs can 6955 // and should be expanded. 6956 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6957 bool Expand = false; 6958 bool RetainExpansion = false; 6959 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6960 if (getDerived().TryExpandParameterPacks( 6961 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6962 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6963 return QualType(); 6964 6965 if (!Expand) { 6966 // We can't expand this pack expansion into separate arguments yet; 6967 // just substitute into the pattern and create a new pack expansion 6968 // type. 6969 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6970 6971 TypeLocBuilder TypeArgBuilder; 6972 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6973 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6974 PatternLoc); 6975 if (NewPatternType.isNull()) 6976 return QualType(); 6977 6978 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6979 NewPatternType, NumExpansions); 6980 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6981 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6982 NewTypeArgInfos.push_back( 6983 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6984 continue; 6985 } 6986 6987 // Substitute into the pack expansion pattern for each slice of the 6988 // pack. 6989 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6990 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6991 6992 TypeLocBuilder TypeArgBuilder; 6993 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6994 6995 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6996 PatternLoc); 6997 if (NewTypeArg.isNull()) 6998 return QualType(); 6999 7000 NewTypeArgInfos.push_back( 7001 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7002 } 7003 7004 continue; 7005 } 7006 7007 TypeLocBuilder TypeArgBuilder; 7008 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7009 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7010 if (NewTypeArg.isNull()) 7011 return QualType(); 7012 7013 // If nothing changed, just keep the old TypeSourceInfo. 7014 if (NewTypeArg == TypeArg) { 7015 NewTypeArgInfos.push_back(TypeArgInfo); 7016 continue; 7017 } 7018 7019 NewTypeArgInfos.push_back( 7020 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7021 AnyChanged = true; 7022 } 7023 7024 QualType Result = TL.getType(); 7025 if (getDerived().AlwaysRebuild() || AnyChanged) { 7026 // Rebuild the type. 7027 Result = getDerived().RebuildObjCObjectType( 7028 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7029 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7030 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7031 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7032 7033 if (Result.isNull()) 7034 return QualType(); 7035 } 7036 7037 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7038 NewT.setHasBaseTypeAsWritten(true); 7039 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7040 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7041 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7042 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7043 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7044 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7045 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7046 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7047 return Result; 7048 } 7049 7050 template<typename Derived> 7051 QualType 7052 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7053 ObjCObjectPointerTypeLoc TL) { 7054 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7055 if (PointeeType.isNull()) 7056 return QualType(); 7057 7058 QualType Result = TL.getType(); 7059 if (getDerived().AlwaysRebuild() || 7060 PointeeType != TL.getPointeeLoc().getType()) { 7061 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7062 TL.getStarLoc()); 7063 if (Result.isNull()) 7064 return QualType(); 7065 } 7066 7067 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7068 NewT.setStarLoc(TL.getStarLoc()); 7069 return Result; 7070 } 7071 7072 //===----------------------------------------------------------------------===// 7073 // Statement transformation 7074 //===----------------------------------------------------------------------===// 7075 template<typename Derived> 7076 StmtResult 7077 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7078 return S; 7079 } 7080 7081 template<typename Derived> 7082 StmtResult 7083 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7084 return getDerived().TransformCompoundStmt(S, false); 7085 } 7086 7087 template<typename Derived> 7088 StmtResult 7089 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7090 bool IsStmtExpr) { 7091 Sema::CompoundScopeRAII CompoundScope(getSema()); 7092 7093 const Stmt *ExprResult = S->getStmtExprResult(); 7094 bool SubStmtInvalid = false; 7095 bool SubStmtChanged = false; 7096 SmallVector<Stmt*, 8> Statements; 7097 for (auto *B : S->body()) { 7098 StmtResult Result = getDerived().TransformStmt( 7099 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7100 7101 if (Result.isInvalid()) { 7102 // Immediately fail if this was a DeclStmt, since it's very 7103 // likely that this will cause problems for future statements. 7104 if (isa<DeclStmt>(B)) 7105 return StmtError(); 7106 7107 // Otherwise, just keep processing substatements and fail later. 7108 SubStmtInvalid = true; 7109 continue; 7110 } 7111 7112 SubStmtChanged = SubStmtChanged || Result.get() != B; 7113 Statements.push_back(Result.getAs<Stmt>()); 7114 } 7115 7116 if (SubStmtInvalid) 7117 return StmtError(); 7118 7119 if (!getDerived().AlwaysRebuild() && 7120 !SubStmtChanged) 7121 return S; 7122 7123 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7124 Statements, 7125 S->getRBracLoc(), 7126 IsStmtExpr); 7127 } 7128 7129 template<typename Derived> 7130 StmtResult 7131 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7132 ExprResult LHS, RHS; 7133 { 7134 EnterExpressionEvaluationContext Unevaluated( 7135 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7136 7137 // Transform the left-hand case value. 7138 LHS = getDerived().TransformExpr(S->getLHS()); 7139 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7140 if (LHS.isInvalid()) 7141 return StmtError(); 7142 7143 // Transform the right-hand case value (for the GNU case-range extension). 7144 RHS = getDerived().TransformExpr(S->getRHS()); 7145 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7146 if (RHS.isInvalid()) 7147 return StmtError(); 7148 } 7149 7150 // Build the case statement. 7151 // Case statements are always rebuilt so that they will attached to their 7152 // transformed switch statement. 7153 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7154 LHS.get(), 7155 S->getEllipsisLoc(), 7156 RHS.get(), 7157 S->getColonLoc()); 7158 if (Case.isInvalid()) 7159 return StmtError(); 7160 7161 // Transform the statement following the case 7162 StmtResult SubStmt = 7163 getDerived().TransformStmt(S->getSubStmt()); 7164 if (SubStmt.isInvalid()) 7165 return StmtError(); 7166 7167 // Attach the body to the case statement 7168 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7169 } 7170 7171 template <typename Derived> 7172 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7173 // Transform the statement following the default case 7174 StmtResult SubStmt = 7175 getDerived().TransformStmt(S->getSubStmt()); 7176 if (SubStmt.isInvalid()) 7177 return StmtError(); 7178 7179 // Default statements are always rebuilt 7180 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7181 SubStmt.get()); 7182 } 7183 7184 template<typename Derived> 7185 StmtResult 7186 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7187 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7188 if (SubStmt.isInvalid()) 7189 return StmtError(); 7190 7191 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7192 S->getDecl()); 7193 if (!LD) 7194 return StmtError(); 7195 7196 // If we're transforming "in-place" (we're not creating new local 7197 // declarations), assume we're replacing the old label statement 7198 // and clear out the reference to it. 7199 if (LD == S->getDecl()) 7200 S->getDecl()->setStmt(nullptr); 7201 7202 // FIXME: Pass the real colon location in. 7203 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7204 cast<LabelDecl>(LD), SourceLocation(), 7205 SubStmt.get()); 7206 } 7207 7208 template <typename Derived> 7209 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7210 if (!R) 7211 return R; 7212 7213 switch (R->getKind()) { 7214 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7215 #define ATTR(X) 7216 #define PRAGMA_SPELLING_ATTR(X) \ 7217 case attr::X: \ 7218 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7219 #include "clang/Basic/AttrList.inc" 7220 default: 7221 return R; 7222 } 7223 } 7224 7225 template <typename Derived> 7226 StmtResult 7227 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7228 StmtDiscardKind SDK) { 7229 bool AttrsChanged = false; 7230 SmallVector<const Attr *, 1> Attrs; 7231 7232 // Visit attributes and keep track if any are transformed. 7233 for (const auto *I : S->getAttrs()) { 7234 const Attr *R = getDerived().TransformAttr(I); 7235 AttrsChanged |= (I != R); 7236 Attrs.push_back(R); 7237 } 7238 7239 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7240 if (SubStmt.isInvalid()) 7241 return StmtError(); 7242 7243 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7244 return S; 7245 7246 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7247 SubStmt.get()); 7248 } 7249 7250 template<typename Derived> 7251 StmtResult 7252 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7253 // Transform the initialization statement 7254 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7255 if (Init.isInvalid()) 7256 return StmtError(); 7257 7258 // Transform the condition 7259 Sema::ConditionResult Cond = getDerived().TransformCondition( 7260 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7261 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7262 : Sema::ConditionKind::Boolean); 7263 if (Cond.isInvalid()) 7264 return StmtError(); 7265 7266 // If this is a constexpr if, determine which arm we should instantiate. 7267 llvm::Optional<bool> ConstexprConditionValue; 7268 if (S->isConstexpr()) 7269 ConstexprConditionValue = Cond.getKnownValue(); 7270 7271 // Transform the "then" branch. 7272 StmtResult Then; 7273 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7274 Then = getDerived().TransformStmt(S->getThen()); 7275 if (Then.isInvalid()) 7276 return StmtError(); 7277 } else { 7278 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7279 } 7280 7281 // Transform the "else" branch. 7282 StmtResult Else; 7283 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7284 Else = getDerived().TransformStmt(S->getElse()); 7285 if (Else.isInvalid()) 7286 return StmtError(); 7287 } 7288 7289 if (!getDerived().AlwaysRebuild() && 7290 Init.get() == S->getInit() && 7291 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7292 Then.get() == S->getThen() && 7293 Else.get() == S->getElse()) 7294 return S; 7295 7296 return getDerived().RebuildIfStmt( 7297 S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, 7298 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7299 } 7300 7301 template<typename Derived> 7302 StmtResult 7303 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7304 // Transform the initialization statement 7305 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7306 if (Init.isInvalid()) 7307 return StmtError(); 7308 7309 // Transform the condition. 7310 Sema::ConditionResult Cond = getDerived().TransformCondition( 7311 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7312 Sema::ConditionKind::Switch); 7313 if (Cond.isInvalid()) 7314 return StmtError(); 7315 7316 // Rebuild the switch statement. 7317 StmtResult Switch = 7318 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7319 Init.get(), Cond, S->getRParenLoc()); 7320 if (Switch.isInvalid()) 7321 return StmtError(); 7322 7323 // Transform the body of the switch statement. 7324 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7325 if (Body.isInvalid()) 7326 return StmtError(); 7327 7328 // Complete the switch statement. 7329 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7330 Body.get()); 7331 } 7332 7333 template<typename Derived> 7334 StmtResult 7335 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7336 // Transform the condition 7337 Sema::ConditionResult Cond = getDerived().TransformCondition( 7338 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7339 Sema::ConditionKind::Boolean); 7340 if (Cond.isInvalid()) 7341 return StmtError(); 7342 7343 // Transform the body 7344 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7345 if (Body.isInvalid()) 7346 return StmtError(); 7347 7348 if (!getDerived().AlwaysRebuild() && 7349 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7350 Body.get() == S->getBody()) 7351 return Owned(S); 7352 7353 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7354 Cond, S->getRParenLoc(), Body.get()); 7355 } 7356 7357 template<typename Derived> 7358 StmtResult 7359 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7360 // Transform the body 7361 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7362 if (Body.isInvalid()) 7363 return StmtError(); 7364 7365 // Transform the condition 7366 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7367 if (Cond.isInvalid()) 7368 return StmtError(); 7369 7370 if (!getDerived().AlwaysRebuild() && 7371 Cond.get() == S->getCond() && 7372 Body.get() == S->getBody()) 7373 return S; 7374 7375 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7376 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7377 S->getRParenLoc()); 7378 } 7379 7380 template<typename Derived> 7381 StmtResult 7382 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7383 if (getSema().getLangOpts().OpenMP) 7384 getSema().startOpenMPLoop(); 7385 7386 // Transform the initialization statement 7387 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7388 if (Init.isInvalid()) 7389 return StmtError(); 7390 7391 // In OpenMP loop region loop control variable must be captured and be 7392 // private. Perform analysis of first part (if any). 7393 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7394 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7395 7396 // Transform the condition 7397 Sema::ConditionResult Cond = getDerived().TransformCondition( 7398 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7399 Sema::ConditionKind::Boolean); 7400 if (Cond.isInvalid()) 7401 return StmtError(); 7402 7403 // Transform the increment 7404 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7405 if (Inc.isInvalid()) 7406 return StmtError(); 7407 7408 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7409 if (S->getInc() && !FullInc.get()) 7410 return StmtError(); 7411 7412 // Transform the body 7413 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7414 if (Body.isInvalid()) 7415 return StmtError(); 7416 7417 if (!getDerived().AlwaysRebuild() && 7418 Init.get() == S->getInit() && 7419 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7420 Inc.get() == S->getInc() && 7421 Body.get() == S->getBody()) 7422 return S; 7423 7424 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7425 Init.get(), Cond, FullInc, 7426 S->getRParenLoc(), Body.get()); 7427 } 7428 7429 template<typename Derived> 7430 StmtResult 7431 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7432 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7433 S->getLabel()); 7434 if (!LD) 7435 return StmtError(); 7436 7437 // Goto statements must always be rebuilt, to resolve the label. 7438 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7439 cast<LabelDecl>(LD)); 7440 } 7441 7442 template<typename Derived> 7443 StmtResult 7444 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7445 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7446 if (Target.isInvalid()) 7447 return StmtError(); 7448 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7449 7450 if (!getDerived().AlwaysRebuild() && 7451 Target.get() == S->getTarget()) 7452 return S; 7453 7454 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7455 Target.get()); 7456 } 7457 7458 template<typename Derived> 7459 StmtResult 7460 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7461 return S; 7462 } 7463 7464 template<typename Derived> 7465 StmtResult 7466 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7467 return S; 7468 } 7469 7470 template<typename Derived> 7471 StmtResult 7472 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7473 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7474 /*NotCopyInit*/false); 7475 if (Result.isInvalid()) 7476 return StmtError(); 7477 7478 // FIXME: We always rebuild the return statement because there is no way 7479 // to tell whether the return type of the function has changed. 7480 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7481 } 7482 7483 template<typename Derived> 7484 StmtResult 7485 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7486 bool DeclChanged = false; 7487 SmallVector<Decl *, 4> Decls; 7488 for (auto *D : S->decls()) { 7489 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7490 if (!Transformed) 7491 return StmtError(); 7492 7493 if (Transformed != D) 7494 DeclChanged = true; 7495 7496 Decls.push_back(Transformed); 7497 } 7498 7499 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7500 return S; 7501 7502 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7503 } 7504 7505 template<typename Derived> 7506 StmtResult 7507 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7508 7509 SmallVector<Expr*, 8> Constraints; 7510 SmallVector<Expr*, 8> Exprs; 7511 SmallVector<IdentifierInfo *, 4> Names; 7512 7513 ExprResult AsmString; 7514 SmallVector<Expr*, 8> Clobbers; 7515 7516 bool ExprsChanged = false; 7517 7518 // Go through the outputs. 7519 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7520 Names.push_back(S->getOutputIdentifier(I)); 7521 7522 // No need to transform the constraint literal. 7523 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7524 7525 // Transform the output expr. 7526 Expr *OutputExpr = S->getOutputExpr(I); 7527 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7528 if (Result.isInvalid()) 7529 return StmtError(); 7530 7531 ExprsChanged |= Result.get() != OutputExpr; 7532 7533 Exprs.push_back(Result.get()); 7534 } 7535 7536 // Go through the inputs. 7537 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7538 Names.push_back(S->getInputIdentifier(I)); 7539 7540 // No need to transform the constraint literal. 7541 Constraints.push_back(S->getInputConstraintLiteral(I)); 7542 7543 // Transform the input expr. 7544 Expr *InputExpr = S->getInputExpr(I); 7545 ExprResult Result = getDerived().TransformExpr(InputExpr); 7546 if (Result.isInvalid()) 7547 return StmtError(); 7548 7549 ExprsChanged |= Result.get() != InputExpr; 7550 7551 Exprs.push_back(Result.get()); 7552 } 7553 7554 // Go through the Labels. 7555 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7556 Names.push_back(S->getLabelIdentifier(I)); 7557 7558 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7559 if (Result.isInvalid()) 7560 return StmtError(); 7561 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7562 Exprs.push_back(Result.get()); 7563 } 7564 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7565 return S; 7566 7567 // Go through the clobbers. 7568 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7569 Clobbers.push_back(S->getClobberStringLiteral(I)); 7570 7571 // No need to transform the asm string literal. 7572 AsmString = S->getAsmString(); 7573 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7574 S->isVolatile(), S->getNumOutputs(), 7575 S->getNumInputs(), Names.data(), 7576 Constraints, Exprs, AsmString.get(), 7577 Clobbers, S->getNumLabels(), 7578 S->getRParenLoc()); 7579 } 7580 7581 template<typename Derived> 7582 StmtResult 7583 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7584 ArrayRef<Token> AsmToks = 7585 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7586 7587 bool HadError = false, HadChange = false; 7588 7589 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7590 SmallVector<Expr*, 8> TransformedExprs; 7591 TransformedExprs.reserve(SrcExprs.size()); 7592 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7593 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7594 if (!Result.isUsable()) { 7595 HadError = true; 7596 } else { 7597 HadChange |= (Result.get() != SrcExprs[i]); 7598 TransformedExprs.push_back(Result.get()); 7599 } 7600 } 7601 7602 if (HadError) return StmtError(); 7603 if (!HadChange && !getDerived().AlwaysRebuild()) 7604 return Owned(S); 7605 7606 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7607 AsmToks, S->getAsmString(), 7608 S->getNumOutputs(), S->getNumInputs(), 7609 S->getAllConstraints(), S->getClobbers(), 7610 TransformedExprs, S->getEndLoc()); 7611 } 7612 7613 // C++ Coroutines TS 7614 7615 template<typename Derived> 7616 StmtResult 7617 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7618 auto *ScopeInfo = SemaRef.getCurFunction(); 7619 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7620 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7621 ScopeInfo->NeedsCoroutineSuspends && 7622 ScopeInfo->CoroutineSuspends.first == nullptr && 7623 ScopeInfo->CoroutineSuspends.second == nullptr && 7624 "expected clean scope info"); 7625 7626 // Set that we have (possibly-invalid) suspend points before we do anything 7627 // that may fail. 7628 ScopeInfo->setNeedsCoroutineSuspends(false); 7629 7630 // We re-build the coroutine promise object (and the coroutine parameters its 7631 // type and constructor depend on) based on the types used in our current 7632 // function. We must do so, and set it on the current FunctionScopeInfo, 7633 // before attempting to transform the other parts of the coroutine body 7634 // statement, such as the implicit suspend statements (because those 7635 // statements reference the FunctionScopeInfo::CoroutinePromise). 7636 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7637 return StmtError(); 7638 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7639 if (!Promise) 7640 return StmtError(); 7641 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7642 ScopeInfo->CoroutinePromise = Promise; 7643 7644 // Transform the implicit coroutine statements constructed using dependent 7645 // types during the previous parse: initial and final suspensions, the return 7646 // object, and others. We also transform the coroutine function's body. 7647 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7648 if (InitSuspend.isInvalid()) 7649 return StmtError(); 7650 StmtResult FinalSuspend = 7651 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7652 if (FinalSuspend.isInvalid() || 7653 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7654 return StmtError(); 7655 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7656 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7657 7658 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7659 if (BodyRes.isInvalid()) 7660 return StmtError(); 7661 7662 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7663 if (Builder.isInvalid()) 7664 return StmtError(); 7665 7666 Expr *ReturnObject = S->getReturnValueInit(); 7667 assert(ReturnObject && "the return object is expected to be valid"); 7668 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7669 /*NoCopyInit*/ false); 7670 if (Res.isInvalid()) 7671 return StmtError(); 7672 Builder.ReturnValue = Res.get(); 7673 7674 // If during the previous parse the coroutine still had a dependent promise 7675 // statement, we may need to build some implicit coroutine statements 7676 // (such as exception and fallthrough handlers) for the first time. 7677 if (S->hasDependentPromiseType()) { 7678 // We can only build these statements, however, if the current promise type 7679 // is not dependent. 7680 if (!Promise->getType()->isDependentType()) { 7681 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7682 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7683 "these nodes should not have been built yet"); 7684 if (!Builder.buildDependentStatements()) 7685 return StmtError(); 7686 } 7687 } else { 7688 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7689 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7690 if (Res.isInvalid()) 7691 return StmtError(); 7692 Builder.OnFallthrough = Res.get(); 7693 } 7694 7695 if (auto *OnException = S->getExceptionHandler()) { 7696 StmtResult Res = getDerived().TransformStmt(OnException); 7697 if (Res.isInvalid()) 7698 return StmtError(); 7699 Builder.OnException = Res.get(); 7700 } 7701 7702 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7703 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7704 if (Res.isInvalid()) 7705 return StmtError(); 7706 Builder.ReturnStmtOnAllocFailure = Res.get(); 7707 } 7708 7709 // Transform any additional statements we may have already built 7710 assert(S->getAllocate() && S->getDeallocate() && 7711 "allocation and deallocation calls must already be built"); 7712 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7713 if (AllocRes.isInvalid()) 7714 return StmtError(); 7715 Builder.Allocate = AllocRes.get(); 7716 7717 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7718 if (DeallocRes.isInvalid()) 7719 return StmtError(); 7720 Builder.Deallocate = DeallocRes.get(); 7721 7722 assert(S->getResultDecl() && "ResultDecl must already be built"); 7723 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7724 if (ResultDecl.isInvalid()) 7725 return StmtError(); 7726 Builder.ResultDecl = ResultDecl.get(); 7727 7728 if (auto *ReturnStmt = S->getReturnStmt()) { 7729 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7730 if (Res.isInvalid()) 7731 return StmtError(); 7732 Builder.ReturnStmt = Res.get(); 7733 } 7734 } 7735 7736 return getDerived().RebuildCoroutineBodyStmt(Builder); 7737 } 7738 7739 template<typename Derived> 7740 StmtResult 7741 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7742 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7743 /*NotCopyInit*/false); 7744 if (Result.isInvalid()) 7745 return StmtError(); 7746 7747 // Always rebuild; we don't know if this needs to be injected into a new 7748 // context or if the promise type has changed. 7749 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7750 S->isImplicit()); 7751 } 7752 7753 template<typename Derived> 7754 ExprResult 7755 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7756 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7757 /*NotCopyInit*/false); 7758 if (Result.isInvalid()) 7759 return ExprError(); 7760 7761 // Always rebuild; we don't know if this needs to be injected into a new 7762 // context or if the promise type has changed. 7763 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7764 E->isImplicit()); 7765 } 7766 7767 template <typename Derived> 7768 ExprResult 7769 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7770 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7771 /*NotCopyInit*/ false); 7772 if (OperandResult.isInvalid()) 7773 return ExprError(); 7774 7775 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7776 E->getOperatorCoawaitLookup()); 7777 7778 if (LookupResult.isInvalid()) 7779 return ExprError(); 7780 7781 // Always rebuild; we don't know if this needs to be injected into a new 7782 // context or if the promise type has changed. 7783 return getDerived().RebuildDependentCoawaitExpr( 7784 E->getKeywordLoc(), OperandResult.get(), 7785 cast<UnresolvedLookupExpr>(LookupResult.get())); 7786 } 7787 7788 template<typename Derived> 7789 ExprResult 7790 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7791 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7792 /*NotCopyInit*/false); 7793 if (Result.isInvalid()) 7794 return ExprError(); 7795 7796 // Always rebuild; we don't know if this needs to be injected into a new 7797 // context or if the promise type has changed. 7798 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7799 } 7800 7801 // Objective-C Statements. 7802 7803 template<typename Derived> 7804 StmtResult 7805 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7806 // Transform the body of the @try. 7807 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7808 if (TryBody.isInvalid()) 7809 return StmtError(); 7810 7811 // Transform the @catch statements (if present). 7812 bool AnyCatchChanged = false; 7813 SmallVector<Stmt*, 8> CatchStmts; 7814 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7815 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7816 if (Catch.isInvalid()) 7817 return StmtError(); 7818 if (Catch.get() != S->getCatchStmt(I)) 7819 AnyCatchChanged = true; 7820 CatchStmts.push_back(Catch.get()); 7821 } 7822 7823 // Transform the @finally statement (if present). 7824 StmtResult Finally; 7825 if (S->getFinallyStmt()) { 7826 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7827 if (Finally.isInvalid()) 7828 return StmtError(); 7829 } 7830 7831 // If nothing changed, just retain this statement. 7832 if (!getDerived().AlwaysRebuild() && 7833 TryBody.get() == S->getTryBody() && 7834 !AnyCatchChanged && 7835 Finally.get() == S->getFinallyStmt()) 7836 return S; 7837 7838 // Build a new statement. 7839 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7840 CatchStmts, Finally.get()); 7841 } 7842 7843 template<typename Derived> 7844 StmtResult 7845 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7846 // Transform the @catch parameter, if there is one. 7847 VarDecl *Var = nullptr; 7848 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7849 TypeSourceInfo *TSInfo = nullptr; 7850 if (FromVar->getTypeSourceInfo()) { 7851 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7852 if (!TSInfo) 7853 return StmtError(); 7854 } 7855 7856 QualType T; 7857 if (TSInfo) 7858 T = TSInfo->getType(); 7859 else { 7860 T = getDerived().TransformType(FromVar->getType()); 7861 if (T.isNull()) 7862 return StmtError(); 7863 } 7864 7865 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7866 if (!Var) 7867 return StmtError(); 7868 } 7869 7870 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7871 if (Body.isInvalid()) 7872 return StmtError(); 7873 7874 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7875 S->getRParenLoc(), 7876 Var, Body.get()); 7877 } 7878 7879 template<typename Derived> 7880 StmtResult 7881 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7882 // Transform the body. 7883 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7884 if (Body.isInvalid()) 7885 return StmtError(); 7886 7887 // If nothing changed, just retain this statement. 7888 if (!getDerived().AlwaysRebuild() && 7889 Body.get() == S->getFinallyBody()) 7890 return S; 7891 7892 // Build a new statement. 7893 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7894 Body.get()); 7895 } 7896 7897 template<typename Derived> 7898 StmtResult 7899 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7900 ExprResult Operand; 7901 if (S->getThrowExpr()) { 7902 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7903 if (Operand.isInvalid()) 7904 return StmtError(); 7905 } 7906 7907 if (!getDerived().AlwaysRebuild() && 7908 Operand.get() == S->getThrowExpr()) 7909 return S; 7910 7911 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7912 } 7913 7914 template<typename Derived> 7915 StmtResult 7916 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7917 ObjCAtSynchronizedStmt *S) { 7918 // Transform the object we are locking. 7919 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7920 if (Object.isInvalid()) 7921 return StmtError(); 7922 Object = 7923 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7924 Object.get()); 7925 if (Object.isInvalid()) 7926 return StmtError(); 7927 7928 // Transform the body. 7929 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7930 if (Body.isInvalid()) 7931 return StmtError(); 7932 7933 // If nothing change, just retain the current statement. 7934 if (!getDerived().AlwaysRebuild() && 7935 Object.get() == S->getSynchExpr() && 7936 Body.get() == S->getSynchBody()) 7937 return S; 7938 7939 // Build a new statement. 7940 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7941 Object.get(), Body.get()); 7942 } 7943 7944 template<typename Derived> 7945 StmtResult 7946 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7947 ObjCAutoreleasePoolStmt *S) { 7948 // Transform the body. 7949 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7950 if (Body.isInvalid()) 7951 return StmtError(); 7952 7953 // If nothing changed, just retain this statement. 7954 if (!getDerived().AlwaysRebuild() && 7955 Body.get() == S->getSubStmt()) 7956 return S; 7957 7958 // Build a new statement. 7959 return getDerived().RebuildObjCAutoreleasePoolStmt( 7960 S->getAtLoc(), Body.get()); 7961 } 7962 7963 template<typename Derived> 7964 StmtResult 7965 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7966 ObjCForCollectionStmt *S) { 7967 // Transform the element statement. 7968 StmtResult Element = 7969 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7970 if (Element.isInvalid()) 7971 return StmtError(); 7972 7973 // Transform the collection expression. 7974 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7975 if (Collection.isInvalid()) 7976 return StmtError(); 7977 7978 // Transform the body. 7979 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7980 if (Body.isInvalid()) 7981 return StmtError(); 7982 7983 // If nothing changed, just retain this statement. 7984 if (!getDerived().AlwaysRebuild() && 7985 Element.get() == S->getElement() && 7986 Collection.get() == S->getCollection() && 7987 Body.get() == S->getBody()) 7988 return S; 7989 7990 // Build a new statement. 7991 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7992 Element.get(), 7993 Collection.get(), 7994 S->getRParenLoc(), 7995 Body.get()); 7996 } 7997 7998 template <typename Derived> 7999 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8000 // Transform the exception declaration, if any. 8001 VarDecl *Var = nullptr; 8002 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8003 TypeSourceInfo *T = 8004 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8005 if (!T) 8006 return StmtError(); 8007 8008 Var = getDerived().RebuildExceptionDecl( 8009 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8010 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8011 if (!Var || Var->isInvalidDecl()) 8012 return StmtError(); 8013 } 8014 8015 // Transform the actual exception handler. 8016 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8017 if (Handler.isInvalid()) 8018 return StmtError(); 8019 8020 if (!getDerived().AlwaysRebuild() && !Var && 8021 Handler.get() == S->getHandlerBlock()) 8022 return S; 8023 8024 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8025 } 8026 8027 template <typename Derived> 8028 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8029 // Transform the try block itself. 8030 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8031 if (TryBlock.isInvalid()) 8032 return StmtError(); 8033 8034 // Transform the handlers. 8035 bool HandlerChanged = false; 8036 SmallVector<Stmt *, 8> Handlers; 8037 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8038 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8039 if (Handler.isInvalid()) 8040 return StmtError(); 8041 8042 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8043 Handlers.push_back(Handler.getAs<Stmt>()); 8044 } 8045 8046 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8047 !HandlerChanged) 8048 return S; 8049 8050 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8051 Handlers); 8052 } 8053 8054 template<typename Derived> 8055 StmtResult 8056 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8057 StmtResult Init = 8058 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8059 if (Init.isInvalid()) 8060 return StmtError(); 8061 8062 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8063 if (Range.isInvalid()) 8064 return StmtError(); 8065 8066 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8067 if (Begin.isInvalid()) 8068 return StmtError(); 8069 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8070 if (End.isInvalid()) 8071 return StmtError(); 8072 8073 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8074 if (Cond.isInvalid()) 8075 return StmtError(); 8076 if (Cond.get()) 8077 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8078 if (Cond.isInvalid()) 8079 return StmtError(); 8080 if (Cond.get()) 8081 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8082 8083 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8084 if (Inc.isInvalid()) 8085 return StmtError(); 8086 if (Inc.get()) 8087 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8088 8089 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8090 if (LoopVar.isInvalid()) 8091 return StmtError(); 8092 8093 StmtResult NewStmt = S; 8094 if (getDerived().AlwaysRebuild() || 8095 Init.get() != S->getInit() || 8096 Range.get() != S->getRangeStmt() || 8097 Begin.get() != S->getBeginStmt() || 8098 End.get() != S->getEndStmt() || 8099 Cond.get() != S->getCond() || 8100 Inc.get() != S->getInc() || 8101 LoopVar.get() != S->getLoopVarStmt()) { 8102 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8103 S->getCoawaitLoc(), Init.get(), 8104 S->getColonLoc(), Range.get(), 8105 Begin.get(), End.get(), 8106 Cond.get(), 8107 Inc.get(), LoopVar.get(), 8108 S->getRParenLoc()); 8109 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8110 // Might not have attached any initializer to the loop variable. 8111 getSema().ActOnInitializerError( 8112 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8113 return StmtError(); 8114 } 8115 } 8116 8117 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8118 if (Body.isInvalid()) 8119 return StmtError(); 8120 8121 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8122 // it now so we have a new statement to attach the body to. 8123 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8124 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8125 S->getCoawaitLoc(), Init.get(), 8126 S->getColonLoc(), Range.get(), 8127 Begin.get(), End.get(), 8128 Cond.get(), 8129 Inc.get(), LoopVar.get(), 8130 S->getRParenLoc()); 8131 if (NewStmt.isInvalid()) 8132 return StmtError(); 8133 } 8134 8135 if (NewStmt.get() == S) 8136 return S; 8137 8138 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8139 } 8140 8141 template<typename Derived> 8142 StmtResult 8143 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8144 MSDependentExistsStmt *S) { 8145 // Transform the nested-name-specifier, if any. 8146 NestedNameSpecifierLoc QualifierLoc; 8147 if (S->getQualifierLoc()) { 8148 QualifierLoc 8149 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8150 if (!QualifierLoc) 8151 return StmtError(); 8152 } 8153 8154 // Transform the declaration name. 8155 DeclarationNameInfo NameInfo = S->getNameInfo(); 8156 if (NameInfo.getName()) { 8157 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8158 if (!NameInfo.getName()) 8159 return StmtError(); 8160 } 8161 8162 // Check whether anything changed. 8163 if (!getDerived().AlwaysRebuild() && 8164 QualifierLoc == S->getQualifierLoc() && 8165 NameInfo.getName() == S->getNameInfo().getName()) 8166 return S; 8167 8168 // Determine whether this name exists, if we can. 8169 CXXScopeSpec SS; 8170 SS.Adopt(QualifierLoc); 8171 bool Dependent = false; 8172 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8173 case Sema::IER_Exists: 8174 if (S->isIfExists()) 8175 break; 8176 8177 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8178 8179 case Sema::IER_DoesNotExist: 8180 if (S->isIfNotExists()) 8181 break; 8182 8183 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8184 8185 case Sema::IER_Dependent: 8186 Dependent = true; 8187 break; 8188 8189 case Sema::IER_Error: 8190 return StmtError(); 8191 } 8192 8193 // We need to continue with the instantiation, so do so now. 8194 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8195 if (SubStmt.isInvalid()) 8196 return StmtError(); 8197 8198 // If we have resolved the name, just transform to the substatement. 8199 if (!Dependent) 8200 return SubStmt; 8201 8202 // The name is still dependent, so build a dependent expression again. 8203 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8204 S->isIfExists(), 8205 QualifierLoc, 8206 NameInfo, 8207 SubStmt.get()); 8208 } 8209 8210 template<typename Derived> 8211 ExprResult 8212 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8213 NestedNameSpecifierLoc QualifierLoc; 8214 if (E->getQualifierLoc()) { 8215 QualifierLoc 8216 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8217 if (!QualifierLoc) 8218 return ExprError(); 8219 } 8220 8221 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8222 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8223 if (!PD) 8224 return ExprError(); 8225 8226 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8227 if (Base.isInvalid()) 8228 return ExprError(); 8229 8230 return new (SemaRef.getASTContext()) 8231 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8232 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8233 QualifierLoc, E->getMemberLoc()); 8234 } 8235 8236 template <typename Derived> 8237 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8238 MSPropertySubscriptExpr *E) { 8239 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8240 if (BaseRes.isInvalid()) 8241 return ExprError(); 8242 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8243 if (IdxRes.isInvalid()) 8244 return ExprError(); 8245 8246 if (!getDerived().AlwaysRebuild() && 8247 BaseRes.get() == E->getBase() && 8248 IdxRes.get() == E->getIdx()) 8249 return E; 8250 8251 return getDerived().RebuildArraySubscriptExpr( 8252 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8253 } 8254 8255 template <typename Derived> 8256 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8257 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8258 if (TryBlock.isInvalid()) 8259 return StmtError(); 8260 8261 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8262 if (Handler.isInvalid()) 8263 return StmtError(); 8264 8265 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8266 Handler.get() == S->getHandler()) 8267 return S; 8268 8269 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8270 TryBlock.get(), Handler.get()); 8271 } 8272 8273 template <typename Derived> 8274 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8275 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8276 if (Block.isInvalid()) 8277 return StmtError(); 8278 8279 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8280 } 8281 8282 template <typename Derived> 8283 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8284 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8285 if (FilterExpr.isInvalid()) 8286 return StmtError(); 8287 8288 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8289 if (Block.isInvalid()) 8290 return StmtError(); 8291 8292 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8293 Block.get()); 8294 } 8295 8296 template <typename Derived> 8297 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8298 if (isa<SEHFinallyStmt>(Handler)) 8299 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8300 else 8301 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8302 } 8303 8304 template<typename Derived> 8305 StmtResult 8306 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8307 return S; 8308 } 8309 8310 //===----------------------------------------------------------------------===// 8311 // OpenMP directive transformation 8312 //===----------------------------------------------------------------------===// 8313 template <typename Derived> 8314 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8315 OMPExecutableDirective *D) { 8316 8317 // Transform the clauses 8318 llvm::SmallVector<OMPClause *, 16> TClauses; 8319 ArrayRef<OMPClause *> Clauses = D->clauses(); 8320 TClauses.reserve(Clauses.size()); 8321 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8322 I != E; ++I) { 8323 if (*I) { 8324 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8325 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8326 getDerived().getSema().EndOpenMPClause(); 8327 if (Clause) 8328 TClauses.push_back(Clause); 8329 } else { 8330 TClauses.push_back(nullptr); 8331 } 8332 } 8333 StmtResult AssociatedStmt; 8334 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8335 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8336 /*CurScope=*/nullptr); 8337 StmtResult Body; 8338 { 8339 Sema::CompoundScopeRAII CompoundScope(getSema()); 8340 Stmt *CS; 8341 if (D->getDirectiveKind() == OMPD_atomic || 8342 D->getDirectiveKind() == OMPD_critical || 8343 D->getDirectiveKind() == OMPD_section || 8344 D->getDirectiveKind() == OMPD_master) 8345 CS = D->getAssociatedStmt(); 8346 else 8347 CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 8348 Body = getDerived().TransformStmt(CS); 8349 } 8350 AssociatedStmt = 8351 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8352 if (AssociatedStmt.isInvalid()) { 8353 return StmtError(); 8354 } 8355 } 8356 if (TClauses.size() != Clauses.size()) { 8357 return StmtError(); 8358 } 8359 8360 // Transform directive name for 'omp critical' directive. 8361 DeclarationNameInfo DirName; 8362 if (D->getDirectiveKind() == OMPD_critical) { 8363 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8364 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8365 } 8366 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8367 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8368 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8369 } else if (D->getDirectiveKind() == OMPD_cancel) { 8370 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8371 } 8372 8373 return getDerived().RebuildOMPExecutableDirective( 8374 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8375 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8376 } 8377 8378 template <typename Derived> 8379 StmtResult 8380 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8381 DeclarationNameInfo DirName; 8382 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8383 D->getBeginLoc()); 8384 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8385 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8386 return Res; 8387 } 8388 8389 template <typename Derived> 8390 StmtResult 8391 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8392 DeclarationNameInfo DirName; 8393 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, 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>::TransformOMPForDirective(OMPForDirective *D) { 8403 DeclarationNameInfo DirName; 8404 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, 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>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8414 DeclarationNameInfo DirName; 8415 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8416 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>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8425 DeclarationNameInfo DirName; 8426 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, 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>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8436 DeclarationNameInfo DirName; 8437 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, 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>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8447 DeclarationNameInfo DirName; 8448 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, 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>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8458 DeclarationNameInfo DirName; 8459 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, 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>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8469 getDerived().getSema().StartOpenMPDSABlock( 8470 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8471 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8472 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8473 return Res; 8474 } 8475 8476 template <typename Derived> 8477 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8478 OMPParallelForDirective *D) { 8479 DeclarationNameInfo DirName; 8480 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8481 nullptr, D->getBeginLoc()); 8482 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8483 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8484 return Res; 8485 } 8486 8487 template <typename Derived> 8488 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8489 OMPParallelForSimdDirective *D) { 8490 DeclarationNameInfo DirName; 8491 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8492 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>::TransformOMPParallelMasterDirective( 8500 OMPParallelMasterDirective *D) { 8501 DeclarationNameInfo DirName; 8502 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, 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>::TransformOMPParallelSectionsDirective( 8511 OMPParallelSectionsDirective *D) { 8512 DeclarationNameInfo DirName; 8513 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, 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 8522 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8523 DeclarationNameInfo DirName; 8524 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8525 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>::TransformOMPTaskyieldDirective( 8533 OMPTaskyieldDirective *D) { 8534 DeclarationNameInfo DirName; 8535 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8536 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>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8545 DeclarationNameInfo DirName; 8546 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, 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 8555 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8556 DeclarationNameInfo DirName; 8557 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, 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 TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8566 OMPTaskgroupDirective *D) { 8567 DeclarationNameInfo DirName; 8568 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, 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>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8578 DeclarationNameInfo DirName; 8579 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, 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 8588 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8589 DeclarationNameInfo DirName; 8590 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, 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>::TransformOMPScanDirective(OMPScanDirective *D) { 8600 DeclarationNameInfo DirName; 8601 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, 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>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8611 DeclarationNameInfo DirName; 8612 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, 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>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8622 DeclarationNameInfo DirName; 8623 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, 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>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8633 DeclarationNameInfo DirName; 8634 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, 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 TreeTransform<Derived>::TransformOMPTargetDataDirective( 8643 OMPTargetDataDirective *D) { 8644 DeclarationNameInfo DirName; 8645 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, 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 TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8654 OMPTargetEnterDataDirective *D) { 8655 DeclarationNameInfo DirName; 8656 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8657 nullptr, 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>::TransformOMPTargetExitDataDirective( 8665 OMPTargetExitDataDirective *D) { 8666 DeclarationNameInfo DirName; 8667 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8668 nullptr, 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>::TransformOMPTargetParallelDirective( 8676 OMPTargetParallelDirective *D) { 8677 DeclarationNameInfo DirName; 8678 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, 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>::TransformOMPTargetParallelForDirective( 8687 OMPTargetParallelForDirective *D) { 8688 DeclarationNameInfo DirName; 8689 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, 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>::TransformOMPTargetUpdateDirective( 8698 OMPTargetUpdateDirective *D) { 8699 DeclarationNameInfo DirName; 8700 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, 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 8709 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8710 DeclarationNameInfo DirName; 8711 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8712 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>::TransformOMPCancellationPointDirective( 8720 OMPCancellationPointDirective *D) { 8721 DeclarationNameInfo DirName; 8722 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, 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>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8732 DeclarationNameInfo DirName; 8733 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, 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 8742 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8743 DeclarationNameInfo DirName; 8744 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8745 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 TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8753 OMPTaskLoopSimdDirective *D) { 8754 DeclarationNameInfo DirName; 8755 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8756 nullptr, 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 TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8764 OMPMasterTaskLoopDirective *D) { 8765 DeclarationNameInfo DirName; 8766 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8767 nullptr, 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>::TransformOMPMasterTaskLoopSimdDirective( 8775 OMPMasterTaskLoopSimdDirective *D) { 8776 DeclarationNameInfo DirName; 8777 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_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>::TransformOMPParallelMasterTaskLoopDirective( 8786 OMPParallelMasterTaskLoopDirective *D) { 8787 DeclarationNameInfo DirName; 8788 getDerived().getSema().StartOpenMPDSABlock( 8789 OMPD_parallel_master_taskloop, DirName, 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 8797 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8798 OMPParallelMasterTaskLoopSimdDirective *D) { 8799 DeclarationNameInfo DirName; 8800 getDerived().getSema().StartOpenMPDSABlock( 8801 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8802 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8803 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8804 return Res; 8805 } 8806 8807 template <typename Derived> 8808 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8809 OMPDistributeDirective *D) { 8810 DeclarationNameInfo DirName; 8811 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8812 D->getBeginLoc()); 8813 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8814 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8815 return Res; 8816 } 8817 8818 template <typename Derived> 8819 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8820 OMPDistributeParallelForDirective *D) { 8821 DeclarationNameInfo DirName; 8822 getDerived().getSema().StartOpenMPDSABlock( 8823 OMPD_distribute_parallel_for, 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 8831 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8832 OMPDistributeParallelForSimdDirective *D) { 8833 DeclarationNameInfo DirName; 8834 getDerived().getSema().StartOpenMPDSABlock( 8835 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8836 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8837 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8838 return Res; 8839 } 8840 8841 template <typename Derived> 8842 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8843 OMPDistributeSimdDirective *D) { 8844 DeclarationNameInfo DirName; 8845 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8846 nullptr, D->getBeginLoc()); 8847 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8848 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8849 return Res; 8850 } 8851 8852 template <typename Derived> 8853 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8854 OMPTargetParallelForSimdDirective *D) { 8855 DeclarationNameInfo DirName; 8856 getDerived().getSema().StartOpenMPDSABlock( 8857 OMPD_target_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>::TransformOMPTargetSimdDirective( 8865 OMPTargetSimdDirective *D) { 8866 DeclarationNameInfo DirName; 8867 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8868 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>::TransformOMPTeamsDistributeDirective( 8876 OMPTeamsDistributeDirective *D) { 8877 DeclarationNameInfo DirName; 8878 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8879 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>::TransformOMPTeamsDistributeSimdDirective( 8887 OMPTeamsDistributeSimdDirective *D) { 8888 DeclarationNameInfo DirName; 8889 getDerived().getSema().StartOpenMPDSABlock( 8890 OMPD_teams_distribute_simd, DirName, nullptr, 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>::TransformOMPTeamsDistributeParallelForSimdDirective( 8898 OMPTeamsDistributeParallelForSimdDirective *D) { 8899 DeclarationNameInfo DirName; 8900 getDerived().getSema().StartOpenMPDSABlock( 8901 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8902 D->getBeginLoc()); 8903 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8904 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8905 return Res; 8906 } 8907 8908 template <typename Derived> 8909 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8910 OMPTeamsDistributeParallelForDirective *D) { 8911 DeclarationNameInfo DirName; 8912 getDerived().getSema().StartOpenMPDSABlock( 8913 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8914 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8915 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8916 return Res; 8917 } 8918 8919 template <typename Derived> 8920 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8921 OMPTargetTeamsDirective *D) { 8922 DeclarationNameInfo DirName; 8923 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8924 nullptr, D->getBeginLoc()); 8925 auto Res = getDerived().TransformOMPExecutableDirective(D); 8926 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8927 return Res; 8928 } 8929 8930 template <typename Derived> 8931 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8932 OMPTargetTeamsDistributeDirective *D) { 8933 DeclarationNameInfo DirName; 8934 getDerived().getSema().StartOpenMPDSABlock( 8935 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8936 auto Res = getDerived().TransformOMPExecutableDirective(D); 8937 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8938 return Res; 8939 } 8940 8941 template <typename Derived> 8942 StmtResult 8943 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8944 OMPTargetTeamsDistributeParallelForDirective *D) { 8945 DeclarationNameInfo DirName; 8946 getDerived().getSema().StartOpenMPDSABlock( 8947 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8948 D->getBeginLoc()); 8949 auto Res = getDerived().TransformOMPExecutableDirective(D); 8950 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8951 return Res; 8952 } 8953 8954 template <typename Derived> 8955 StmtResult TreeTransform<Derived>:: 8956 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8957 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8958 DeclarationNameInfo DirName; 8959 getDerived().getSema().StartOpenMPDSABlock( 8960 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8961 D->getBeginLoc()); 8962 auto Res = getDerived().TransformOMPExecutableDirective(D); 8963 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8964 return Res; 8965 } 8966 8967 template <typename Derived> 8968 StmtResult 8969 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8970 OMPTargetTeamsDistributeSimdDirective *D) { 8971 DeclarationNameInfo DirName; 8972 getDerived().getSema().StartOpenMPDSABlock( 8973 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8974 auto Res = getDerived().TransformOMPExecutableDirective(D); 8975 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8976 return Res; 8977 } 8978 8979 8980 //===----------------------------------------------------------------------===// 8981 // OpenMP clause transformation 8982 //===----------------------------------------------------------------------===// 8983 template <typename Derived> 8984 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8985 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8986 if (Cond.isInvalid()) 8987 return nullptr; 8988 return getDerived().RebuildOMPIfClause( 8989 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8990 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8991 } 8992 8993 template <typename Derived> 8994 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8995 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8996 if (Cond.isInvalid()) 8997 return nullptr; 8998 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8999 C->getLParenLoc(), C->getEndLoc()); 9000 } 9001 9002 template <typename Derived> 9003 OMPClause * 9004 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9005 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9006 if (NumThreads.isInvalid()) 9007 return nullptr; 9008 return getDerived().RebuildOMPNumThreadsClause( 9009 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9010 } 9011 9012 template <typename Derived> 9013 OMPClause * 9014 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9015 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9016 if (E.isInvalid()) 9017 return nullptr; 9018 return getDerived().RebuildOMPSafelenClause( 9019 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9020 } 9021 9022 template <typename Derived> 9023 OMPClause * 9024 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9025 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9026 if (E.isInvalid()) 9027 return nullptr; 9028 return getDerived().RebuildOMPAllocatorClause( 9029 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9030 } 9031 9032 template <typename Derived> 9033 OMPClause * 9034 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9035 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9036 if (E.isInvalid()) 9037 return nullptr; 9038 return getDerived().RebuildOMPSimdlenClause( 9039 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9040 } 9041 9042 template <typename Derived> 9043 OMPClause * 9044 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9045 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9046 if (E.isInvalid()) 9047 return nullptr; 9048 return getDerived().RebuildOMPCollapseClause( 9049 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9050 } 9051 9052 template <typename Derived> 9053 OMPClause * 9054 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9055 return getDerived().RebuildOMPDefaultClause( 9056 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9057 C->getLParenLoc(), C->getEndLoc()); 9058 } 9059 9060 template <typename Derived> 9061 OMPClause * 9062 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9063 return getDerived().RebuildOMPProcBindClause( 9064 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9065 C->getLParenLoc(), C->getEndLoc()); 9066 } 9067 9068 template <typename Derived> 9069 OMPClause * 9070 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9071 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9072 if (E.isInvalid()) 9073 return nullptr; 9074 return getDerived().RebuildOMPScheduleClause( 9075 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9076 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9077 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9078 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9079 } 9080 9081 template <typename Derived> 9082 OMPClause * 9083 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9084 ExprResult E; 9085 if (auto *Num = C->getNumForLoops()) { 9086 E = getDerived().TransformExpr(Num); 9087 if (E.isInvalid()) 9088 return nullptr; 9089 } 9090 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9091 C->getLParenLoc(), E.get()); 9092 } 9093 9094 template <typename Derived> 9095 OMPClause * 9096 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9097 ExprResult E; 9098 if (Expr *Evt = C->getEventHandler()) { 9099 E = getDerived().TransformExpr(Evt); 9100 if (E.isInvalid()) 9101 return nullptr; 9102 } 9103 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9104 C->getLParenLoc(), C->getEndLoc()); 9105 } 9106 9107 template <typename Derived> 9108 OMPClause * 9109 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9110 // No need to rebuild this clause, no template-dependent parameters. 9111 return C; 9112 } 9113 9114 template <typename Derived> 9115 OMPClause * 9116 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9117 // No need to rebuild this clause, no template-dependent parameters. 9118 return C; 9119 } 9120 9121 template <typename Derived> 9122 OMPClause * 9123 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9124 // No need to rebuild this clause, no template-dependent parameters. 9125 return C; 9126 } 9127 9128 template <typename Derived> 9129 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9130 // No need to rebuild this clause, no template-dependent parameters. 9131 return C; 9132 } 9133 9134 template <typename Derived> 9135 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9136 // No need to rebuild this clause, no template-dependent parameters. 9137 return C; 9138 } 9139 9140 template <typename Derived> 9141 OMPClause * 9142 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9143 // No need to rebuild this clause, no template-dependent parameters. 9144 return C; 9145 } 9146 9147 template <typename Derived> 9148 OMPClause * 9149 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9150 // No need to rebuild this clause, no template-dependent parameters. 9151 return C; 9152 } 9153 9154 template <typename Derived> 9155 OMPClause * 9156 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *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>::TransformOMPAcqRelClause(OMPAcqRelClause *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>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9171 // No need to rebuild this clause, no template-dependent parameters. 9172 return C; 9173 } 9174 9175 template <typename Derived> 9176 OMPClause * 9177 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9178 // No need to rebuild this clause, no template-dependent parameters. 9179 return C; 9180 } 9181 9182 template <typename Derived> 9183 OMPClause * 9184 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9185 // No need to rebuild this clause, no template-dependent parameters. 9186 return C; 9187 } 9188 9189 template <typename Derived> 9190 OMPClause * 9191 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9192 // No need to rebuild this clause, no template-dependent parameters. 9193 return C; 9194 } 9195 9196 template <typename Derived> 9197 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9198 // No need to rebuild this clause, no template-dependent parameters. 9199 return C; 9200 } 9201 9202 template <typename Derived> 9203 OMPClause * 9204 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9205 // No need to rebuild this clause, no template-dependent parameters. 9206 return C; 9207 } 9208 9209 template <typename Derived> 9210 OMPClause * 9211 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9212 // No need to rebuild this clause, no template-dependent parameters. 9213 return C; 9214 } 9215 9216 template <typename Derived> 9217 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9218 OMPUnifiedAddressClause *C) { 9219 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9220 } 9221 9222 template <typename Derived> 9223 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9224 OMPUnifiedSharedMemoryClause *C) { 9225 llvm_unreachable( 9226 "unified_shared_memory clause cannot appear in dependent context"); 9227 } 9228 9229 template <typename Derived> 9230 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9231 OMPReverseOffloadClause *C) { 9232 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9233 } 9234 9235 template <typename Derived> 9236 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9237 OMPDynamicAllocatorsClause *C) { 9238 llvm_unreachable( 9239 "dynamic_allocators clause cannot appear in dependent context"); 9240 } 9241 9242 template <typename Derived> 9243 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9244 OMPAtomicDefaultMemOrderClause *C) { 9245 llvm_unreachable( 9246 "atomic_default_mem_order clause cannot appear in dependent context"); 9247 } 9248 9249 template <typename Derived> 9250 OMPClause * 9251 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9252 llvm::SmallVector<Expr *, 16> Vars; 9253 Vars.reserve(C->varlist_size()); 9254 for (auto *VE : C->varlists()) { 9255 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9256 if (EVar.isInvalid()) 9257 return nullptr; 9258 Vars.push_back(EVar.get()); 9259 } 9260 return getDerived().RebuildOMPPrivateClause( 9261 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9262 } 9263 9264 template <typename Derived> 9265 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9266 OMPFirstprivateClause *C) { 9267 llvm::SmallVector<Expr *, 16> Vars; 9268 Vars.reserve(C->varlist_size()); 9269 for (auto *VE : C->varlists()) { 9270 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9271 if (EVar.isInvalid()) 9272 return nullptr; 9273 Vars.push_back(EVar.get()); 9274 } 9275 return getDerived().RebuildOMPFirstprivateClause( 9276 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9277 } 9278 9279 template <typename Derived> 9280 OMPClause * 9281 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9282 llvm::SmallVector<Expr *, 16> Vars; 9283 Vars.reserve(C->varlist_size()); 9284 for (auto *VE : C->varlists()) { 9285 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9286 if (EVar.isInvalid()) 9287 return nullptr; 9288 Vars.push_back(EVar.get()); 9289 } 9290 return getDerived().RebuildOMPLastprivateClause( 9291 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9292 C->getLParenLoc(), C->getEndLoc()); 9293 } 9294 9295 template <typename Derived> 9296 OMPClause * 9297 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9298 llvm::SmallVector<Expr *, 16> Vars; 9299 Vars.reserve(C->varlist_size()); 9300 for (auto *VE : C->varlists()) { 9301 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9302 if (EVar.isInvalid()) 9303 return nullptr; 9304 Vars.push_back(EVar.get()); 9305 } 9306 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9307 C->getLParenLoc(), C->getEndLoc()); 9308 } 9309 9310 template <typename Derived> 9311 OMPClause * 9312 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9313 llvm::SmallVector<Expr *, 16> Vars; 9314 Vars.reserve(C->varlist_size()); 9315 for (auto *VE : C->varlists()) { 9316 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9317 if (EVar.isInvalid()) 9318 return nullptr; 9319 Vars.push_back(EVar.get()); 9320 } 9321 CXXScopeSpec ReductionIdScopeSpec; 9322 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9323 9324 DeclarationNameInfo NameInfo = C->getNameInfo(); 9325 if (NameInfo.getName()) { 9326 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9327 if (!NameInfo.getName()) 9328 return nullptr; 9329 } 9330 // Build a list of all UDR decls with the same names ranged by the Scopes. 9331 // The Scope boundary is a duplication of the previous decl. 9332 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9333 for (auto *E : C->reduction_ops()) { 9334 // Transform all the decls. 9335 if (E) { 9336 auto *ULE = cast<UnresolvedLookupExpr>(E); 9337 UnresolvedSet<8> Decls; 9338 for (auto *D : ULE->decls()) { 9339 NamedDecl *InstD = 9340 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9341 Decls.addDecl(InstD, InstD->getAccess()); 9342 } 9343 UnresolvedReductions.push_back( 9344 UnresolvedLookupExpr::Create( 9345 SemaRef.Context, /*NamingClass=*/nullptr, 9346 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9347 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9348 Decls.begin(), Decls.end())); 9349 } else 9350 UnresolvedReductions.push_back(nullptr); 9351 } 9352 return getDerived().RebuildOMPReductionClause( 9353 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9354 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9355 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9356 } 9357 9358 template <typename Derived> 9359 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9360 OMPTaskReductionClause *C) { 9361 llvm::SmallVector<Expr *, 16> Vars; 9362 Vars.reserve(C->varlist_size()); 9363 for (auto *VE : C->varlists()) { 9364 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9365 if (EVar.isInvalid()) 9366 return nullptr; 9367 Vars.push_back(EVar.get()); 9368 } 9369 CXXScopeSpec ReductionIdScopeSpec; 9370 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9371 9372 DeclarationNameInfo NameInfo = C->getNameInfo(); 9373 if (NameInfo.getName()) { 9374 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9375 if (!NameInfo.getName()) 9376 return nullptr; 9377 } 9378 // Build a list of all UDR decls with the same names ranged by the Scopes. 9379 // The Scope boundary is a duplication of the previous decl. 9380 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9381 for (auto *E : C->reduction_ops()) { 9382 // Transform all the decls. 9383 if (E) { 9384 auto *ULE = cast<UnresolvedLookupExpr>(E); 9385 UnresolvedSet<8> Decls; 9386 for (auto *D : ULE->decls()) { 9387 NamedDecl *InstD = 9388 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9389 Decls.addDecl(InstD, InstD->getAccess()); 9390 } 9391 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9392 SemaRef.Context, /*NamingClass=*/nullptr, 9393 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9394 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9395 } else 9396 UnresolvedReductions.push_back(nullptr); 9397 } 9398 return getDerived().RebuildOMPTaskReductionClause( 9399 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9400 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9401 } 9402 9403 template <typename Derived> 9404 OMPClause * 9405 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9406 llvm::SmallVector<Expr *, 16> Vars; 9407 Vars.reserve(C->varlist_size()); 9408 for (auto *VE : C->varlists()) { 9409 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9410 if (EVar.isInvalid()) 9411 return nullptr; 9412 Vars.push_back(EVar.get()); 9413 } 9414 CXXScopeSpec ReductionIdScopeSpec; 9415 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9416 9417 DeclarationNameInfo NameInfo = C->getNameInfo(); 9418 if (NameInfo.getName()) { 9419 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9420 if (!NameInfo.getName()) 9421 return nullptr; 9422 } 9423 // Build a list of all UDR decls with the same names ranged by the Scopes. 9424 // The Scope boundary is a duplication of the previous decl. 9425 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9426 for (auto *E : C->reduction_ops()) { 9427 // Transform all the decls. 9428 if (E) { 9429 auto *ULE = cast<UnresolvedLookupExpr>(E); 9430 UnresolvedSet<8> Decls; 9431 for (auto *D : ULE->decls()) { 9432 NamedDecl *InstD = 9433 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9434 Decls.addDecl(InstD, InstD->getAccess()); 9435 } 9436 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9437 SemaRef.Context, /*NamingClass=*/nullptr, 9438 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9439 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9440 } else 9441 UnresolvedReductions.push_back(nullptr); 9442 } 9443 return getDerived().RebuildOMPInReductionClause( 9444 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9445 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9446 } 9447 9448 template <typename Derived> 9449 OMPClause * 9450 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9451 llvm::SmallVector<Expr *, 16> Vars; 9452 Vars.reserve(C->varlist_size()); 9453 for (auto *VE : C->varlists()) { 9454 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9455 if (EVar.isInvalid()) 9456 return nullptr; 9457 Vars.push_back(EVar.get()); 9458 } 9459 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9460 if (Step.isInvalid()) 9461 return nullptr; 9462 return getDerived().RebuildOMPLinearClause( 9463 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9464 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9465 } 9466 9467 template <typename Derived> 9468 OMPClause * 9469 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9470 llvm::SmallVector<Expr *, 16> Vars; 9471 Vars.reserve(C->varlist_size()); 9472 for (auto *VE : C->varlists()) { 9473 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9474 if (EVar.isInvalid()) 9475 return nullptr; 9476 Vars.push_back(EVar.get()); 9477 } 9478 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9479 if (Alignment.isInvalid()) 9480 return nullptr; 9481 return getDerived().RebuildOMPAlignedClause( 9482 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9483 C->getColonLoc(), C->getEndLoc()); 9484 } 9485 9486 template <typename Derived> 9487 OMPClause * 9488 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9489 llvm::SmallVector<Expr *, 16> Vars; 9490 Vars.reserve(C->varlist_size()); 9491 for (auto *VE : C->varlists()) { 9492 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9493 if (EVar.isInvalid()) 9494 return nullptr; 9495 Vars.push_back(EVar.get()); 9496 } 9497 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9498 C->getLParenLoc(), C->getEndLoc()); 9499 } 9500 9501 template <typename Derived> 9502 OMPClause * 9503 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9504 llvm::SmallVector<Expr *, 16> Vars; 9505 Vars.reserve(C->varlist_size()); 9506 for (auto *VE : C->varlists()) { 9507 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9508 if (EVar.isInvalid()) 9509 return nullptr; 9510 Vars.push_back(EVar.get()); 9511 } 9512 return getDerived().RebuildOMPCopyprivateClause( 9513 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9514 } 9515 9516 template <typename Derived> 9517 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9518 llvm::SmallVector<Expr *, 16> Vars; 9519 Vars.reserve(C->varlist_size()); 9520 for (auto *VE : C->varlists()) { 9521 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9522 if (EVar.isInvalid()) 9523 return nullptr; 9524 Vars.push_back(EVar.get()); 9525 } 9526 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9527 C->getLParenLoc(), C->getEndLoc()); 9528 } 9529 9530 template <typename Derived> 9531 OMPClause * 9532 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9533 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9534 if (E.isInvalid()) 9535 return nullptr; 9536 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9537 C->getLParenLoc(), C->getEndLoc()); 9538 } 9539 9540 template <typename Derived> 9541 OMPClause * 9542 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9543 llvm::SmallVector<Expr *, 16> Vars; 9544 Expr *DepModifier = C->getModifier(); 9545 if (DepModifier) { 9546 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9547 if (DepModRes.isInvalid()) 9548 return nullptr; 9549 DepModifier = DepModRes.get(); 9550 } 9551 Vars.reserve(C->varlist_size()); 9552 for (auto *VE : C->varlists()) { 9553 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9554 if (EVar.isInvalid()) 9555 return nullptr; 9556 Vars.push_back(EVar.get()); 9557 } 9558 return getDerived().RebuildOMPDependClause( 9559 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9560 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9561 C->getEndLoc()); 9562 } 9563 9564 template <typename Derived> 9565 OMPClause * 9566 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9567 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9568 if (E.isInvalid()) 9569 return nullptr; 9570 return getDerived().RebuildOMPDeviceClause( 9571 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9572 C->getModifierLoc(), C->getEndLoc()); 9573 } 9574 9575 template <typename Derived, class T> 9576 bool transformOMPMappableExprListClause( 9577 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9578 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9579 DeclarationNameInfo &MapperIdInfo, 9580 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9581 // Transform expressions in the list. 9582 Vars.reserve(C->varlist_size()); 9583 for (auto *VE : C->varlists()) { 9584 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9585 if (EVar.isInvalid()) 9586 return true; 9587 Vars.push_back(EVar.get()); 9588 } 9589 // Transform mapper scope specifier and identifier. 9590 NestedNameSpecifierLoc QualifierLoc; 9591 if (C->getMapperQualifierLoc()) { 9592 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9593 C->getMapperQualifierLoc()); 9594 if (!QualifierLoc) 9595 return true; 9596 } 9597 MapperIdScopeSpec.Adopt(QualifierLoc); 9598 MapperIdInfo = C->getMapperIdInfo(); 9599 if (MapperIdInfo.getName()) { 9600 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9601 if (!MapperIdInfo.getName()) 9602 return true; 9603 } 9604 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9605 // the previous user-defined mapper lookup in dependent environment. 9606 for (auto *E : C->mapperlists()) { 9607 // Transform all the decls. 9608 if (E) { 9609 auto *ULE = cast<UnresolvedLookupExpr>(E); 9610 UnresolvedSet<8> Decls; 9611 for (auto *D : ULE->decls()) { 9612 NamedDecl *InstD = 9613 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9614 Decls.addDecl(InstD, InstD->getAccess()); 9615 } 9616 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9617 TT.getSema().Context, /*NamingClass=*/nullptr, 9618 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9619 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9620 Decls.end())); 9621 } else { 9622 UnresolvedMappers.push_back(nullptr); 9623 } 9624 } 9625 return false; 9626 } 9627 9628 template <typename Derived> 9629 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9630 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9631 llvm::SmallVector<Expr *, 16> Vars; 9632 CXXScopeSpec MapperIdScopeSpec; 9633 DeclarationNameInfo MapperIdInfo; 9634 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9635 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9636 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9637 return nullptr; 9638 return getDerived().RebuildOMPMapClause( 9639 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9640 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9641 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9642 } 9643 9644 template <typename Derived> 9645 OMPClause * 9646 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9647 Expr *Allocator = C->getAllocator(); 9648 if (Allocator) { 9649 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9650 if (AllocatorRes.isInvalid()) 9651 return nullptr; 9652 Allocator = AllocatorRes.get(); 9653 } 9654 llvm::SmallVector<Expr *, 16> Vars; 9655 Vars.reserve(C->varlist_size()); 9656 for (auto *VE : C->varlists()) { 9657 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9658 if (EVar.isInvalid()) 9659 return nullptr; 9660 Vars.push_back(EVar.get()); 9661 } 9662 return getDerived().RebuildOMPAllocateClause( 9663 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9664 C->getEndLoc()); 9665 } 9666 9667 template <typename Derived> 9668 OMPClause * 9669 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9670 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9671 if (E.isInvalid()) 9672 return nullptr; 9673 return getDerived().RebuildOMPNumTeamsClause( 9674 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9675 } 9676 9677 template <typename Derived> 9678 OMPClause * 9679 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9680 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9681 if (E.isInvalid()) 9682 return nullptr; 9683 return getDerived().RebuildOMPThreadLimitClause( 9684 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9685 } 9686 9687 template <typename Derived> 9688 OMPClause * 9689 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9690 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9691 if (E.isInvalid()) 9692 return nullptr; 9693 return getDerived().RebuildOMPPriorityClause( 9694 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9695 } 9696 9697 template <typename Derived> 9698 OMPClause * 9699 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9700 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9701 if (E.isInvalid()) 9702 return nullptr; 9703 return getDerived().RebuildOMPGrainsizeClause( 9704 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9705 } 9706 9707 template <typename Derived> 9708 OMPClause * 9709 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9710 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9711 if (E.isInvalid()) 9712 return nullptr; 9713 return getDerived().RebuildOMPNumTasksClause( 9714 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9715 } 9716 9717 template <typename Derived> 9718 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9719 ExprResult E = getDerived().TransformExpr(C->getHint()); 9720 if (E.isInvalid()) 9721 return nullptr; 9722 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9723 C->getLParenLoc(), C->getEndLoc()); 9724 } 9725 9726 template <typename Derived> 9727 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9728 OMPDistScheduleClause *C) { 9729 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9730 if (E.isInvalid()) 9731 return nullptr; 9732 return getDerived().RebuildOMPDistScheduleClause( 9733 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9734 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9735 } 9736 9737 template <typename Derived> 9738 OMPClause * 9739 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9740 // Rebuild Defaultmap Clause since we need to invoke the checking of 9741 // defaultmap(none:variable-category) after template initialization. 9742 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9743 C->getDefaultmapKind(), 9744 C->getBeginLoc(), 9745 C->getLParenLoc(), 9746 C->getDefaultmapModifierLoc(), 9747 C->getDefaultmapKindLoc(), 9748 C->getEndLoc()); 9749 } 9750 9751 template <typename Derived> 9752 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9753 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9754 llvm::SmallVector<Expr *, 16> Vars; 9755 CXXScopeSpec MapperIdScopeSpec; 9756 DeclarationNameInfo MapperIdInfo; 9757 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9758 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9759 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9760 return nullptr; 9761 return getDerived().RebuildOMPToClause( 9762 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9763 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9764 } 9765 9766 template <typename Derived> 9767 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9768 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9769 llvm::SmallVector<Expr *, 16> Vars; 9770 CXXScopeSpec MapperIdScopeSpec; 9771 DeclarationNameInfo MapperIdInfo; 9772 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9773 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9774 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9775 return nullptr; 9776 return getDerived().RebuildOMPFromClause( 9777 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9778 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9779 } 9780 9781 template <typename Derived> 9782 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9783 OMPUseDevicePtrClause *C) { 9784 llvm::SmallVector<Expr *, 16> Vars; 9785 Vars.reserve(C->varlist_size()); 9786 for (auto *VE : C->varlists()) { 9787 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9788 if (EVar.isInvalid()) 9789 return nullptr; 9790 Vars.push_back(EVar.get()); 9791 } 9792 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9793 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9794 } 9795 9796 template <typename Derived> 9797 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 9798 OMPUseDeviceAddrClause *C) { 9799 llvm::SmallVector<Expr *, 16> Vars; 9800 Vars.reserve(C->varlist_size()); 9801 for (auto *VE : C->varlists()) { 9802 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9803 if (EVar.isInvalid()) 9804 return nullptr; 9805 Vars.push_back(EVar.get()); 9806 } 9807 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9808 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 9809 } 9810 9811 template <typename Derived> 9812 OMPClause * 9813 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9814 llvm::SmallVector<Expr *, 16> Vars; 9815 Vars.reserve(C->varlist_size()); 9816 for (auto *VE : C->varlists()) { 9817 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9818 if (EVar.isInvalid()) 9819 return nullptr; 9820 Vars.push_back(EVar.get()); 9821 } 9822 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9823 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9824 } 9825 9826 template <typename Derived> 9827 OMPClause * 9828 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9829 llvm::SmallVector<Expr *, 16> Vars; 9830 Vars.reserve(C->varlist_size()); 9831 for (auto *VE : C->varlists()) { 9832 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9833 if (EVar.isInvalid()) 9834 return nullptr; 9835 Vars.push_back(EVar.get()); 9836 } 9837 return getDerived().RebuildOMPNontemporalClause( 9838 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9839 } 9840 9841 template <typename Derived> 9842 OMPClause * 9843 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 9844 llvm::SmallVector<Expr *, 16> Vars; 9845 Vars.reserve(C->varlist_size()); 9846 for (auto *VE : C->varlists()) { 9847 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9848 if (EVar.isInvalid()) 9849 return nullptr; 9850 Vars.push_back(EVar.get()); 9851 } 9852 return getDerived().RebuildOMPInclusiveClause( 9853 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9854 } 9855 9856 template <typename Derived> 9857 OMPClause * 9858 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 9859 llvm::SmallVector<Expr *, 16> Vars; 9860 Vars.reserve(C->varlist_size()); 9861 for (auto *VE : C->varlists()) { 9862 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9863 if (EVar.isInvalid()) 9864 return nullptr; 9865 Vars.push_back(EVar.get()); 9866 } 9867 return getDerived().RebuildOMPExclusiveClause( 9868 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9869 } 9870 9871 template <typename Derived> 9872 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 9873 OMPUsesAllocatorsClause *C) { 9874 SmallVector<Sema::UsesAllocatorsData, 16> Data; 9875 Data.reserve(C->getNumberOfAllocators()); 9876 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 9877 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 9878 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 9879 if (Allocator.isInvalid()) 9880 continue; 9881 ExprResult AllocatorTraits; 9882 if (Expr *AT = D.AllocatorTraits) { 9883 AllocatorTraits = getDerived().TransformExpr(AT); 9884 if (AllocatorTraits.isInvalid()) 9885 continue; 9886 } 9887 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 9888 NewD.Allocator = Allocator.get(); 9889 NewD.AllocatorTraits = AllocatorTraits.get(); 9890 NewD.LParenLoc = D.LParenLoc; 9891 NewD.RParenLoc = D.RParenLoc; 9892 } 9893 return getDerived().RebuildOMPUsesAllocatorsClause( 9894 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9895 } 9896 9897 template <typename Derived> 9898 OMPClause * 9899 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 9900 SmallVector<Expr *, 4> Locators; 9901 Locators.reserve(C->varlist_size()); 9902 ExprResult ModifierRes; 9903 if (Expr *Modifier = C->getModifier()) { 9904 ModifierRes = getDerived().TransformExpr(Modifier); 9905 if (ModifierRes.isInvalid()) 9906 return nullptr; 9907 } 9908 for (Expr *E : C->varlists()) { 9909 ExprResult Locator = getDerived().TransformExpr(E); 9910 if (Locator.isInvalid()) 9911 continue; 9912 Locators.push_back(Locator.get()); 9913 } 9914 return getDerived().RebuildOMPAffinityClause( 9915 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 9916 ModifierRes.get(), Locators); 9917 } 9918 9919 template <typename Derived> 9920 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 9921 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 9922 C->getBeginLoc(), C->getLParenLoc(), 9923 C->getEndLoc()); 9924 } 9925 9926 //===----------------------------------------------------------------------===// 9927 // Expression transformation 9928 //===----------------------------------------------------------------------===// 9929 template<typename Derived> 9930 ExprResult 9931 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9932 return TransformExpr(E->getSubExpr()); 9933 } 9934 9935 template<typename Derived> 9936 ExprResult 9937 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9938 if (!E->isTypeDependent()) 9939 return E; 9940 9941 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9942 E->getIdentKind()); 9943 } 9944 9945 template<typename Derived> 9946 ExprResult 9947 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9948 NestedNameSpecifierLoc QualifierLoc; 9949 if (E->getQualifierLoc()) { 9950 QualifierLoc 9951 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9952 if (!QualifierLoc) 9953 return ExprError(); 9954 } 9955 9956 ValueDecl *ND 9957 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9958 E->getDecl())); 9959 if (!ND) 9960 return ExprError(); 9961 9962 NamedDecl *Found = ND; 9963 if (E->getFoundDecl() != E->getDecl()) { 9964 Found = cast_or_null<NamedDecl>( 9965 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 9966 if (!Found) 9967 return ExprError(); 9968 } 9969 9970 DeclarationNameInfo NameInfo = E->getNameInfo(); 9971 if (NameInfo.getName()) { 9972 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9973 if (!NameInfo.getName()) 9974 return ExprError(); 9975 } 9976 9977 if (!getDerived().AlwaysRebuild() && 9978 QualifierLoc == E->getQualifierLoc() && 9979 ND == E->getDecl() && 9980 Found == E->getFoundDecl() && 9981 NameInfo.getName() == E->getDecl()->getDeclName() && 9982 !E->hasExplicitTemplateArgs()) { 9983 9984 // Mark it referenced in the new context regardless. 9985 // FIXME: this is a bit instantiation-specific. 9986 SemaRef.MarkDeclRefReferenced(E); 9987 9988 return E; 9989 } 9990 9991 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9992 if (E->hasExplicitTemplateArgs()) { 9993 TemplateArgs = &TransArgs; 9994 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9995 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9996 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9997 E->getNumTemplateArgs(), 9998 TransArgs)) 9999 return ExprError(); 10000 } 10001 10002 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10003 Found, TemplateArgs); 10004 } 10005 10006 template<typename Derived> 10007 ExprResult 10008 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10009 return E; 10010 } 10011 10012 template <typename Derived> 10013 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10014 FixedPointLiteral *E) { 10015 return E; 10016 } 10017 10018 template<typename Derived> 10019 ExprResult 10020 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10021 return E; 10022 } 10023 10024 template<typename Derived> 10025 ExprResult 10026 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10027 return E; 10028 } 10029 10030 template<typename Derived> 10031 ExprResult 10032 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10033 return E; 10034 } 10035 10036 template<typename Derived> 10037 ExprResult 10038 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10039 return E; 10040 } 10041 10042 template<typename Derived> 10043 ExprResult 10044 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10045 if (FunctionDecl *FD = E->getDirectCallee()) 10046 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10047 return SemaRef.MaybeBindToTemporary(E); 10048 } 10049 10050 template<typename Derived> 10051 ExprResult 10052 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10053 ExprResult ControllingExpr = 10054 getDerived().TransformExpr(E->getControllingExpr()); 10055 if (ControllingExpr.isInvalid()) 10056 return ExprError(); 10057 10058 SmallVector<Expr *, 4> AssocExprs; 10059 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10060 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10061 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10062 if (TSI) { 10063 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10064 if (!AssocType) 10065 return ExprError(); 10066 AssocTypes.push_back(AssocType); 10067 } else { 10068 AssocTypes.push_back(nullptr); 10069 } 10070 10071 ExprResult AssocExpr = 10072 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10073 if (AssocExpr.isInvalid()) 10074 return ExprError(); 10075 AssocExprs.push_back(AssocExpr.get()); 10076 } 10077 10078 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10079 E->getDefaultLoc(), 10080 E->getRParenLoc(), 10081 ControllingExpr.get(), 10082 AssocTypes, 10083 AssocExprs); 10084 } 10085 10086 template<typename Derived> 10087 ExprResult 10088 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10089 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10090 if (SubExpr.isInvalid()) 10091 return ExprError(); 10092 10093 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10094 return E; 10095 10096 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10097 E->getRParen()); 10098 } 10099 10100 /// The operand of a unary address-of operator has special rules: it's 10101 /// allowed to refer to a non-static member of a class even if there's no 'this' 10102 /// object available. 10103 template<typename Derived> 10104 ExprResult 10105 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10106 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10107 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10108 else 10109 return getDerived().TransformExpr(E); 10110 } 10111 10112 template<typename Derived> 10113 ExprResult 10114 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10115 ExprResult SubExpr; 10116 if (E->getOpcode() == UO_AddrOf) 10117 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10118 else 10119 SubExpr = TransformExpr(E->getSubExpr()); 10120 if (SubExpr.isInvalid()) 10121 return ExprError(); 10122 10123 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10124 return E; 10125 10126 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10127 E->getOpcode(), 10128 SubExpr.get()); 10129 } 10130 10131 template<typename Derived> 10132 ExprResult 10133 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10134 // Transform the type. 10135 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10136 if (!Type) 10137 return ExprError(); 10138 10139 // Transform all of the components into components similar to what the 10140 // parser uses. 10141 // FIXME: It would be slightly more efficient in the non-dependent case to 10142 // just map FieldDecls, rather than requiring the rebuilder to look for 10143 // the fields again. However, __builtin_offsetof is rare enough in 10144 // template code that we don't care. 10145 bool ExprChanged = false; 10146 typedef Sema::OffsetOfComponent Component; 10147 SmallVector<Component, 4> Components; 10148 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10149 const OffsetOfNode &ON = E->getComponent(I); 10150 Component Comp; 10151 Comp.isBrackets = true; 10152 Comp.LocStart = ON.getSourceRange().getBegin(); 10153 Comp.LocEnd = ON.getSourceRange().getEnd(); 10154 switch (ON.getKind()) { 10155 case OffsetOfNode::Array: { 10156 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10157 ExprResult Index = getDerived().TransformExpr(FromIndex); 10158 if (Index.isInvalid()) 10159 return ExprError(); 10160 10161 ExprChanged = ExprChanged || Index.get() != FromIndex; 10162 Comp.isBrackets = true; 10163 Comp.U.E = Index.get(); 10164 break; 10165 } 10166 10167 case OffsetOfNode::Field: 10168 case OffsetOfNode::Identifier: 10169 Comp.isBrackets = false; 10170 Comp.U.IdentInfo = ON.getFieldName(); 10171 if (!Comp.U.IdentInfo) 10172 continue; 10173 10174 break; 10175 10176 case OffsetOfNode::Base: 10177 // Will be recomputed during the rebuild. 10178 continue; 10179 } 10180 10181 Components.push_back(Comp); 10182 } 10183 10184 // If nothing changed, retain the existing expression. 10185 if (!getDerived().AlwaysRebuild() && 10186 Type == E->getTypeSourceInfo() && 10187 !ExprChanged) 10188 return E; 10189 10190 // Build a new offsetof expression. 10191 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10192 Components, E->getRParenLoc()); 10193 } 10194 10195 template<typename Derived> 10196 ExprResult 10197 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10198 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10199 "opaque value expression requires transformation"); 10200 return E; 10201 } 10202 10203 template<typename Derived> 10204 ExprResult 10205 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10206 return E; 10207 } 10208 10209 template <typename Derived> 10210 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10211 llvm::SmallVector<Expr *, 8> Children; 10212 bool Changed = false; 10213 for (Expr *C : E->subExpressions()) { 10214 ExprResult NewC = getDerived().TransformExpr(C); 10215 if (NewC.isInvalid()) 10216 return ExprError(); 10217 Children.push_back(NewC.get()); 10218 10219 Changed |= NewC.get() != C; 10220 } 10221 if (!getDerived().AlwaysRebuild() && !Changed) 10222 return E; 10223 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10224 Children, E->getType()); 10225 } 10226 10227 template<typename Derived> 10228 ExprResult 10229 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10230 // Rebuild the syntactic form. The original syntactic form has 10231 // opaque-value expressions in it, so strip those away and rebuild 10232 // the result. This is a really awful way of doing this, but the 10233 // better solution (rebuilding the semantic expressions and 10234 // rebinding OVEs as necessary) doesn't work; we'd need 10235 // TreeTransform to not strip away implicit conversions. 10236 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10237 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10238 if (result.isInvalid()) return ExprError(); 10239 10240 // If that gives us a pseudo-object result back, the pseudo-object 10241 // expression must have been an lvalue-to-rvalue conversion which we 10242 // should reapply. 10243 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10244 result = SemaRef.checkPseudoObjectRValue(result.get()); 10245 10246 return result; 10247 } 10248 10249 template<typename Derived> 10250 ExprResult 10251 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10252 UnaryExprOrTypeTraitExpr *E) { 10253 if (E->isArgumentType()) { 10254 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10255 10256 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10257 if (!NewT) 10258 return ExprError(); 10259 10260 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10261 return E; 10262 10263 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10264 E->getKind(), 10265 E->getSourceRange()); 10266 } 10267 10268 // C++0x [expr.sizeof]p1: 10269 // The operand is either an expression, which is an unevaluated operand 10270 // [...] 10271 EnterExpressionEvaluationContext Unevaluated( 10272 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10273 Sema::ReuseLambdaContextDecl); 10274 10275 // Try to recover if we have something like sizeof(T::X) where X is a type. 10276 // Notably, there must be *exactly* one set of parens if X is a type. 10277 TypeSourceInfo *RecoveryTSI = nullptr; 10278 ExprResult SubExpr; 10279 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10280 if (auto *DRE = 10281 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10282 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10283 PE, DRE, false, &RecoveryTSI); 10284 else 10285 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10286 10287 if (RecoveryTSI) { 10288 return getDerived().RebuildUnaryExprOrTypeTrait( 10289 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10290 } else if (SubExpr.isInvalid()) 10291 return ExprError(); 10292 10293 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10294 return E; 10295 10296 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10297 E->getOperatorLoc(), 10298 E->getKind(), 10299 E->getSourceRange()); 10300 } 10301 10302 template<typename Derived> 10303 ExprResult 10304 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10305 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10306 if (LHS.isInvalid()) 10307 return ExprError(); 10308 10309 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10310 if (RHS.isInvalid()) 10311 return ExprError(); 10312 10313 10314 if (!getDerived().AlwaysRebuild() && 10315 LHS.get() == E->getLHS() && 10316 RHS.get() == E->getRHS()) 10317 return E; 10318 10319 return getDerived().RebuildArraySubscriptExpr( 10320 LHS.get(), 10321 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10322 } 10323 10324 template <typename Derived> 10325 ExprResult 10326 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10327 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10328 if (Base.isInvalid()) 10329 return ExprError(); 10330 10331 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10332 if (RowIdx.isInvalid()) 10333 return ExprError(); 10334 10335 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10336 if (ColumnIdx.isInvalid()) 10337 return ExprError(); 10338 10339 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10340 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10341 return E; 10342 10343 return getDerived().RebuildMatrixSubscriptExpr( 10344 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10345 } 10346 10347 template <typename Derived> 10348 ExprResult 10349 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10350 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10351 if (Base.isInvalid()) 10352 return ExprError(); 10353 10354 ExprResult LowerBound; 10355 if (E->getLowerBound()) { 10356 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10357 if (LowerBound.isInvalid()) 10358 return ExprError(); 10359 } 10360 10361 ExprResult Length; 10362 if (E->getLength()) { 10363 Length = getDerived().TransformExpr(E->getLength()); 10364 if (Length.isInvalid()) 10365 return ExprError(); 10366 } 10367 10368 ExprResult Stride; 10369 if (Expr *Str = E->getStride()) { 10370 Stride = getDerived().TransformExpr(Str); 10371 if (Stride.isInvalid()) 10372 return ExprError(); 10373 } 10374 10375 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10376 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10377 return E; 10378 10379 return getDerived().RebuildOMPArraySectionExpr( 10380 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10381 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10382 E->getRBracketLoc()); 10383 } 10384 10385 template <typename Derived> 10386 ExprResult 10387 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10388 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10389 if (Base.isInvalid()) 10390 return ExprError(); 10391 10392 SmallVector<Expr *, 4> Dims; 10393 bool ErrorFound = false; 10394 for (Expr *Dim : E->getDimensions()) { 10395 ExprResult DimRes = getDerived().TransformExpr(Dim); 10396 if (DimRes.isInvalid()) { 10397 ErrorFound = true; 10398 continue; 10399 } 10400 Dims.push_back(DimRes.get()); 10401 } 10402 10403 if (ErrorFound) 10404 return ExprError(); 10405 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10406 E->getRParenLoc(), Dims, 10407 E->getBracketsRanges()); 10408 } 10409 10410 template <typename Derived> 10411 ExprResult 10412 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10413 unsigned NumIterators = E->numOfIterators(); 10414 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10415 10416 bool ErrorFound = false; 10417 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10418 for (unsigned I = 0; I < NumIterators; ++I) { 10419 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10420 Data[I].DeclIdent = D->getIdentifier(); 10421 Data[I].DeclIdentLoc = D->getLocation(); 10422 if (D->getLocation() == D->getBeginLoc()) { 10423 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10424 "Implicit type must be int."); 10425 } else { 10426 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10427 QualType DeclTy = getDerived().TransformType(D->getType()); 10428 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10429 } 10430 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10431 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10432 ExprResult End = getDerived().TransformExpr(Range.End); 10433 ExprResult Step = getDerived().TransformExpr(Range.Step); 10434 ErrorFound = ErrorFound || 10435 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10436 !Data[I].Type.get().isNull())) || 10437 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10438 if (ErrorFound) 10439 continue; 10440 Data[I].Range.Begin = Begin.get(); 10441 Data[I].Range.End = End.get(); 10442 Data[I].Range.Step = Step.get(); 10443 Data[I].AssignLoc = E->getAssignLoc(I); 10444 Data[I].ColonLoc = E->getColonLoc(I); 10445 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10446 NeedToRebuild = 10447 NeedToRebuild || 10448 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10449 D->getType().getTypePtrOrNull()) || 10450 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10451 Range.Step != Data[I].Range.Step; 10452 } 10453 if (ErrorFound) 10454 return ExprError(); 10455 if (!NeedToRebuild) 10456 return E; 10457 10458 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10459 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10460 if (!Res.isUsable()) 10461 return Res; 10462 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10463 for (unsigned I = 0; I < NumIterators; ++I) 10464 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10465 IE->getIteratorDecl(I)); 10466 return Res; 10467 } 10468 10469 template<typename Derived> 10470 ExprResult 10471 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10472 // Transform the callee. 10473 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10474 if (Callee.isInvalid()) 10475 return ExprError(); 10476 10477 // Transform arguments. 10478 bool ArgChanged = false; 10479 SmallVector<Expr*, 8> Args; 10480 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10481 &ArgChanged)) 10482 return ExprError(); 10483 10484 if (!getDerived().AlwaysRebuild() && 10485 Callee.get() == E->getCallee() && 10486 !ArgChanged) 10487 return SemaRef.MaybeBindToTemporary(E); 10488 10489 // FIXME: Wrong source location information for the '('. 10490 SourceLocation FakeLParenLoc 10491 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10492 10493 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10494 if (E->hasStoredFPFeatures()) { 10495 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10496 getSema().CurFPFeatures = 10497 NewOverrides.applyOverrides(getSema().getLangOpts()); 10498 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10499 } 10500 10501 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10502 Args, 10503 E->getRParenLoc()); 10504 } 10505 10506 template<typename Derived> 10507 ExprResult 10508 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10509 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10510 if (Base.isInvalid()) 10511 return ExprError(); 10512 10513 NestedNameSpecifierLoc QualifierLoc; 10514 if (E->hasQualifier()) { 10515 QualifierLoc 10516 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10517 10518 if (!QualifierLoc) 10519 return ExprError(); 10520 } 10521 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10522 10523 ValueDecl *Member 10524 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10525 E->getMemberDecl())); 10526 if (!Member) 10527 return ExprError(); 10528 10529 NamedDecl *FoundDecl = E->getFoundDecl(); 10530 if (FoundDecl == E->getMemberDecl()) { 10531 FoundDecl = Member; 10532 } else { 10533 FoundDecl = cast_or_null<NamedDecl>( 10534 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10535 if (!FoundDecl) 10536 return ExprError(); 10537 } 10538 10539 if (!getDerived().AlwaysRebuild() && 10540 Base.get() == E->getBase() && 10541 QualifierLoc == E->getQualifierLoc() && 10542 Member == E->getMemberDecl() && 10543 FoundDecl == E->getFoundDecl() && 10544 !E->hasExplicitTemplateArgs()) { 10545 10546 // Mark it referenced in the new context regardless. 10547 // FIXME: this is a bit instantiation-specific. 10548 SemaRef.MarkMemberReferenced(E); 10549 10550 return E; 10551 } 10552 10553 TemplateArgumentListInfo TransArgs; 10554 if (E->hasExplicitTemplateArgs()) { 10555 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10556 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10557 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10558 E->getNumTemplateArgs(), 10559 TransArgs)) 10560 return ExprError(); 10561 } 10562 10563 // FIXME: Bogus source location for the operator 10564 SourceLocation FakeOperatorLoc = 10565 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10566 10567 // FIXME: to do this check properly, we will need to preserve the 10568 // first-qualifier-in-scope here, just in case we had a dependent 10569 // base (and therefore couldn't do the check) and a 10570 // nested-name-qualifier (and therefore could do the lookup). 10571 NamedDecl *FirstQualifierInScope = nullptr; 10572 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10573 if (MemberNameInfo.getName()) { 10574 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10575 if (!MemberNameInfo.getName()) 10576 return ExprError(); 10577 } 10578 10579 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10580 E->isArrow(), 10581 QualifierLoc, 10582 TemplateKWLoc, 10583 MemberNameInfo, 10584 Member, 10585 FoundDecl, 10586 (E->hasExplicitTemplateArgs() 10587 ? &TransArgs : nullptr), 10588 FirstQualifierInScope); 10589 } 10590 10591 template<typename Derived> 10592 ExprResult 10593 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10594 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10595 if (LHS.isInvalid()) 10596 return ExprError(); 10597 10598 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10599 if (RHS.isInvalid()) 10600 return ExprError(); 10601 10602 if (!getDerived().AlwaysRebuild() && 10603 LHS.get() == E->getLHS() && 10604 RHS.get() == E->getRHS()) 10605 return E; 10606 10607 if (E->isCompoundAssignmentOp()) 10608 // FPFeatures has already been established from trailing storage 10609 return getDerived().RebuildBinaryOperator( 10610 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10611 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10612 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10613 getSema().CurFPFeatures = 10614 NewOverrides.applyOverrides(getSema().getLangOpts()); 10615 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10616 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10617 LHS.get(), RHS.get()); 10618 } 10619 10620 template <typename Derived> 10621 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10622 CXXRewrittenBinaryOperator *E) { 10623 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10624 10625 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10626 if (LHS.isInvalid()) 10627 return ExprError(); 10628 10629 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10630 if (RHS.isInvalid()) 10631 return ExprError(); 10632 10633 if (!getDerived().AlwaysRebuild() && 10634 LHS.get() == Decomp.LHS && 10635 RHS.get() == Decomp.RHS) 10636 return E; 10637 10638 // Extract the already-resolved callee declarations so that we can restrict 10639 // ourselves to using them as the unqualified lookup results when rebuilding. 10640 UnresolvedSet<2> UnqualLookups; 10641 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10642 const_cast<Expr *>(Decomp.InnerBinOp)}; 10643 for (Expr *PossibleBinOp : PossibleBinOps) { 10644 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10645 if (!Op) 10646 continue; 10647 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10648 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10649 continue; 10650 10651 // Transform the callee in case we built a call to a local extern 10652 // declaration. 10653 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10654 E->getOperatorLoc(), Callee->getFoundDecl())); 10655 if (!Found) 10656 return ExprError(); 10657 UnqualLookups.addDecl(Found); 10658 } 10659 10660 return getDerived().RebuildCXXRewrittenBinaryOperator( 10661 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10662 } 10663 10664 template<typename Derived> 10665 ExprResult 10666 TreeTransform<Derived>::TransformCompoundAssignOperator( 10667 CompoundAssignOperator *E) { 10668 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10669 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10670 getSema().CurFPFeatures = 10671 NewOverrides.applyOverrides(getSema().getLangOpts()); 10672 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10673 return getDerived().TransformBinaryOperator(E); 10674 } 10675 10676 template<typename Derived> 10677 ExprResult TreeTransform<Derived>:: 10678 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10679 // Just rebuild the common and RHS expressions and see whether we 10680 // get any changes. 10681 10682 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10683 if (commonExpr.isInvalid()) 10684 return ExprError(); 10685 10686 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10687 if (rhs.isInvalid()) 10688 return ExprError(); 10689 10690 if (!getDerived().AlwaysRebuild() && 10691 commonExpr.get() == e->getCommon() && 10692 rhs.get() == e->getFalseExpr()) 10693 return e; 10694 10695 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10696 e->getQuestionLoc(), 10697 nullptr, 10698 e->getColonLoc(), 10699 rhs.get()); 10700 } 10701 10702 template<typename Derived> 10703 ExprResult 10704 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10705 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10706 if (Cond.isInvalid()) 10707 return ExprError(); 10708 10709 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10710 if (LHS.isInvalid()) 10711 return ExprError(); 10712 10713 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10714 if (RHS.isInvalid()) 10715 return ExprError(); 10716 10717 if (!getDerived().AlwaysRebuild() && 10718 Cond.get() == E->getCond() && 10719 LHS.get() == E->getLHS() && 10720 RHS.get() == E->getRHS()) 10721 return E; 10722 10723 return getDerived().RebuildConditionalOperator(Cond.get(), 10724 E->getQuestionLoc(), 10725 LHS.get(), 10726 E->getColonLoc(), 10727 RHS.get()); 10728 } 10729 10730 template<typename Derived> 10731 ExprResult 10732 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10733 // Implicit casts are eliminated during transformation, since they 10734 // will be recomputed by semantic analysis after transformation. 10735 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10736 } 10737 10738 template<typename Derived> 10739 ExprResult 10740 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10741 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10742 if (!Type) 10743 return ExprError(); 10744 10745 ExprResult SubExpr 10746 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10747 if (SubExpr.isInvalid()) 10748 return ExprError(); 10749 10750 if (!getDerived().AlwaysRebuild() && 10751 Type == E->getTypeInfoAsWritten() && 10752 SubExpr.get() == E->getSubExpr()) 10753 return E; 10754 10755 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10756 Type, 10757 E->getRParenLoc(), 10758 SubExpr.get()); 10759 } 10760 10761 template<typename Derived> 10762 ExprResult 10763 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10764 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10765 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10766 if (!NewT) 10767 return ExprError(); 10768 10769 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10770 if (Init.isInvalid()) 10771 return ExprError(); 10772 10773 if (!getDerived().AlwaysRebuild() && 10774 OldT == NewT && 10775 Init.get() == E->getInitializer()) 10776 return SemaRef.MaybeBindToTemporary(E); 10777 10778 // Note: the expression type doesn't necessarily match the 10779 // type-as-written, but that's okay, because it should always be 10780 // derivable from the initializer. 10781 10782 return getDerived().RebuildCompoundLiteralExpr( 10783 E->getLParenLoc(), NewT, 10784 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10785 } 10786 10787 template<typename Derived> 10788 ExprResult 10789 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10790 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10791 if (Base.isInvalid()) 10792 return ExprError(); 10793 10794 if (!getDerived().AlwaysRebuild() && 10795 Base.get() == E->getBase()) 10796 return E; 10797 10798 // FIXME: Bad source location 10799 SourceLocation FakeOperatorLoc = 10800 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10801 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10802 E->getAccessorLoc(), 10803 E->getAccessor()); 10804 } 10805 10806 template<typename Derived> 10807 ExprResult 10808 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10809 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10810 E = Syntactic; 10811 10812 bool InitChanged = false; 10813 10814 EnterExpressionEvaluationContext Context( 10815 getSema(), EnterExpressionEvaluationContext::InitList); 10816 10817 SmallVector<Expr*, 4> Inits; 10818 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10819 Inits, &InitChanged)) 10820 return ExprError(); 10821 10822 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10823 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10824 // in some cases. We can't reuse it in general, because the syntactic and 10825 // semantic forms are linked, and we can't know that semantic form will 10826 // match even if the syntactic form does. 10827 } 10828 10829 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10830 E->getRBraceLoc()); 10831 } 10832 10833 template<typename Derived> 10834 ExprResult 10835 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10836 Designation Desig; 10837 10838 // transform the initializer value 10839 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10840 if (Init.isInvalid()) 10841 return ExprError(); 10842 10843 // transform the designators. 10844 SmallVector<Expr*, 4> ArrayExprs; 10845 bool ExprChanged = false; 10846 for (const DesignatedInitExpr::Designator &D : E->designators()) { 10847 if (D.isFieldDesignator()) { 10848 Desig.AddDesignator(Designator::getField(D.getFieldName(), 10849 D.getDotLoc(), 10850 D.getFieldLoc())); 10851 if (D.getField()) { 10852 FieldDecl *Field = cast_or_null<FieldDecl>( 10853 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 10854 if (Field != D.getField()) 10855 // Rebuild the expression when the transformed FieldDecl is 10856 // different to the already assigned FieldDecl. 10857 ExprChanged = true; 10858 } else { 10859 // Ensure that the designator expression is rebuilt when there isn't 10860 // a resolved FieldDecl in the designator as we don't want to assign 10861 // a FieldDecl to a pattern designator that will be instantiated again. 10862 ExprChanged = true; 10863 } 10864 continue; 10865 } 10866 10867 if (D.isArrayDesignator()) { 10868 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 10869 if (Index.isInvalid()) 10870 return ExprError(); 10871 10872 Desig.AddDesignator( 10873 Designator::getArray(Index.get(), D.getLBracketLoc())); 10874 10875 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 10876 ArrayExprs.push_back(Index.get()); 10877 continue; 10878 } 10879 10880 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 10881 ExprResult Start 10882 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 10883 if (Start.isInvalid()) 10884 return ExprError(); 10885 10886 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 10887 if (End.isInvalid()) 10888 return ExprError(); 10889 10890 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 10891 End.get(), 10892 D.getLBracketLoc(), 10893 D.getEllipsisLoc())); 10894 10895 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 10896 End.get() != E->getArrayRangeEnd(D); 10897 10898 ArrayExprs.push_back(Start.get()); 10899 ArrayExprs.push_back(End.get()); 10900 } 10901 10902 if (!getDerived().AlwaysRebuild() && 10903 Init.get() == E->getInit() && 10904 !ExprChanged) 10905 return E; 10906 10907 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 10908 E->getEqualOrColonLoc(), 10909 E->usesGNUSyntax(), Init.get()); 10910 } 10911 10912 // Seems that if TransformInitListExpr() only works on the syntactic form of an 10913 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 10914 template<typename Derived> 10915 ExprResult 10916 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 10917 DesignatedInitUpdateExpr *E) { 10918 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 10919 "initializer"); 10920 return ExprError(); 10921 } 10922 10923 template<typename Derived> 10924 ExprResult 10925 TreeTransform<Derived>::TransformNoInitExpr( 10926 NoInitExpr *E) { 10927 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 10928 return ExprError(); 10929 } 10930 10931 template<typename Derived> 10932 ExprResult 10933 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 10934 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 10935 return ExprError(); 10936 } 10937 10938 template<typename Derived> 10939 ExprResult 10940 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 10941 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 10942 return ExprError(); 10943 } 10944 10945 template<typename Derived> 10946 ExprResult 10947 TreeTransform<Derived>::TransformImplicitValueInitExpr( 10948 ImplicitValueInitExpr *E) { 10949 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 10950 10951 // FIXME: Will we ever have proper type location here? Will we actually 10952 // need to transform the type? 10953 QualType T = getDerived().TransformType(E->getType()); 10954 if (T.isNull()) 10955 return ExprError(); 10956 10957 if (!getDerived().AlwaysRebuild() && 10958 T == E->getType()) 10959 return E; 10960 10961 return getDerived().RebuildImplicitValueInitExpr(T); 10962 } 10963 10964 template<typename Derived> 10965 ExprResult 10966 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 10967 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 10968 if (!TInfo) 10969 return ExprError(); 10970 10971 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10972 if (SubExpr.isInvalid()) 10973 return ExprError(); 10974 10975 if (!getDerived().AlwaysRebuild() && 10976 TInfo == E->getWrittenTypeInfo() && 10977 SubExpr.get() == E->getSubExpr()) 10978 return E; 10979 10980 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 10981 TInfo, E->getRParenLoc()); 10982 } 10983 10984 template<typename Derived> 10985 ExprResult 10986 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 10987 bool ArgumentChanged = false; 10988 SmallVector<Expr*, 4> Inits; 10989 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 10990 &ArgumentChanged)) 10991 return ExprError(); 10992 10993 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 10994 Inits, 10995 E->getRParenLoc()); 10996 } 10997 10998 /// Transform an address-of-label expression. 10999 /// 11000 /// By default, the transformation of an address-of-label expression always 11001 /// rebuilds the expression, so that the label identifier can be resolved to 11002 /// the corresponding label statement by semantic analysis. 11003 template<typename Derived> 11004 ExprResult 11005 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11006 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11007 E->getLabel()); 11008 if (!LD) 11009 return ExprError(); 11010 11011 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11012 cast<LabelDecl>(LD)); 11013 } 11014 11015 template<typename Derived> 11016 ExprResult 11017 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11018 SemaRef.ActOnStartStmtExpr(); 11019 StmtResult SubStmt 11020 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11021 if (SubStmt.isInvalid()) { 11022 SemaRef.ActOnStmtExprError(); 11023 return ExprError(); 11024 } 11025 11026 unsigned OldDepth = E->getTemplateDepth(); 11027 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11028 11029 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11030 SubStmt.get() == E->getSubStmt()) { 11031 // Calling this an 'error' is unintuitive, but it does the right thing. 11032 SemaRef.ActOnStmtExprError(); 11033 return SemaRef.MaybeBindToTemporary(E); 11034 } 11035 11036 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11037 E->getRParenLoc(), NewDepth); 11038 } 11039 11040 template<typename Derived> 11041 ExprResult 11042 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11043 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11044 if (Cond.isInvalid()) 11045 return ExprError(); 11046 11047 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11048 if (LHS.isInvalid()) 11049 return ExprError(); 11050 11051 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11052 if (RHS.isInvalid()) 11053 return ExprError(); 11054 11055 if (!getDerived().AlwaysRebuild() && 11056 Cond.get() == E->getCond() && 11057 LHS.get() == E->getLHS() && 11058 RHS.get() == E->getRHS()) 11059 return E; 11060 11061 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11062 Cond.get(), LHS.get(), RHS.get(), 11063 E->getRParenLoc()); 11064 } 11065 11066 template<typename Derived> 11067 ExprResult 11068 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11069 return E; 11070 } 11071 11072 template<typename Derived> 11073 ExprResult 11074 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11075 switch (E->getOperator()) { 11076 case OO_New: 11077 case OO_Delete: 11078 case OO_Array_New: 11079 case OO_Array_Delete: 11080 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11081 11082 case OO_Call: { 11083 // This is a call to an object's operator(). 11084 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11085 11086 // Transform the object itself. 11087 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11088 if (Object.isInvalid()) 11089 return ExprError(); 11090 11091 // FIXME: Poor location information 11092 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11093 static_cast<Expr *>(Object.get())->getEndLoc()); 11094 11095 // Transform the call arguments. 11096 SmallVector<Expr*, 8> Args; 11097 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11098 Args)) 11099 return ExprError(); 11100 11101 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11102 E->getEndLoc()); 11103 } 11104 11105 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11106 case OO_##Name: 11107 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11108 #include "clang/Basic/OperatorKinds.def" 11109 case OO_Subscript: 11110 // Handled below. 11111 break; 11112 11113 case OO_Conditional: 11114 llvm_unreachable("conditional operator is not actually overloadable"); 11115 11116 case OO_None: 11117 case NUM_OVERLOADED_OPERATORS: 11118 llvm_unreachable("not an overloaded operator?"); 11119 } 11120 11121 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11122 if (Callee.isInvalid()) 11123 return ExprError(); 11124 11125 ExprResult First; 11126 if (E->getOperator() == OO_Amp) 11127 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11128 else 11129 First = getDerived().TransformExpr(E->getArg(0)); 11130 if (First.isInvalid()) 11131 return ExprError(); 11132 11133 ExprResult Second; 11134 if (E->getNumArgs() == 2) { 11135 Second = getDerived().TransformExpr(E->getArg(1)); 11136 if (Second.isInvalid()) 11137 return ExprError(); 11138 } 11139 11140 if (!getDerived().AlwaysRebuild() && 11141 Callee.get() == E->getCallee() && 11142 First.get() == E->getArg(0) && 11143 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11144 return SemaRef.MaybeBindToTemporary(E); 11145 11146 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11147 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11148 getSema().CurFPFeatures = 11149 NewOverrides.applyOverrides(getSema().getLangOpts()); 11150 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11151 11152 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11153 E->getOperatorLoc(), 11154 Callee.get(), 11155 First.get(), 11156 Second.get()); 11157 } 11158 11159 template<typename Derived> 11160 ExprResult 11161 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11162 return getDerived().TransformCallExpr(E); 11163 } 11164 11165 template <typename Derived> 11166 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11167 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11168 getSema().CurContext != E->getParentContext(); 11169 11170 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11171 return E; 11172 11173 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11174 E->getEndLoc(), 11175 getSema().CurContext); 11176 } 11177 11178 template<typename Derived> 11179 ExprResult 11180 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11181 // Transform the callee. 11182 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11183 if (Callee.isInvalid()) 11184 return ExprError(); 11185 11186 // Transform exec config. 11187 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11188 if (EC.isInvalid()) 11189 return ExprError(); 11190 11191 // Transform arguments. 11192 bool ArgChanged = false; 11193 SmallVector<Expr*, 8> Args; 11194 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11195 &ArgChanged)) 11196 return ExprError(); 11197 11198 if (!getDerived().AlwaysRebuild() && 11199 Callee.get() == E->getCallee() && 11200 !ArgChanged) 11201 return SemaRef.MaybeBindToTemporary(E); 11202 11203 // FIXME: Wrong source location information for the '('. 11204 SourceLocation FakeLParenLoc 11205 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11206 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11207 Args, 11208 E->getRParenLoc(), EC.get()); 11209 } 11210 11211 template<typename Derived> 11212 ExprResult 11213 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11214 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11215 if (!Type) 11216 return ExprError(); 11217 11218 ExprResult SubExpr 11219 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11220 if (SubExpr.isInvalid()) 11221 return ExprError(); 11222 11223 if (!getDerived().AlwaysRebuild() && 11224 Type == E->getTypeInfoAsWritten() && 11225 SubExpr.get() == E->getSubExpr()) 11226 return E; 11227 return getDerived().RebuildCXXNamedCastExpr( 11228 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11229 Type, E->getAngleBrackets().getEnd(), 11230 // FIXME. this should be '(' location 11231 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11232 } 11233 11234 template<typename Derived> 11235 ExprResult 11236 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11237 TypeSourceInfo *TSI = 11238 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11239 if (!TSI) 11240 return ExprError(); 11241 11242 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11243 if (Sub.isInvalid()) 11244 return ExprError(); 11245 11246 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11247 Sub.get(), BCE->getEndLoc()); 11248 } 11249 11250 template<typename Derived> 11251 ExprResult 11252 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11253 return getDerived().TransformCXXNamedCastExpr(E); 11254 } 11255 11256 template<typename Derived> 11257 ExprResult 11258 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11259 return getDerived().TransformCXXNamedCastExpr(E); 11260 } 11261 11262 template<typename Derived> 11263 ExprResult 11264 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11265 CXXReinterpretCastExpr *E) { 11266 return getDerived().TransformCXXNamedCastExpr(E); 11267 } 11268 11269 template<typename Derived> 11270 ExprResult 11271 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11272 return getDerived().TransformCXXNamedCastExpr(E); 11273 } 11274 11275 template<typename Derived> 11276 ExprResult 11277 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11278 return getDerived().TransformCXXNamedCastExpr(E); 11279 } 11280 11281 template<typename Derived> 11282 ExprResult 11283 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11284 CXXFunctionalCastExpr *E) { 11285 TypeSourceInfo *Type = 11286 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11287 if (!Type) 11288 return ExprError(); 11289 11290 ExprResult SubExpr 11291 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11292 if (SubExpr.isInvalid()) 11293 return ExprError(); 11294 11295 if (!getDerived().AlwaysRebuild() && 11296 Type == E->getTypeInfoAsWritten() && 11297 SubExpr.get() == E->getSubExpr()) 11298 return E; 11299 11300 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11301 E->getLParenLoc(), 11302 SubExpr.get(), 11303 E->getRParenLoc(), 11304 E->isListInitialization()); 11305 } 11306 11307 template<typename Derived> 11308 ExprResult 11309 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11310 if (E->isTypeOperand()) { 11311 TypeSourceInfo *TInfo 11312 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11313 if (!TInfo) 11314 return ExprError(); 11315 11316 if (!getDerived().AlwaysRebuild() && 11317 TInfo == E->getTypeOperandSourceInfo()) 11318 return E; 11319 11320 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11321 TInfo, E->getEndLoc()); 11322 } 11323 11324 // We don't know whether the subexpression is potentially evaluated until 11325 // after we perform semantic analysis. We speculatively assume it is 11326 // unevaluated; it will get fixed later if the subexpression is in fact 11327 // potentially evaluated. 11328 EnterExpressionEvaluationContext Unevaluated( 11329 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11330 Sema::ReuseLambdaContextDecl); 11331 11332 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11333 if (SubExpr.isInvalid()) 11334 return ExprError(); 11335 11336 if (!getDerived().AlwaysRebuild() && 11337 SubExpr.get() == E->getExprOperand()) 11338 return E; 11339 11340 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11341 SubExpr.get(), E->getEndLoc()); 11342 } 11343 11344 template<typename Derived> 11345 ExprResult 11346 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11347 if (E->isTypeOperand()) { 11348 TypeSourceInfo *TInfo 11349 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11350 if (!TInfo) 11351 return ExprError(); 11352 11353 if (!getDerived().AlwaysRebuild() && 11354 TInfo == E->getTypeOperandSourceInfo()) 11355 return E; 11356 11357 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11358 TInfo, E->getEndLoc()); 11359 } 11360 11361 EnterExpressionEvaluationContext Unevaluated( 11362 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11363 11364 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11365 if (SubExpr.isInvalid()) 11366 return ExprError(); 11367 11368 if (!getDerived().AlwaysRebuild() && 11369 SubExpr.get() == E->getExprOperand()) 11370 return E; 11371 11372 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11373 SubExpr.get(), E->getEndLoc()); 11374 } 11375 11376 template<typename Derived> 11377 ExprResult 11378 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11379 return E; 11380 } 11381 11382 template<typename Derived> 11383 ExprResult 11384 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11385 CXXNullPtrLiteralExpr *E) { 11386 return E; 11387 } 11388 11389 template<typename Derived> 11390 ExprResult 11391 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11392 QualType T = getSema().getCurrentThisType(); 11393 11394 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11395 // Mark it referenced in the new context regardless. 11396 // FIXME: this is a bit instantiation-specific. 11397 getSema().MarkThisReferenced(E); 11398 return E; 11399 } 11400 11401 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11402 } 11403 11404 template<typename Derived> 11405 ExprResult 11406 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11407 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11408 if (SubExpr.isInvalid()) 11409 return ExprError(); 11410 11411 if (!getDerived().AlwaysRebuild() && 11412 SubExpr.get() == E->getSubExpr()) 11413 return E; 11414 11415 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11416 E->isThrownVariableInScope()); 11417 } 11418 11419 template<typename Derived> 11420 ExprResult 11421 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11422 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11423 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11424 if (!Param) 11425 return ExprError(); 11426 11427 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11428 E->getUsedContext() == SemaRef.CurContext) 11429 return E; 11430 11431 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11432 } 11433 11434 template<typename Derived> 11435 ExprResult 11436 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11437 FieldDecl *Field = cast_or_null<FieldDecl>( 11438 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11439 if (!Field) 11440 return ExprError(); 11441 11442 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11443 E->getUsedContext() == SemaRef.CurContext) 11444 return E; 11445 11446 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11447 } 11448 11449 template<typename Derived> 11450 ExprResult 11451 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11452 CXXScalarValueInitExpr *E) { 11453 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11454 if (!T) 11455 return ExprError(); 11456 11457 if (!getDerived().AlwaysRebuild() && 11458 T == E->getTypeSourceInfo()) 11459 return E; 11460 11461 return getDerived().RebuildCXXScalarValueInitExpr(T, 11462 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11463 E->getRParenLoc()); 11464 } 11465 11466 template<typename Derived> 11467 ExprResult 11468 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11469 // Transform the type that we're allocating 11470 TypeSourceInfo *AllocTypeInfo = 11471 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11472 if (!AllocTypeInfo) 11473 return ExprError(); 11474 11475 // Transform the size of the array we're allocating (if any). 11476 Optional<Expr *> ArraySize; 11477 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11478 ExprResult NewArraySize; 11479 if (*OldArraySize) { 11480 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11481 if (NewArraySize.isInvalid()) 11482 return ExprError(); 11483 } 11484 ArraySize = NewArraySize.get(); 11485 } 11486 11487 // Transform the placement arguments (if any). 11488 bool ArgumentChanged = false; 11489 SmallVector<Expr*, 8> PlacementArgs; 11490 if (getDerived().TransformExprs(E->getPlacementArgs(), 11491 E->getNumPlacementArgs(), true, 11492 PlacementArgs, &ArgumentChanged)) 11493 return ExprError(); 11494 11495 // Transform the initializer (if any). 11496 Expr *OldInit = E->getInitializer(); 11497 ExprResult NewInit; 11498 if (OldInit) 11499 NewInit = getDerived().TransformInitializer(OldInit, true); 11500 if (NewInit.isInvalid()) 11501 return ExprError(); 11502 11503 // Transform new operator and delete operator. 11504 FunctionDecl *OperatorNew = nullptr; 11505 if (E->getOperatorNew()) { 11506 OperatorNew = cast_or_null<FunctionDecl>( 11507 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11508 if (!OperatorNew) 11509 return ExprError(); 11510 } 11511 11512 FunctionDecl *OperatorDelete = nullptr; 11513 if (E->getOperatorDelete()) { 11514 OperatorDelete = cast_or_null<FunctionDecl>( 11515 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11516 if (!OperatorDelete) 11517 return ExprError(); 11518 } 11519 11520 if (!getDerived().AlwaysRebuild() && 11521 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11522 ArraySize == E->getArraySize() && 11523 NewInit.get() == OldInit && 11524 OperatorNew == E->getOperatorNew() && 11525 OperatorDelete == E->getOperatorDelete() && 11526 !ArgumentChanged) { 11527 // Mark any declarations we need as referenced. 11528 // FIXME: instantiation-specific. 11529 if (OperatorNew) 11530 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11531 if (OperatorDelete) 11532 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11533 11534 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11535 QualType ElementType 11536 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11537 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11538 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11539 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11540 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11541 } 11542 } 11543 } 11544 11545 return E; 11546 } 11547 11548 QualType AllocType = AllocTypeInfo->getType(); 11549 if (!ArraySize) { 11550 // If no array size was specified, but the new expression was 11551 // instantiated with an array type (e.g., "new T" where T is 11552 // instantiated with "int[4]"), extract the outer bound from the 11553 // array type as our array size. We do this with constant and 11554 // dependently-sized array types. 11555 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11556 if (!ArrayT) { 11557 // Do nothing 11558 } else if (const ConstantArrayType *ConsArrayT 11559 = dyn_cast<ConstantArrayType>(ArrayT)) { 11560 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11561 SemaRef.Context.getSizeType(), 11562 /*FIXME:*/ E->getBeginLoc()); 11563 AllocType = ConsArrayT->getElementType(); 11564 } else if (const DependentSizedArrayType *DepArrayT 11565 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11566 if (DepArrayT->getSizeExpr()) { 11567 ArraySize = DepArrayT->getSizeExpr(); 11568 AllocType = DepArrayT->getElementType(); 11569 } 11570 } 11571 } 11572 11573 return getDerived().RebuildCXXNewExpr( 11574 E->getBeginLoc(), E->isGlobalNew(), 11575 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11576 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11577 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11578 } 11579 11580 template<typename Derived> 11581 ExprResult 11582 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11583 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11584 if (Operand.isInvalid()) 11585 return ExprError(); 11586 11587 // Transform the delete operator, if known. 11588 FunctionDecl *OperatorDelete = nullptr; 11589 if (E->getOperatorDelete()) { 11590 OperatorDelete = cast_or_null<FunctionDecl>( 11591 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11592 if (!OperatorDelete) 11593 return ExprError(); 11594 } 11595 11596 if (!getDerived().AlwaysRebuild() && 11597 Operand.get() == E->getArgument() && 11598 OperatorDelete == E->getOperatorDelete()) { 11599 // Mark any declarations we need as referenced. 11600 // FIXME: instantiation-specific. 11601 if (OperatorDelete) 11602 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11603 11604 if (!E->getArgument()->isTypeDependent()) { 11605 QualType Destroyed = SemaRef.Context.getBaseElementType( 11606 E->getDestroyedType()); 11607 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11608 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11609 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11610 SemaRef.LookupDestructor(Record)); 11611 } 11612 } 11613 11614 return E; 11615 } 11616 11617 return getDerived().RebuildCXXDeleteExpr( 11618 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11619 } 11620 11621 template<typename Derived> 11622 ExprResult 11623 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11624 CXXPseudoDestructorExpr *E) { 11625 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11626 if (Base.isInvalid()) 11627 return ExprError(); 11628 11629 ParsedType ObjectTypePtr; 11630 bool MayBePseudoDestructor = false; 11631 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11632 E->getOperatorLoc(), 11633 E->isArrow()? tok::arrow : tok::period, 11634 ObjectTypePtr, 11635 MayBePseudoDestructor); 11636 if (Base.isInvalid()) 11637 return ExprError(); 11638 11639 QualType ObjectType = ObjectTypePtr.get(); 11640 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11641 if (QualifierLoc) { 11642 QualifierLoc 11643 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11644 if (!QualifierLoc) 11645 return ExprError(); 11646 } 11647 CXXScopeSpec SS; 11648 SS.Adopt(QualifierLoc); 11649 11650 PseudoDestructorTypeStorage Destroyed; 11651 if (E->getDestroyedTypeInfo()) { 11652 TypeSourceInfo *DestroyedTypeInfo 11653 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11654 ObjectType, nullptr, SS); 11655 if (!DestroyedTypeInfo) 11656 return ExprError(); 11657 Destroyed = DestroyedTypeInfo; 11658 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11659 // We aren't likely to be able to resolve the identifier down to a type 11660 // now anyway, so just retain the identifier. 11661 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11662 E->getDestroyedTypeLoc()); 11663 } else { 11664 // Look for a destructor known with the given name. 11665 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11666 *E->getDestroyedTypeIdentifier(), 11667 E->getDestroyedTypeLoc(), 11668 /*Scope=*/nullptr, 11669 SS, ObjectTypePtr, 11670 false); 11671 if (!T) 11672 return ExprError(); 11673 11674 Destroyed 11675 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11676 E->getDestroyedTypeLoc()); 11677 } 11678 11679 TypeSourceInfo *ScopeTypeInfo = nullptr; 11680 if (E->getScopeTypeInfo()) { 11681 CXXScopeSpec EmptySS; 11682 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11683 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11684 if (!ScopeTypeInfo) 11685 return ExprError(); 11686 } 11687 11688 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11689 E->getOperatorLoc(), 11690 E->isArrow(), 11691 SS, 11692 ScopeTypeInfo, 11693 E->getColonColonLoc(), 11694 E->getTildeLoc(), 11695 Destroyed); 11696 } 11697 11698 template <typename Derived> 11699 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11700 bool RequiresADL, 11701 LookupResult &R) { 11702 // Transform all the decls. 11703 bool AllEmptyPacks = true; 11704 for (auto *OldD : Old->decls()) { 11705 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11706 if (!InstD) { 11707 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11708 // This can happen because of dependent hiding. 11709 if (isa<UsingShadowDecl>(OldD)) 11710 continue; 11711 else { 11712 R.clear(); 11713 return true; 11714 } 11715 } 11716 11717 // Expand using pack declarations. 11718 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11719 ArrayRef<NamedDecl*> Decls = SingleDecl; 11720 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11721 Decls = UPD->expansions(); 11722 11723 // Expand using declarations. 11724 for (auto *D : Decls) { 11725 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11726 for (auto *SD : UD->shadows()) 11727 R.addDecl(SD); 11728 } else { 11729 R.addDecl(D); 11730 } 11731 } 11732 11733 AllEmptyPacks &= Decls.empty(); 11734 }; 11735 11736 // C++ [temp.res]/8.4.2: 11737 // The program is ill-formed, no diagnostic required, if [...] lookup for 11738 // a name in the template definition found a using-declaration, but the 11739 // lookup in the corresponding scope in the instantiation odoes not find 11740 // any declarations because the using-declaration was a pack expansion and 11741 // the corresponding pack is empty 11742 if (AllEmptyPacks && !RequiresADL) { 11743 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11744 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11745 return true; 11746 } 11747 11748 // Resolve a kind, but don't do any further analysis. If it's 11749 // ambiguous, the callee needs to deal with it. 11750 R.resolveKind(); 11751 return false; 11752 } 11753 11754 template<typename Derived> 11755 ExprResult 11756 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11757 UnresolvedLookupExpr *Old) { 11758 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11759 Sema::LookupOrdinaryName); 11760 11761 // Transform the declaration set. 11762 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11763 return ExprError(); 11764 11765 // Rebuild the nested-name qualifier, if present. 11766 CXXScopeSpec SS; 11767 if (Old->getQualifierLoc()) { 11768 NestedNameSpecifierLoc QualifierLoc 11769 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11770 if (!QualifierLoc) 11771 return ExprError(); 11772 11773 SS.Adopt(QualifierLoc); 11774 } 11775 11776 if (Old->getNamingClass()) { 11777 CXXRecordDecl *NamingClass 11778 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11779 Old->getNameLoc(), 11780 Old->getNamingClass())); 11781 if (!NamingClass) { 11782 R.clear(); 11783 return ExprError(); 11784 } 11785 11786 R.setNamingClass(NamingClass); 11787 } 11788 11789 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11790 11791 // If we have neither explicit template arguments, nor the template keyword, 11792 // it's a normal declaration name or member reference. 11793 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11794 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11795 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11796 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11797 // give a good diagnostic. 11798 if (D && D->isCXXInstanceMember()) { 11799 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11800 /*TemplateArgs=*/nullptr, 11801 /*Scope=*/nullptr); 11802 } 11803 11804 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11805 } 11806 11807 // If we have template arguments, rebuild them, then rebuild the 11808 // templateid expression. 11809 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11810 if (Old->hasExplicitTemplateArgs() && 11811 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11812 Old->getNumTemplateArgs(), 11813 TransArgs)) { 11814 R.clear(); 11815 return ExprError(); 11816 } 11817 11818 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11819 Old->requiresADL(), &TransArgs); 11820 } 11821 11822 template<typename Derived> 11823 ExprResult 11824 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11825 bool ArgChanged = false; 11826 SmallVector<TypeSourceInfo *, 4> Args; 11827 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11828 TypeSourceInfo *From = E->getArg(I); 11829 TypeLoc FromTL = From->getTypeLoc(); 11830 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11831 TypeLocBuilder TLB; 11832 TLB.reserve(FromTL.getFullDataSize()); 11833 QualType To = getDerived().TransformType(TLB, FromTL); 11834 if (To.isNull()) 11835 return ExprError(); 11836 11837 if (To == From->getType()) 11838 Args.push_back(From); 11839 else { 11840 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11841 ArgChanged = true; 11842 } 11843 continue; 11844 } 11845 11846 ArgChanged = true; 11847 11848 // We have a pack expansion. Instantiate it. 11849 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 11850 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 11851 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11852 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 11853 11854 // Determine whether the set of unexpanded parameter packs can and should 11855 // be expanded. 11856 bool Expand = true; 11857 bool RetainExpansion = false; 11858 Optional<unsigned> OrigNumExpansions = 11859 ExpansionTL.getTypePtr()->getNumExpansions(); 11860 Optional<unsigned> NumExpansions = OrigNumExpansions; 11861 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 11862 PatternTL.getSourceRange(), 11863 Unexpanded, 11864 Expand, RetainExpansion, 11865 NumExpansions)) 11866 return ExprError(); 11867 11868 if (!Expand) { 11869 // The transform has determined that we should perform a simple 11870 // transformation on the pack expansion, producing another pack 11871 // expansion. 11872 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11873 11874 TypeLocBuilder TLB; 11875 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11876 11877 QualType To = getDerived().TransformType(TLB, PatternTL); 11878 if (To.isNull()) 11879 return ExprError(); 11880 11881 To = getDerived().RebuildPackExpansionType(To, 11882 PatternTL.getSourceRange(), 11883 ExpansionTL.getEllipsisLoc(), 11884 NumExpansions); 11885 if (To.isNull()) 11886 return ExprError(); 11887 11888 PackExpansionTypeLoc ToExpansionTL 11889 = TLB.push<PackExpansionTypeLoc>(To); 11890 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11891 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11892 continue; 11893 } 11894 11895 // Expand the pack expansion by substituting for each argument in the 11896 // pack(s). 11897 for (unsigned I = 0; I != *NumExpansions; ++I) { 11898 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 11899 TypeLocBuilder TLB; 11900 TLB.reserve(PatternTL.getFullDataSize()); 11901 QualType To = getDerived().TransformType(TLB, PatternTL); 11902 if (To.isNull()) 11903 return ExprError(); 11904 11905 if (To->containsUnexpandedParameterPack()) { 11906 To = getDerived().RebuildPackExpansionType(To, 11907 PatternTL.getSourceRange(), 11908 ExpansionTL.getEllipsisLoc(), 11909 NumExpansions); 11910 if (To.isNull()) 11911 return ExprError(); 11912 11913 PackExpansionTypeLoc ToExpansionTL 11914 = TLB.push<PackExpansionTypeLoc>(To); 11915 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11916 } 11917 11918 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11919 } 11920 11921 if (!RetainExpansion) 11922 continue; 11923 11924 // If we're supposed to retain a pack expansion, do so by temporarily 11925 // forgetting the partially-substituted parameter pack. 11926 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11927 11928 TypeLocBuilder TLB; 11929 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11930 11931 QualType To = getDerived().TransformType(TLB, PatternTL); 11932 if (To.isNull()) 11933 return ExprError(); 11934 11935 To = getDerived().RebuildPackExpansionType(To, 11936 PatternTL.getSourceRange(), 11937 ExpansionTL.getEllipsisLoc(), 11938 NumExpansions); 11939 if (To.isNull()) 11940 return ExprError(); 11941 11942 PackExpansionTypeLoc ToExpansionTL 11943 = TLB.push<PackExpansionTypeLoc>(To); 11944 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11945 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11946 } 11947 11948 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11949 return E; 11950 11951 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 11952 E->getEndLoc()); 11953 } 11954 11955 template<typename Derived> 11956 ExprResult 11957 TreeTransform<Derived>::TransformConceptSpecializationExpr( 11958 ConceptSpecializationExpr *E) { 11959 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 11960 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 11961 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11962 Old->NumTemplateArgs, TransArgs)) 11963 return ExprError(); 11964 11965 return getDerived().RebuildConceptSpecializationExpr( 11966 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 11967 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 11968 &TransArgs); 11969 } 11970 11971 template<typename Derived> 11972 ExprResult 11973 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 11974 SmallVector<ParmVarDecl*, 4> TransParams; 11975 SmallVector<QualType, 4> TransParamTypes; 11976 Sema::ExtParameterInfoBuilder ExtParamInfos; 11977 11978 // C++2a [expr.prim.req]p2 11979 // Expressions appearing within a requirement-body are unevaluated operands. 11980 EnterExpressionEvaluationContext Ctx( 11981 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11982 11983 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 11984 getSema().Context, getSema().CurContext, 11985 E->getBody()->getBeginLoc()); 11986 11987 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 11988 11989 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 11990 E->getLocalParameters(), 11991 /*ParamTypes=*/nullptr, 11992 /*ParamInfos=*/nullptr, 11993 TransParamTypes, &TransParams, 11994 ExtParamInfos)) 11995 return ExprError(); 11996 11997 for (ParmVarDecl *Param : TransParams) 11998 Param->setDeclContext(Body); 11999 12000 SmallVector<concepts::Requirement *, 4> TransReqs; 12001 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12002 TransReqs)) 12003 return ExprError(); 12004 12005 for (concepts::Requirement *Req : TransReqs) { 12006 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12007 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12008 ER->getReturnTypeRequirement() 12009 .getTypeConstraintTemplateParameterList()->getParam(0) 12010 ->setDeclContext(Body); 12011 } 12012 } 12013 } 12014 12015 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12016 TransParams, TransReqs, 12017 E->getRBraceLoc()); 12018 } 12019 12020 template<typename Derived> 12021 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12022 ArrayRef<concepts::Requirement *> Reqs, 12023 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12024 for (concepts::Requirement *Req : Reqs) { 12025 concepts::Requirement *TransReq = nullptr; 12026 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12027 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12028 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12029 TransReq = getDerived().TransformExprRequirement(ExprReq); 12030 else 12031 TransReq = getDerived().TransformNestedRequirement( 12032 cast<concepts::NestedRequirement>(Req)); 12033 if (!TransReq) 12034 return true; 12035 Transformed.push_back(TransReq); 12036 } 12037 return false; 12038 } 12039 12040 template<typename Derived> 12041 concepts::TypeRequirement * 12042 TreeTransform<Derived>::TransformTypeRequirement( 12043 concepts::TypeRequirement *Req) { 12044 if (Req->isSubstitutionFailure()) { 12045 if (getDerived().AlwaysRebuild()) 12046 return getDerived().RebuildTypeRequirement( 12047 Req->getSubstitutionDiagnostic()); 12048 return Req; 12049 } 12050 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12051 if (!TransType) 12052 return nullptr; 12053 return getDerived().RebuildTypeRequirement(TransType); 12054 } 12055 12056 template<typename Derived> 12057 concepts::ExprRequirement * 12058 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12059 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12060 if (Req->isExprSubstitutionFailure()) 12061 TransExpr = Req->getExprSubstitutionDiagnostic(); 12062 else { 12063 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12064 if (TransExprRes.isInvalid()) 12065 return nullptr; 12066 TransExpr = TransExprRes.get(); 12067 } 12068 12069 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12070 const auto &RetReq = Req->getReturnTypeRequirement(); 12071 if (RetReq.isEmpty()) 12072 TransRetReq.emplace(); 12073 else if (RetReq.isSubstitutionFailure()) 12074 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12075 else if (RetReq.isTypeConstraint()) { 12076 TemplateParameterList *OrigTPL = 12077 RetReq.getTypeConstraintTemplateParameterList(); 12078 TemplateParameterList *TPL = 12079 getDerived().TransformTemplateParameterList(OrigTPL); 12080 if (!TPL) 12081 return nullptr; 12082 TransRetReq.emplace(TPL); 12083 } 12084 assert(TransRetReq.hasValue() && 12085 "All code paths leading here must set TransRetReq"); 12086 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12087 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12088 Req->getNoexceptLoc(), 12089 std::move(*TransRetReq)); 12090 return getDerived().RebuildExprRequirement( 12091 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12092 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12093 } 12094 12095 template<typename Derived> 12096 concepts::NestedRequirement * 12097 TreeTransform<Derived>::TransformNestedRequirement( 12098 concepts::NestedRequirement *Req) { 12099 if (Req->isSubstitutionFailure()) { 12100 if (getDerived().AlwaysRebuild()) 12101 return getDerived().RebuildNestedRequirement( 12102 Req->getSubstitutionDiagnostic()); 12103 return Req; 12104 } 12105 ExprResult TransConstraint = 12106 getDerived().TransformExpr(Req->getConstraintExpr()); 12107 if (TransConstraint.isInvalid()) 12108 return nullptr; 12109 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12110 } 12111 12112 template<typename Derived> 12113 ExprResult 12114 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12115 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12116 if (!T) 12117 return ExprError(); 12118 12119 if (!getDerived().AlwaysRebuild() && 12120 T == E->getQueriedTypeSourceInfo()) 12121 return E; 12122 12123 ExprResult SubExpr; 12124 { 12125 EnterExpressionEvaluationContext Unevaluated( 12126 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12127 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12128 if (SubExpr.isInvalid()) 12129 return ExprError(); 12130 12131 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12132 return E; 12133 } 12134 12135 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12136 SubExpr.get(), E->getEndLoc()); 12137 } 12138 12139 template<typename Derived> 12140 ExprResult 12141 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12142 ExprResult SubExpr; 12143 { 12144 EnterExpressionEvaluationContext Unevaluated( 12145 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12146 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12147 if (SubExpr.isInvalid()) 12148 return ExprError(); 12149 12150 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12151 return E; 12152 } 12153 12154 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12155 SubExpr.get(), E->getEndLoc()); 12156 } 12157 12158 template <typename Derived> 12159 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12160 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12161 TypeSourceInfo **RecoveryTSI) { 12162 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12163 DRE, AddrTaken, RecoveryTSI); 12164 12165 // Propagate both errors and recovered types, which return ExprEmpty. 12166 if (!NewDRE.isUsable()) 12167 return NewDRE; 12168 12169 // We got an expr, wrap it up in parens. 12170 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12171 return PE; 12172 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12173 PE->getRParen()); 12174 } 12175 12176 template <typename Derived> 12177 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12178 DependentScopeDeclRefExpr *E) { 12179 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12180 nullptr); 12181 } 12182 12183 template<typename Derived> 12184 ExprResult 12185 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12186 DependentScopeDeclRefExpr *E, 12187 bool IsAddressOfOperand, 12188 TypeSourceInfo **RecoveryTSI) { 12189 assert(E->getQualifierLoc()); 12190 NestedNameSpecifierLoc QualifierLoc 12191 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12192 if (!QualifierLoc) 12193 return ExprError(); 12194 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12195 12196 // TODO: If this is a conversion-function-id, verify that the 12197 // destination type name (if present) resolves the same way after 12198 // instantiation as it did in the local scope. 12199 12200 DeclarationNameInfo NameInfo 12201 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12202 if (!NameInfo.getName()) 12203 return ExprError(); 12204 12205 if (!E->hasExplicitTemplateArgs()) { 12206 if (!getDerived().AlwaysRebuild() && 12207 QualifierLoc == E->getQualifierLoc() && 12208 // Note: it is sufficient to compare the Name component of NameInfo: 12209 // if name has not changed, DNLoc has not changed either. 12210 NameInfo.getName() == E->getDeclName()) 12211 return E; 12212 12213 return getDerived().RebuildDependentScopeDeclRefExpr( 12214 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12215 IsAddressOfOperand, RecoveryTSI); 12216 } 12217 12218 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12219 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12220 E->getNumTemplateArgs(), 12221 TransArgs)) 12222 return ExprError(); 12223 12224 return getDerived().RebuildDependentScopeDeclRefExpr( 12225 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12226 RecoveryTSI); 12227 } 12228 12229 template<typename Derived> 12230 ExprResult 12231 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12232 // CXXConstructExprs other than for list-initialization and 12233 // CXXTemporaryObjectExpr are always implicit, so when we have 12234 // a 1-argument construction we just transform that argument. 12235 if (getDerived().AllowSkippingCXXConstructExpr() && 12236 ((E->getNumArgs() == 1 || 12237 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12238 (!getDerived().DropCallArgument(E->getArg(0))) && 12239 !E->isListInitialization())) 12240 return getDerived().TransformExpr(E->getArg(0)); 12241 12242 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12243 12244 QualType T = getDerived().TransformType(E->getType()); 12245 if (T.isNull()) 12246 return ExprError(); 12247 12248 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12249 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12250 if (!Constructor) 12251 return ExprError(); 12252 12253 bool ArgumentChanged = false; 12254 SmallVector<Expr*, 8> Args; 12255 { 12256 EnterExpressionEvaluationContext Context( 12257 getSema(), EnterExpressionEvaluationContext::InitList, 12258 E->isListInitialization()); 12259 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12260 &ArgumentChanged)) 12261 return ExprError(); 12262 } 12263 12264 if (!getDerived().AlwaysRebuild() && 12265 T == E->getType() && 12266 Constructor == E->getConstructor() && 12267 !ArgumentChanged) { 12268 // Mark the constructor as referenced. 12269 // FIXME: Instantiation-specific 12270 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12271 return E; 12272 } 12273 12274 return getDerived().RebuildCXXConstructExpr( 12275 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12276 E->hadMultipleCandidates(), E->isListInitialization(), 12277 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12278 E->getConstructionKind(), E->getParenOrBraceRange()); 12279 } 12280 12281 template<typename Derived> 12282 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12283 CXXInheritedCtorInitExpr *E) { 12284 QualType T = getDerived().TransformType(E->getType()); 12285 if (T.isNull()) 12286 return ExprError(); 12287 12288 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12289 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12290 if (!Constructor) 12291 return ExprError(); 12292 12293 if (!getDerived().AlwaysRebuild() && 12294 T == E->getType() && 12295 Constructor == E->getConstructor()) { 12296 // Mark the constructor as referenced. 12297 // FIXME: Instantiation-specific 12298 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12299 return E; 12300 } 12301 12302 return getDerived().RebuildCXXInheritedCtorInitExpr( 12303 T, E->getLocation(), Constructor, 12304 E->constructsVBase(), E->inheritedFromVBase()); 12305 } 12306 12307 /// Transform a C++ temporary-binding expression. 12308 /// 12309 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12310 /// transform the subexpression and return that. 12311 template<typename Derived> 12312 ExprResult 12313 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12314 return getDerived().TransformExpr(E->getSubExpr()); 12315 } 12316 12317 /// Transform a C++ expression that contains cleanups that should 12318 /// be run after the expression is evaluated. 12319 /// 12320 /// Since ExprWithCleanups nodes are implicitly generated, we 12321 /// just transform the subexpression and return that. 12322 template<typename Derived> 12323 ExprResult 12324 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12325 return getDerived().TransformExpr(E->getSubExpr()); 12326 } 12327 12328 template<typename Derived> 12329 ExprResult 12330 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12331 CXXTemporaryObjectExpr *E) { 12332 TypeSourceInfo *T = 12333 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12334 if (!T) 12335 return ExprError(); 12336 12337 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12338 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12339 if (!Constructor) 12340 return ExprError(); 12341 12342 bool ArgumentChanged = false; 12343 SmallVector<Expr*, 8> Args; 12344 Args.reserve(E->getNumArgs()); 12345 { 12346 EnterExpressionEvaluationContext Context( 12347 getSema(), EnterExpressionEvaluationContext::InitList, 12348 E->isListInitialization()); 12349 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12350 &ArgumentChanged)) 12351 return ExprError(); 12352 } 12353 12354 if (!getDerived().AlwaysRebuild() && 12355 T == E->getTypeSourceInfo() && 12356 Constructor == E->getConstructor() && 12357 !ArgumentChanged) { 12358 // FIXME: Instantiation-specific 12359 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12360 return SemaRef.MaybeBindToTemporary(E); 12361 } 12362 12363 // FIXME: We should just pass E->isListInitialization(), but we're not 12364 // prepared to handle list-initialization without a child InitListExpr. 12365 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12366 return getDerived().RebuildCXXTemporaryObjectExpr( 12367 T, LParenLoc, Args, E->getEndLoc(), 12368 /*ListInitialization=*/LParenLoc.isInvalid()); 12369 } 12370 12371 template<typename Derived> 12372 ExprResult 12373 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12374 // Transform any init-capture expressions before entering the scope of the 12375 // lambda body, because they are not semantically within that scope. 12376 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12377 struct TransformedInitCapture { 12378 // The location of the ... if the result is retaining a pack expansion. 12379 SourceLocation EllipsisLoc; 12380 // Zero or more expansions of the init-capture. 12381 SmallVector<InitCaptureInfoTy, 4> Expansions; 12382 }; 12383 SmallVector<TransformedInitCapture, 4> InitCaptures; 12384 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12385 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12386 CEnd = E->capture_end(); 12387 C != CEnd; ++C) { 12388 if (!E->isInitCapture(C)) 12389 continue; 12390 12391 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12392 VarDecl *OldVD = C->getCapturedVar(); 12393 12394 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12395 Optional<unsigned> NumExpansions) { 12396 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12397 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12398 12399 if (NewExprInitResult.isInvalid()) { 12400 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12401 return; 12402 } 12403 Expr *NewExprInit = NewExprInitResult.get(); 12404 12405 QualType NewInitCaptureType = 12406 getSema().buildLambdaInitCaptureInitialization( 12407 C->getLocation(), OldVD->getType()->isReferenceType(), 12408 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12409 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12410 NewExprInit); 12411 Result.Expansions.push_back( 12412 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12413 }; 12414 12415 // If this is an init-capture pack, consider expanding the pack now. 12416 if (OldVD->isParameterPack()) { 12417 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12418 ->getTypeLoc() 12419 .castAs<PackExpansionTypeLoc>(); 12420 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12421 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12422 12423 // Determine whether the set of unexpanded parameter packs can and should 12424 // be expanded. 12425 bool Expand = true; 12426 bool RetainExpansion = false; 12427 Optional<unsigned> OrigNumExpansions = 12428 ExpansionTL.getTypePtr()->getNumExpansions(); 12429 Optional<unsigned> NumExpansions = OrigNumExpansions; 12430 if (getDerived().TryExpandParameterPacks( 12431 ExpansionTL.getEllipsisLoc(), 12432 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12433 RetainExpansion, NumExpansions)) 12434 return ExprError(); 12435 if (Expand) { 12436 for (unsigned I = 0; I != *NumExpansions; ++I) { 12437 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12438 SubstInitCapture(SourceLocation(), None); 12439 } 12440 } 12441 if (!Expand || RetainExpansion) { 12442 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12443 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12444 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12445 } 12446 } else { 12447 SubstInitCapture(SourceLocation(), None); 12448 } 12449 } 12450 12451 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12452 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12453 12454 // Transform the template parameters, and add them to the current 12455 // instantiation scope. The null case is handled correctly. 12456 auto TPL = getDerived().TransformTemplateParameterList( 12457 E->getTemplateParameterList()); 12458 LSI->GLTemplateParameterList = TPL; 12459 12460 // Transform the type of the original lambda's call operator. 12461 // The transformation MUST be done in the CurrentInstantiationScope since 12462 // it introduces a mapping of the original to the newly created 12463 // transformed parameters. 12464 TypeSourceInfo *NewCallOpTSI = nullptr; 12465 { 12466 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12467 FunctionProtoTypeLoc OldCallOpFPTL = 12468 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12469 12470 TypeLocBuilder NewCallOpTLBuilder; 12471 SmallVector<QualType, 4> ExceptionStorage; 12472 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12473 QualType NewCallOpType = TransformFunctionProtoType( 12474 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12475 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12476 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12477 ExceptionStorage, Changed); 12478 }); 12479 if (NewCallOpType.isNull()) 12480 return ExprError(); 12481 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12482 NewCallOpType); 12483 } 12484 12485 // Transform the trailing requires clause 12486 ExprResult NewTrailingRequiresClause; 12487 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12488 // FIXME: Concepts: Substitution into requires clause should only happen 12489 // when checking satisfaction. 12490 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12491 12492 // Create the local class that will describe the lambda. 12493 // FIXME: KnownDependent below is wrong when substituting inside a templated 12494 // context that isn't a DeclContext (such as a variable template). 12495 CXXRecordDecl *OldClass = E->getLambdaClass(); 12496 CXXRecordDecl *Class 12497 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12498 NewCallOpTSI, 12499 /*KnownDependent=*/false, 12500 E->getCaptureDefault()); 12501 getDerived().transformedLocalDecl(OldClass, {Class}); 12502 12503 Optional<std::tuple<unsigned, bool, Decl *>> Mangling; 12504 if (getDerived().ReplacingOriginal()) 12505 Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(), 12506 OldClass->hasKnownLambdaInternalLinkage(), 12507 OldClass->getLambdaContextDecl()); 12508 12509 // Build the call operator. 12510 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12511 Class, E->getIntroducerRange(), NewCallOpTSI, 12512 E->getCallOperator()->getEndLoc(), 12513 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12514 E->getCallOperator()->getConstexprKind(), 12515 NewTrailingRequiresClause.get()); 12516 12517 LSI->CallOperator = NewCallOperator; 12518 12519 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12520 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12521 12522 // Number the lambda for linkage purposes if necessary. 12523 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12524 12525 // Introduce the context of the call operator. 12526 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12527 /*NewThisContext*/false); 12528 12529 // Enter the scope of the lambda. 12530 getSema().buildLambdaScope(LSI, NewCallOperator, 12531 E->getIntroducerRange(), 12532 E->getCaptureDefault(), 12533 E->getCaptureDefaultLoc(), 12534 E->hasExplicitParameters(), 12535 E->hasExplicitResultType(), 12536 E->isMutable()); 12537 12538 bool Invalid = false; 12539 12540 // Transform captures. 12541 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12542 CEnd = E->capture_end(); 12543 C != CEnd; ++C) { 12544 // When we hit the first implicit capture, tell Sema that we've finished 12545 // the list of explicit captures. 12546 if (C->isImplicit()) 12547 break; 12548 12549 // Capturing 'this' is trivial. 12550 if (C->capturesThis()) { 12551 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12552 /*BuildAndDiagnose*/ true, nullptr, 12553 C->getCaptureKind() == LCK_StarThis); 12554 continue; 12555 } 12556 // Captured expression will be recaptured during captured variables 12557 // rebuilding. 12558 if (C->capturesVLAType()) 12559 continue; 12560 12561 // Rebuild init-captures, including the implied field declaration. 12562 if (E->isInitCapture(C)) { 12563 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12564 12565 VarDecl *OldVD = C->getCapturedVar(); 12566 llvm::SmallVector<Decl*, 4> NewVDs; 12567 12568 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12569 ExprResult Init = Info.first; 12570 QualType InitQualType = Info.second; 12571 if (Init.isInvalid() || InitQualType.isNull()) { 12572 Invalid = true; 12573 break; 12574 } 12575 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12576 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12577 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12578 if (!NewVD) { 12579 Invalid = true; 12580 break; 12581 } 12582 NewVDs.push_back(NewVD); 12583 getSema().addInitCapture(LSI, NewVD); 12584 } 12585 12586 if (Invalid) 12587 break; 12588 12589 getDerived().transformedLocalDecl(OldVD, NewVDs); 12590 continue; 12591 } 12592 12593 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12594 12595 // Determine the capture kind for Sema. 12596 Sema::TryCaptureKind Kind 12597 = C->isImplicit()? Sema::TryCapture_Implicit 12598 : C->getCaptureKind() == LCK_ByCopy 12599 ? Sema::TryCapture_ExplicitByVal 12600 : Sema::TryCapture_ExplicitByRef; 12601 SourceLocation EllipsisLoc; 12602 if (C->isPackExpansion()) { 12603 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12604 bool ShouldExpand = false; 12605 bool RetainExpansion = false; 12606 Optional<unsigned> NumExpansions; 12607 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12608 C->getLocation(), 12609 Unexpanded, 12610 ShouldExpand, RetainExpansion, 12611 NumExpansions)) { 12612 Invalid = true; 12613 continue; 12614 } 12615 12616 if (ShouldExpand) { 12617 // The transform has determined that we should perform an expansion; 12618 // transform and capture each of the arguments. 12619 // expansion of the pattern. Do so. 12620 VarDecl *Pack = C->getCapturedVar(); 12621 for (unsigned I = 0; I != *NumExpansions; ++I) { 12622 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12623 VarDecl *CapturedVar 12624 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12625 Pack)); 12626 if (!CapturedVar) { 12627 Invalid = true; 12628 continue; 12629 } 12630 12631 // Capture the transformed variable. 12632 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12633 } 12634 12635 // FIXME: Retain a pack expansion if RetainExpansion is true. 12636 12637 continue; 12638 } 12639 12640 EllipsisLoc = C->getEllipsisLoc(); 12641 } 12642 12643 // Transform the captured variable. 12644 VarDecl *CapturedVar 12645 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12646 C->getCapturedVar())); 12647 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12648 Invalid = true; 12649 continue; 12650 } 12651 12652 // Capture the transformed variable. 12653 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12654 EllipsisLoc); 12655 } 12656 getSema().finishLambdaExplicitCaptures(LSI); 12657 12658 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12659 // evaluation context even if we're not transforming the function body. 12660 getSema().PushExpressionEvaluationContext( 12661 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12662 12663 // Instantiate the body of the lambda expression. 12664 StmtResult Body = 12665 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12666 12667 // ActOnLambda* will pop the function scope for us. 12668 FuncScopeCleanup.disable(); 12669 12670 if (Body.isInvalid()) { 12671 SavedContext.pop(); 12672 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12673 /*IsInstantiation=*/true); 12674 return ExprError(); 12675 } 12676 12677 // Copy the LSI before ActOnFinishFunctionBody removes it. 12678 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12679 // the call operator. 12680 auto LSICopy = *LSI; 12681 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12682 /*IsInstantiation*/ true); 12683 SavedContext.pop(); 12684 12685 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12686 &LSICopy); 12687 } 12688 12689 template<typename Derived> 12690 StmtResult 12691 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12692 return TransformStmt(S); 12693 } 12694 12695 template<typename Derived> 12696 StmtResult 12697 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12698 // Transform captures. 12699 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12700 CEnd = E->capture_end(); 12701 C != CEnd; ++C) { 12702 // When we hit the first implicit capture, tell Sema that we've finished 12703 // the list of explicit captures. 12704 if (!C->isImplicit()) 12705 continue; 12706 12707 // Capturing 'this' is trivial. 12708 if (C->capturesThis()) { 12709 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12710 /*BuildAndDiagnose*/ true, nullptr, 12711 C->getCaptureKind() == LCK_StarThis); 12712 continue; 12713 } 12714 // Captured expression will be recaptured during captured variables 12715 // rebuilding. 12716 if (C->capturesVLAType()) 12717 continue; 12718 12719 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12720 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12721 12722 // Transform the captured variable. 12723 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12724 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12725 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12726 return StmtError(); 12727 12728 // Capture the transformed variable. 12729 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12730 } 12731 12732 return S; 12733 } 12734 12735 template<typename Derived> 12736 ExprResult 12737 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12738 CXXUnresolvedConstructExpr *E) { 12739 TypeSourceInfo *T = 12740 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12741 if (!T) 12742 return ExprError(); 12743 12744 bool ArgumentChanged = false; 12745 SmallVector<Expr*, 8> Args; 12746 Args.reserve(E->arg_size()); 12747 { 12748 EnterExpressionEvaluationContext Context( 12749 getSema(), EnterExpressionEvaluationContext::InitList, 12750 E->isListInitialization()); 12751 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 12752 &ArgumentChanged)) 12753 return ExprError(); 12754 } 12755 12756 if (!getDerived().AlwaysRebuild() && 12757 T == E->getTypeSourceInfo() && 12758 !ArgumentChanged) 12759 return E; 12760 12761 // FIXME: we're faking the locations of the commas 12762 return getDerived().RebuildCXXUnresolvedConstructExpr( 12763 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12764 } 12765 12766 template<typename Derived> 12767 ExprResult 12768 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12769 CXXDependentScopeMemberExpr *E) { 12770 // Transform the base of the expression. 12771 ExprResult Base((Expr*) nullptr); 12772 Expr *OldBase; 12773 QualType BaseType; 12774 QualType ObjectType; 12775 if (!E->isImplicitAccess()) { 12776 OldBase = E->getBase(); 12777 Base = getDerived().TransformExpr(OldBase); 12778 if (Base.isInvalid()) 12779 return ExprError(); 12780 12781 // Start the member reference and compute the object's type. 12782 ParsedType ObjectTy; 12783 bool MayBePseudoDestructor = false; 12784 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12785 E->getOperatorLoc(), 12786 E->isArrow()? tok::arrow : tok::period, 12787 ObjectTy, 12788 MayBePseudoDestructor); 12789 if (Base.isInvalid()) 12790 return ExprError(); 12791 12792 ObjectType = ObjectTy.get(); 12793 BaseType = ((Expr*) Base.get())->getType(); 12794 } else { 12795 OldBase = nullptr; 12796 BaseType = getDerived().TransformType(E->getBaseType()); 12797 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12798 } 12799 12800 // Transform the first part of the nested-name-specifier that qualifies 12801 // the member name. 12802 NamedDecl *FirstQualifierInScope 12803 = getDerived().TransformFirstQualifierInScope( 12804 E->getFirstQualifierFoundInScope(), 12805 E->getQualifierLoc().getBeginLoc()); 12806 12807 NestedNameSpecifierLoc QualifierLoc; 12808 if (E->getQualifier()) { 12809 QualifierLoc 12810 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12811 ObjectType, 12812 FirstQualifierInScope); 12813 if (!QualifierLoc) 12814 return ExprError(); 12815 } 12816 12817 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12818 12819 // TODO: If this is a conversion-function-id, verify that the 12820 // destination type name (if present) resolves the same way after 12821 // instantiation as it did in the local scope. 12822 12823 DeclarationNameInfo NameInfo 12824 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12825 if (!NameInfo.getName()) 12826 return ExprError(); 12827 12828 if (!E->hasExplicitTemplateArgs()) { 12829 // This is a reference to a member without an explicitly-specified 12830 // template argument list. Optimize for this common case. 12831 if (!getDerived().AlwaysRebuild() && 12832 Base.get() == OldBase && 12833 BaseType == E->getBaseType() && 12834 QualifierLoc == E->getQualifierLoc() && 12835 NameInfo.getName() == E->getMember() && 12836 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12837 return E; 12838 12839 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12840 BaseType, 12841 E->isArrow(), 12842 E->getOperatorLoc(), 12843 QualifierLoc, 12844 TemplateKWLoc, 12845 FirstQualifierInScope, 12846 NameInfo, 12847 /*TemplateArgs*/nullptr); 12848 } 12849 12850 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12851 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12852 E->getNumTemplateArgs(), 12853 TransArgs)) 12854 return ExprError(); 12855 12856 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12857 BaseType, 12858 E->isArrow(), 12859 E->getOperatorLoc(), 12860 QualifierLoc, 12861 TemplateKWLoc, 12862 FirstQualifierInScope, 12863 NameInfo, 12864 &TransArgs); 12865 } 12866 12867 template<typename Derived> 12868 ExprResult 12869 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 12870 // Transform the base of the expression. 12871 ExprResult Base((Expr*) nullptr); 12872 QualType BaseType; 12873 if (!Old->isImplicitAccess()) { 12874 Base = getDerived().TransformExpr(Old->getBase()); 12875 if (Base.isInvalid()) 12876 return ExprError(); 12877 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 12878 Old->isArrow()); 12879 if (Base.isInvalid()) 12880 return ExprError(); 12881 BaseType = Base.get()->getType(); 12882 } else { 12883 BaseType = getDerived().TransformType(Old->getBaseType()); 12884 } 12885 12886 NestedNameSpecifierLoc QualifierLoc; 12887 if (Old->getQualifierLoc()) { 12888 QualifierLoc 12889 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12890 if (!QualifierLoc) 12891 return ExprError(); 12892 } 12893 12894 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12895 12896 LookupResult R(SemaRef, Old->getMemberNameInfo(), 12897 Sema::LookupOrdinaryName); 12898 12899 // Transform the declaration set. 12900 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 12901 return ExprError(); 12902 12903 // Determine the naming class. 12904 if (Old->getNamingClass()) { 12905 CXXRecordDecl *NamingClass 12906 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12907 Old->getMemberLoc(), 12908 Old->getNamingClass())); 12909 if (!NamingClass) 12910 return ExprError(); 12911 12912 R.setNamingClass(NamingClass); 12913 } 12914 12915 TemplateArgumentListInfo TransArgs; 12916 if (Old->hasExplicitTemplateArgs()) { 12917 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 12918 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 12919 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12920 Old->getNumTemplateArgs(), 12921 TransArgs)) 12922 return ExprError(); 12923 } 12924 12925 // FIXME: to do this check properly, we will need to preserve the 12926 // first-qualifier-in-scope here, just in case we had a dependent 12927 // base (and therefore couldn't do the check) and a 12928 // nested-name-qualifier (and therefore could do the lookup). 12929 NamedDecl *FirstQualifierInScope = nullptr; 12930 12931 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 12932 BaseType, 12933 Old->getOperatorLoc(), 12934 Old->isArrow(), 12935 QualifierLoc, 12936 TemplateKWLoc, 12937 FirstQualifierInScope, 12938 R, 12939 (Old->hasExplicitTemplateArgs() 12940 ? &TransArgs : nullptr)); 12941 } 12942 12943 template<typename Derived> 12944 ExprResult 12945 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 12946 EnterExpressionEvaluationContext Unevaluated( 12947 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12948 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 12949 if (SubExpr.isInvalid()) 12950 return ExprError(); 12951 12952 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 12953 return E; 12954 12955 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 12956 } 12957 12958 template<typename Derived> 12959 ExprResult 12960 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 12961 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 12962 if (Pattern.isInvalid()) 12963 return ExprError(); 12964 12965 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 12966 return E; 12967 12968 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 12969 E->getNumExpansions()); 12970 } 12971 12972 template<typename Derived> 12973 ExprResult 12974 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 12975 // If E is not value-dependent, then nothing will change when we transform it. 12976 // Note: This is an instantiation-centric view. 12977 if (!E->isValueDependent()) 12978 return E; 12979 12980 EnterExpressionEvaluationContext Unevaluated( 12981 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 12982 12983 ArrayRef<TemplateArgument> PackArgs; 12984 TemplateArgument ArgStorage; 12985 12986 // Find the argument list to transform. 12987 if (E->isPartiallySubstituted()) { 12988 PackArgs = E->getPartialArguments(); 12989 } else if (E->isValueDependent()) { 12990 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 12991 bool ShouldExpand = false; 12992 bool RetainExpansion = false; 12993 Optional<unsigned> NumExpansions; 12994 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 12995 Unexpanded, 12996 ShouldExpand, RetainExpansion, 12997 NumExpansions)) 12998 return ExprError(); 12999 13000 // If we need to expand the pack, build a template argument from it and 13001 // expand that. 13002 if (ShouldExpand) { 13003 auto *Pack = E->getPack(); 13004 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13005 ArgStorage = getSema().Context.getPackExpansionType( 13006 getSema().Context.getTypeDeclType(TTPD), None); 13007 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13008 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13009 } else { 13010 auto *VD = cast<ValueDecl>(Pack); 13011 ExprResult DRE = getSema().BuildDeclRefExpr( 13012 VD, VD->getType().getNonLValueExprType(getSema().Context), 13013 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 13014 E->getPackLoc()); 13015 if (DRE.isInvalid()) 13016 return ExprError(); 13017 ArgStorage = new (getSema().Context) PackExpansionExpr( 13018 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13019 } 13020 PackArgs = ArgStorage; 13021 } 13022 } 13023 13024 // If we're not expanding the pack, just transform the decl. 13025 if (!PackArgs.size()) { 13026 auto *Pack = cast_or_null<NamedDecl>( 13027 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13028 if (!Pack) 13029 return ExprError(); 13030 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13031 E->getPackLoc(), 13032 E->getRParenLoc(), None, None); 13033 } 13034 13035 // Try to compute the result without performing a partial substitution. 13036 Optional<unsigned> Result = 0; 13037 for (const TemplateArgument &Arg : PackArgs) { 13038 if (!Arg.isPackExpansion()) { 13039 Result = *Result + 1; 13040 continue; 13041 } 13042 13043 TemplateArgumentLoc ArgLoc; 13044 InventTemplateArgumentLoc(Arg, ArgLoc); 13045 13046 // Find the pattern of the pack expansion. 13047 SourceLocation Ellipsis; 13048 Optional<unsigned> OrigNumExpansions; 13049 TemplateArgumentLoc Pattern = 13050 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13051 OrigNumExpansions); 13052 13053 // Substitute under the pack expansion. Do not expand the pack (yet). 13054 TemplateArgumentLoc OutPattern; 13055 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13056 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13057 /*Uneval*/ true)) 13058 return true; 13059 13060 // See if we can determine the number of arguments from the result. 13061 Optional<unsigned> NumExpansions = 13062 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13063 if (!NumExpansions) { 13064 // No: we must be in an alias template expansion, and we're going to need 13065 // to actually expand the packs. 13066 Result = None; 13067 break; 13068 } 13069 13070 Result = *Result + *NumExpansions; 13071 } 13072 13073 // Common case: we could determine the number of expansions without 13074 // substituting. 13075 if (Result) 13076 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13077 E->getPackLoc(), 13078 E->getRParenLoc(), *Result, None); 13079 13080 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13081 E->getPackLoc()); 13082 { 13083 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13084 typedef TemplateArgumentLocInventIterator< 13085 Derived, const TemplateArgument*> PackLocIterator; 13086 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13087 PackLocIterator(*this, PackArgs.end()), 13088 TransformedPackArgs, /*Uneval*/true)) 13089 return ExprError(); 13090 } 13091 13092 // Check whether we managed to fully-expand the pack. 13093 // FIXME: Is it possible for us to do so and not hit the early exit path? 13094 SmallVector<TemplateArgument, 8> Args; 13095 bool PartialSubstitution = false; 13096 for (auto &Loc : TransformedPackArgs.arguments()) { 13097 Args.push_back(Loc.getArgument()); 13098 if (Loc.getArgument().isPackExpansion()) 13099 PartialSubstitution = true; 13100 } 13101 13102 if (PartialSubstitution) 13103 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13104 E->getPackLoc(), 13105 E->getRParenLoc(), None, Args); 13106 13107 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13108 E->getPackLoc(), E->getRParenLoc(), 13109 Args.size(), None); 13110 } 13111 13112 template<typename Derived> 13113 ExprResult 13114 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13115 SubstNonTypeTemplateParmPackExpr *E) { 13116 // Default behavior is to do nothing with this transformation. 13117 return E; 13118 } 13119 13120 template<typename Derived> 13121 ExprResult 13122 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13123 SubstNonTypeTemplateParmExpr *E) { 13124 // Default behavior is to do nothing with this transformation. 13125 return E; 13126 } 13127 13128 template<typename Derived> 13129 ExprResult 13130 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13131 // Default behavior is to do nothing with this transformation. 13132 return E; 13133 } 13134 13135 template<typename Derived> 13136 ExprResult 13137 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13138 MaterializeTemporaryExpr *E) { 13139 return getDerived().TransformExpr(E->getSubExpr()); 13140 } 13141 13142 template<typename Derived> 13143 ExprResult 13144 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13145 UnresolvedLookupExpr *Callee = nullptr; 13146 if (Expr *OldCallee = E->getCallee()) { 13147 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13148 if (CalleeResult.isInvalid()) 13149 return ExprError(); 13150 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13151 } 13152 13153 Expr *Pattern = E->getPattern(); 13154 13155 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13156 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13157 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13158 13159 // Determine whether the set of unexpanded parameter packs can and should 13160 // be expanded. 13161 bool Expand = true; 13162 bool RetainExpansion = false; 13163 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13164 NumExpansions = OrigNumExpansions; 13165 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13166 Pattern->getSourceRange(), 13167 Unexpanded, 13168 Expand, RetainExpansion, 13169 NumExpansions)) 13170 return true; 13171 13172 if (!Expand) { 13173 // Do not expand any packs here, just transform and rebuild a fold 13174 // expression. 13175 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13176 13177 ExprResult LHS = 13178 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13179 if (LHS.isInvalid()) 13180 return true; 13181 13182 ExprResult RHS = 13183 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13184 if (RHS.isInvalid()) 13185 return true; 13186 13187 if (!getDerived().AlwaysRebuild() && 13188 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13189 return E; 13190 13191 return getDerived().RebuildCXXFoldExpr( 13192 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13193 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13194 } 13195 13196 // The transform has determined that we should perform an elementwise 13197 // expansion of the pattern. Do so. 13198 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13199 if (Result.isInvalid()) 13200 return true; 13201 bool LeftFold = E->isLeftFold(); 13202 13203 // If we're retaining an expansion for a right fold, it is the innermost 13204 // component and takes the init (if any). 13205 if (!LeftFold && RetainExpansion) { 13206 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13207 13208 ExprResult Out = getDerived().TransformExpr(Pattern); 13209 if (Out.isInvalid()) 13210 return true; 13211 13212 Result = getDerived().RebuildCXXFoldExpr( 13213 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13214 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13215 if (Result.isInvalid()) 13216 return true; 13217 } 13218 13219 for (unsigned I = 0; I != *NumExpansions; ++I) { 13220 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13221 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13222 ExprResult Out = getDerived().TransformExpr(Pattern); 13223 if (Out.isInvalid()) 13224 return true; 13225 13226 if (Out.get()->containsUnexpandedParameterPack()) { 13227 // We still have a pack; retain a pack expansion for this slice. 13228 Result = getDerived().RebuildCXXFoldExpr( 13229 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13230 E->getOperator(), E->getEllipsisLoc(), 13231 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13232 OrigNumExpansions); 13233 } else if (Result.isUsable()) { 13234 // We've got down to a single element; build a binary operator. 13235 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13236 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13237 if (Callee) 13238 Result = getDerived().RebuildCXXOperatorCallExpr( 13239 BinaryOperator::getOverloadedOperator(E->getOperator()), 13240 E->getEllipsisLoc(), Callee, LHS, RHS); 13241 else 13242 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13243 E->getOperator(), LHS, RHS); 13244 } else 13245 Result = Out; 13246 13247 if (Result.isInvalid()) 13248 return true; 13249 } 13250 13251 // If we're retaining an expansion for a left fold, it is the outermost 13252 // component and takes the complete expansion so far as its init (if any). 13253 if (LeftFold && RetainExpansion) { 13254 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13255 13256 ExprResult Out = getDerived().TransformExpr(Pattern); 13257 if (Out.isInvalid()) 13258 return true; 13259 13260 Result = getDerived().RebuildCXXFoldExpr( 13261 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13262 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13263 if (Result.isInvalid()) 13264 return true; 13265 } 13266 13267 // If we had no init and an empty pack, and we're not retaining an expansion, 13268 // then produce a fallback value or error. 13269 if (Result.isUnset()) 13270 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13271 E->getOperator()); 13272 13273 return Result; 13274 } 13275 13276 template<typename Derived> 13277 ExprResult 13278 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13279 CXXStdInitializerListExpr *E) { 13280 return getDerived().TransformExpr(E->getSubExpr()); 13281 } 13282 13283 template<typename Derived> 13284 ExprResult 13285 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13286 return SemaRef.MaybeBindToTemporary(E); 13287 } 13288 13289 template<typename Derived> 13290 ExprResult 13291 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13292 return E; 13293 } 13294 13295 template<typename Derived> 13296 ExprResult 13297 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13298 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13299 if (SubExpr.isInvalid()) 13300 return ExprError(); 13301 13302 if (!getDerived().AlwaysRebuild() && 13303 SubExpr.get() == E->getSubExpr()) 13304 return E; 13305 13306 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13307 } 13308 13309 template<typename Derived> 13310 ExprResult 13311 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13312 // Transform each of the elements. 13313 SmallVector<Expr *, 8> Elements; 13314 bool ArgChanged = false; 13315 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13316 /*IsCall=*/false, Elements, &ArgChanged)) 13317 return ExprError(); 13318 13319 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13320 return SemaRef.MaybeBindToTemporary(E); 13321 13322 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13323 Elements.data(), 13324 Elements.size()); 13325 } 13326 13327 template<typename Derived> 13328 ExprResult 13329 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13330 ObjCDictionaryLiteral *E) { 13331 // Transform each of the elements. 13332 SmallVector<ObjCDictionaryElement, 8> Elements; 13333 bool ArgChanged = false; 13334 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13335 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13336 13337 if (OrigElement.isPackExpansion()) { 13338 // This key/value element is a pack expansion. 13339 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13340 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13341 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13342 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13343 13344 // Determine whether the set of unexpanded parameter packs can 13345 // and should be expanded. 13346 bool Expand = true; 13347 bool RetainExpansion = false; 13348 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13349 Optional<unsigned> NumExpansions = OrigNumExpansions; 13350 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13351 OrigElement.Value->getEndLoc()); 13352 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13353 PatternRange, Unexpanded, Expand, 13354 RetainExpansion, NumExpansions)) 13355 return ExprError(); 13356 13357 if (!Expand) { 13358 // The transform has determined that we should perform a simple 13359 // transformation on the pack expansion, producing another pack 13360 // expansion. 13361 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13362 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13363 if (Key.isInvalid()) 13364 return ExprError(); 13365 13366 if (Key.get() != OrigElement.Key) 13367 ArgChanged = true; 13368 13369 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13370 if (Value.isInvalid()) 13371 return ExprError(); 13372 13373 if (Value.get() != OrigElement.Value) 13374 ArgChanged = true; 13375 13376 ObjCDictionaryElement Expansion = { 13377 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13378 }; 13379 Elements.push_back(Expansion); 13380 continue; 13381 } 13382 13383 // Record right away that the argument was changed. This needs 13384 // to happen even if the array expands to nothing. 13385 ArgChanged = true; 13386 13387 // The transform has determined that we should perform an elementwise 13388 // expansion of the pattern. Do so. 13389 for (unsigned I = 0; I != *NumExpansions; ++I) { 13390 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13391 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13392 if (Key.isInvalid()) 13393 return ExprError(); 13394 13395 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13396 if (Value.isInvalid()) 13397 return ExprError(); 13398 13399 ObjCDictionaryElement Element = { 13400 Key.get(), Value.get(), SourceLocation(), NumExpansions 13401 }; 13402 13403 // If any unexpanded parameter packs remain, we still have a 13404 // pack expansion. 13405 // FIXME: Can this really happen? 13406 if (Key.get()->containsUnexpandedParameterPack() || 13407 Value.get()->containsUnexpandedParameterPack()) 13408 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13409 13410 Elements.push_back(Element); 13411 } 13412 13413 // FIXME: Retain a pack expansion if RetainExpansion is true. 13414 13415 // We've finished with this pack expansion. 13416 continue; 13417 } 13418 13419 // Transform and check key. 13420 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13421 if (Key.isInvalid()) 13422 return ExprError(); 13423 13424 if (Key.get() != OrigElement.Key) 13425 ArgChanged = true; 13426 13427 // Transform and check value. 13428 ExprResult Value 13429 = getDerived().TransformExpr(OrigElement.Value); 13430 if (Value.isInvalid()) 13431 return ExprError(); 13432 13433 if (Value.get() != OrigElement.Value) 13434 ArgChanged = true; 13435 13436 ObjCDictionaryElement Element = { 13437 Key.get(), Value.get(), SourceLocation(), None 13438 }; 13439 Elements.push_back(Element); 13440 } 13441 13442 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13443 return SemaRef.MaybeBindToTemporary(E); 13444 13445 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13446 Elements); 13447 } 13448 13449 template<typename Derived> 13450 ExprResult 13451 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13452 TypeSourceInfo *EncodedTypeInfo 13453 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13454 if (!EncodedTypeInfo) 13455 return ExprError(); 13456 13457 if (!getDerived().AlwaysRebuild() && 13458 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13459 return E; 13460 13461 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13462 EncodedTypeInfo, 13463 E->getRParenLoc()); 13464 } 13465 13466 template<typename Derived> 13467 ExprResult TreeTransform<Derived>:: 13468 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13469 // This is a kind of implicit conversion, and it needs to get dropped 13470 // and recomputed for the same general reasons that ImplicitCastExprs 13471 // do, as well a more specific one: this expression is only valid when 13472 // it appears *immediately* as an argument expression. 13473 return getDerived().TransformExpr(E->getSubExpr()); 13474 } 13475 13476 template<typename Derived> 13477 ExprResult TreeTransform<Derived>:: 13478 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13479 TypeSourceInfo *TSInfo 13480 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13481 if (!TSInfo) 13482 return ExprError(); 13483 13484 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13485 if (Result.isInvalid()) 13486 return ExprError(); 13487 13488 if (!getDerived().AlwaysRebuild() && 13489 TSInfo == E->getTypeInfoAsWritten() && 13490 Result.get() == E->getSubExpr()) 13491 return E; 13492 13493 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13494 E->getBridgeKeywordLoc(), TSInfo, 13495 Result.get()); 13496 } 13497 13498 template <typename Derived> 13499 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13500 ObjCAvailabilityCheckExpr *E) { 13501 return E; 13502 } 13503 13504 template<typename Derived> 13505 ExprResult 13506 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13507 // Transform arguments. 13508 bool ArgChanged = false; 13509 SmallVector<Expr*, 8> Args; 13510 Args.reserve(E->getNumArgs()); 13511 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13512 &ArgChanged)) 13513 return ExprError(); 13514 13515 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13516 // Class message: transform the receiver type. 13517 TypeSourceInfo *ReceiverTypeInfo 13518 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13519 if (!ReceiverTypeInfo) 13520 return ExprError(); 13521 13522 // If nothing changed, just retain the existing message send. 13523 if (!getDerived().AlwaysRebuild() && 13524 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13525 return SemaRef.MaybeBindToTemporary(E); 13526 13527 // Build a new class message send. 13528 SmallVector<SourceLocation, 16> SelLocs; 13529 E->getSelectorLocs(SelLocs); 13530 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13531 E->getSelector(), 13532 SelLocs, 13533 E->getMethodDecl(), 13534 E->getLeftLoc(), 13535 Args, 13536 E->getRightLoc()); 13537 } 13538 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13539 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13540 if (!E->getMethodDecl()) 13541 return ExprError(); 13542 13543 // Build a new class message send to 'super'. 13544 SmallVector<SourceLocation, 16> SelLocs; 13545 E->getSelectorLocs(SelLocs); 13546 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13547 E->getSelector(), 13548 SelLocs, 13549 E->getReceiverType(), 13550 E->getMethodDecl(), 13551 E->getLeftLoc(), 13552 Args, 13553 E->getRightLoc()); 13554 } 13555 13556 // Instance message: transform the receiver 13557 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13558 "Only class and instance messages may be instantiated"); 13559 ExprResult Receiver 13560 = getDerived().TransformExpr(E->getInstanceReceiver()); 13561 if (Receiver.isInvalid()) 13562 return ExprError(); 13563 13564 // If nothing changed, just retain the existing message send. 13565 if (!getDerived().AlwaysRebuild() && 13566 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13567 return SemaRef.MaybeBindToTemporary(E); 13568 13569 // Build a new instance message send. 13570 SmallVector<SourceLocation, 16> SelLocs; 13571 E->getSelectorLocs(SelLocs); 13572 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13573 E->getSelector(), 13574 SelLocs, 13575 E->getMethodDecl(), 13576 E->getLeftLoc(), 13577 Args, 13578 E->getRightLoc()); 13579 } 13580 13581 template<typename Derived> 13582 ExprResult 13583 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13584 return E; 13585 } 13586 13587 template<typename Derived> 13588 ExprResult 13589 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13590 return E; 13591 } 13592 13593 template<typename Derived> 13594 ExprResult 13595 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13596 // Transform the base expression. 13597 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13598 if (Base.isInvalid()) 13599 return ExprError(); 13600 13601 // We don't need to transform the ivar; it will never change. 13602 13603 // If nothing changed, just retain the existing expression. 13604 if (!getDerived().AlwaysRebuild() && 13605 Base.get() == E->getBase()) 13606 return E; 13607 13608 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13609 E->getLocation(), 13610 E->isArrow(), E->isFreeIvar()); 13611 } 13612 13613 template<typename Derived> 13614 ExprResult 13615 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13616 // 'super' and types never change. Property never changes. Just 13617 // retain the existing expression. 13618 if (!E->isObjectReceiver()) 13619 return E; 13620 13621 // Transform the base expression. 13622 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13623 if (Base.isInvalid()) 13624 return ExprError(); 13625 13626 // We don't need to transform the property; it will never change. 13627 13628 // If nothing changed, just retain the existing expression. 13629 if (!getDerived().AlwaysRebuild() && 13630 Base.get() == E->getBase()) 13631 return E; 13632 13633 if (E->isExplicitProperty()) 13634 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13635 E->getExplicitProperty(), 13636 E->getLocation()); 13637 13638 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13639 SemaRef.Context.PseudoObjectTy, 13640 E->getImplicitPropertyGetter(), 13641 E->getImplicitPropertySetter(), 13642 E->getLocation()); 13643 } 13644 13645 template<typename Derived> 13646 ExprResult 13647 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13648 // Transform the base expression. 13649 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13650 if (Base.isInvalid()) 13651 return ExprError(); 13652 13653 // Transform the key expression. 13654 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13655 if (Key.isInvalid()) 13656 return ExprError(); 13657 13658 // If nothing changed, just retain the existing expression. 13659 if (!getDerived().AlwaysRebuild() && 13660 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13661 return E; 13662 13663 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13664 Base.get(), Key.get(), 13665 E->getAtIndexMethodDecl(), 13666 E->setAtIndexMethodDecl()); 13667 } 13668 13669 template<typename Derived> 13670 ExprResult 13671 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13672 // Transform the base expression. 13673 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13674 if (Base.isInvalid()) 13675 return ExprError(); 13676 13677 // If nothing changed, just retain the existing expression. 13678 if (!getDerived().AlwaysRebuild() && 13679 Base.get() == E->getBase()) 13680 return E; 13681 13682 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13683 E->getOpLoc(), 13684 E->isArrow()); 13685 } 13686 13687 template<typename Derived> 13688 ExprResult 13689 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13690 bool ArgumentChanged = false; 13691 SmallVector<Expr*, 8> SubExprs; 13692 SubExprs.reserve(E->getNumSubExprs()); 13693 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13694 SubExprs, &ArgumentChanged)) 13695 return ExprError(); 13696 13697 if (!getDerived().AlwaysRebuild() && 13698 !ArgumentChanged) 13699 return E; 13700 13701 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13702 SubExprs, 13703 E->getRParenLoc()); 13704 } 13705 13706 template<typename Derived> 13707 ExprResult 13708 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13709 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13710 if (SrcExpr.isInvalid()) 13711 return ExprError(); 13712 13713 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13714 if (!Type) 13715 return ExprError(); 13716 13717 if (!getDerived().AlwaysRebuild() && 13718 Type == E->getTypeSourceInfo() && 13719 SrcExpr.get() == E->getSrcExpr()) 13720 return E; 13721 13722 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13723 SrcExpr.get(), Type, 13724 E->getRParenLoc()); 13725 } 13726 13727 template<typename Derived> 13728 ExprResult 13729 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13730 BlockDecl *oldBlock = E->getBlockDecl(); 13731 13732 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13733 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13734 13735 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13736 blockScope->TheDecl->setBlockMissingReturnType( 13737 oldBlock->blockMissingReturnType()); 13738 13739 SmallVector<ParmVarDecl*, 4> params; 13740 SmallVector<QualType, 4> paramTypes; 13741 13742 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13743 13744 // Parameter substitution. 13745 Sema::ExtParameterInfoBuilder extParamInfos; 13746 if (getDerived().TransformFunctionTypeParams( 13747 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13748 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13749 extParamInfos)) { 13750 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13751 return ExprError(); 13752 } 13753 13754 QualType exprResultType = 13755 getDerived().TransformType(exprFunctionType->getReturnType()); 13756 13757 auto epi = exprFunctionType->getExtProtoInfo(); 13758 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13759 13760 QualType functionType = 13761 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13762 blockScope->FunctionType = functionType; 13763 13764 // Set the parameters on the block decl. 13765 if (!params.empty()) 13766 blockScope->TheDecl->setParams(params); 13767 13768 if (!oldBlock->blockMissingReturnType()) { 13769 blockScope->HasImplicitReturnType = false; 13770 blockScope->ReturnType = exprResultType; 13771 } 13772 13773 // Transform the body 13774 StmtResult body = getDerived().TransformStmt(E->getBody()); 13775 if (body.isInvalid()) { 13776 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13777 return ExprError(); 13778 } 13779 13780 #ifndef NDEBUG 13781 // In builds with assertions, make sure that we captured everything we 13782 // captured before. 13783 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13784 for (const auto &I : oldBlock->captures()) { 13785 VarDecl *oldCapture = I.getVariable(); 13786 13787 // Ignore parameter packs. 13788 if (oldCapture->isParameterPack()) 13789 continue; 13790 13791 VarDecl *newCapture = 13792 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13793 oldCapture)); 13794 assert(blockScope->CaptureMap.count(newCapture)); 13795 } 13796 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13797 } 13798 #endif 13799 13800 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13801 /*Scope=*/nullptr); 13802 } 13803 13804 template<typename Derived> 13805 ExprResult 13806 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13807 llvm_unreachable("Cannot transform asType expressions yet"); 13808 } 13809 13810 template<typename Derived> 13811 ExprResult 13812 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13813 bool ArgumentChanged = false; 13814 SmallVector<Expr*, 8> SubExprs; 13815 SubExprs.reserve(E->getNumSubExprs()); 13816 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13817 SubExprs, &ArgumentChanged)) 13818 return ExprError(); 13819 13820 if (!getDerived().AlwaysRebuild() && 13821 !ArgumentChanged) 13822 return E; 13823 13824 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13825 E->getOp(), E->getRParenLoc()); 13826 } 13827 13828 //===----------------------------------------------------------------------===// 13829 // Type reconstruction 13830 //===----------------------------------------------------------------------===// 13831 13832 template<typename Derived> 13833 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 13834 SourceLocation Star) { 13835 return SemaRef.BuildPointerType(PointeeType, Star, 13836 getDerived().getBaseEntity()); 13837 } 13838 13839 template<typename Derived> 13840 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 13841 SourceLocation Star) { 13842 return SemaRef.BuildBlockPointerType(PointeeType, Star, 13843 getDerived().getBaseEntity()); 13844 } 13845 13846 template<typename Derived> 13847 QualType 13848 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 13849 bool WrittenAsLValue, 13850 SourceLocation Sigil) { 13851 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 13852 Sigil, getDerived().getBaseEntity()); 13853 } 13854 13855 template<typename Derived> 13856 QualType 13857 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 13858 QualType ClassType, 13859 SourceLocation Sigil) { 13860 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 13861 getDerived().getBaseEntity()); 13862 } 13863 13864 template<typename Derived> 13865 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 13866 const ObjCTypeParamDecl *Decl, 13867 SourceLocation ProtocolLAngleLoc, 13868 ArrayRef<ObjCProtocolDecl *> Protocols, 13869 ArrayRef<SourceLocation> ProtocolLocs, 13870 SourceLocation ProtocolRAngleLoc) { 13871 return SemaRef.BuildObjCTypeParamType(Decl, 13872 ProtocolLAngleLoc, Protocols, 13873 ProtocolLocs, ProtocolRAngleLoc, 13874 /*FailOnError=*/true); 13875 } 13876 13877 template<typename Derived> 13878 QualType TreeTransform<Derived>::RebuildObjCObjectType( 13879 QualType BaseType, 13880 SourceLocation Loc, 13881 SourceLocation TypeArgsLAngleLoc, 13882 ArrayRef<TypeSourceInfo *> TypeArgs, 13883 SourceLocation TypeArgsRAngleLoc, 13884 SourceLocation ProtocolLAngleLoc, 13885 ArrayRef<ObjCProtocolDecl *> Protocols, 13886 ArrayRef<SourceLocation> ProtocolLocs, 13887 SourceLocation ProtocolRAngleLoc) { 13888 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 13889 TypeArgs, TypeArgsRAngleLoc, 13890 ProtocolLAngleLoc, Protocols, ProtocolLocs, 13891 ProtocolRAngleLoc, 13892 /*FailOnError=*/true); 13893 } 13894 13895 template<typename Derived> 13896 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 13897 QualType PointeeType, 13898 SourceLocation Star) { 13899 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 13900 } 13901 13902 template<typename Derived> 13903 QualType 13904 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 13905 ArrayType::ArraySizeModifier SizeMod, 13906 const llvm::APInt *Size, 13907 Expr *SizeExpr, 13908 unsigned IndexTypeQuals, 13909 SourceRange BracketsRange) { 13910 if (SizeExpr || !Size) 13911 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 13912 IndexTypeQuals, BracketsRange, 13913 getDerived().getBaseEntity()); 13914 13915 QualType Types[] = { 13916 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 13917 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 13918 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 13919 }; 13920 const unsigned NumTypes = llvm::array_lengthof(Types); 13921 QualType SizeType; 13922 for (unsigned I = 0; I != NumTypes; ++I) 13923 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 13924 SizeType = Types[I]; 13925 break; 13926 } 13927 13928 // Note that we can return a VariableArrayType here in the case where 13929 // the element type was a dependent VariableArrayType. 13930 IntegerLiteral *ArraySize 13931 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 13932 /*FIXME*/BracketsRange.getBegin()); 13933 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 13934 IndexTypeQuals, BracketsRange, 13935 getDerived().getBaseEntity()); 13936 } 13937 13938 template<typename Derived> 13939 QualType 13940 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 13941 ArrayType::ArraySizeModifier SizeMod, 13942 const llvm::APInt &Size, 13943 Expr *SizeExpr, 13944 unsigned IndexTypeQuals, 13945 SourceRange BracketsRange) { 13946 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 13947 IndexTypeQuals, BracketsRange); 13948 } 13949 13950 template<typename Derived> 13951 QualType 13952 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 13953 ArrayType::ArraySizeModifier SizeMod, 13954 unsigned IndexTypeQuals, 13955 SourceRange BracketsRange) { 13956 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 13957 IndexTypeQuals, BracketsRange); 13958 } 13959 13960 template<typename Derived> 13961 QualType 13962 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 13963 ArrayType::ArraySizeModifier SizeMod, 13964 Expr *SizeExpr, 13965 unsigned IndexTypeQuals, 13966 SourceRange BracketsRange) { 13967 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13968 SizeExpr, 13969 IndexTypeQuals, BracketsRange); 13970 } 13971 13972 template<typename Derived> 13973 QualType 13974 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 13975 ArrayType::ArraySizeModifier SizeMod, 13976 Expr *SizeExpr, 13977 unsigned IndexTypeQuals, 13978 SourceRange BracketsRange) { 13979 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13980 SizeExpr, 13981 IndexTypeQuals, BracketsRange); 13982 } 13983 13984 template <typename Derived> 13985 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 13986 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 13987 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 13988 AttributeLoc); 13989 } 13990 13991 template <typename Derived> 13992 QualType 13993 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 13994 unsigned NumElements, 13995 VectorType::VectorKind VecKind) { 13996 // FIXME: semantic checking! 13997 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 13998 } 13999 14000 template <typename Derived> 14001 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14002 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14003 VectorType::VectorKind VecKind) { 14004 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14005 } 14006 14007 template<typename Derived> 14008 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14009 unsigned NumElements, 14010 SourceLocation AttributeLoc) { 14011 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14012 NumElements, true); 14013 IntegerLiteral *VectorSize 14014 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14015 AttributeLoc); 14016 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14017 } 14018 14019 template<typename Derived> 14020 QualType 14021 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14022 Expr *SizeExpr, 14023 SourceLocation AttributeLoc) { 14024 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14025 } 14026 14027 template <typename Derived> 14028 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14029 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14030 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14031 NumColumns); 14032 } 14033 14034 template <typename Derived> 14035 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14036 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14037 SourceLocation AttributeLoc) { 14038 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14039 AttributeLoc); 14040 } 14041 14042 template<typename Derived> 14043 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14044 QualType T, 14045 MutableArrayRef<QualType> ParamTypes, 14046 const FunctionProtoType::ExtProtoInfo &EPI) { 14047 return SemaRef.BuildFunctionType(T, ParamTypes, 14048 getDerived().getBaseLocation(), 14049 getDerived().getBaseEntity(), 14050 EPI); 14051 } 14052 14053 template<typename Derived> 14054 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14055 return SemaRef.Context.getFunctionNoProtoType(T); 14056 } 14057 14058 template<typename Derived> 14059 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14060 Decl *D) { 14061 assert(D && "no decl found"); 14062 if (D->isInvalidDecl()) return QualType(); 14063 14064 // FIXME: Doesn't account for ObjCInterfaceDecl! 14065 TypeDecl *Ty; 14066 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14067 // A valid resolved using typename pack expansion decl can have multiple 14068 // UsingDecls, but they must each have exactly one type, and it must be 14069 // the same type in every case. But we must have at least one expansion! 14070 if (UPD->expansions().empty()) { 14071 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14072 << UPD->isCXXClassMember() << UPD; 14073 return QualType(); 14074 } 14075 14076 // We might still have some unresolved types. Try to pick a resolved type 14077 // if we can. The final instantiation will check that the remaining 14078 // unresolved types instantiate to the type we pick. 14079 QualType FallbackT; 14080 QualType T; 14081 for (auto *E : UPD->expansions()) { 14082 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14083 if (ThisT.isNull()) 14084 continue; 14085 else if (ThisT->getAs<UnresolvedUsingType>()) 14086 FallbackT = ThisT; 14087 else if (T.isNull()) 14088 T = ThisT; 14089 else 14090 assert(getSema().Context.hasSameType(ThisT, T) && 14091 "mismatched resolved types in using pack expansion"); 14092 } 14093 return T.isNull() ? FallbackT : T; 14094 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14095 assert(Using->hasTypename() && 14096 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14097 14098 // A valid resolved using typename decl points to exactly one type decl. 14099 assert(++Using->shadow_begin() == Using->shadow_end()); 14100 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 14101 } else { 14102 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14103 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14104 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14105 } 14106 14107 return SemaRef.Context.getTypeDeclType(Ty); 14108 } 14109 14110 template<typename Derived> 14111 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14112 SourceLocation Loc) { 14113 return SemaRef.BuildTypeofExprType(E, Loc); 14114 } 14115 14116 template<typename Derived> 14117 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14118 return SemaRef.Context.getTypeOfType(Underlying); 14119 } 14120 14121 template<typename Derived> 14122 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14123 SourceLocation Loc) { 14124 return SemaRef.BuildDecltypeType(E, Loc); 14125 } 14126 14127 template<typename Derived> 14128 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14129 UnaryTransformType::UTTKind UKind, 14130 SourceLocation Loc) { 14131 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14132 } 14133 14134 template<typename Derived> 14135 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14136 TemplateName Template, 14137 SourceLocation TemplateNameLoc, 14138 TemplateArgumentListInfo &TemplateArgs) { 14139 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14140 } 14141 14142 template<typename Derived> 14143 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14144 SourceLocation KWLoc) { 14145 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14146 } 14147 14148 template<typename Derived> 14149 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14150 SourceLocation KWLoc, 14151 bool isReadPipe) { 14152 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14153 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14154 } 14155 14156 template <typename Derived> 14157 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14158 unsigned NumBits, 14159 SourceLocation Loc) { 14160 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14161 NumBits, true); 14162 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14163 SemaRef.Context.IntTy, Loc); 14164 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14165 } 14166 14167 template <typename Derived> 14168 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14169 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14170 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14171 } 14172 14173 template<typename Derived> 14174 TemplateName 14175 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14176 bool TemplateKW, 14177 TemplateDecl *Template) { 14178 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14179 Template); 14180 } 14181 14182 template<typename Derived> 14183 TemplateName 14184 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14185 SourceLocation TemplateKWLoc, 14186 const IdentifierInfo &Name, 14187 SourceLocation NameLoc, 14188 QualType ObjectType, 14189 NamedDecl *FirstQualifierInScope, 14190 bool AllowInjectedClassName) { 14191 UnqualifiedId TemplateName; 14192 TemplateName.setIdentifier(&Name, NameLoc); 14193 Sema::TemplateTy Template; 14194 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14195 TemplateName, ParsedType::make(ObjectType), 14196 /*EnteringContext=*/false, Template, 14197 AllowInjectedClassName); 14198 return Template.get(); 14199 } 14200 14201 template<typename Derived> 14202 TemplateName 14203 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14204 SourceLocation TemplateKWLoc, 14205 OverloadedOperatorKind Operator, 14206 SourceLocation NameLoc, 14207 QualType ObjectType, 14208 bool AllowInjectedClassName) { 14209 UnqualifiedId Name; 14210 // FIXME: Bogus location information. 14211 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14212 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14213 Sema::TemplateTy Template; 14214 getSema().ActOnTemplateName( 14215 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14216 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14217 return Template.get(); 14218 } 14219 14220 template<typename Derived> 14221 ExprResult 14222 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14223 SourceLocation OpLoc, 14224 Expr *OrigCallee, 14225 Expr *First, 14226 Expr *Second) { 14227 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14228 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14229 14230 if (First->getObjectKind() == OK_ObjCProperty) { 14231 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14232 if (BinaryOperator::isAssignmentOp(Opc)) 14233 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14234 First, Second); 14235 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14236 if (Result.isInvalid()) 14237 return ExprError(); 14238 First = Result.get(); 14239 } 14240 14241 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14242 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14243 if (Result.isInvalid()) 14244 return ExprError(); 14245 Second = Result.get(); 14246 } 14247 14248 // Determine whether this should be a builtin operation. 14249 if (Op == OO_Subscript) { 14250 if (!First->getType()->isOverloadableType() && 14251 !Second->getType()->isOverloadableType()) 14252 return getSema().CreateBuiltinArraySubscriptExpr( 14253 First, Callee->getBeginLoc(), Second, OpLoc); 14254 } else if (Op == OO_Arrow) { 14255 // -> is never a builtin operation. 14256 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14257 } else if (Second == nullptr || isPostIncDec) { 14258 if (!First->getType()->isOverloadableType() || 14259 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14260 // The argument is not of overloadable type, or this is an expression 14261 // of the form &Class::member, so try to create a built-in unary 14262 // operation. 14263 UnaryOperatorKind Opc 14264 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14265 14266 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14267 } 14268 } else { 14269 if (!First->getType()->isOverloadableType() && 14270 !Second->getType()->isOverloadableType()) { 14271 // Neither of the arguments is an overloadable type, so try to 14272 // create a built-in binary operation. 14273 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14274 ExprResult Result 14275 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14276 if (Result.isInvalid()) 14277 return ExprError(); 14278 14279 return Result; 14280 } 14281 } 14282 14283 // Compute the transformed set of functions (and function templates) to be 14284 // used during overload resolution. 14285 UnresolvedSet<16> Functions; 14286 bool RequiresADL; 14287 14288 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14289 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14290 // If the overload could not be resolved in the template definition 14291 // (because we had a dependent argument), ADL is performed as part of 14292 // template instantiation. 14293 RequiresADL = ULE->requiresADL(); 14294 } else { 14295 // If we've resolved this to a particular non-member function, just call 14296 // that function. If we resolved it to a member function, 14297 // CreateOverloaded* will find that function for us. 14298 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14299 if (!isa<CXXMethodDecl>(ND)) 14300 Functions.addDecl(ND); 14301 RequiresADL = false; 14302 } 14303 14304 // Add any functions found via argument-dependent lookup. 14305 Expr *Args[2] = { First, Second }; 14306 unsigned NumArgs = 1 + (Second != nullptr); 14307 14308 // Create the overloaded operator invocation for unary operators. 14309 if (NumArgs == 1 || isPostIncDec) { 14310 UnaryOperatorKind Opc 14311 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14312 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14313 RequiresADL); 14314 } 14315 14316 if (Op == OO_Subscript) { 14317 SourceLocation LBrace; 14318 SourceLocation RBrace; 14319 14320 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14321 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14322 LBrace = SourceLocation::getFromRawEncoding( 14323 NameLoc.CXXOperatorName.BeginOpNameLoc); 14324 RBrace = SourceLocation::getFromRawEncoding( 14325 NameLoc.CXXOperatorName.EndOpNameLoc); 14326 } else { 14327 LBrace = Callee->getBeginLoc(); 14328 RBrace = OpLoc; 14329 } 14330 14331 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14332 First, Second); 14333 } 14334 14335 // Create the overloaded operator invocation for binary operators. 14336 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14337 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14338 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14339 if (Result.isInvalid()) 14340 return ExprError(); 14341 14342 return Result; 14343 } 14344 14345 template<typename Derived> 14346 ExprResult 14347 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14348 SourceLocation OperatorLoc, 14349 bool isArrow, 14350 CXXScopeSpec &SS, 14351 TypeSourceInfo *ScopeType, 14352 SourceLocation CCLoc, 14353 SourceLocation TildeLoc, 14354 PseudoDestructorTypeStorage Destroyed) { 14355 QualType BaseType = Base->getType(); 14356 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14357 (!isArrow && !BaseType->getAs<RecordType>()) || 14358 (isArrow && BaseType->getAs<PointerType>() && 14359 !BaseType->castAs<PointerType>()->getPointeeType() 14360 ->template getAs<RecordType>())){ 14361 // This pseudo-destructor expression is still a pseudo-destructor. 14362 return SemaRef.BuildPseudoDestructorExpr( 14363 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14364 CCLoc, TildeLoc, Destroyed); 14365 } 14366 14367 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14368 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14369 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14370 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14371 NameInfo.setNamedTypeInfo(DestroyedType); 14372 14373 // The scope type is now known to be a valid nested name specifier 14374 // component. Tack it on to the end of the nested name specifier. 14375 if (ScopeType) { 14376 if (!ScopeType->getType()->getAs<TagType>()) { 14377 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14378 diag::err_expected_class_or_namespace) 14379 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14380 return ExprError(); 14381 } 14382 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14383 CCLoc); 14384 } 14385 14386 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14387 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14388 OperatorLoc, isArrow, 14389 SS, TemplateKWLoc, 14390 /*FIXME: FirstQualifier*/ nullptr, 14391 NameInfo, 14392 /*TemplateArgs*/ nullptr, 14393 /*S*/nullptr); 14394 } 14395 14396 template<typename Derived> 14397 StmtResult 14398 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14399 SourceLocation Loc = S->getBeginLoc(); 14400 CapturedDecl *CD = S->getCapturedDecl(); 14401 unsigned NumParams = CD->getNumParams(); 14402 unsigned ContextParamPos = CD->getContextParamPosition(); 14403 SmallVector<Sema::CapturedParamNameType, 4> Params; 14404 for (unsigned I = 0; I < NumParams; ++I) { 14405 if (I != ContextParamPos) { 14406 Params.push_back( 14407 std::make_pair( 14408 CD->getParam(I)->getName(), 14409 getDerived().TransformType(CD->getParam(I)->getType()))); 14410 } else { 14411 Params.push_back(std::make_pair(StringRef(), QualType())); 14412 } 14413 } 14414 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14415 S->getCapturedRegionKind(), Params); 14416 StmtResult Body; 14417 { 14418 Sema::CompoundScopeRAII CompoundScope(getSema()); 14419 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14420 } 14421 14422 if (Body.isInvalid()) { 14423 getSema().ActOnCapturedRegionError(); 14424 return StmtError(); 14425 } 14426 14427 return getSema().ActOnCapturedRegionEnd(Body.get()); 14428 } 14429 14430 } // end namespace clang 14431 14432 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14433