1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 17 #include "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprConcepts.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/OpenMPClause.h" 27 #include "clang/AST/Stmt.h" 28 #include "clang/AST/StmtCXX.h" 29 #include "clang/AST/StmtObjC.h" 30 #include "clang/AST/StmtOpenMP.h" 31 #include "clang/Basic/DiagnosticParse.h" 32 #include "clang/Basic/OpenMPKinds.h" 33 #include "clang/Sema/Designator.h" 34 #include "clang/Sema/Lookup.h" 35 #include "clang/Sema/Ownership.h" 36 #include "clang/Sema/ParsedTemplate.h" 37 #include "clang/Sema/ScopeInfo.h" 38 #include "clang/Sema/SemaDiagnostic.h" 39 #include "clang/Sema/SemaInternal.h" 40 #include "llvm/ADT/ArrayRef.h" 41 #include "llvm/Support/ErrorHandling.h" 42 #include <algorithm> 43 44 using namespace llvm::omp; 45 46 namespace clang { 47 using namespace sema; 48 49 /// A semantic tree transformation that allows one to transform one 50 /// abstract syntax tree into another. 51 /// 52 /// A new tree transformation is defined by creating a new subclass \c X of 53 /// \c TreeTransform<X> and then overriding certain operations to provide 54 /// behavior specific to that transformation. For example, template 55 /// instantiation is implemented as a tree transformation where the 56 /// transformation of TemplateTypeParmType nodes involves substituting the 57 /// template arguments for their corresponding template parameters; a similar 58 /// transformation is performed for non-type template parameters and 59 /// template template parameters. 60 /// 61 /// This tree-transformation template uses static polymorphism to allow 62 /// subclasses to customize any of its operations. Thus, a subclass can 63 /// override any of the transformation or rebuild operators by providing an 64 /// operation with the same signature as the default implementation. The 65 /// overriding function should not be virtual. 66 /// 67 /// Semantic tree transformations are split into two stages, either of which 68 /// can be replaced by a subclass. The "transform" step transforms an AST node 69 /// or the parts of an AST node using the various transformation functions, 70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 71 /// node of the appropriate kind from the pieces. The default transformation 72 /// routines recursively transform the operands to composite AST nodes (e.g., 73 /// the pointee type of a PointerType node) and, if any of those operand nodes 74 /// were changed by the transformation, invokes the rebuild operation to create 75 /// a new AST node. 76 /// 77 /// Subclasses can customize the transformation at various levels. The 78 /// most coarse-grained transformations involve replacing TransformType(), 79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 81 /// new implementations. 82 /// 83 /// For more fine-grained transformations, subclasses can replace any of the 84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 86 /// replacing TransformTemplateTypeParmType() allows template instantiation 87 /// to substitute template arguments for their corresponding template 88 /// parameters. Additionally, subclasses can override the \c RebuildXXX 89 /// functions to control how AST nodes are rebuilt when their operands change. 90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 92 /// be able to use more efficient rebuild steps. 93 /// 94 /// There are a handful of other functions that can be overridden, allowing one 95 /// to avoid traversing nodes that don't need any transformation 96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 97 /// operands have not changed (\c AlwaysRebuild()), and customize the 98 /// default locations and entity names used for type-checking 99 /// (\c getBaseLocation(), \c getBaseEntity()). 100 template<typename Derived> 101 class TreeTransform { 102 /// Private RAII object that helps us forget and then re-remember 103 /// the template argument corresponding to a partially-substituted parameter 104 /// pack. 105 class ForgetPartiallySubstitutedPackRAII { 106 Derived &Self; 107 TemplateArgument Old; 108 109 public: 110 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 111 Old = Self.ForgetPartiallySubstitutedPack(); 112 } 113 114 ~ForgetPartiallySubstitutedPackRAII() { 115 Self.RememberPartiallySubstitutedPack(Old); 116 } 117 }; 118 119 protected: 120 Sema &SemaRef; 121 122 /// The set of local declarations that have been transformed, for 123 /// cases where we are forced to build new declarations within the transformer 124 /// rather than in the subclass (e.g., lambda closure types). 125 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 126 127 public: 128 /// Initializes a new tree transformer. 129 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 130 131 /// Retrieves a reference to the derived class. 132 Derived &getDerived() { return static_cast<Derived&>(*this); } 133 134 /// Retrieves a reference to the derived class. 135 const Derived &getDerived() const { 136 return static_cast<const Derived&>(*this); 137 } 138 139 static inline ExprResult Owned(Expr *E) { return E; } 140 static inline StmtResult Owned(Stmt *S) { return S; } 141 142 /// Retrieves a reference to the semantic analysis object used for 143 /// this tree transform. 144 Sema &getSema() const { return SemaRef; } 145 146 /// Whether the transformation should always rebuild AST nodes, even 147 /// if none of the children have changed. 148 /// 149 /// Subclasses may override this function to specify when the transformation 150 /// should rebuild all AST nodes. 151 /// 152 /// We must always rebuild all AST nodes when performing variadic template 153 /// pack expansion, in order to avoid violating the AST invariant that each 154 /// statement node appears at most once in its containing declaration. 155 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 156 157 /// Whether the transformation is forming an expression or statement that 158 /// replaces the original. In this case, we'll reuse mangling numbers from 159 /// existing lambdas. 160 bool ReplacingOriginal() { return false; } 161 162 /// Wether CXXConstructExpr can be skipped when they are implicit. 163 /// They will be reconstructed when used if needed. 164 /// This is usefull when the user that cause rebuilding of the 165 /// CXXConstructExpr is outside of the expression at which the TreeTransform 166 /// started. 167 bool AllowSkippingCXXConstructExpr() { return true; } 168 169 /// Returns the location of the entity being transformed, if that 170 /// information was not available elsewhere in the AST. 171 /// 172 /// By default, returns no source-location information. Subclasses can 173 /// provide an alternative implementation that provides better location 174 /// information. 175 SourceLocation getBaseLocation() { return SourceLocation(); } 176 177 /// Returns the name of the entity being transformed, if that 178 /// information was not available elsewhere in the AST. 179 /// 180 /// By default, returns an empty name. Subclasses can provide an alternative 181 /// implementation with a more precise name. 182 DeclarationName getBaseEntity() { return DeclarationName(); } 183 184 /// Sets the "base" location and entity when that 185 /// information is known based on another transformation. 186 /// 187 /// By default, the source location and entity are ignored. Subclasses can 188 /// override this function to provide a customized implementation. 189 void setBase(SourceLocation Loc, DeclarationName Entity) { } 190 191 /// RAII object that temporarily sets the base location and entity 192 /// used for reporting diagnostics in types. 193 class TemporaryBase { 194 TreeTransform &Self; 195 SourceLocation OldLocation; 196 DeclarationName OldEntity; 197 198 public: 199 TemporaryBase(TreeTransform &Self, SourceLocation Location, 200 DeclarationName Entity) : Self(Self) { 201 OldLocation = Self.getDerived().getBaseLocation(); 202 OldEntity = Self.getDerived().getBaseEntity(); 203 204 if (Location.isValid()) 205 Self.getDerived().setBase(Location, Entity); 206 } 207 208 ~TemporaryBase() { 209 Self.getDerived().setBase(OldLocation, OldEntity); 210 } 211 }; 212 213 /// Determine whether the given type \p T has already been 214 /// transformed. 215 /// 216 /// Subclasses can provide an alternative implementation of this routine 217 /// to short-circuit evaluation when it is known that a given type will 218 /// not change. For example, template instantiation need not traverse 219 /// non-dependent types. 220 bool AlreadyTransformed(QualType T) { 221 return T.isNull(); 222 } 223 224 /// Transform a template parameter depth level. 225 /// 226 /// During a transformation that transforms template parameters, this maps 227 /// an old template parameter depth to a new depth. 228 unsigned TransformTemplateDepth(unsigned Depth) { 229 return Depth; 230 } 231 232 /// Determine whether the given call argument should be dropped, e.g., 233 /// because it is a default argument. 234 /// 235 /// Subclasses can provide an alternative implementation of this routine to 236 /// determine which kinds of call arguments get dropped. By default, 237 /// CXXDefaultArgument nodes are dropped (prior to transformation). 238 bool DropCallArgument(Expr *E) { 239 return E->isDefaultArgument(); 240 } 241 242 /// Determine whether we should expand a pack expansion with the 243 /// given set of parameter packs into separate arguments by repeatedly 244 /// transforming the pattern. 245 /// 246 /// By default, the transformer never tries to expand pack expansions. 247 /// Subclasses can override this routine to provide different behavior. 248 /// 249 /// \param EllipsisLoc The location of the ellipsis that identifies the 250 /// pack expansion. 251 /// 252 /// \param PatternRange The source range that covers the entire pattern of 253 /// the pack expansion. 254 /// 255 /// \param Unexpanded The set of unexpanded parameter packs within the 256 /// pattern. 257 /// 258 /// \param ShouldExpand Will be set to \c true if the transformer should 259 /// expand the corresponding pack expansions into separate arguments. When 260 /// set, \c NumExpansions must also be set. 261 /// 262 /// \param RetainExpansion Whether the caller should add an unexpanded 263 /// pack expansion after all of the expanded arguments. This is used 264 /// when extending explicitly-specified template argument packs per 265 /// C++0x [temp.arg.explicit]p9. 266 /// 267 /// \param NumExpansions The number of separate arguments that will be in 268 /// the expanded form of the corresponding pack expansion. This is both an 269 /// input and an output parameter, which can be set by the caller if the 270 /// number of expansions is known a priori (e.g., due to a prior substitution) 271 /// and will be set by the callee when the number of expansions is known. 272 /// The callee must set this value when \c ShouldExpand is \c true; it may 273 /// set this value in other cases. 274 /// 275 /// \returns true if an error occurred (e.g., because the parameter packs 276 /// are to be instantiated with arguments of different lengths), false 277 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 278 /// must be set. 279 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 280 SourceRange PatternRange, 281 ArrayRef<UnexpandedParameterPack> Unexpanded, 282 bool &ShouldExpand, 283 bool &RetainExpansion, 284 Optional<unsigned> &NumExpansions) { 285 ShouldExpand = false; 286 return false; 287 } 288 289 /// "Forget" about the partially-substituted pack template argument, 290 /// when performing an instantiation that must preserve the parameter pack 291 /// use. 292 /// 293 /// This routine is meant to be overridden by the template instantiator. 294 TemplateArgument ForgetPartiallySubstitutedPack() { 295 return TemplateArgument(); 296 } 297 298 /// "Remember" the partially-substituted pack template argument 299 /// after performing an instantiation that must preserve the parameter pack 300 /// use. 301 /// 302 /// This routine is meant to be overridden by the template instantiator. 303 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 304 305 /// Note to the derived class when a function parameter pack is 306 /// being expanded. 307 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 308 309 /// Transforms the given type into another type. 310 /// 311 /// By default, this routine transforms a type by creating a 312 /// TypeSourceInfo for it and delegating to the appropriate 313 /// function. This is expensive, but we don't mind, because 314 /// this method is deprecated anyway; all users should be 315 /// switched to storing TypeSourceInfos. 316 /// 317 /// \returns the transformed type. 318 QualType TransformType(QualType T); 319 320 /// Transforms the given type-with-location into a new 321 /// type-with-location. 322 /// 323 /// By default, this routine transforms a type by delegating to the 324 /// appropriate TransformXXXType to build a new type. Subclasses 325 /// may override this function (to take over all type 326 /// transformations) or some set of the TransformXXXType functions 327 /// to alter the transformation. 328 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 329 330 /// Transform the given type-with-location into a new 331 /// type, collecting location information in the given builder 332 /// as necessary. 333 /// 334 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 335 336 /// Transform a type that is permitted to produce a 337 /// DeducedTemplateSpecializationType. 338 /// 339 /// This is used in the (relatively rare) contexts where it is acceptable 340 /// for transformation to produce a class template type with deduced 341 /// template arguments. 342 /// @{ 343 QualType TransformTypeWithDeducedTST(QualType T); 344 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 345 /// @} 346 347 /// The reason why the value of a statement is not discarded, if any. 348 enum StmtDiscardKind { 349 SDK_Discarded, 350 SDK_NotDiscarded, 351 SDK_StmtExprResult, 352 }; 353 354 /// Transform the given statement. 355 /// 356 /// By default, this routine transforms a statement by delegating to the 357 /// appropriate TransformXXXStmt function to transform a specific kind of 358 /// statement or the TransformExpr() function to transform an expression. 359 /// Subclasses may override this function to transform statements using some 360 /// other mechanism. 361 /// 362 /// \returns the transformed statement. 363 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 364 365 /// Transform the given statement. 366 /// 367 /// By default, this routine transforms a statement by delegating to the 368 /// appropriate TransformOMPXXXClause function to transform a specific kind 369 /// of clause. Subclasses may override this function to transform statements 370 /// using some other mechanism. 371 /// 372 /// \returns the transformed OpenMP clause. 373 OMPClause *TransformOMPClause(OMPClause *S); 374 375 /// Transform the given attribute. 376 /// 377 /// By default, this routine transforms a statement by delegating to the 378 /// appropriate TransformXXXAttr function to transform a specific kind 379 /// of attribute. Subclasses may override this function to transform 380 /// attributed statements using some other mechanism. 381 /// 382 /// \returns the transformed attribute 383 const Attr *TransformAttr(const Attr *S); 384 385 /// Transform the specified attribute. 386 /// 387 /// Subclasses should override the transformation of attributes with a pragma 388 /// spelling to transform expressions stored within the attribute. 389 /// 390 /// \returns the transformed attribute. 391 #define ATTR(X) 392 #define PRAGMA_SPELLING_ATTR(X) \ 393 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 394 #include "clang/Basic/AttrList.inc" 395 396 /// Transform the given expression. 397 /// 398 /// By default, this routine transforms an expression by delegating to the 399 /// appropriate TransformXXXExpr function to build a new expression. 400 /// Subclasses may override this function to transform expressions using some 401 /// other mechanism. 402 /// 403 /// \returns the transformed expression. 404 ExprResult TransformExpr(Expr *E); 405 406 /// Transform the given initializer. 407 /// 408 /// By default, this routine transforms an initializer by stripping off the 409 /// semantic nodes added by initialization, then passing the result to 410 /// TransformExpr or TransformExprs. 411 /// 412 /// \returns the transformed initializer. 413 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 414 415 /// Transform the given list of expressions. 416 /// 417 /// This routine transforms a list of expressions by invoking 418 /// \c TransformExpr() for each subexpression. However, it also provides 419 /// support for variadic templates by expanding any pack expansions (if the 420 /// derived class permits such expansion) along the way. When pack expansions 421 /// are present, the number of outputs may not equal the number of inputs. 422 /// 423 /// \param Inputs The set of expressions to be transformed. 424 /// 425 /// \param NumInputs The number of expressions in \c Inputs. 426 /// 427 /// \param IsCall If \c true, then this transform is being performed on 428 /// function-call arguments, and any arguments that should be dropped, will 429 /// be. 430 /// 431 /// \param Outputs The transformed input expressions will be added to this 432 /// vector. 433 /// 434 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 435 /// due to transformation. 436 /// 437 /// \returns true if an error occurred, false otherwise. 438 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 439 SmallVectorImpl<Expr *> &Outputs, 440 bool *ArgChanged = nullptr); 441 442 /// Transform the given declaration, which is referenced from a type 443 /// or expression. 444 /// 445 /// By default, acts as the identity function on declarations, unless the 446 /// transformer has had to transform the declaration itself. Subclasses 447 /// may override this function to provide alternate behavior. 448 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 449 llvm::DenseMap<Decl *, Decl *>::iterator Known 450 = TransformedLocalDecls.find(D); 451 if (Known != TransformedLocalDecls.end()) 452 return Known->second; 453 454 return D; 455 } 456 457 /// Transform the specified condition. 458 /// 459 /// By default, this transforms the variable and expression and rebuilds 460 /// the condition. 461 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 462 Expr *Expr, 463 Sema::ConditionKind Kind); 464 465 /// Transform the attributes associated with the given declaration and 466 /// place them on the new declaration. 467 /// 468 /// By default, this operation does nothing. Subclasses may override this 469 /// behavior to transform attributes. 470 void transformAttrs(Decl *Old, Decl *New) { } 471 472 /// Note that a local declaration has been transformed by this 473 /// transformer. 474 /// 475 /// Local declarations are typically transformed via a call to 476 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 477 /// the transformer itself has to transform the declarations. This routine 478 /// can be overridden by a subclass that keeps track of such mappings. 479 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 480 assert(New.size() == 1 && 481 "must override transformedLocalDecl if performing pack expansion"); 482 TransformedLocalDecls[Old] = New.front(); 483 } 484 485 /// Transform the definition of the given declaration. 486 /// 487 /// By default, invokes TransformDecl() to transform the declaration. 488 /// Subclasses may override this function to provide alternate behavior. 489 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 490 return getDerived().TransformDecl(Loc, D); 491 } 492 493 /// Transform the given declaration, which was the first part of a 494 /// nested-name-specifier in a member access expression. 495 /// 496 /// This specific declaration transformation only applies to the first 497 /// identifier in a nested-name-specifier of a member access expression, e.g., 498 /// the \c T in \c x->T::member 499 /// 500 /// By default, invokes TransformDecl() to transform the declaration. 501 /// Subclasses may override this function to provide alternate behavior. 502 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 503 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 504 } 505 506 /// Transform the set of declarations in an OverloadExpr. 507 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 508 LookupResult &R); 509 510 /// Transform the given nested-name-specifier with source-location 511 /// information. 512 /// 513 /// By default, transforms all of the types and declarations within the 514 /// nested-name-specifier. Subclasses may override this function to provide 515 /// alternate behavior. 516 NestedNameSpecifierLoc 517 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 518 QualType ObjectType = QualType(), 519 NamedDecl *FirstQualifierInScope = nullptr); 520 521 /// Transform the given declaration name. 522 /// 523 /// By default, transforms the types of conversion function, constructor, 524 /// and destructor names and then (if needed) rebuilds the declaration name. 525 /// Identifiers and selectors are returned unmodified. Sublcasses may 526 /// override this function to provide alternate behavior. 527 DeclarationNameInfo 528 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 529 530 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 531 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 532 concepts::TypeRequirement * 533 TransformTypeRequirement(concepts::TypeRequirement *Req); 534 concepts::ExprRequirement * 535 TransformExprRequirement(concepts::ExprRequirement *Req); 536 concepts::NestedRequirement * 537 TransformNestedRequirement(concepts::NestedRequirement *Req); 538 539 /// Transform the given template name. 540 /// 541 /// \param SS The nested-name-specifier that qualifies the template 542 /// name. This nested-name-specifier must already have been transformed. 543 /// 544 /// \param Name The template name to transform. 545 /// 546 /// \param NameLoc The source location of the template name. 547 /// 548 /// \param ObjectType If we're translating a template name within a member 549 /// access expression, this is the type of the object whose member template 550 /// is being referenced. 551 /// 552 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 553 /// also refers to a name within the current (lexical) scope, this is the 554 /// declaration it refers to. 555 /// 556 /// By default, transforms the template name by transforming the declarations 557 /// and nested-name-specifiers that occur within the template name. 558 /// Subclasses may override this function to provide alternate behavior. 559 TemplateName 560 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 561 SourceLocation NameLoc, 562 QualType ObjectType = QualType(), 563 NamedDecl *FirstQualifierInScope = nullptr, 564 bool AllowInjectedClassName = false); 565 566 /// Transform the given template argument. 567 /// 568 /// By default, this operation transforms the type, expression, or 569 /// declaration stored within the template argument and constructs a 570 /// new template argument from the transformed result. Subclasses may 571 /// override this function to provide alternate behavior. 572 /// 573 /// Returns true if there was an error. 574 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 575 TemplateArgumentLoc &Output, 576 bool Uneval = false); 577 578 /// Transform the given set of template arguments. 579 /// 580 /// By default, this operation transforms all of the template arguments 581 /// in the input set using \c TransformTemplateArgument(), and appends 582 /// the transformed arguments to the output list. 583 /// 584 /// Note that this overload of \c TransformTemplateArguments() is merely 585 /// a convenience function. Subclasses that wish to override this behavior 586 /// should override the iterator-based member template version. 587 /// 588 /// \param Inputs The set of template arguments to be transformed. 589 /// 590 /// \param NumInputs The number of template arguments in \p Inputs. 591 /// 592 /// \param Outputs The set of transformed template arguments output by this 593 /// routine. 594 /// 595 /// Returns true if an error occurred. 596 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 597 unsigned NumInputs, 598 TemplateArgumentListInfo &Outputs, 599 bool Uneval = false) { 600 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 601 Uneval); 602 } 603 604 /// Transform the given set of template arguments. 605 /// 606 /// By default, this operation transforms all of the template arguments 607 /// in the input set using \c TransformTemplateArgument(), and appends 608 /// the transformed arguments to the output list. 609 /// 610 /// \param First An iterator to the first template argument. 611 /// 612 /// \param Last An iterator one step past the last template argument. 613 /// 614 /// \param Outputs The set of transformed template arguments output by this 615 /// routine. 616 /// 617 /// Returns true if an error occurred. 618 template<typename InputIterator> 619 bool TransformTemplateArguments(InputIterator First, 620 InputIterator Last, 621 TemplateArgumentListInfo &Outputs, 622 bool Uneval = false); 623 624 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 625 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 626 TemplateArgumentLoc &ArgLoc); 627 628 /// Fakes up a TypeSourceInfo for a type. 629 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 630 return SemaRef.Context.getTrivialTypeSourceInfo(T, 631 getDerived().getBaseLocation()); 632 } 633 634 #define ABSTRACT_TYPELOC(CLASS, PARENT) 635 #define TYPELOC(CLASS, PARENT) \ 636 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 637 #include "clang/AST/TypeLocNodes.def" 638 639 template<typename Fn> 640 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 641 FunctionProtoTypeLoc TL, 642 CXXRecordDecl *ThisContext, 643 Qualifiers ThisTypeQuals, 644 Fn TransformExceptionSpec); 645 646 bool TransformExceptionSpec(SourceLocation Loc, 647 FunctionProtoType::ExceptionSpecInfo &ESI, 648 SmallVectorImpl<QualType> &Exceptions, 649 bool &Changed); 650 651 StmtResult TransformSEHHandler(Stmt *Handler); 652 653 QualType 654 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 655 TemplateSpecializationTypeLoc TL, 656 TemplateName Template); 657 658 QualType 659 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 660 DependentTemplateSpecializationTypeLoc TL, 661 TemplateName Template, 662 CXXScopeSpec &SS); 663 664 QualType TransformDependentTemplateSpecializationType( 665 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 666 NestedNameSpecifierLoc QualifierLoc); 667 668 /// Transforms the parameters of a function type into the 669 /// given vectors. 670 /// 671 /// The result vectors should be kept in sync; null entries in the 672 /// variables vector are acceptable. 673 /// 674 /// Return true on error. 675 bool TransformFunctionTypeParams( 676 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 677 const QualType *ParamTypes, 678 const FunctionProtoType::ExtParameterInfo *ParamInfos, 679 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 680 Sema::ExtParameterInfoBuilder &PInfos); 681 682 /// Transforms a single function-type parameter. Return null 683 /// on error. 684 /// 685 /// \param indexAdjustment - A number to add to the parameter's 686 /// scope index; can be negative 687 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 688 int indexAdjustment, 689 Optional<unsigned> NumExpansions, 690 bool ExpectParameterPack); 691 692 /// Transform the body of a lambda-expression. 693 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 694 /// Alternative implementation of TransformLambdaBody that skips transforming 695 /// the body. 696 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 697 698 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 699 700 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 701 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 702 703 TemplateParameterList *TransformTemplateParameterList( 704 TemplateParameterList *TPL) { 705 return TPL; 706 } 707 708 ExprResult TransformAddressOfOperand(Expr *E); 709 710 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 711 bool IsAddressOfOperand, 712 TypeSourceInfo **RecoveryTSI); 713 714 ExprResult TransformParenDependentScopeDeclRefExpr( 715 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 716 TypeSourceInfo **RecoveryTSI); 717 718 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 719 720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 721 // amount of stack usage with clang. 722 #define STMT(Node, Parent) \ 723 LLVM_ATTRIBUTE_NOINLINE \ 724 StmtResult Transform##Node(Node *S); 725 #define VALUESTMT(Node, Parent) \ 726 LLVM_ATTRIBUTE_NOINLINE \ 727 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 728 #define EXPR(Node, Parent) \ 729 LLVM_ATTRIBUTE_NOINLINE \ 730 ExprResult Transform##Node(Node *E); 731 #define ABSTRACT_STMT(Stmt) 732 #include "clang/AST/StmtNodes.inc" 733 734 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 735 LLVM_ATTRIBUTE_NOINLINE \ 736 OMPClause *Transform ## Class(Class *S); 737 #include "llvm/Frontend/OpenMP/OMPKinds.def" 738 739 /// Build a new qualified type given its unqualified type and type location. 740 /// 741 /// By default, this routine adds type qualifiers only to types that can 742 /// have qualifiers, and silently suppresses those qualifiers that are not 743 /// permitted. Subclasses may override this routine to provide different 744 /// behavior. 745 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 746 747 /// Build a new pointer type given its pointee type. 748 /// 749 /// By default, performs semantic analysis when building the pointer type. 750 /// Subclasses may override this routine to provide different behavior. 751 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 752 753 /// Build a new block pointer type given its pointee type. 754 /// 755 /// By default, performs semantic analysis when building the block pointer 756 /// type. Subclasses may override this routine to provide different behavior. 757 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 758 759 /// Build a new reference type given the type it references. 760 /// 761 /// By default, performs semantic analysis when building the 762 /// reference type. Subclasses may override this routine to provide 763 /// different behavior. 764 /// 765 /// \param LValue whether the type was written with an lvalue sigil 766 /// or an rvalue sigil. 767 QualType RebuildReferenceType(QualType ReferentType, 768 bool LValue, 769 SourceLocation Sigil); 770 771 /// Build a new member pointer type given the pointee type and the 772 /// class type it refers into. 773 /// 774 /// By default, performs semantic analysis when building the member pointer 775 /// type. Subclasses may override this routine to provide different behavior. 776 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 777 SourceLocation Sigil); 778 779 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 780 SourceLocation ProtocolLAngleLoc, 781 ArrayRef<ObjCProtocolDecl *> Protocols, 782 ArrayRef<SourceLocation> ProtocolLocs, 783 SourceLocation ProtocolRAngleLoc); 784 785 /// Build an Objective-C object type. 786 /// 787 /// By default, performs semantic analysis when building the object type. 788 /// Subclasses may override this routine to provide different behavior. 789 QualType RebuildObjCObjectType(QualType BaseType, 790 SourceLocation Loc, 791 SourceLocation TypeArgsLAngleLoc, 792 ArrayRef<TypeSourceInfo *> TypeArgs, 793 SourceLocation TypeArgsRAngleLoc, 794 SourceLocation ProtocolLAngleLoc, 795 ArrayRef<ObjCProtocolDecl *> Protocols, 796 ArrayRef<SourceLocation> ProtocolLocs, 797 SourceLocation ProtocolRAngleLoc); 798 799 /// Build a new Objective-C object pointer type given the pointee type. 800 /// 801 /// By default, directly builds the pointer type, with no additional semantic 802 /// analysis. 803 QualType RebuildObjCObjectPointerType(QualType PointeeType, 804 SourceLocation Star); 805 806 /// Build a new array type given the element type, size 807 /// modifier, size of the array (if known), size expression, and index type 808 /// qualifiers. 809 /// 810 /// By default, performs semantic analysis when building the array type. 811 /// Subclasses may override this routine to provide different behavior. 812 /// Also by default, all of the other Rebuild*Array 813 QualType RebuildArrayType(QualType ElementType, 814 ArrayType::ArraySizeModifier SizeMod, 815 const llvm::APInt *Size, 816 Expr *SizeExpr, 817 unsigned IndexTypeQuals, 818 SourceRange BracketsRange); 819 820 /// Build a new constant array type given the element type, size 821 /// modifier, (known) size of the array, and index type qualifiers. 822 /// 823 /// By default, performs semantic analysis when building the array type. 824 /// Subclasses may override this routine to provide different behavior. 825 QualType RebuildConstantArrayType(QualType ElementType, 826 ArrayType::ArraySizeModifier SizeMod, 827 const llvm::APInt &Size, 828 Expr *SizeExpr, 829 unsigned IndexTypeQuals, 830 SourceRange BracketsRange); 831 832 /// Build a new incomplete array type given the element type, size 833 /// modifier, and index type qualifiers. 834 /// 835 /// By default, performs semantic analysis when building the array type. 836 /// Subclasses may override this routine to provide different behavior. 837 QualType RebuildIncompleteArrayType(QualType ElementType, 838 ArrayType::ArraySizeModifier SizeMod, 839 unsigned IndexTypeQuals, 840 SourceRange BracketsRange); 841 842 /// Build a new variable-length array type given the element type, 843 /// size modifier, size expression, and index type qualifiers. 844 /// 845 /// By default, performs semantic analysis when building the array type. 846 /// Subclasses may override this routine to provide different behavior. 847 QualType RebuildVariableArrayType(QualType ElementType, 848 ArrayType::ArraySizeModifier SizeMod, 849 Expr *SizeExpr, 850 unsigned IndexTypeQuals, 851 SourceRange BracketsRange); 852 853 /// Build a new dependent-sized array type given the element type, 854 /// size modifier, size expression, and index type qualifiers. 855 /// 856 /// By default, performs semantic analysis when building the array type. 857 /// Subclasses may override this routine to provide different behavior. 858 QualType RebuildDependentSizedArrayType(QualType ElementType, 859 ArrayType::ArraySizeModifier SizeMod, 860 Expr *SizeExpr, 861 unsigned IndexTypeQuals, 862 SourceRange BracketsRange); 863 864 /// Build a new vector type given the element type and 865 /// number of elements. 866 /// 867 /// By default, performs semantic analysis when building the vector type. 868 /// Subclasses may override this routine to provide different behavior. 869 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 870 VectorType::VectorKind VecKind); 871 872 /// Build a new potentially dependently-sized extended vector type 873 /// given the element type and number of elements. 874 /// 875 /// By default, performs semantic analysis when building the vector type. 876 /// Subclasses may override this routine to provide different behavior. 877 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 878 SourceLocation AttributeLoc, 879 VectorType::VectorKind); 880 881 /// Build a new extended vector type given the element type and 882 /// number of elements. 883 /// 884 /// By default, performs semantic analysis when building the vector type. 885 /// Subclasses may override this routine to provide different behavior. 886 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 887 SourceLocation AttributeLoc); 888 889 /// Build a new potentially dependently-sized extended vector type 890 /// given the element type and number of elements. 891 /// 892 /// By default, performs semantic analysis when building the vector type. 893 /// Subclasses may override this routine to provide different behavior. 894 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 895 Expr *SizeExpr, 896 SourceLocation AttributeLoc); 897 898 /// Build a new matrix type given the element type and dimensions. 899 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 900 unsigned NumColumns); 901 902 /// Build a new matrix type given the type and dependently-defined 903 /// dimensions. 904 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 905 Expr *ColumnExpr, 906 SourceLocation AttributeLoc); 907 908 /// Build a new DependentAddressSpaceType or return the pointee 909 /// type variable with the correct address space (retrieved from 910 /// AddrSpaceExpr) applied to it. The former will be returned in cases 911 /// where the address space remains dependent. 912 /// 913 /// By default, performs semantic analysis when building the type with address 914 /// space applied. Subclasses may override this routine to provide different 915 /// behavior. 916 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 917 Expr *AddrSpaceExpr, 918 SourceLocation AttributeLoc); 919 920 /// Build a new function type. 921 /// 922 /// By default, performs semantic analysis when building the function type. 923 /// Subclasses may override this routine to provide different behavior. 924 QualType RebuildFunctionProtoType(QualType T, 925 MutableArrayRef<QualType> ParamTypes, 926 const FunctionProtoType::ExtProtoInfo &EPI); 927 928 /// Build a new unprototyped function type. 929 QualType RebuildFunctionNoProtoType(QualType ResultType); 930 931 /// Rebuild an unresolved typename type, given the decl that 932 /// the UnresolvedUsingTypenameDecl was transformed to. 933 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 934 935 /// Build a new typedef type. 936 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 937 return SemaRef.Context.getTypeDeclType(Typedef); 938 } 939 940 /// Build a new MacroDefined type. 941 QualType RebuildMacroQualifiedType(QualType T, 942 const IdentifierInfo *MacroII) { 943 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 944 } 945 946 /// Build a new class/struct/union type. 947 QualType RebuildRecordType(RecordDecl *Record) { 948 return SemaRef.Context.getTypeDeclType(Record); 949 } 950 951 /// Build a new Enum type. 952 QualType RebuildEnumType(EnumDecl *Enum) { 953 return SemaRef.Context.getTypeDeclType(Enum); 954 } 955 956 /// Build a new typeof(expr) type. 957 /// 958 /// By default, performs semantic analysis when building the typeof type. 959 /// Subclasses may override this routine to provide different behavior. 960 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 961 962 /// Build a new typeof(type) type. 963 /// 964 /// By default, builds a new TypeOfType with the given underlying type. 965 QualType RebuildTypeOfType(QualType Underlying); 966 967 /// Build a new unary transform type. 968 QualType RebuildUnaryTransformType(QualType BaseType, 969 UnaryTransformType::UTTKind UKind, 970 SourceLocation Loc); 971 972 /// Build a new C++11 decltype type. 973 /// 974 /// By default, performs semantic analysis when building the decltype type. 975 /// Subclasses may override this routine to provide different behavior. 976 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 977 978 /// Build a new C++11 auto type. 979 /// 980 /// By default, builds a new AutoType with the given deduced type. 981 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 982 ConceptDecl *TypeConstraintConcept, 983 ArrayRef<TemplateArgument> TypeConstraintArgs) { 984 // Note, IsDependent is always false here: we implicitly convert an 'auto' 985 // which has been deduced to a dependent type into an undeduced 'auto', so 986 // that we'll retry deduction after the transformation. 987 return SemaRef.Context.getAutoType(Deduced, Keyword, 988 /*IsDependent*/ false, /*IsPack=*/false, 989 TypeConstraintConcept, 990 TypeConstraintArgs); 991 } 992 993 /// By default, builds a new DeducedTemplateSpecializationType with the given 994 /// deduced type. 995 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 996 QualType Deduced) { 997 return SemaRef.Context.getDeducedTemplateSpecializationType( 998 Template, Deduced, /*IsDependent*/ false); 999 } 1000 1001 /// Build a new template specialization type. 1002 /// 1003 /// By default, performs semantic analysis when building the template 1004 /// specialization type. Subclasses may override this routine to provide 1005 /// different behavior. 1006 QualType RebuildTemplateSpecializationType(TemplateName Template, 1007 SourceLocation TemplateLoc, 1008 TemplateArgumentListInfo &Args); 1009 1010 /// Build a new parenthesized type. 1011 /// 1012 /// By default, builds a new ParenType type from the inner type. 1013 /// Subclasses may override this routine to provide different behavior. 1014 QualType RebuildParenType(QualType InnerType) { 1015 return SemaRef.BuildParenType(InnerType); 1016 } 1017 1018 /// Build a new qualified name type. 1019 /// 1020 /// By default, builds a new ElaboratedType type from the keyword, 1021 /// the nested-name-specifier and the named type. 1022 /// Subclasses may override this routine to provide different behavior. 1023 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1024 ElaboratedTypeKeyword Keyword, 1025 NestedNameSpecifierLoc QualifierLoc, 1026 QualType Named) { 1027 return SemaRef.Context.getElaboratedType(Keyword, 1028 QualifierLoc.getNestedNameSpecifier(), 1029 Named); 1030 } 1031 1032 /// Build a new typename type that refers to a template-id. 1033 /// 1034 /// By default, builds a new DependentNameType type from the 1035 /// nested-name-specifier and the given type. Subclasses may override 1036 /// this routine to provide different behavior. 1037 QualType RebuildDependentTemplateSpecializationType( 1038 ElaboratedTypeKeyword Keyword, 1039 NestedNameSpecifierLoc QualifierLoc, 1040 SourceLocation TemplateKWLoc, 1041 const IdentifierInfo *Name, 1042 SourceLocation NameLoc, 1043 TemplateArgumentListInfo &Args, 1044 bool AllowInjectedClassName) { 1045 // Rebuild the template name. 1046 // TODO: avoid TemplateName abstraction 1047 CXXScopeSpec SS; 1048 SS.Adopt(QualifierLoc); 1049 TemplateName InstName = getDerived().RebuildTemplateName( 1050 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1051 AllowInjectedClassName); 1052 1053 if (InstName.isNull()) 1054 return QualType(); 1055 1056 // If it's still dependent, make a dependent specialization. 1057 if (InstName.getAsDependentTemplateName()) 1058 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1059 QualifierLoc.getNestedNameSpecifier(), 1060 Name, 1061 Args); 1062 1063 // Otherwise, make an elaborated type wrapping a non-dependent 1064 // specialization. 1065 QualType T = 1066 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1067 if (T.isNull()) return QualType(); 1068 1069 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1070 return T; 1071 1072 return SemaRef.Context.getElaboratedType(Keyword, 1073 QualifierLoc.getNestedNameSpecifier(), 1074 T); 1075 } 1076 1077 /// Build a new typename type that refers to an identifier. 1078 /// 1079 /// By default, performs semantic analysis when building the typename type 1080 /// (or elaborated type). Subclasses may override this routine to provide 1081 /// different behavior. 1082 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1083 SourceLocation KeywordLoc, 1084 NestedNameSpecifierLoc QualifierLoc, 1085 const IdentifierInfo *Id, 1086 SourceLocation IdLoc, 1087 bool DeducedTSTContext) { 1088 CXXScopeSpec SS; 1089 SS.Adopt(QualifierLoc); 1090 1091 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1092 // If the name is still dependent, just build a new dependent name type. 1093 if (!SemaRef.computeDeclContext(SS)) 1094 return SemaRef.Context.getDependentNameType(Keyword, 1095 QualifierLoc.getNestedNameSpecifier(), 1096 Id); 1097 } 1098 1099 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1100 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1101 *Id, IdLoc, DeducedTSTContext); 1102 } 1103 1104 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1105 1106 // We had a dependent elaborated-type-specifier that has been transformed 1107 // into a non-dependent elaborated-type-specifier. Find the tag we're 1108 // referring to. 1109 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1110 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1111 if (!DC) 1112 return QualType(); 1113 1114 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1115 return QualType(); 1116 1117 TagDecl *Tag = nullptr; 1118 SemaRef.LookupQualifiedName(Result, DC); 1119 switch (Result.getResultKind()) { 1120 case LookupResult::NotFound: 1121 case LookupResult::NotFoundInCurrentInstantiation: 1122 break; 1123 1124 case LookupResult::Found: 1125 Tag = Result.getAsSingle<TagDecl>(); 1126 break; 1127 1128 case LookupResult::FoundOverloaded: 1129 case LookupResult::FoundUnresolvedValue: 1130 llvm_unreachable("Tag lookup cannot find non-tags"); 1131 1132 case LookupResult::Ambiguous: 1133 // Let the LookupResult structure handle ambiguities. 1134 return QualType(); 1135 } 1136 1137 if (!Tag) { 1138 // Check where the name exists but isn't a tag type and use that to emit 1139 // better diagnostics. 1140 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1141 SemaRef.LookupQualifiedName(Result, DC); 1142 switch (Result.getResultKind()) { 1143 case LookupResult::Found: 1144 case LookupResult::FoundOverloaded: 1145 case LookupResult::FoundUnresolvedValue: { 1146 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1147 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1148 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1149 << NTK << Kind; 1150 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1151 break; 1152 } 1153 default: 1154 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1155 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1156 break; 1157 } 1158 return QualType(); 1159 } 1160 1161 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1162 IdLoc, Id)) { 1163 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1164 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1165 return QualType(); 1166 } 1167 1168 // Build the elaborated-type-specifier type. 1169 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1170 return SemaRef.Context.getElaboratedType(Keyword, 1171 QualifierLoc.getNestedNameSpecifier(), 1172 T); 1173 } 1174 1175 /// Build a new pack expansion type. 1176 /// 1177 /// By default, builds a new PackExpansionType type from the given pattern. 1178 /// Subclasses may override this routine to provide different behavior. 1179 QualType RebuildPackExpansionType(QualType Pattern, 1180 SourceRange PatternRange, 1181 SourceLocation EllipsisLoc, 1182 Optional<unsigned> NumExpansions) { 1183 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1184 NumExpansions); 1185 } 1186 1187 /// Build a new atomic type given its value type. 1188 /// 1189 /// By default, performs semantic analysis when building the atomic type. 1190 /// Subclasses may override this routine to provide different behavior. 1191 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1192 1193 /// Build a new pipe type given its value type. 1194 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1195 bool isReadPipe); 1196 1197 /// Build an extended int given its value type. 1198 QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits, 1199 SourceLocation Loc); 1200 1201 /// Build a dependent extended int given its value type. 1202 QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr, 1203 SourceLocation Loc); 1204 1205 /// Build a new template name given a nested name specifier, a flag 1206 /// indicating whether the "template" keyword was provided, and the template 1207 /// that the template name refers to. 1208 /// 1209 /// By default, builds the new template name directly. Subclasses may override 1210 /// this routine to provide different behavior. 1211 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1212 bool TemplateKW, 1213 TemplateDecl *Template); 1214 1215 /// Build a new template name given a nested name specifier and the 1216 /// name that is referred to as a template. 1217 /// 1218 /// By default, performs semantic analysis to determine whether the name can 1219 /// be resolved to a specific template, then builds the appropriate kind of 1220 /// template name. Subclasses may override this routine to provide different 1221 /// behavior. 1222 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1223 SourceLocation TemplateKWLoc, 1224 const IdentifierInfo &Name, 1225 SourceLocation NameLoc, QualType ObjectType, 1226 NamedDecl *FirstQualifierInScope, 1227 bool AllowInjectedClassName); 1228 1229 /// Build a new template name given a nested name specifier and the 1230 /// overloaded operator name that is referred to as a template. 1231 /// 1232 /// By default, performs semantic analysis to determine whether the name can 1233 /// be resolved to a specific template, then builds the appropriate kind of 1234 /// template name. Subclasses may override this routine to provide different 1235 /// behavior. 1236 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1237 SourceLocation TemplateKWLoc, 1238 OverloadedOperatorKind Operator, 1239 SourceLocation NameLoc, QualType ObjectType, 1240 bool AllowInjectedClassName); 1241 1242 /// Build a new template name given a template template parameter pack 1243 /// and the 1244 /// 1245 /// By default, performs semantic analysis to determine whether the name can 1246 /// be resolved to a specific template, then builds the appropriate kind of 1247 /// template name. Subclasses may override this routine to provide different 1248 /// behavior. 1249 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1250 const TemplateArgument &ArgPack) { 1251 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1252 } 1253 1254 /// Build a new compound statement. 1255 /// 1256 /// By default, performs semantic analysis to build the new statement. 1257 /// Subclasses may override this routine to provide different behavior. 1258 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1259 MultiStmtArg Statements, 1260 SourceLocation RBraceLoc, 1261 bool IsStmtExpr) { 1262 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1263 IsStmtExpr); 1264 } 1265 1266 /// Build a new case statement. 1267 /// 1268 /// By default, performs semantic analysis to build the new statement. 1269 /// Subclasses may override this routine to provide different behavior. 1270 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1271 Expr *LHS, 1272 SourceLocation EllipsisLoc, 1273 Expr *RHS, 1274 SourceLocation ColonLoc) { 1275 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1276 ColonLoc); 1277 } 1278 1279 /// Attach the body to a new case statement. 1280 /// 1281 /// By default, performs semantic analysis to build the new statement. 1282 /// Subclasses may override this routine to provide different behavior. 1283 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1284 getSema().ActOnCaseStmtBody(S, Body); 1285 return S; 1286 } 1287 1288 /// Build a new default statement. 1289 /// 1290 /// By default, performs semantic analysis to build the new statement. 1291 /// Subclasses may override this routine to provide different behavior. 1292 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1293 SourceLocation ColonLoc, 1294 Stmt *SubStmt) { 1295 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1296 /*CurScope=*/nullptr); 1297 } 1298 1299 /// Build a new label statement. 1300 /// 1301 /// By default, performs semantic analysis to build the new statement. 1302 /// Subclasses may override this routine to provide different behavior. 1303 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1304 SourceLocation ColonLoc, Stmt *SubStmt) { 1305 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1306 } 1307 1308 /// Build a new label statement. 1309 /// 1310 /// By default, performs semantic analysis to build the new statement. 1311 /// Subclasses may override this routine to provide different behavior. 1312 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1313 ArrayRef<const Attr*> Attrs, 1314 Stmt *SubStmt) { 1315 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1316 } 1317 1318 /// Build a new "if" statement. 1319 /// 1320 /// By default, performs semantic analysis to build the new statement. 1321 /// Subclasses may override this routine to provide different behavior. 1322 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1323 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1324 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1325 SourceLocation ElseLoc, Stmt *Else) { 1326 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond, 1327 RParenLoc, Then, ElseLoc, Else); 1328 } 1329 1330 /// Start building a new switch statement. 1331 /// 1332 /// By default, performs semantic analysis to build the new statement. 1333 /// Subclasses may override this routine to provide different behavior. 1334 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1335 SourceLocation LParenLoc, Stmt *Init, 1336 Sema::ConditionResult Cond, 1337 SourceLocation RParenLoc) { 1338 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1339 RParenLoc); 1340 } 1341 1342 /// Attach the body to the switch statement. 1343 /// 1344 /// By default, performs semantic analysis to build the new statement. 1345 /// Subclasses may override this routine to provide different behavior. 1346 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1347 Stmt *Switch, Stmt *Body) { 1348 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1349 } 1350 1351 /// Build a new while statement. 1352 /// 1353 /// By default, performs semantic analysis to build the new statement. 1354 /// Subclasses may override this routine to provide different behavior. 1355 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1356 Sema::ConditionResult Cond, 1357 SourceLocation RParenLoc, Stmt *Body) { 1358 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1359 } 1360 1361 /// Build a new do-while statement. 1362 /// 1363 /// By default, performs semantic analysis to build the new statement. 1364 /// Subclasses may override this routine to provide different behavior. 1365 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1366 SourceLocation WhileLoc, SourceLocation LParenLoc, 1367 Expr *Cond, SourceLocation RParenLoc) { 1368 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1369 Cond, RParenLoc); 1370 } 1371 1372 /// Build a new for statement. 1373 /// 1374 /// By default, performs semantic analysis to build the new statement. 1375 /// Subclasses may override this routine to provide different behavior. 1376 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1377 Stmt *Init, Sema::ConditionResult Cond, 1378 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1379 Stmt *Body) { 1380 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1381 Inc, RParenLoc, Body); 1382 } 1383 1384 /// Build a new goto statement. 1385 /// 1386 /// By default, performs semantic analysis to build the new statement. 1387 /// Subclasses may override this routine to provide different behavior. 1388 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1389 LabelDecl *Label) { 1390 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1391 } 1392 1393 /// Build a new indirect goto statement. 1394 /// 1395 /// By default, performs semantic analysis to build the new statement. 1396 /// Subclasses may override this routine to provide different behavior. 1397 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1398 SourceLocation StarLoc, 1399 Expr *Target) { 1400 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1401 } 1402 1403 /// Build a new return statement. 1404 /// 1405 /// By default, performs semantic analysis to build the new statement. 1406 /// Subclasses may override this routine to provide different behavior. 1407 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1408 return getSema().BuildReturnStmt(ReturnLoc, Result); 1409 } 1410 1411 /// Build a new declaration statement. 1412 /// 1413 /// By default, performs semantic analysis to build the new statement. 1414 /// Subclasses may override this routine to provide different behavior. 1415 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1416 SourceLocation StartLoc, SourceLocation EndLoc) { 1417 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1418 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1419 } 1420 1421 /// Build a new inline asm statement. 1422 /// 1423 /// By default, performs semantic analysis to build the new statement. 1424 /// Subclasses may override this routine to provide different behavior. 1425 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1426 bool IsVolatile, unsigned NumOutputs, 1427 unsigned NumInputs, IdentifierInfo **Names, 1428 MultiExprArg Constraints, MultiExprArg Exprs, 1429 Expr *AsmString, MultiExprArg Clobbers, 1430 unsigned NumLabels, 1431 SourceLocation RParenLoc) { 1432 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1433 NumInputs, Names, Constraints, Exprs, 1434 AsmString, Clobbers, NumLabels, RParenLoc); 1435 } 1436 1437 /// Build a new MS style inline asm statement. 1438 /// 1439 /// By default, performs semantic analysis to build the new statement. 1440 /// Subclasses may override this routine to provide different behavior. 1441 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1442 ArrayRef<Token> AsmToks, 1443 StringRef AsmString, 1444 unsigned NumOutputs, unsigned NumInputs, 1445 ArrayRef<StringRef> Constraints, 1446 ArrayRef<StringRef> Clobbers, 1447 ArrayRef<Expr*> Exprs, 1448 SourceLocation EndLoc) { 1449 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1450 NumOutputs, NumInputs, 1451 Constraints, Clobbers, Exprs, EndLoc); 1452 } 1453 1454 /// Build a new co_return statement. 1455 /// 1456 /// By default, performs semantic analysis to build the new statement. 1457 /// Subclasses may override this routine to provide different behavior. 1458 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1459 bool IsImplicit) { 1460 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1461 } 1462 1463 /// Build a new co_await expression. 1464 /// 1465 /// By default, performs semantic analysis to build the new expression. 1466 /// Subclasses may override this routine to provide different behavior. 1467 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1468 bool IsImplicit) { 1469 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1470 } 1471 1472 /// Build a new co_await expression. 1473 /// 1474 /// By default, performs semantic analysis to build the new expression. 1475 /// Subclasses may override this routine to provide different behavior. 1476 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1477 Expr *Result, 1478 UnresolvedLookupExpr *Lookup) { 1479 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1480 } 1481 1482 /// Build a new co_yield expression. 1483 /// 1484 /// By default, performs semantic analysis to build the new expression. 1485 /// Subclasses may override this routine to provide different behavior. 1486 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1487 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1488 } 1489 1490 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1491 return getSema().BuildCoroutineBodyStmt(Args); 1492 } 1493 1494 /// Build a new Objective-C \@try statement. 1495 /// 1496 /// By default, performs semantic analysis to build the new statement. 1497 /// Subclasses may override this routine to provide different behavior. 1498 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1499 Stmt *TryBody, 1500 MultiStmtArg CatchStmts, 1501 Stmt *Finally) { 1502 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1503 Finally); 1504 } 1505 1506 /// Rebuild an Objective-C exception declaration. 1507 /// 1508 /// By default, performs semantic analysis to build the new declaration. 1509 /// Subclasses may override this routine to provide different behavior. 1510 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1511 TypeSourceInfo *TInfo, QualType T) { 1512 return getSema().BuildObjCExceptionDecl(TInfo, T, 1513 ExceptionDecl->getInnerLocStart(), 1514 ExceptionDecl->getLocation(), 1515 ExceptionDecl->getIdentifier()); 1516 } 1517 1518 /// Build a new Objective-C \@catch statement. 1519 /// 1520 /// By default, performs semantic analysis to build the new statement. 1521 /// Subclasses may override this routine to provide different behavior. 1522 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1523 SourceLocation RParenLoc, 1524 VarDecl *Var, 1525 Stmt *Body) { 1526 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1527 Var, Body); 1528 } 1529 1530 /// Build a new Objective-C \@finally statement. 1531 /// 1532 /// By default, performs semantic analysis to build the new statement. 1533 /// Subclasses may override this routine to provide different behavior. 1534 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1535 Stmt *Body) { 1536 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1537 } 1538 1539 /// Build a new Objective-C \@throw statement. 1540 /// 1541 /// By default, performs semantic analysis to build the new statement. 1542 /// Subclasses may override this routine to provide different behavior. 1543 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1544 Expr *Operand) { 1545 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1546 } 1547 1548 /// Build a new OpenMP executable directive. 1549 /// 1550 /// By default, performs semantic analysis to build the new statement. 1551 /// Subclasses may override this routine to provide different behavior. 1552 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1553 DeclarationNameInfo DirName, 1554 OpenMPDirectiveKind CancelRegion, 1555 ArrayRef<OMPClause *> Clauses, 1556 Stmt *AStmt, SourceLocation StartLoc, 1557 SourceLocation EndLoc) { 1558 return getSema().ActOnOpenMPExecutableDirective( 1559 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1560 } 1561 1562 /// Build a new OpenMP 'if' clause. 1563 /// 1564 /// By default, performs semantic analysis to build the new OpenMP clause. 1565 /// Subclasses may override this routine to provide different behavior. 1566 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1567 Expr *Condition, SourceLocation StartLoc, 1568 SourceLocation LParenLoc, 1569 SourceLocation NameModifierLoc, 1570 SourceLocation ColonLoc, 1571 SourceLocation EndLoc) { 1572 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1573 LParenLoc, NameModifierLoc, ColonLoc, 1574 EndLoc); 1575 } 1576 1577 /// Build a new OpenMP 'final' clause. 1578 /// 1579 /// By default, performs semantic analysis to build the new OpenMP clause. 1580 /// Subclasses may override this routine to provide different behavior. 1581 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1582 SourceLocation LParenLoc, 1583 SourceLocation EndLoc) { 1584 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1585 EndLoc); 1586 } 1587 1588 /// Build a new OpenMP 'num_threads' clause. 1589 /// 1590 /// By default, performs semantic analysis to build the new OpenMP clause. 1591 /// Subclasses may override this routine to provide different behavior. 1592 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1593 SourceLocation StartLoc, 1594 SourceLocation LParenLoc, 1595 SourceLocation EndLoc) { 1596 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1597 LParenLoc, EndLoc); 1598 } 1599 1600 /// Build a new OpenMP 'safelen' clause. 1601 /// 1602 /// By default, performs semantic analysis to build the new OpenMP clause. 1603 /// Subclasses may override this routine to provide different behavior. 1604 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1605 SourceLocation LParenLoc, 1606 SourceLocation EndLoc) { 1607 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1608 } 1609 1610 /// Build a new OpenMP 'simdlen' clause. 1611 /// 1612 /// By default, performs semantic analysis to build the new OpenMP clause. 1613 /// Subclasses may override this routine to provide different behavior. 1614 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1615 SourceLocation LParenLoc, 1616 SourceLocation EndLoc) { 1617 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1618 } 1619 1620 /// Build a new OpenMP 'allocator' clause. 1621 /// 1622 /// By default, performs semantic analysis to build the new OpenMP clause. 1623 /// Subclasses may override this routine to provide different behavior. 1624 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1625 SourceLocation LParenLoc, 1626 SourceLocation EndLoc) { 1627 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1628 } 1629 1630 /// Build a new OpenMP 'collapse' clause. 1631 /// 1632 /// By default, performs semantic analysis to build the new OpenMP clause. 1633 /// Subclasses may override this routine to provide different behavior. 1634 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1635 SourceLocation LParenLoc, 1636 SourceLocation EndLoc) { 1637 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1638 EndLoc); 1639 } 1640 1641 /// Build a new OpenMP 'default' clause. 1642 /// 1643 /// By default, performs semantic analysis to build the new OpenMP clause. 1644 /// Subclasses may override this routine to provide different behavior. 1645 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1646 SourceLocation StartLoc, 1647 SourceLocation LParenLoc, 1648 SourceLocation EndLoc) { 1649 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1650 StartLoc, LParenLoc, EndLoc); 1651 } 1652 1653 /// Build a new OpenMP 'proc_bind' clause. 1654 /// 1655 /// By default, performs semantic analysis to build the new OpenMP clause. 1656 /// Subclasses may override this routine to provide different behavior. 1657 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1658 SourceLocation KindKwLoc, 1659 SourceLocation StartLoc, 1660 SourceLocation LParenLoc, 1661 SourceLocation EndLoc) { 1662 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1663 StartLoc, LParenLoc, EndLoc); 1664 } 1665 1666 /// Build a new OpenMP 'schedule' clause. 1667 /// 1668 /// By default, performs semantic analysis to build the new OpenMP clause. 1669 /// Subclasses may override this routine to provide different behavior. 1670 OMPClause *RebuildOMPScheduleClause( 1671 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1672 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1673 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1674 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1675 return getSema().ActOnOpenMPScheduleClause( 1676 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1677 CommaLoc, EndLoc); 1678 } 1679 1680 /// Build a new OpenMP 'ordered' clause. 1681 /// 1682 /// By default, performs semantic analysis to build the new OpenMP clause. 1683 /// Subclasses may override this routine to provide different behavior. 1684 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1685 SourceLocation EndLoc, 1686 SourceLocation LParenLoc, Expr *Num) { 1687 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1688 } 1689 1690 /// Build a new OpenMP 'private' clause. 1691 /// 1692 /// By default, performs semantic analysis to build the new OpenMP clause. 1693 /// Subclasses may override this routine to provide different behavior. 1694 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1695 SourceLocation StartLoc, 1696 SourceLocation LParenLoc, 1697 SourceLocation EndLoc) { 1698 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1699 EndLoc); 1700 } 1701 1702 /// Build a new OpenMP 'firstprivate' clause. 1703 /// 1704 /// By default, performs semantic analysis to build the new OpenMP clause. 1705 /// Subclasses may override this routine to provide different behavior. 1706 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1707 SourceLocation StartLoc, 1708 SourceLocation LParenLoc, 1709 SourceLocation EndLoc) { 1710 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1711 EndLoc); 1712 } 1713 1714 /// Build a new OpenMP 'lastprivate' clause. 1715 /// 1716 /// By default, performs semantic analysis to build the new OpenMP clause. 1717 /// Subclasses may override this routine to provide different behavior. 1718 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1719 OpenMPLastprivateModifier LPKind, 1720 SourceLocation LPKindLoc, 1721 SourceLocation ColonLoc, 1722 SourceLocation StartLoc, 1723 SourceLocation LParenLoc, 1724 SourceLocation EndLoc) { 1725 return getSema().ActOnOpenMPLastprivateClause( 1726 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1727 } 1728 1729 /// Build a new OpenMP 'shared' clause. 1730 /// 1731 /// By default, performs semantic analysis to build the new OpenMP clause. 1732 /// Subclasses may override this routine to provide different behavior. 1733 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1734 SourceLocation StartLoc, 1735 SourceLocation LParenLoc, 1736 SourceLocation EndLoc) { 1737 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1738 EndLoc); 1739 } 1740 1741 /// Build a new OpenMP 'reduction' clause. 1742 /// 1743 /// By default, performs semantic analysis to build the new statement. 1744 /// Subclasses may override this routine to provide different behavior. 1745 OMPClause *RebuildOMPReductionClause( 1746 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1747 SourceLocation StartLoc, SourceLocation LParenLoc, 1748 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1749 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1750 const DeclarationNameInfo &ReductionId, 1751 ArrayRef<Expr *> UnresolvedReductions) { 1752 return getSema().ActOnOpenMPReductionClause( 1753 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1754 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1755 } 1756 1757 /// Build a new OpenMP 'task_reduction' clause. 1758 /// 1759 /// By default, performs semantic analysis to build the new statement. 1760 /// Subclasses may override this routine to provide different behavior. 1761 OMPClause *RebuildOMPTaskReductionClause( 1762 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1763 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1764 CXXScopeSpec &ReductionIdScopeSpec, 1765 const DeclarationNameInfo &ReductionId, 1766 ArrayRef<Expr *> UnresolvedReductions) { 1767 return getSema().ActOnOpenMPTaskReductionClause( 1768 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1769 ReductionId, UnresolvedReductions); 1770 } 1771 1772 /// Build a new OpenMP 'in_reduction' clause. 1773 /// 1774 /// By default, performs semantic analysis to build the new statement. 1775 /// Subclasses may override this routine to provide different behavior. 1776 OMPClause * 1777 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1778 SourceLocation LParenLoc, SourceLocation ColonLoc, 1779 SourceLocation EndLoc, 1780 CXXScopeSpec &ReductionIdScopeSpec, 1781 const DeclarationNameInfo &ReductionId, 1782 ArrayRef<Expr *> UnresolvedReductions) { 1783 return getSema().ActOnOpenMPInReductionClause( 1784 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1785 ReductionId, UnresolvedReductions); 1786 } 1787 1788 /// Build a new OpenMP 'linear' clause. 1789 /// 1790 /// By default, performs semantic analysis to build the new OpenMP clause. 1791 /// Subclasses may override this routine to provide different behavior. 1792 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1793 SourceLocation StartLoc, 1794 SourceLocation LParenLoc, 1795 OpenMPLinearClauseKind Modifier, 1796 SourceLocation ModifierLoc, 1797 SourceLocation ColonLoc, 1798 SourceLocation EndLoc) { 1799 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1800 Modifier, ModifierLoc, ColonLoc, 1801 EndLoc); 1802 } 1803 1804 /// Build a new OpenMP 'aligned' clause. 1805 /// 1806 /// By default, performs semantic analysis to build the new OpenMP clause. 1807 /// Subclasses may override this routine to provide different behavior. 1808 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1809 SourceLocation StartLoc, 1810 SourceLocation LParenLoc, 1811 SourceLocation ColonLoc, 1812 SourceLocation EndLoc) { 1813 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1814 LParenLoc, ColonLoc, EndLoc); 1815 } 1816 1817 /// Build a new OpenMP 'copyin' clause. 1818 /// 1819 /// By default, performs semantic analysis to build the new OpenMP clause. 1820 /// Subclasses may override this routine to provide different behavior. 1821 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1822 SourceLocation StartLoc, 1823 SourceLocation LParenLoc, 1824 SourceLocation EndLoc) { 1825 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1826 EndLoc); 1827 } 1828 1829 /// Build a new OpenMP 'copyprivate' clause. 1830 /// 1831 /// By default, performs semantic analysis to build the new OpenMP clause. 1832 /// Subclasses may override this routine to provide different behavior. 1833 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1834 SourceLocation StartLoc, 1835 SourceLocation LParenLoc, 1836 SourceLocation EndLoc) { 1837 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1838 EndLoc); 1839 } 1840 1841 /// Build a new OpenMP 'flush' pseudo clause. 1842 /// 1843 /// By default, performs semantic analysis to build the new OpenMP clause. 1844 /// Subclasses may override this routine to provide different behavior. 1845 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1846 SourceLocation StartLoc, 1847 SourceLocation LParenLoc, 1848 SourceLocation EndLoc) { 1849 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1850 EndLoc); 1851 } 1852 1853 /// Build a new OpenMP 'depobj' pseudo clause. 1854 /// 1855 /// By default, performs semantic analysis to build the new OpenMP clause. 1856 /// Subclasses may override this routine to provide different behavior. 1857 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1858 SourceLocation LParenLoc, 1859 SourceLocation EndLoc) { 1860 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1861 EndLoc); 1862 } 1863 1864 /// Build a new OpenMP 'depend' pseudo clause. 1865 /// 1866 /// By default, performs semantic analysis to build the new OpenMP clause. 1867 /// Subclasses may override this routine to provide different behavior. 1868 OMPClause * 1869 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1870 SourceLocation DepLoc, SourceLocation ColonLoc, 1871 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1872 SourceLocation LParenLoc, SourceLocation EndLoc) { 1873 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1874 ColonLoc, VarList, StartLoc, 1875 LParenLoc, EndLoc); 1876 } 1877 1878 /// Build a new OpenMP 'device' clause. 1879 /// 1880 /// By default, performs semantic analysis to build the new statement. 1881 /// Subclasses may override this routine to provide different behavior. 1882 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1883 Expr *Device, SourceLocation StartLoc, 1884 SourceLocation LParenLoc, 1885 SourceLocation ModifierLoc, 1886 SourceLocation EndLoc) { 1887 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1888 LParenLoc, ModifierLoc, EndLoc); 1889 } 1890 1891 /// Build a new OpenMP 'map' clause. 1892 /// 1893 /// By default, performs semantic analysis to build the new OpenMP clause. 1894 /// Subclasses may override this routine to provide different behavior. 1895 OMPClause *RebuildOMPMapClause( 1896 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1897 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1898 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1899 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1900 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1901 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1902 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1903 MapperIdScopeSpec, MapperId, MapType, 1904 IsMapTypeImplicit, MapLoc, ColonLoc, 1905 VarList, Locs, UnresolvedMappers); 1906 } 1907 1908 /// Build a new OpenMP 'allocate' clause. 1909 /// 1910 /// By default, performs semantic analysis to build the new OpenMP clause. 1911 /// Subclasses may override this routine to provide different behavior. 1912 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1913 SourceLocation StartLoc, 1914 SourceLocation LParenLoc, 1915 SourceLocation ColonLoc, 1916 SourceLocation EndLoc) { 1917 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1918 LParenLoc, ColonLoc, EndLoc); 1919 } 1920 1921 /// Build a new OpenMP 'num_teams' clause. 1922 /// 1923 /// By default, performs semantic analysis to build the new statement. 1924 /// Subclasses may override this routine to provide different behavior. 1925 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1926 SourceLocation LParenLoc, 1927 SourceLocation EndLoc) { 1928 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1929 EndLoc); 1930 } 1931 1932 /// Build a new OpenMP 'thread_limit' clause. 1933 /// 1934 /// By default, performs semantic analysis to build the new statement. 1935 /// Subclasses may override this routine to provide different behavior. 1936 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1937 SourceLocation StartLoc, 1938 SourceLocation LParenLoc, 1939 SourceLocation EndLoc) { 1940 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1941 LParenLoc, EndLoc); 1942 } 1943 1944 /// Build a new OpenMP 'priority' clause. 1945 /// 1946 /// By default, performs semantic analysis to build the new statement. 1947 /// Subclasses may override this routine to provide different behavior. 1948 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1949 SourceLocation LParenLoc, 1950 SourceLocation EndLoc) { 1951 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1952 EndLoc); 1953 } 1954 1955 /// Build a new OpenMP 'grainsize' clause. 1956 /// 1957 /// By default, performs semantic analysis to build the new statement. 1958 /// Subclasses may override this routine to provide different behavior. 1959 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1960 SourceLocation LParenLoc, 1961 SourceLocation EndLoc) { 1962 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1963 EndLoc); 1964 } 1965 1966 /// Build a new OpenMP 'num_tasks' clause. 1967 /// 1968 /// By default, performs semantic analysis to build the new statement. 1969 /// Subclasses may override this routine to provide different behavior. 1970 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1971 SourceLocation LParenLoc, 1972 SourceLocation EndLoc) { 1973 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1974 EndLoc); 1975 } 1976 1977 /// Build a new OpenMP 'hint' clause. 1978 /// 1979 /// By default, performs semantic analysis to build the new statement. 1980 /// Subclasses may override this routine to provide different behavior. 1981 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1982 SourceLocation LParenLoc, 1983 SourceLocation EndLoc) { 1984 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1985 } 1986 1987 /// Build a new OpenMP 'detach' clause. 1988 /// 1989 /// By default, performs semantic analysis to build the new statement. 1990 /// Subclasses may override this routine to provide different behavior. 1991 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 1992 SourceLocation LParenLoc, 1993 SourceLocation EndLoc) { 1994 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 1995 } 1996 1997 /// Build a new OpenMP 'dist_schedule' clause. 1998 /// 1999 /// By default, performs semantic analysis to build the new OpenMP clause. 2000 /// Subclasses may override this routine to provide different behavior. 2001 OMPClause * 2002 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2003 Expr *ChunkSize, SourceLocation StartLoc, 2004 SourceLocation LParenLoc, SourceLocation KindLoc, 2005 SourceLocation CommaLoc, SourceLocation EndLoc) { 2006 return getSema().ActOnOpenMPDistScheduleClause( 2007 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2008 } 2009 2010 /// Build a new OpenMP 'to' clause. 2011 /// 2012 /// By default, performs semantic analysis to build the new statement. 2013 /// Subclasses may override this routine to provide different behavior. 2014 OMPClause * 2015 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2016 ArrayRef<SourceLocation> MotionModifiersLoc, 2017 CXXScopeSpec &MapperIdScopeSpec, 2018 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2019 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2020 ArrayRef<Expr *> UnresolvedMappers) { 2021 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2022 MapperIdScopeSpec, MapperId, ColonLoc, 2023 VarList, Locs, UnresolvedMappers); 2024 } 2025 2026 /// Build a new OpenMP 'from' clause. 2027 /// 2028 /// By default, performs semantic analysis to build the new statement. 2029 /// Subclasses may override this routine to provide different behavior. 2030 OMPClause * 2031 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2032 ArrayRef<SourceLocation> MotionModifiersLoc, 2033 CXXScopeSpec &MapperIdScopeSpec, 2034 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2035 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2036 ArrayRef<Expr *> UnresolvedMappers) { 2037 return getSema().ActOnOpenMPFromClause( 2038 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2039 ColonLoc, VarList, Locs, UnresolvedMappers); 2040 } 2041 2042 /// Build a new OpenMP 'use_device_ptr' clause. 2043 /// 2044 /// By default, performs semantic analysis to build the new OpenMP clause. 2045 /// Subclasses may override this routine to provide different behavior. 2046 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2047 const OMPVarListLocTy &Locs) { 2048 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2049 } 2050 2051 /// Build a new OpenMP 'use_device_addr' clause. 2052 /// 2053 /// By default, performs semantic analysis to build the new OpenMP clause. 2054 /// Subclasses may override this routine to provide different behavior. 2055 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2056 const OMPVarListLocTy &Locs) { 2057 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2058 } 2059 2060 /// Build a new OpenMP 'is_device_ptr' clause. 2061 /// 2062 /// By default, performs semantic analysis to build the new OpenMP clause. 2063 /// Subclasses may override this routine to provide different behavior. 2064 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2065 const OMPVarListLocTy &Locs) { 2066 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2067 } 2068 2069 /// Build a new OpenMP 'defaultmap' clause. 2070 /// 2071 /// By default, performs semantic analysis to build the new OpenMP clause. 2072 /// Subclasses may override this routine to provide different behavior. 2073 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2074 OpenMPDefaultmapClauseKind Kind, 2075 SourceLocation StartLoc, 2076 SourceLocation LParenLoc, 2077 SourceLocation MLoc, 2078 SourceLocation KindLoc, 2079 SourceLocation EndLoc) { 2080 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2081 MLoc, KindLoc, EndLoc); 2082 } 2083 2084 /// Build a new OpenMP 'nontemporal' clause. 2085 /// 2086 /// By default, performs semantic analysis to build the new OpenMP clause. 2087 /// Subclasses may override this routine to provide different behavior. 2088 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2089 SourceLocation StartLoc, 2090 SourceLocation LParenLoc, 2091 SourceLocation EndLoc) { 2092 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2093 EndLoc); 2094 } 2095 2096 /// Build a new OpenMP 'inclusive' clause. 2097 /// 2098 /// By default, performs semantic analysis to build the new OpenMP clause. 2099 /// Subclasses may override this routine to provide different behavior. 2100 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2101 SourceLocation StartLoc, 2102 SourceLocation LParenLoc, 2103 SourceLocation EndLoc) { 2104 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2105 EndLoc); 2106 } 2107 2108 /// Build a new OpenMP 'exclusive' clause. 2109 /// 2110 /// By default, performs semantic analysis to build the new OpenMP clause. 2111 /// Subclasses may override this routine to provide different behavior. 2112 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2113 SourceLocation StartLoc, 2114 SourceLocation LParenLoc, 2115 SourceLocation EndLoc) { 2116 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2117 EndLoc); 2118 } 2119 2120 /// Build a new OpenMP 'uses_allocators' clause. 2121 /// 2122 /// By default, performs semantic analysis to build the new OpenMP clause. 2123 /// Subclasses may override this routine to provide different behavior. 2124 OMPClause *RebuildOMPUsesAllocatorsClause( 2125 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2126 SourceLocation LParenLoc, SourceLocation EndLoc) { 2127 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2128 Data); 2129 } 2130 2131 /// Build a new OpenMP 'affinity' clause. 2132 /// 2133 /// By default, performs semantic analysis to build the new OpenMP clause. 2134 /// Subclasses may override this routine to provide different behavior. 2135 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2136 SourceLocation LParenLoc, 2137 SourceLocation ColonLoc, 2138 SourceLocation EndLoc, Expr *Modifier, 2139 ArrayRef<Expr *> Locators) { 2140 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2141 EndLoc, Modifier, Locators); 2142 } 2143 2144 /// Build a new OpenMP 'order' clause. 2145 /// 2146 /// By default, performs semantic analysis to build the new OpenMP clause. 2147 /// Subclasses may override this routine to provide different behavior. 2148 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2149 SourceLocation KindKwLoc, 2150 SourceLocation StartLoc, 2151 SourceLocation LParenLoc, 2152 SourceLocation EndLoc) { 2153 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2154 LParenLoc, EndLoc); 2155 } 2156 2157 /// Rebuild the operand to an Objective-C \@synchronized statement. 2158 /// 2159 /// By default, performs semantic analysis to build the new statement. 2160 /// Subclasses may override this routine to provide different behavior. 2161 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2162 Expr *object) { 2163 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2164 } 2165 2166 /// Build a new Objective-C \@synchronized statement. 2167 /// 2168 /// By default, performs semantic analysis to build the new statement. 2169 /// Subclasses may override this routine to provide different behavior. 2170 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2171 Expr *Object, Stmt *Body) { 2172 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2173 } 2174 2175 /// Build a new Objective-C \@autoreleasepool statement. 2176 /// 2177 /// By default, performs semantic analysis to build the new statement. 2178 /// Subclasses may override this routine to provide different behavior. 2179 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2180 Stmt *Body) { 2181 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2182 } 2183 2184 /// Build a new Objective-C fast enumeration statement. 2185 /// 2186 /// By default, performs semantic analysis to build the new statement. 2187 /// Subclasses may override this routine to provide different behavior. 2188 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2189 Stmt *Element, 2190 Expr *Collection, 2191 SourceLocation RParenLoc, 2192 Stmt *Body) { 2193 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2194 Element, 2195 Collection, 2196 RParenLoc); 2197 if (ForEachStmt.isInvalid()) 2198 return StmtError(); 2199 2200 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2201 } 2202 2203 /// Build a new C++ exception declaration. 2204 /// 2205 /// By default, performs semantic analysis to build the new decaration. 2206 /// Subclasses may override this routine to provide different behavior. 2207 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2208 TypeSourceInfo *Declarator, 2209 SourceLocation StartLoc, 2210 SourceLocation IdLoc, 2211 IdentifierInfo *Id) { 2212 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2213 StartLoc, IdLoc, Id); 2214 if (Var) 2215 getSema().CurContext->addDecl(Var); 2216 return Var; 2217 } 2218 2219 /// Build a new C++ catch statement. 2220 /// 2221 /// By default, performs semantic analysis to build the new statement. 2222 /// Subclasses may override this routine to provide different behavior. 2223 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2224 VarDecl *ExceptionDecl, 2225 Stmt *Handler) { 2226 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2227 Handler)); 2228 } 2229 2230 /// Build a new C++ try statement. 2231 /// 2232 /// By default, performs semantic analysis to build the new statement. 2233 /// Subclasses may override this routine to provide different behavior. 2234 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2235 ArrayRef<Stmt *> Handlers) { 2236 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2237 } 2238 2239 /// Build a new C++0x range-based for statement. 2240 /// 2241 /// By default, performs semantic analysis to build the new statement. 2242 /// Subclasses may override this routine to provide different behavior. 2243 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2244 SourceLocation CoawaitLoc, Stmt *Init, 2245 SourceLocation ColonLoc, Stmt *Range, 2246 Stmt *Begin, Stmt *End, Expr *Cond, 2247 Expr *Inc, Stmt *LoopVar, 2248 SourceLocation RParenLoc) { 2249 // If we've just learned that the range is actually an Objective-C 2250 // collection, treat this as an Objective-C fast enumeration loop. 2251 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2252 if (RangeStmt->isSingleDecl()) { 2253 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2254 if (RangeVar->isInvalidDecl()) 2255 return StmtError(); 2256 2257 Expr *RangeExpr = RangeVar->getInit(); 2258 if (!RangeExpr->isTypeDependent() && 2259 RangeExpr->getType()->isObjCObjectPointerType()) { 2260 // FIXME: Support init-statements in Objective-C++20 ranged for 2261 // statement. 2262 if (Init) { 2263 return SemaRef.Diag(Init->getBeginLoc(), 2264 diag::err_objc_for_range_init_stmt) 2265 << Init->getSourceRange(); 2266 } 2267 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2268 RangeExpr, RParenLoc); 2269 } 2270 } 2271 } 2272 } 2273 2274 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2275 Range, Begin, End, Cond, Inc, LoopVar, 2276 RParenLoc, Sema::BFRK_Rebuild); 2277 } 2278 2279 /// Build a new C++0x range-based for statement. 2280 /// 2281 /// By default, performs semantic analysis to build the new statement. 2282 /// Subclasses may override this routine to provide different behavior. 2283 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2284 bool IsIfExists, 2285 NestedNameSpecifierLoc QualifierLoc, 2286 DeclarationNameInfo NameInfo, 2287 Stmt *Nested) { 2288 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2289 QualifierLoc, NameInfo, Nested); 2290 } 2291 2292 /// Attach body to a C++0x range-based for statement. 2293 /// 2294 /// By default, performs semantic analysis to finish the new statement. 2295 /// Subclasses may override this routine to provide different behavior. 2296 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2297 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2298 } 2299 2300 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2301 Stmt *TryBlock, Stmt *Handler) { 2302 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2303 } 2304 2305 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2306 Stmt *Block) { 2307 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2308 } 2309 2310 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2311 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2312 } 2313 2314 /// Build a new predefined expression. 2315 /// 2316 /// By default, performs semantic analysis to build the new expression. 2317 /// Subclasses may override this routine to provide different behavior. 2318 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2319 PredefinedExpr::IdentKind IK) { 2320 return getSema().BuildPredefinedExpr(Loc, IK); 2321 } 2322 2323 /// Build a new expression that references a declaration. 2324 /// 2325 /// By default, performs semantic analysis to build the new expression. 2326 /// Subclasses may override this routine to provide different behavior. 2327 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2328 LookupResult &R, 2329 bool RequiresADL) { 2330 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2331 } 2332 2333 2334 /// Build a new expression that references a declaration. 2335 /// 2336 /// By default, performs semantic analysis to build the new expression. 2337 /// Subclasses may override this routine to provide different behavior. 2338 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2339 ValueDecl *VD, 2340 const DeclarationNameInfo &NameInfo, 2341 NamedDecl *Found, 2342 TemplateArgumentListInfo *TemplateArgs) { 2343 CXXScopeSpec SS; 2344 SS.Adopt(QualifierLoc); 2345 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2346 TemplateArgs); 2347 } 2348 2349 /// Build a new expression in parentheses. 2350 /// 2351 /// By default, performs semantic analysis to build the new expression. 2352 /// Subclasses may override this routine to provide different behavior. 2353 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2354 SourceLocation RParen) { 2355 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2356 } 2357 2358 /// Build a new pseudo-destructor expression. 2359 /// 2360 /// By default, performs semantic analysis to build the new expression. 2361 /// Subclasses may override this routine to provide different behavior. 2362 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2363 SourceLocation OperatorLoc, 2364 bool isArrow, 2365 CXXScopeSpec &SS, 2366 TypeSourceInfo *ScopeType, 2367 SourceLocation CCLoc, 2368 SourceLocation TildeLoc, 2369 PseudoDestructorTypeStorage Destroyed); 2370 2371 /// Build a new unary operator expression. 2372 /// 2373 /// By default, performs semantic analysis to build the new expression. 2374 /// Subclasses may override this routine to provide different behavior. 2375 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2376 UnaryOperatorKind Opc, 2377 Expr *SubExpr) { 2378 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2379 } 2380 2381 /// Build a new builtin offsetof expression. 2382 /// 2383 /// By default, performs semantic analysis to build the new expression. 2384 /// Subclasses may override this routine to provide different behavior. 2385 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2386 TypeSourceInfo *Type, 2387 ArrayRef<Sema::OffsetOfComponent> Components, 2388 SourceLocation RParenLoc) { 2389 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2390 RParenLoc); 2391 } 2392 2393 /// Build a new sizeof, alignof or vec_step expression with a 2394 /// type argument. 2395 /// 2396 /// By default, performs semantic analysis to build the new expression. 2397 /// Subclasses may override this routine to provide different behavior. 2398 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2399 SourceLocation OpLoc, 2400 UnaryExprOrTypeTrait ExprKind, 2401 SourceRange R) { 2402 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2403 } 2404 2405 /// Build a new sizeof, alignof or vec step expression with an 2406 /// expression argument. 2407 /// 2408 /// By default, performs semantic analysis to build the new expression. 2409 /// Subclasses may override this routine to provide different behavior. 2410 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2411 UnaryExprOrTypeTrait ExprKind, 2412 SourceRange R) { 2413 ExprResult Result 2414 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2415 if (Result.isInvalid()) 2416 return ExprError(); 2417 2418 return Result; 2419 } 2420 2421 /// Build a new array subscript expression. 2422 /// 2423 /// By default, performs semantic analysis to build the new expression. 2424 /// Subclasses may override this routine to provide different behavior. 2425 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2426 SourceLocation LBracketLoc, 2427 Expr *RHS, 2428 SourceLocation RBracketLoc) { 2429 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2430 LBracketLoc, RHS, 2431 RBracketLoc); 2432 } 2433 2434 /// Build a new matrix subscript expression. 2435 /// 2436 /// By default, performs semantic analysis to build the new expression. 2437 /// Subclasses may override this routine to provide different behavior. 2438 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2439 Expr *ColumnIdx, 2440 SourceLocation RBracketLoc) { 2441 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2442 RBracketLoc); 2443 } 2444 2445 /// Build a new array section expression. 2446 /// 2447 /// By default, performs semantic analysis to build the new expression. 2448 /// Subclasses may override this routine to provide different behavior. 2449 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2450 Expr *LowerBound, 2451 SourceLocation ColonLocFirst, 2452 SourceLocation ColonLocSecond, 2453 Expr *Length, Expr *Stride, 2454 SourceLocation RBracketLoc) { 2455 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2456 ColonLocFirst, ColonLocSecond, 2457 Length, Stride, RBracketLoc); 2458 } 2459 2460 /// Build a new array shaping expression. 2461 /// 2462 /// By default, performs semantic analysis to build the new expression. 2463 /// Subclasses may override this routine to provide different behavior. 2464 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2465 SourceLocation RParenLoc, 2466 ArrayRef<Expr *> Dims, 2467 ArrayRef<SourceRange> BracketsRanges) { 2468 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2469 BracketsRanges); 2470 } 2471 2472 /// Build a new iterator expression. 2473 /// 2474 /// By default, performs semantic analysis to build the new expression. 2475 /// Subclasses may override this routine to provide different behavior. 2476 ExprResult RebuildOMPIteratorExpr( 2477 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2478 ArrayRef<Sema::OMPIteratorData> Data) { 2479 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2480 LLoc, RLoc, Data); 2481 } 2482 2483 /// Build a new call expression. 2484 /// 2485 /// By default, performs semantic analysis to build the new expression. 2486 /// Subclasses may override this routine to provide different behavior. 2487 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2488 MultiExprArg Args, 2489 SourceLocation RParenLoc, 2490 Expr *ExecConfig = nullptr) { 2491 return getSema().ActOnCallExpr( 2492 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2493 } 2494 2495 /// Build a new member access expression. 2496 /// 2497 /// By default, performs semantic analysis to build the new expression. 2498 /// Subclasses may override this routine to provide different behavior. 2499 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2500 bool isArrow, 2501 NestedNameSpecifierLoc QualifierLoc, 2502 SourceLocation TemplateKWLoc, 2503 const DeclarationNameInfo &MemberNameInfo, 2504 ValueDecl *Member, 2505 NamedDecl *FoundDecl, 2506 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2507 NamedDecl *FirstQualifierInScope) { 2508 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2509 isArrow); 2510 if (!Member->getDeclName()) { 2511 // We have a reference to an unnamed field. This is always the 2512 // base of an anonymous struct/union member access, i.e. the 2513 // field is always of record type. 2514 assert(Member->getType()->isRecordType() && 2515 "unnamed member not of record type?"); 2516 2517 BaseResult = 2518 getSema().PerformObjectMemberConversion(BaseResult.get(), 2519 QualifierLoc.getNestedNameSpecifier(), 2520 FoundDecl, Member); 2521 if (BaseResult.isInvalid()) 2522 return ExprError(); 2523 Base = BaseResult.get(); 2524 2525 CXXScopeSpec EmptySS; 2526 return getSema().BuildFieldReferenceExpr( 2527 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2528 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2529 } 2530 2531 CXXScopeSpec SS; 2532 SS.Adopt(QualifierLoc); 2533 2534 Base = BaseResult.get(); 2535 QualType BaseType = Base->getType(); 2536 2537 if (isArrow && !BaseType->isPointerType()) 2538 return ExprError(); 2539 2540 // FIXME: this involves duplicating earlier analysis in a lot of 2541 // cases; we should avoid this when possible. 2542 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2543 R.addDecl(FoundDecl); 2544 R.resolveKind(); 2545 2546 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2547 SS, TemplateKWLoc, 2548 FirstQualifierInScope, 2549 R, ExplicitTemplateArgs, 2550 /*S*/nullptr); 2551 } 2552 2553 /// Build a new binary operator expression. 2554 /// 2555 /// By default, performs semantic analysis to build the new expression. 2556 /// Subclasses may override this routine to provide different behavior. 2557 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2558 BinaryOperatorKind Opc, 2559 Expr *LHS, Expr *RHS) { 2560 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2561 } 2562 2563 /// Build a new rewritten operator expression. 2564 /// 2565 /// By default, performs semantic analysis to build the new expression. 2566 /// Subclasses may override this routine to provide different behavior. 2567 ExprResult RebuildCXXRewrittenBinaryOperator( 2568 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2569 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2570 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2571 RHS, /*RequiresADL*/false); 2572 } 2573 2574 /// Build a new conditional operator expression. 2575 /// 2576 /// By default, performs semantic analysis to build the new expression. 2577 /// Subclasses may override this routine to provide different behavior. 2578 ExprResult RebuildConditionalOperator(Expr *Cond, 2579 SourceLocation QuestionLoc, 2580 Expr *LHS, 2581 SourceLocation ColonLoc, 2582 Expr *RHS) { 2583 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2584 LHS, RHS); 2585 } 2586 2587 /// Build a new C-style cast expression. 2588 /// 2589 /// By default, performs semantic analysis to build the new expression. 2590 /// Subclasses may override this routine to provide different behavior. 2591 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2592 TypeSourceInfo *TInfo, 2593 SourceLocation RParenLoc, 2594 Expr *SubExpr) { 2595 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2596 SubExpr); 2597 } 2598 2599 /// Build a new compound literal expression. 2600 /// 2601 /// By default, performs semantic analysis to build the new expression. 2602 /// Subclasses may override this routine to provide different behavior. 2603 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2604 TypeSourceInfo *TInfo, 2605 SourceLocation RParenLoc, 2606 Expr *Init) { 2607 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2608 Init); 2609 } 2610 2611 /// Build a new extended vector element access expression. 2612 /// 2613 /// By default, performs semantic analysis to build the new expression. 2614 /// Subclasses may override this routine to provide different behavior. 2615 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2616 SourceLocation OpLoc, 2617 SourceLocation AccessorLoc, 2618 IdentifierInfo &Accessor) { 2619 2620 CXXScopeSpec SS; 2621 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2622 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2623 OpLoc, /*IsArrow*/ false, 2624 SS, SourceLocation(), 2625 /*FirstQualifierInScope*/ nullptr, 2626 NameInfo, 2627 /* TemplateArgs */ nullptr, 2628 /*S*/ nullptr); 2629 } 2630 2631 /// Build a new initializer list expression. 2632 /// 2633 /// By default, performs semantic analysis to build the new expression. 2634 /// Subclasses may override this routine to provide different behavior. 2635 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2636 MultiExprArg Inits, 2637 SourceLocation RBraceLoc) { 2638 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2639 } 2640 2641 /// Build a new designated initializer expression. 2642 /// 2643 /// By default, performs semantic analysis to build the new expression. 2644 /// Subclasses may override this routine to provide different behavior. 2645 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2646 MultiExprArg ArrayExprs, 2647 SourceLocation EqualOrColonLoc, 2648 bool GNUSyntax, 2649 Expr *Init) { 2650 ExprResult Result 2651 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2652 Init); 2653 if (Result.isInvalid()) 2654 return ExprError(); 2655 2656 return Result; 2657 } 2658 2659 /// Build a new value-initialized expression. 2660 /// 2661 /// By default, builds the implicit value initialization without performing 2662 /// any semantic analysis. Subclasses may override this routine to provide 2663 /// different behavior. 2664 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2665 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2666 } 2667 2668 /// Build a new \c va_arg expression. 2669 /// 2670 /// By default, performs semantic analysis to build the new expression. 2671 /// Subclasses may override this routine to provide different behavior. 2672 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2673 Expr *SubExpr, TypeSourceInfo *TInfo, 2674 SourceLocation RParenLoc) { 2675 return getSema().BuildVAArgExpr(BuiltinLoc, 2676 SubExpr, TInfo, 2677 RParenLoc); 2678 } 2679 2680 /// Build a new expression list in parentheses. 2681 /// 2682 /// By default, performs semantic analysis to build the new expression. 2683 /// Subclasses may override this routine to provide different behavior. 2684 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2685 MultiExprArg SubExprs, 2686 SourceLocation RParenLoc) { 2687 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2688 } 2689 2690 /// Build a new address-of-label expression. 2691 /// 2692 /// By default, performs semantic analysis, using the name of the label 2693 /// rather than attempting to map the label statement itself. 2694 /// Subclasses may override this routine to provide different behavior. 2695 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2696 SourceLocation LabelLoc, LabelDecl *Label) { 2697 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2698 } 2699 2700 /// Build a new GNU statement expression. 2701 /// 2702 /// By default, performs semantic analysis to build the new expression. 2703 /// Subclasses may override this routine to provide different behavior. 2704 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2705 SourceLocation RParenLoc, unsigned TemplateDepth) { 2706 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2707 TemplateDepth); 2708 } 2709 2710 /// Build a new __builtin_choose_expr expression. 2711 /// 2712 /// By default, performs semantic analysis to build the new expression. 2713 /// Subclasses may override this routine to provide different behavior. 2714 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2715 Expr *Cond, Expr *LHS, Expr *RHS, 2716 SourceLocation RParenLoc) { 2717 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2718 Cond, LHS, RHS, 2719 RParenLoc); 2720 } 2721 2722 /// Build a new generic selection expression. 2723 /// 2724 /// By default, performs semantic analysis to build the new expression. 2725 /// Subclasses may override this routine to provide different behavior. 2726 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2727 SourceLocation DefaultLoc, 2728 SourceLocation RParenLoc, 2729 Expr *ControllingExpr, 2730 ArrayRef<TypeSourceInfo *> Types, 2731 ArrayRef<Expr *> Exprs) { 2732 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2733 ControllingExpr, Types, Exprs); 2734 } 2735 2736 /// Build a new overloaded operator call expression. 2737 /// 2738 /// By default, performs semantic analysis to build the new expression. 2739 /// The semantic analysis provides the behavior of template instantiation, 2740 /// copying with transformations that turn what looks like an overloaded 2741 /// operator call into a use of a builtin operator, performing 2742 /// argument-dependent lookup, etc. Subclasses may override this routine to 2743 /// provide different behavior. 2744 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2745 SourceLocation OpLoc, 2746 Expr *Callee, 2747 Expr *First, 2748 Expr *Second); 2749 2750 /// Build a new C++ "named" cast expression, such as static_cast or 2751 /// reinterpret_cast. 2752 /// 2753 /// By default, this routine dispatches to one of the more-specific routines 2754 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2755 /// Subclasses may override this routine to provide different behavior. 2756 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2757 Stmt::StmtClass Class, 2758 SourceLocation LAngleLoc, 2759 TypeSourceInfo *TInfo, 2760 SourceLocation RAngleLoc, 2761 SourceLocation LParenLoc, 2762 Expr *SubExpr, 2763 SourceLocation RParenLoc) { 2764 switch (Class) { 2765 case Stmt::CXXStaticCastExprClass: 2766 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2767 RAngleLoc, LParenLoc, 2768 SubExpr, RParenLoc); 2769 2770 case Stmt::CXXDynamicCastExprClass: 2771 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2772 RAngleLoc, LParenLoc, 2773 SubExpr, RParenLoc); 2774 2775 case Stmt::CXXReinterpretCastExprClass: 2776 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2777 RAngleLoc, LParenLoc, 2778 SubExpr, 2779 RParenLoc); 2780 2781 case Stmt::CXXConstCastExprClass: 2782 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2783 RAngleLoc, LParenLoc, 2784 SubExpr, RParenLoc); 2785 2786 case Stmt::CXXAddrspaceCastExprClass: 2787 return getDerived().RebuildCXXAddrspaceCastExpr( 2788 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2789 2790 default: 2791 llvm_unreachable("Invalid C++ named cast"); 2792 } 2793 } 2794 2795 /// Build a new C++ static_cast expression. 2796 /// 2797 /// By default, performs semantic analysis to build the new expression. 2798 /// Subclasses may override this routine to provide different behavior. 2799 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2800 SourceLocation LAngleLoc, 2801 TypeSourceInfo *TInfo, 2802 SourceLocation RAngleLoc, 2803 SourceLocation LParenLoc, 2804 Expr *SubExpr, 2805 SourceLocation RParenLoc) { 2806 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2807 TInfo, SubExpr, 2808 SourceRange(LAngleLoc, RAngleLoc), 2809 SourceRange(LParenLoc, RParenLoc)); 2810 } 2811 2812 /// Build a new C++ dynamic_cast expression. 2813 /// 2814 /// By default, performs semantic analysis to build the new expression. 2815 /// Subclasses may override this routine to provide different behavior. 2816 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2817 SourceLocation LAngleLoc, 2818 TypeSourceInfo *TInfo, 2819 SourceLocation RAngleLoc, 2820 SourceLocation LParenLoc, 2821 Expr *SubExpr, 2822 SourceLocation RParenLoc) { 2823 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2824 TInfo, SubExpr, 2825 SourceRange(LAngleLoc, RAngleLoc), 2826 SourceRange(LParenLoc, RParenLoc)); 2827 } 2828 2829 /// Build a new C++ reinterpret_cast expression. 2830 /// 2831 /// By default, performs semantic analysis to build the new expression. 2832 /// Subclasses may override this routine to provide different behavior. 2833 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2834 SourceLocation LAngleLoc, 2835 TypeSourceInfo *TInfo, 2836 SourceLocation RAngleLoc, 2837 SourceLocation LParenLoc, 2838 Expr *SubExpr, 2839 SourceLocation RParenLoc) { 2840 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2841 TInfo, SubExpr, 2842 SourceRange(LAngleLoc, RAngleLoc), 2843 SourceRange(LParenLoc, RParenLoc)); 2844 } 2845 2846 /// Build a new C++ const_cast expression. 2847 /// 2848 /// By default, performs semantic analysis to build the new expression. 2849 /// Subclasses may override this routine to provide different behavior. 2850 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2851 SourceLocation LAngleLoc, 2852 TypeSourceInfo *TInfo, 2853 SourceLocation RAngleLoc, 2854 SourceLocation LParenLoc, 2855 Expr *SubExpr, 2856 SourceLocation RParenLoc) { 2857 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2858 TInfo, SubExpr, 2859 SourceRange(LAngleLoc, RAngleLoc), 2860 SourceRange(LParenLoc, RParenLoc)); 2861 } 2862 2863 ExprResult 2864 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2865 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2866 SourceLocation LParenLoc, Expr *SubExpr, 2867 SourceLocation RParenLoc) { 2868 return getSema().BuildCXXNamedCast( 2869 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2870 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2871 } 2872 2873 /// Build a new C++ functional-style cast expression. 2874 /// 2875 /// By default, performs semantic analysis to build the new expression. 2876 /// Subclasses may override this routine to provide different behavior. 2877 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2878 SourceLocation LParenLoc, 2879 Expr *Sub, 2880 SourceLocation RParenLoc, 2881 bool ListInitialization) { 2882 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2883 MultiExprArg(&Sub, 1), RParenLoc, 2884 ListInitialization); 2885 } 2886 2887 /// Build a new C++ __builtin_bit_cast expression. 2888 /// 2889 /// By default, performs semantic analysis to build the new expression. 2890 /// Subclasses may override this routine to provide different behavior. 2891 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2892 TypeSourceInfo *TSI, Expr *Sub, 2893 SourceLocation RParenLoc) { 2894 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2895 } 2896 2897 /// Build a new C++ typeid(type) expression. 2898 /// 2899 /// By default, performs semantic analysis to build the new expression. 2900 /// Subclasses may override this routine to provide different behavior. 2901 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2902 SourceLocation TypeidLoc, 2903 TypeSourceInfo *Operand, 2904 SourceLocation RParenLoc) { 2905 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2906 RParenLoc); 2907 } 2908 2909 2910 /// Build a new C++ typeid(expr) expression. 2911 /// 2912 /// By default, performs semantic analysis to build the new expression. 2913 /// Subclasses may override this routine to provide different behavior. 2914 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2915 SourceLocation TypeidLoc, 2916 Expr *Operand, 2917 SourceLocation RParenLoc) { 2918 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2919 RParenLoc); 2920 } 2921 2922 /// Build a new C++ __uuidof(type) expression. 2923 /// 2924 /// By default, performs semantic analysis to build the new expression. 2925 /// Subclasses may override this routine to provide different behavior. 2926 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2927 TypeSourceInfo *Operand, 2928 SourceLocation RParenLoc) { 2929 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2930 } 2931 2932 /// Build a new C++ __uuidof(expr) expression. 2933 /// 2934 /// By default, performs semantic analysis to build the new expression. 2935 /// Subclasses may override this routine to provide different behavior. 2936 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2937 Expr *Operand, SourceLocation RParenLoc) { 2938 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2939 } 2940 2941 /// Build a new C++ "this" expression. 2942 /// 2943 /// By default, builds a new "this" expression without performing any 2944 /// semantic analysis. Subclasses may override this routine to provide 2945 /// different behavior. 2946 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2947 QualType ThisType, 2948 bool isImplicit) { 2949 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 2950 } 2951 2952 /// Build a new C++ throw expression. 2953 /// 2954 /// By default, performs semantic analysis to build the new expression. 2955 /// Subclasses may override this routine to provide different behavior. 2956 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2957 bool IsThrownVariableInScope) { 2958 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2959 } 2960 2961 /// Build a new C++ default-argument expression. 2962 /// 2963 /// By default, builds a new default-argument expression, which does not 2964 /// require any semantic analysis. Subclasses may override this routine to 2965 /// provide different behavior. 2966 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 2967 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 2968 getSema().CurContext); 2969 } 2970 2971 /// Build a new C++11 default-initialization expression. 2972 /// 2973 /// By default, builds a new default field initialization expression, which 2974 /// does not require any semantic analysis. Subclasses may override this 2975 /// routine to provide different behavior. 2976 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2977 FieldDecl *Field) { 2978 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 2979 getSema().CurContext); 2980 } 2981 2982 /// Build a new C++ zero-initialization expression. 2983 /// 2984 /// By default, performs semantic analysis to build the new expression. 2985 /// Subclasses may override this routine to provide different behavior. 2986 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2987 SourceLocation LParenLoc, 2988 SourceLocation RParenLoc) { 2989 return getSema().BuildCXXTypeConstructExpr( 2990 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2991 } 2992 2993 /// Build a new C++ "new" expression. 2994 /// 2995 /// By default, performs semantic analysis to build the new expression. 2996 /// Subclasses may override this routine to provide different behavior. 2997 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2998 bool UseGlobal, 2999 SourceLocation PlacementLParen, 3000 MultiExprArg PlacementArgs, 3001 SourceLocation PlacementRParen, 3002 SourceRange TypeIdParens, 3003 QualType AllocatedType, 3004 TypeSourceInfo *AllocatedTypeInfo, 3005 Optional<Expr *> ArraySize, 3006 SourceRange DirectInitRange, 3007 Expr *Initializer) { 3008 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3009 PlacementLParen, 3010 PlacementArgs, 3011 PlacementRParen, 3012 TypeIdParens, 3013 AllocatedType, 3014 AllocatedTypeInfo, 3015 ArraySize, 3016 DirectInitRange, 3017 Initializer); 3018 } 3019 3020 /// Build a new C++ "delete" expression. 3021 /// 3022 /// By default, performs semantic analysis to build the new expression. 3023 /// Subclasses may override this routine to provide different behavior. 3024 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3025 bool IsGlobalDelete, 3026 bool IsArrayForm, 3027 Expr *Operand) { 3028 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3029 Operand); 3030 } 3031 3032 /// Build a new type trait expression. 3033 /// 3034 /// By default, performs semantic analysis to build the new expression. 3035 /// Subclasses may override this routine to provide different behavior. 3036 ExprResult RebuildTypeTrait(TypeTrait Trait, 3037 SourceLocation StartLoc, 3038 ArrayRef<TypeSourceInfo *> Args, 3039 SourceLocation RParenLoc) { 3040 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3041 } 3042 3043 /// Build a new array type trait expression. 3044 /// 3045 /// By default, performs semantic analysis to build the new expression. 3046 /// Subclasses may override this routine to provide different behavior. 3047 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3048 SourceLocation StartLoc, 3049 TypeSourceInfo *TSInfo, 3050 Expr *DimExpr, 3051 SourceLocation RParenLoc) { 3052 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3053 } 3054 3055 /// Build a new expression trait expression. 3056 /// 3057 /// By default, performs semantic analysis to build the new expression. 3058 /// Subclasses may override this routine to provide different behavior. 3059 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3060 SourceLocation StartLoc, 3061 Expr *Queried, 3062 SourceLocation RParenLoc) { 3063 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3064 } 3065 3066 /// Build a new (previously unresolved) declaration reference 3067 /// expression. 3068 /// 3069 /// By default, performs semantic analysis to build the new expression. 3070 /// Subclasses may override this routine to provide different behavior. 3071 ExprResult RebuildDependentScopeDeclRefExpr( 3072 NestedNameSpecifierLoc QualifierLoc, 3073 SourceLocation TemplateKWLoc, 3074 const DeclarationNameInfo &NameInfo, 3075 const TemplateArgumentListInfo *TemplateArgs, 3076 bool IsAddressOfOperand, 3077 TypeSourceInfo **RecoveryTSI) { 3078 CXXScopeSpec SS; 3079 SS.Adopt(QualifierLoc); 3080 3081 if (TemplateArgs || TemplateKWLoc.isValid()) 3082 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3083 TemplateArgs); 3084 3085 return getSema().BuildQualifiedDeclarationNameExpr( 3086 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3087 } 3088 3089 /// Build a new template-id expression. 3090 /// 3091 /// By default, performs semantic analysis to build the new expression. 3092 /// Subclasses may override this routine to provide different behavior. 3093 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3094 SourceLocation TemplateKWLoc, 3095 LookupResult &R, 3096 bool RequiresADL, 3097 const TemplateArgumentListInfo *TemplateArgs) { 3098 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3099 TemplateArgs); 3100 } 3101 3102 /// Build a new object-construction expression. 3103 /// 3104 /// By default, performs semantic analysis to build the new expression. 3105 /// Subclasses may override this routine to provide different behavior. 3106 ExprResult RebuildCXXConstructExpr(QualType T, 3107 SourceLocation Loc, 3108 CXXConstructorDecl *Constructor, 3109 bool IsElidable, 3110 MultiExprArg Args, 3111 bool HadMultipleCandidates, 3112 bool ListInitialization, 3113 bool StdInitListInitialization, 3114 bool RequiresZeroInit, 3115 CXXConstructExpr::ConstructionKind ConstructKind, 3116 SourceRange ParenRange) { 3117 // Reconstruct the constructor we originally found, which might be 3118 // different if this is a call to an inherited constructor. 3119 CXXConstructorDecl *FoundCtor = Constructor; 3120 if (Constructor->isInheritingConstructor()) 3121 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3122 3123 SmallVector<Expr*, 8> ConvertedArgs; 3124 if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs)) 3125 return ExprError(); 3126 3127 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3128 IsElidable, 3129 ConvertedArgs, 3130 HadMultipleCandidates, 3131 ListInitialization, 3132 StdInitListInitialization, 3133 RequiresZeroInit, ConstructKind, 3134 ParenRange); 3135 } 3136 3137 /// Build a new implicit construction via inherited constructor 3138 /// expression. 3139 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3140 CXXConstructorDecl *Constructor, 3141 bool ConstructsVBase, 3142 bool InheritedFromVBase) { 3143 return new (getSema().Context) CXXInheritedCtorInitExpr( 3144 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3145 } 3146 3147 /// Build a new object-construction expression. 3148 /// 3149 /// By default, performs semantic analysis to build the new expression. 3150 /// Subclasses may override this routine to provide different behavior. 3151 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3152 SourceLocation LParenOrBraceLoc, 3153 MultiExprArg Args, 3154 SourceLocation RParenOrBraceLoc, 3155 bool ListInitialization) { 3156 return getSema().BuildCXXTypeConstructExpr( 3157 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3158 } 3159 3160 /// Build a new object-construction expression. 3161 /// 3162 /// By default, performs semantic analysis to build the new expression. 3163 /// Subclasses may override this routine to provide different behavior. 3164 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3165 SourceLocation LParenLoc, 3166 MultiExprArg Args, 3167 SourceLocation RParenLoc, 3168 bool ListInitialization) { 3169 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3170 RParenLoc, ListInitialization); 3171 } 3172 3173 /// Build a new member reference expression. 3174 /// 3175 /// By default, performs semantic analysis to build the new expression. 3176 /// Subclasses may override this routine to provide different behavior. 3177 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3178 QualType BaseType, 3179 bool IsArrow, 3180 SourceLocation OperatorLoc, 3181 NestedNameSpecifierLoc QualifierLoc, 3182 SourceLocation TemplateKWLoc, 3183 NamedDecl *FirstQualifierInScope, 3184 const DeclarationNameInfo &MemberNameInfo, 3185 const TemplateArgumentListInfo *TemplateArgs) { 3186 CXXScopeSpec SS; 3187 SS.Adopt(QualifierLoc); 3188 3189 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3190 OperatorLoc, IsArrow, 3191 SS, TemplateKWLoc, 3192 FirstQualifierInScope, 3193 MemberNameInfo, 3194 TemplateArgs, /*S*/nullptr); 3195 } 3196 3197 /// Build a new member reference expression. 3198 /// 3199 /// By default, performs semantic analysis to build the new expression. 3200 /// Subclasses may override this routine to provide different behavior. 3201 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3202 SourceLocation OperatorLoc, 3203 bool IsArrow, 3204 NestedNameSpecifierLoc QualifierLoc, 3205 SourceLocation TemplateKWLoc, 3206 NamedDecl *FirstQualifierInScope, 3207 LookupResult &R, 3208 const TemplateArgumentListInfo *TemplateArgs) { 3209 CXXScopeSpec SS; 3210 SS.Adopt(QualifierLoc); 3211 3212 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3213 OperatorLoc, IsArrow, 3214 SS, TemplateKWLoc, 3215 FirstQualifierInScope, 3216 R, TemplateArgs, /*S*/nullptr); 3217 } 3218 3219 /// Build a new noexcept expression. 3220 /// 3221 /// By default, performs semantic analysis to build the new expression. 3222 /// Subclasses may override this routine to provide different behavior. 3223 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3224 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3225 } 3226 3227 /// Build a new expression to compute the length of a parameter pack. 3228 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3229 NamedDecl *Pack, 3230 SourceLocation PackLoc, 3231 SourceLocation RParenLoc, 3232 Optional<unsigned> Length, 3233 ArrayRef<TemplateArgument> PartialArgs) { 3234 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3235 RParenLoc, Length, PartialArgs); 3236 } 3237 3238 /// Build a new expression representing a call to a source location 3239 /// builtin. 3240 /// 3241 /// By default, performs semantic analysis to build the new expression. 3242 /// Subclasses may override this routine to provide different behavior. 3243 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3244 SourceLocation BuiltinLoc, 3245 SourceLocation RPLoc, 3246 DeclContext *ParentContext) { 3247 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3248 } 3249 3250 /// Build a new Objective-C boxed expression. 3251 /// 3252 /// By default, performs semantic analysis to build the new expression. 3253 /// Subclasses may override this routine to provide different behavior. 3254 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3255 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3256 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3257 TemplateArgumentListInfo *TALI) { 3258 CXXScopeSpec SS; 3259 SS.Adopt(NNS); 3260 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3261 ConceptNameInfo, 3262 FoundDecl, 3263 NamedConcept, TALI); 3264 if (Result.isInvalid()) 3265 return ExprError(); 3266 return Result; 3267 } 3268 3269 /// \brief Build a new requires expression. 3270 /// 3271 /// By default, performs semantic analysis to build the new expression. 3272 /// Subclasses may override this routine to provide different behavior. 3273 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3274 RequiresExprBodyDecl *Body, 3275 ArrayRef<ParmVarDecl *> LocalParameters, 3276 ArrayRef<concepts::Requirement *> Requirements, 3277 SourceLocation ClosingBraceLoc) { 3278 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3279 LocalParameters, Requirements, ClosingBraceLoc); 3280 } 3281 3282 concepts::TypeRequirement * 3283 RebuildTypeRequirement( 3284 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3285 return SemaRef.BuildTypeRequirement(SubstDiag); 3286 } 3287 3288 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3289 return SemaRef.BuildTypeRequirement(T); 3290 } 3291 3292 concepts::ExprRequirement * 3293 RebuildExprRequirement( 3294 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3295 SourceLocation NoexceptLoc, 3296 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3297 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3298 std::move(Ret)); 3299 } 3300 3301 concepts::ExprRequirement * 3302 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3303 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3304 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3305 std::move(Ret)); 3306 } 3307 3308 concepts::NestedRequirement * 3309 RebuildNestedRequirement( 3310 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3311 return SemaRef.BuildNestedRequirement(SubstDiag); 3312 } 3313 3314 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3315 return SemaRef.BuildNestedRequirement(Constraint); 3316 } 3317 3318 /// \brief Build a new Objective-C boxed expression. 3319 /// 3320 /// By default, performs semantic analysis to build the new expression. 3321 /// Subclasses may override this routine to provide different behavior. 3322 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3323 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3324 } 3325 3326 /// Build a new Objective-C array literal. 3327 /// 3328 /// By default, performs semantic analysis to build the new expression. 3329 /// Subclasses may override this routine to provide different behavior. 3330 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3331 Expr **Elements, unsigned NumElements) { 3332 return getSema().BuildObjCArrayLiteral(Range, 3333 MultiExprArg(Elements, NumElements)); 3334 } 3335 3336 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3337 Expr *Base, Expr *Key, 3338 ObjCMethodDecl *getterMethod, 3339 ObjCMethodDecl *setterMethod) { 3340 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3341 getterMethod, setterMethod); 3342 } 3343 3344 /// Build a new Objective-C dictionary literal. 3345 /// 3346 /// By default, performs semantic analysis to build the new expression. 3347 /// Subclasses may override this routine to provide different behavior. 3348 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3349 MutableArrayRef<ObjCDictionaryElement> Elements) { 3350 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3351 } 3352 3353 /// Build a new Objective-C \@encode expression. 3354 /// 3355 /// By default, performs semantic analysis to build the new expression. 3356 /// Subclasses may override this routine to provide different behavior. 3357 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3358 TypeSourceInfo *EncodeTypeInfo, 3359 SourceLocation RParenLoc) { 3360 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3361 } 3362 3363 /// Build a new Objective-C class message. 3364 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3365 Selector Sel, 3366 ArrayRef<SourceLocation> SelectorLocs, 3367 ObjCMethodDecl *Method, 3368 SourceLocation LBracLoc, 3369 MultiExprArg Args, 3370 SourceLocation RBracLoc) { 3371 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3372 ReceiverTypeInfo->getType(), 3373 /*SuperLoc=*/SourceLocation(), 3374 Sel, Method, LBracLoc, SelectorLocs, 3375 RBracLoc, Args); 3376 } 3377 3378 /// Build a new Objective-C instance message. 3379 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3380 Selector Sel, 3381 ArrayRef<SourceLocation> SelectorLocs, 3382 ObjCMethodDecl *Method, 3383 SourceLocation LBracLoc, 3384 MultiExprArg Args, 3385 SourceLocation RBracLoc) { 3386 return SemaRef.BuildInstanceMessage(Receiver, 3387 Receiver->getType(), 3388 /*SuperLoc=*/SourceLocation(), 3389 Sel, Method, LBracLoc, SelectorLocs, 3390 RBracLoc, Args); 3391 } 3392 3393 /// Build a new Objective-C instance/class message to 'super'. 3394 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3395 Selector Sel, 3396 ArrayRef<SourceLocation> SelectorLocs, 3397 QualType SuperType, 3398 ObjCMethodDecl *Method, 3399 SourceLocation LBracLoc, 3400 MultiExprArg Args, 3401 SourceLocation RBracLoc) { 3402 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3403 SuperType, 3404 SuperLoc, 3405 Sel, Method, LBracLoc, SelectorLocs, 3406 RBracLoc, Args) 3407 : SemaRef.BuildClassMessage(nullptr, 3408 SuperType, 3409 SuperLoc, 3410 Sel, Method, LBracLoc, SelectorLocs, 3411 RBracLoc, Args); 3412 3413 3414 } 3415 3416 /// Build a new Objective-C ivar reference expression. 3417 /// 3418 /// By default, performs semantic analysis to build the new expression. 3419 /// Subclasses may override this routine to provide different behavior. 3420 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3421 SourceLocation IvarLoc, 3422 bool IsArrow, bool IsFreeIvar) { 3423 CXXScopeSpec SS; 3424 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3425 ExprResult Result = getSema().BuildMemberReferenceExpr( 3426 BaseArg, BaseArg->getType(), 3427 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3428 /*FirstQualifierInScope=*/nullptr, NameInfo, 3429 /*TemplateArgs=*/nullptr, 3430 /*S=*/nullptr); 3431 if (IsFreeIvar && Result.isUsable()) 3432 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3433 return Result; 3434 } 3435 3436 /// Build a new Objective-C property reference expression. 3437 /// 3438 /// By default, performs semantic analysis to build the new expression. 3439 /// Subclasses may override this routine to provide different behavior. 3440 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3441 ObjCPropertyDecl *Property, 3442 SourceLocation PropertyLoc) { 3443 CXXScopeSpec SS; 3444 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3445 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3446 /*FIXME:*/PropertyLoc, 3447 /*IsArrow=*/false, 3448 SS, SourceLocation(), 3449 /*FirstQualifierInScope=*/nullptr, 3450 NameInfo, 3451 /*TemplateArgs=*/nullptr, 3452 /*S=*/nullptr); 3453 } 3454 3455 /// Build a new Objective-C property reference expression. 3456 /// 3457 /// By default, performs semantic analysis to build the new expression. 3458 /// Subclasses may override this routine to provide different behavior. 3459 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3460 ObjCMethodDecl *Getter, 3461 ObjCMethodDecl *Setter, 3462 SourceLocation PropertyLoc) { 3463 // Since these expressions can only be value-dependent, we do not 3464 // need to perform semantic analysis again. 3465 return Owned( 3466 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3467 VK_LValue, OK_ObjCProperty, 3468 PropertyLoc, Base)); 3469 } 3470 3471 /// Build a new Objective-C "isa" expression. 3472 /// 3473 /// By default, performs semantic analysis to build the new expression. 3474 /// Subclasses may override this routine to provide different behavior. 3475 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3476 SourceLocation OpLoc, bool IsArrow) { 3477 CXXScopeSpec SS; 3478 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3479 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3480 OpLoc, IsArrow, 3481 SS, SourceLocation(), 3482 /*FirstQualifierInScope=*/nullptr, 3483 NameInfo, 3484 /*TemplateArgs=*/nullptr, 3485 /*S=*/nullptr); 3486 } 3487 3488 /// Build a new shuffle vector expression. 3489 /// 3490 /// By default, performs semantic analysis to build the new expression. 3491 /// Subclasses may override this routine to provide different behavior. 3492 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3493 MultiExprArg SubExprs, 3494 SourceLocation RParenLoc) { 3495 // Find the declaration for __builtin_shufflevector 3496 const IdentifierInfo &Name 3497 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3498 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3499 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3500 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3501 3502 // Build a reference to the __builtin_shufflevector builtin 3503 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3504 Expr *Callee = new (SemaRef.Context) 3505 DeclRefExpr(SemaRef.Context, Builtin, false, 3506 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3507 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3508 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3509 CK_BuiltinFnToFnPtr).get(); 3510 3511 // Build the CallExpr 3512 ExprResult TheCall = CallExpr::Create( 3513 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3514 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3515 FPOptionsOverride()); 3516 3517 // Type-check the __builtin_shufflevector expression. 3518 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3519 } 3520 3521 /// Build a new convert vector expression. 3522 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3523 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3524 SourceLocation RParenLoc) { 3525 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3526 BuiltinLoc, RParenLoc); 3527 } 3528 3529 /// Build a new template argument pack expansion. 3530 /// 3531 /// By default, performs semantic analysis to build a new pack expansion 3532 /// for a template argument. Subclasses may override this routine to provide 3533 /// different behavior. 3534 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3535 SourceLocation EllipsisLoc, 3536 Optional<unsigned> NumExpansions) { 3537 switch (Pattern.getArgument().getKind()) { 3538 case TemplateArgument::Expression: { 3539 ExprResult Result 3540 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3541 EllipsisLoc, NumExpansions); 3542 if (Result.isInvalid()) 3543 return TemplateArgumentLoc(); 3544 3545 return TemplateArgumentLoc(Result.get(), Result.get()); 3546 } 3547 3548 case TemplateArgument::Template: 3549 return TemplateArgumentLoc( 3550 SemaRef.Context, 3551 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3552 NumExpansions), 3553 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3554 EllipsisLoc); 3555 3556 case TemplateArgument::Null: 3557 case TemplateArgument::Integral: 3558 case TemplateArgument::Declaration: 3559 case TemplateArgument::Pack: 3560 case TemplateArgument::TemplateExpansion: 3561 case TemplateArgument::NullPtr: 3562 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3563 3564 case TemplateArgument::Type: 3565 if (TypeSourceInfo *Expansion 3566 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3567 EllipsisLoc, 3568 NumExpansions)) 3569 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3570 Expansion); 3571 break; 3572 } 3573 3574 return TemplateArgumentLoc(); 3575 } 3576 3577 /// Build a new expression pack expansion. 3578 /// 3579 /// By default, performs semantic analysis to build a new pack expansion 3580 /// for an expression. Subclasses may override this routine to provide 3581 /// different behavior. 3582 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3583 Optional<unsigned> NumExpansions) { 3584 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3585 } 3586 3587 /// Build a new C++1z fold-expression. 3588 /// 3589 /// By default, performs semantic analysis in order to build a new fold 3590 /// expression. 3591 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3592 SourceLocation LParenLoc, Expr *LHS, 3593 BinaryOperatorKind Operator, 3594 SourceLocation EllipsisLoc, Expr *RHS, 3595 SourceLocation RParenLoc, 3596 Optional<unsigned> NumExpansions) { 3597 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3598 EllipsisLoc, RHS, RParenLoc, 3599 NumExpansions); 3600 } 3601 3602 /// Build an empty C++1z fold-expression with the given operator. 3603 /// 3604 /// By default, produces the fallback value for the fold-expression, or 3605 /// produce an error if there is no fallback value. 3606 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3607 BinaryOperatorKind Operator) { 3608 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3609 } 3610 3611 /// Build a new atomic operation expression. 3612 /// 3613 /// By default, performs semantic analysis to build the new expression. 3614 /// Subclasses may override this routine to provide different behavior. 3615 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3616 AtomicExpr::AtomicOp Op, 3617 SourceLocation RParenLoc) { 3618 // Use this for all of the locations, since we don't know the difference 3619 // between the call and the expr at this point. 3620 SourceRange Range{BuiltinLoc, RParenLoc}; 3621 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3622 Sema::AtomicArgumentOrder::AST); 3623 } 3624 3625 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3626 ArrayRef<Expr *> SubExprs, QualType Type) { 3627 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3628 } 3629 3630 private: 3631 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3632 QualType ObjectType, 3633 NamedDecl *FirstQualifierInScope, 3634 CXXScopeSpec &SS); 3635 3636 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3637 QualType ObjectType, 3638 NamedDecl *FirstQualifierInScope, 3639 CXXScopeSpec &SS); 3640 3641 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3642 NamedDecl *FirstQualifierInScope, 3643 CXXScopeSpec &SS); 3644 3645 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3646 DependentNameTypeLoc TL, 3647 bool DeducibleTSTContext); 3648 }; 3649 3650 template <typename Derived> 3651 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3652 if (!S) 3653 return S; 3654 3655 switch (S->getStmtClass()) { 3656 case Stmt::NoStmtClass: break; 3657 3658 // Transform individual statement nodes 3659 // Pass SDK into statements that can produce a value 3660 #define STMT(Node, Parent) \ 3661 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3662 #define VALUESTMT(Node, Parent) \ 3663 case Stmt::Node##Class: \ 3664 return getDerived().Transform##Node(cast<Node>(S), SDK); 3665 #define ABSTRACT_STMT(Node) 3666 #define EXPR(Node, Parent) 3667 #include "clang/AST/StmtNodes.inc" 3668 3669 // Transform expressions by calling TransformExpr. 3670 #define STMT(Node, Parent) 3671 #define ABSTRACT_STMT(Stmt) 3672 #define EXPR(Node, Parent) case Stmt::Node##Class: 3673 #include "clang/AST/StmtNodes.inc" 3674 { 3675 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3676 3677 if (SDK == SDK_StmtExprResult) 3678 E = getSema().ActOnStmtExprResult(E); 3679 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3680 } 3681 } 3682 3683 return S; 3684 } 3685 3686 template<typename Derived> 3687 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3688 if (!S) 3689 return S; 3690 3691 switch (S->getClauseKind()) { 3692 default: break; 3693 // Transform individual clause nodes 3694 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 3695 case Enum: \ 3696 return getDerived().Transform ## Class(cast<Class>(S)); 3697 #include "llvm/Frontend/OpenMP/OMPKinds.def" 3698 } 3699 3700 return S; 3701 } 3702 3703 3704 template<typename Derived> 3705 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3706 if (!E) 3707 return E; 3708 3709 switch (E->getStmtClass()) { 3710 case Stmt::NoStmtClass: break; 3711 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3712 #define ABSTRACT_STMT(Stmt) 3713 #define EXPR(Node, Parent) \ 3714 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3715 #include "clang/AST/StmtNodes.inc" 3716 } 3717 3718 return E; 3719 } 3720 3721 template<typename Derived> 3722 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3723 bool NotCopyInit) { 3724 // Initializers are instantiated like expressions, except that various outer 3725 // layers are stripped. 3726 if (!Init) 3727 return Init; 3728 3729 if (auto *FE = dyn_cast<FullExpr>(Init)) 3730 Init = FE->getSubExpr(); 3731 3732 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3733 Init = AIL->getCommonExpr(); 3734 3735 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3736 Init = MTE->getSubExpr(); 3737 3738 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3739 Init = Binder->getSubExpr(); 3740 3741 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3742 Init = ICE->getSubExprAsWritten(); 3743 3744 if (CXXStdInitializerListExpr *ILE = 3745 dyn_cast<CXXStdInitializerListExpr>(Init)) 3746 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3747 3748 // If this is copy-initialization, we only need to reconstruct 3749 // InitListExprs. Other forms of copy-initialization will be a no-op if 3750 // the initializer is already the right type. 3751 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3752 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3753 return getDerived().TransformExpr(Init); 3754 3755 // Revert value-initialization back to empty parens. 3756 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3757 SourceRange Parens = VIE->getSourceRange(); 3758 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3759 Parens.getEnd()); 3760 } 3761 3762 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3763 if (isa<ImplicitValueInitExpr>(Init)) 3764 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3765 SourceLocation()); 3766 3767 // Revert initialization by constructor back to a parenthesized or braced list 3768 // of expressions. Any other form of initializer can just be reused directly. 3769 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3770 return getDerived().TransformExpr(Init); 3771 3772 // If the initialization implicitly converted an initializer list to a 3773 // std::initializer_list object, unwrap the std::initializer_list too. 3774 if (Construct && Construct->isStdInitListInitialization()) 3775 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3776 3777 // Enter a list-init context if this was list initialization. 3778 EnterExpressionEvaluationContext Context( 3779 getSema(), EnterExpressionEvaluationContext::InitList, 3780 Construct->isListInitialization()); 3781 3782 SmallVector<Expr*, 8> NewArgs; 3783 bool ArgChanged = false; 3784 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3785 /*IsCall*/true, NewArgs, &ArgChanged)) 3786 return ExprError(); 3787 3788 // If this was list initialization, revert to syntactic list form. 3789 if (Construct->isListInitialization()) 3790 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3791 Construct->getEndLoc()); 3792 3793 // Build a ParenListExpr to represent anything else. 3794 SourceRange Parens = Construct->getParenOrBraceRange(); 3795 if (Parens.isInvalid()) { 3796 // This was a variable declaration's initialization for which no initializer 3797 // was specified. 3798 assert(NewArgs.empty() && 3799 "no parens or braces but have direct init with arguments?"); 3800 return ExprEmpty(); 3801 } 3802 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3803 Parens.getEnd()); 3804 } 3805 3806 template<typename Derived> 3807 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3808 unsigned NumInputs, 3809 bool IsCall, 3810 SmallVectorImpl<Expr *> &Outputs, 3811 bool *ArgChanged) { 3812 for (unsigned I = 0; I != NumInputs; ++I) { 3813 // If requested, drop call arguments that need to be dropped. 3814 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3815 if (ArgChanged) 3816 *ArgChanged = true; 3817 3818 break; 3819 } 3820 3821 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3822 Expr *Pattern = Expansion->getPattern(); 3823 3824 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3825 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3826 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3827 3828 // Determine whether the set of unexpanded parameter packs can and should 3829 // be expanded. 3830 bool Expand = true; 3831 bool RetainExpansion = false; 3832 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3833 Optional<unsigned> NumExpansions = OrigNumExpansions; 3834 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3835 Pattern->getSourceRange(), 3836 Unexpanded, 3837 Expand, RetainExpansion, 3838 NumExpansions)) 3839 return true; 3840 3841 if (!Expand) { 3842 // The transform has determined that we should perform a simple 3843 // transformation on the pack expansion, producing another pack 3844 // expansion. 3845 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3846 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3847 if (OutPattern.isInvalid()) 3848 return true; 3849 3850 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3851 Expansion->getEllipsisLoc(), 3852 NumExpansions); 3853 if (Out.isInvalid()) 3854 return true; 3855 3856 if (ArgChanged) 3857 *ArgChanged = true; 3858 Outputs.push_back(Out.get()); 3859 continue; 3860 } 3861 3862 // Record right away that the argument was changed. This needs 3863 // to happen even if the array expands to nothing. 3864 if (ArgChanged) *ArgChanged = true; 3865 3866 // The transform has determined that we should perform an elementwise 3867 // expansion of the pattern. Do so. 3868 for (unsigned I = 0; I != *NumExpansions; ++I) { 3869 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3870 ExprResult Out = getDerived().TransformExpr(Pattern); 3871 if (Out.isInvalid()) 3872 return true; 3873 3874 if (Out.get()->containsUnexpandedParameterPack()) { 3875 Out = getDerived().RebuildPackExpansion( 3876 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3877 if (Out.isInvalid()) 3878 return true; 3879 } 3880 3881 Outputs.push_back(Out.get()); 3882 } 3883 3884 // If we're supposed to retain a pack expansion, do so by temporarily 3885 // forgetting the partially-substituted parameter pack. 3886 if (RetainExpansion) { 3887 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3888 3889 ExprResult Out = getDerived().TransformExpr(Pattern); 3890 if (Out.isInvalid()) 3891 return true; 3892 3893 Out = getDerived().RebuildPackExpansion( 3894 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3895 if (Out.isInvalid()) 3896 return true; 3897 3898 Outputs.push_back(Out.get()); 3899 } 3900 3901 continue; 3902 } 3903 3904 ExprResult Result = 3905 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3906 : getDerived().TransformExpr(Inputs[I]); 3907 if (Result.isInvalid()) 3908 return true; 3909 3910 if (Result.get() != Inputs[I] && ArgChanged) 3911 *ArgChanged = true; 3912 3913 Outputs.push_back(Result.get()); 3914 } 3915 3916 return false; 3917 } 3918 3919 template <typename Derived> 3920 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3921 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3922 if (Var) { 3923 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3924 getDerived().TransformDefinition(Var->getLocation(), Var)); 3925 3926 if (!ConditionVar) 3927 return Sema::ConditionError(); 3928 3929 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3930 } 3931 3932 if (Expr) { 3933 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3934 3935 if (CondExpr.isInvalid()) 3936 return Sema::ConditionError(); 3937 3938 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3939 } 3940 3941 return Sema::ConditionResult(); 3942 } 3943 3944 template<typename Derived> 3945 NestedNameSpecifierLoc 3946 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3947 NestedNameSpecifierLoc NNS, 3948 QualType ObjectType, 3949 NamedDecl *FirstQualifierInScope) { 3950 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3951 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3952 Qualifier = Qualifier.getPrefix()) 3953 Qualifiers.push_back(Qualifier); 3954 3955 CXXScopeSpec SS; 3956 while (!Qualifiers.empty()) { 3957 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3958 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3959 3960 switch (QNNS->getKind()) { 3961 case NestedNameSpecifier::Identifier: { 3962 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3963 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3964 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3965 SS, FirstQualifierInScope, false)) 3966 return NestedNameSpecifierLoc(); 3967 } 3968 break; 3969 3970 case NestedNameSpecifier::Namespace: { 3971 NamespaceDecl *NS 3972 = cast_or_null<NamespaceDecl>( 3973 getDerived().TransformDecl( 3974 Q.getLocalBeginLoc(), 3975 QNNS->getAsNamespace())); 3976 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3977 break; 3978 } 3979 3980 case NestedNameSpecifier::NamespaceAlias: { 3981 NamespaceAliasDecl *Alias 3982 = cast_or_null<NamespaceAliasDecl>( 3983 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3984 QNNS->getAsNamespaceAlias())); 3985 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3986 Q.getLocalEndLoc()); 3987 break; 3988 } 3989 3990 case NestedNameSpecifier::Global: 3991 // There is no meaningful transformation that one could perform on the 3992 // global scope. 3993 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3994 break; 3995 3996 case NestedNameSpecifier::Super: { 3997 CXXRecordDecl *RD = 3998 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3999 SourceLocation(), QNNS->getAsRecordDecl())); 4000 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4001 break; 4002 } 4003 4004 case NestedNameSpecifier::TypeSpecWithTemplate: 4005 case NestedNameSpecifier::TypeSpec: { 4006 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4007 FirstQualifierInScope, SS); 4008 4009 if (!TL) 4010 return NestedNameSpecifierLoc(); 4011 4012 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4013 (SemaRef.getLangOpts().CPlusPlus11 && 4014 TL.getType()->isEnumeralType())) { 4015 assert(!TL.getType().hasLocalQualifiers() && 4016 "Can't get cv-qualifiers here"); 4017 if (TL.getType()->isEnumeralType()) 4018 SemaRef.Diag(TL.getBeginLoc(), 4019 diag::warn_cxx98_compat_enum_nested_name_spec); 4020 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 4021 Q.getLocalEndLoc()); 4022 break; 4023 } 4024 // If the nested-name-specifier is an invalid type def, don't emit an 4025 // error because a previous error should have already been emitted. 4026 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4027 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4028 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4029 << TL.getType() << SS.getRange(); 4030 } 4031 return NestedNameSpecifierLoc(); 4032 } 4033 } 4034 4035 // The qualifier-in-scope and object type only apply to the leftmost entity. 4036 FirstQualifierInScope = nullptr; 4037 ObjectType = QualType(); 4038 } 4039 4040 // Don't rebuild the nested-name-specifier if we don't have to. 4041 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4042 !getDerived().AlwaysRebuild()) 4043 return NNS; 4044 4045 // If we can re-use the source-location data from the original 4046 // nested-name-specifier, do so. 4047 if (SS.location_size() == NNS.getDataLength() && 4048 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4049 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4050 4051 // Allocate new nested-name-specifier location information. 4052 return SS.getWithLocInContext(SemaRef.Context); 4053 } 4054 4055 template<typename Derived> 4056 DeclarationNameInfo 4057 TreeTransform<Derived> 4058 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4059 DeclarationName Name = NameInfo.getName(); 4060 if (!Name) 4061 return DeclarationNameInfo(); 4062 4063 switch (Name.getNameKind()) { 4064 case DeclarationName::Identifier: 4065 case DeclarationName::ObjCZeroArgSelector: 4066 case DeclarationName::ObjCOneArgSelector: 4067 case DeclarationName::ObjCMultiArgSelector: 4068 case DeclarationName::CXXOperatorName: 4069 case DeclarationName::CXXLiteralOperatorName: 4070 case DeclarationName::CXXUsingDirective: 4071 return NameInfo; 4072 4073 case DeclarationName::CXXDeductionGuideName: { 4074 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4075 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4076 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4077 if (!NewTemplate) 4078 return DeclarationNameInfo(); 4079 4080 DeclarationNameInfo NewNameInfo(NameInfo); 4081 NewNameInfo.setName( 4082 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4083 return NewNameInfo; 4084 } 4085 4086 case DeclarationName::CXXConstructorName: 4087 case DeclarationName::CXXDestructorName: 4088 case DeclarationName::CXXConversionFunctionName: { 4089 TypeSourceInfo *NewTInfo; 4090 CanQualType NewCanTy; 4091 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4092 NewTInfo = getDerived().TransformType(OldTInfo); 4093 if (!NewTInfo) 4094 return DeclarationNameInfo(); 4095 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4096 } 4097 else { 4098 NewTInfo = nullptr; 4099 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4100 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4101 if (NewT.isNull()) 4102 return DeclarationNameInfo(); 4103 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4104 } 4105 4106 DeclarationName NewName 4107 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4108 NewCanTy); 4109 DeclarationNameInfo NewNameInfo(NameInfo); 4110 NewNameInfo.setName(NewName); 4111 NewNameInfo.setNamedTypeInfo(NewTInfo); 4112 return NewNameInfo; 4113 } 4114 } 4115 4116 llvm_unreachable("Unknown name kind."); 4117 } 4118 4119 template<typename Derived> 4120 TemplateName 4121 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4122 TemplateName Name, 4123 SourceLocation NameLoc, 4124 QualType ObjectType, 4125 NamedDecl *FirstQualifierInScope, 4126 bool AllowInjectedClassName) { 4127 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4128 TemplateDecl *Template = QTN->getTemplateDecl(); 4129 assert(Template && "qualified template name must refer to a template"); 4130 4131 TemplateDecl *TransTemplate 4132 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4133 Template)); 4134 if (!TransTemplate) 4135 return TemplateName(); 4136 4137 if (!getDerived().AlwaysRebuild() && 4138 SS.getScopeRep() == QTN->getQualifier() && 4139 TransTemplate == Template) 4140 return Name; 4141 4142 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4143 TransTemplate); 4144 } 4145 4146 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4147 if (SS.getScopeRep()) { 4148 // These apply to the scope specifier, not the template. 4149 ObjectType = QualType(); 4150 FirstQualifierInScope = nullptr; 4151 } 4152 4153 if (!getDerived().AlwaysRebuild() && 4154 SS.getScopeRep() == DTN->getQualifier() && 4155 ObjectType.isNull()) 4156 return Name; 4157 4158 // FIXME: Preserve the location of the "template" keyword. 4159 SourceLocation TemplateKWLoc = NameLoc; 4160 4161 if (DTN->isIdentifier()) { 4162 return getDerived().RebuildTemplateName(SS, 4163 TemplateKWLoc, 4164 *DTN->getIdentifier(), 4165 NameLoc, 4166 ObjectType, 4167 FirstQualifierInScope, 4168 AllowInjectedClassName); 4169 } 4170 4171 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4172 DTN->getOperator(), NameLoc, 4173 ObjectType, AllowInjectedClassName); 4174 } 4175 4176 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4177 TemplateDecl *TransTemplate 4178 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4179 Template)); 4180 if (!TransTemplate) 4181 return TemplateName(); 4182 4183 if (!getDerived().AlwaysRebuild() && 4184 TransTemplate == Template) 4185 return Name; 4186 4187 return TemplateName(TransTemplate); 4188 } 4189 4190 if (SubstTemplateTemplateParmPackStorage *SubstPack 4191 = Name.getAsSubstTemplateTemplateParmPack()) { 4192 TemplateTemplateParmDecl *TransParam 4193 = cast_or_null<TemplateTemplateParmDecl>( 4194 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4195 if (!TransParam) 4196 return TemplateName(); 4197 4198 if (!getDerived().AlwaysRebuild() && 4199 TransParam == SubstPack->getParameterPack()) 4200 return Name; 4201 4202 return getDerived().RebuildTemplateName(TransParam, 4203 SubstPack->getArgumentPack()); 4204 } 4205 4206 // These should be getting filtered out before they reach the AST. 4207 llvm_unreachable("overloaded function decl survived to here"); 4208 } 4209 4210 template<typename Derived> 4211 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4212 const TemplateArgument &Arg, 4213 TemplateArgumentLoc &Output) { 4214 Output = getSema().getTrivialTemplateArgumentLoc( 4215 Arg, QualType(), getDerived().getBaseLocation()); 4216 } 4217 4218 template<typename Derived> 4219 bool TreeTransform<Derived>::TransformTemplateArgument( 4220 const TemplateArgumentLoc &Input, 4221 TemplateArgumentLoc &Output, bool Uneval) { 4222 const TemplateArgument &Arg = Input.getArgument(); 4223 switch (Arg.getKind()) { 4224 case TemplateArgument::Null: 4225 case TemplateArgument::Pack: 4226 llvm_unreachable("Unexpected TemplateArgument"); 4227 4228 case TemplateArgument::Integral: 4229 case TemplateArgument::NullPtr: 4230 case TemplateArgument::Declaration: { 4231 // Transform a resolved template argument straight to a resolved template 4232 // argument. We get here when substituting into an already-substituted 4233 // template type argument during concept satisfaction checking. 4234 QualType T = Arg.getNonTypeTemplateArgumentType(); 4235 QualType NewT = getDerived().TransformType(T); 4236 if (NewT.isNull()) 4237 return true; 4238 4239 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4240 ? Arg.getAsDecl() 4241 : nullptr; 4242 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4243 getDerived().getBaseLocation(), D)) 4244 : nullptr; 4245 if (D && !NewD) 4246 return true; 4247 4248 if (NewT == T && D == NewD) 4249 Output = Input; 4250 else if (Arg.getKind() == TemplateArgument::Integral) 4251 Output = TemplateArgumentLoc( 4252 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4253 TemplateArgumentLocInfo()); 4254 else if (Arg.getKind() == TemplateArgument::NullPtr) 4255 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4256 TemplateArgumentLocInfo()); 4257 else 4258 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4259 TemplateArgumentLocInfo()); 4260 4261 return false; 4262 } 4263 4264 case TemplateArgument::Type: { 4265 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4266 if (!DI) 4267 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4268 4269 DI = getDerived().TransformType(DI); 4270 if (!DI) return true; 4271 4272 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4273 return false; 4274 } 4275 4276 case TemplateArgument::Template: { 4277 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4278 if (QualifierLoc) { 4279 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4280 if (!QualifierLoc) 4281 return true; 4282 } 4283 4284 CXXScopeSpec SS; 4285 SS.Adopt(QualifierLoc); 4286 TemplateName Template 4287 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4288 Input.getTemplateNameLoc()); 4289 if (Template.isNull()) 4290 return true; 4291 4292 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4293 QualifierLoc, Input.getTemplateNameLoc()); 4294 return false; 4295 } 4296 4297 case TemplateArgument::TemplateExpansion: 4298 llvm_unreachable("Caller should expand pack expansions"); 4299 4300 case TemplateArgument::Expression: { 4301 // Template argument expressions are constant expressions. 4302 EnterExpressionEvaluationContext Unevaluated( 4303 getSema(), 4304 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4305 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4306 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4307 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4308 4309 Expr *InputExpr = Input.getSourceExpression(); 4310 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4311 4312 ExprResult E = getDerived().TransformExpr(InputExpr); 4313 E = SemaRef.ActOnConstantExpression(E); 4314 if (E.isInvalid()) return true; 4315 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4316 return false; 4317 } 4318 } 4319 4320 // Work around bogus GCC warning 4321 return true; 4322 } 4323 4324 /// Iterator adaptor that invents template argument location information 4325 /// for each of the template arguments in its underlying iterator. 4326 template<typename Derived, typename InputIterator> 4327 class TemplateArgumentLocInventIterator { 4328 TreeTransform<Derived> &Self; 4329 InputIterator Iter; 4330 4331 public: 4332 typedef TemplateArgumentLoc value_type; 4333 typedef TemplateArgumentLoc reference; 4334 typedef typename std::iterator_traits<InputIterator>::difference_type 4335 difference_type; 4336 typedef std::input_iterator_tag iterator_category; 4337 4338 class pointer { 4339 TemplateArgumentLoc Arg; 4340 4341 public: 4342 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4343 4344 const TemplateArgumentLoc *operator->() const { return &Arg; } 4345 }; 4346 4347 TemplateArgumentLocInventIterator() { } 4348 4349 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4350 InputIterator Iter) 4351 : Self(Self), Iter(Iter) { } 4352 4353 TemplateArgumentLocInventIterator &operator++() { 4354 ++Iter; 4355 return *this; 4356 } 4357 4358 TemplateArgumentLocInventIterator operator++(int) { 4359 TemplateArgumentLocInventIterator Old(*this); 4360 ++(*this); 4361 return Old; 4362 } 4363 4364 reference operator*() const { 4365 TemplateArgumentLoc Result; 4366 Self.InventTemplateArgumentLoc(*Iter, Result); 4367 return Result; 4368 } 4369 4370 pointer operator->() const { return pointer(**this); } 4371 4372 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4373 const TemplateArgumentLocInventIterator &Y) { 4374 return X.Iter == Y.Iter; 4375 } 4376 4377 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4378 const TemplateArgumentLocInventIterator &Y) { 4379 return X.Iter != Y.Iter; 4380 } 4381 }; 4382 4383 template<typename Derived> 4384 template<typename InputIterator> 4385 bool TreeTransform<Derived>::TransformTemplateArguments( 4386 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4387 bool Uneval) { 4388 for (; First != Last; ++First) { 4389 TemplateArgumentLoc Out; 4390 TemplateArgumentLoc In = *First; 4391 4392 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4393 // Unpack argument packs, which we translate them into separate 4394 // arguments. 4395 // FIXME: We could do much better if we could guarantee that the 4396 // TemplateArgumentLocInfo for the pack expansion would be usable for 4397 // all of the template arguments in the argument pack. 4398 typedef TemplateArgumentLocInventIterator<Derived, 4399 TemplateArgument::pack_iterator> 4400 PackLocIterator; 4401 if (TransformTemplateArguments(PackLocIterator(*this, 4402 In.getArgument().pack_begin()), 4403 PackLocIterator(*this, 4404 In.getArgument().pack_end()), 4405 Outputs, Uneval)) 4406 return true; 4407 4408 continue; 4409 } 4410 4411 if (In.getArgument().isPackExpansion()) { 4412 // We have a pack expansion, for which we will be substituting into 4413 // the pattern. 4414 SourceLocation Ellipsis; 4415 Optional<unsigned> OrigNumExpansions; 4416 TemplateArgumentLoc Pattern 4417 = getSema().getTemplateArgumentPackExpansionPattern( 4418 In, Ellipsis, OrigNumExpansions); 4419 4420 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4421 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4422 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4423 4424 // Determine whether the set of unexpanded parameter packs can and should 4425 // be expanded. 4426 bool Expand = true; 4427 bool RetainExpansion = false; 4428 Optional<unsigned> NumExpansions = OrigNumExpansions; 4429 if (getDerived().TryExpandParameterPacks(Ellipsis, 4430 Pattern.getSourceRange(), 4431 Unexpanded, 4432 Expand, 4433 RetainExpansion, 4434 NumExpansions)) 4435 return true; 4436 4437 if (!Expand) { 4438 // The transform has determined that we should perform a simple 4439 // transformation on the pack expansion, producing another pack 4440 // expansion. 4441 TemplateArgumentLoc OutPattern; 4442 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4443 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4444 return true; 4445 4446 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4447 NumExpansions); 4448 if (Out.getArgument().isNull()) 4449 return true; 4450 4451 Outputs.addArgument(Out); 4452 continue; 4453 } 4454 4455 // The transform has determined that we should perform an elementwise 4456 // expansion of the pattern. Do so. 4457 for (unsigned I = 0; I != *NumExpansions; ++I) { 4458 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4459 4460 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4461 return true; 4462 4463 if (Out.getArgument().containsUnexpandedParameterPack()) { 4464 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4465 OrigNumExpansions); 4466 if (Out.getArgument().isNull()) 4467 return true; 4468 } 4469 4470 Outputs.addArgument(Out); 4471 } 4472 4473 // If we're supposed to retain a pack expansion, do so by temporarily 4474 // forgetting the partially-substituted parameter pack. 4475 if (RetainExpansion) { 4476 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4477 4478 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4479 return true; 4480 4481 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4482 OrigNumExpansions); 4483 if (Out.getArgument().isNull()) 4484 return true; 4485 4486 Outputs.addArgument(Out); 4487 } 4488 4489 continue; 4490 } 4491 4492 // The simple case: 4493 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4494 return true; 4495 4496 Outputs.addArgument(Out); 4497 } 4498 4499 return false; 4500 4501 } 4502 4503 //===----------------------------------------------------------------------===// 4504 // Type transformation 4505 //===----------------------------------------------------------------------===// 4506 4507 template<typename Derived> 4508 QualType TreeTransform<Derived>::TransformType(QualType T) { 4509 if (getDerived().AlreadyTransformed(T)) 4510 return T; 4511 4512 // Temporary workaround. All of these transformations should 4513 // eventually turn into transformations on TypeLocs. 4514 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4515 getDerived().getBaseLocation()); 4516 4517 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4518 4519 if (!NewDI) 4520 return QualType(); 4521 4522 return NewDI->getType(); 4523 } 4524 4525 template<typename Derived> 4526 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4527 // Refine the base location to the type's location. 4528 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4529 getDerived().getBaseEntity()); 4530 if (getDerived().AlreadyTransformed(DI->getType())) 4531 return DI; 4532 4533 TypeLocBuilder TLB; 4534 4535 TypeLoc TL = DI->getTypeLoc(); 4536 TLB.reserve(TL.getFullDataSize()); 4537 4538 QualType Result = getDerived().TransformType(TLB, TL); 4539 if (Result.isNull()) 4540 return nullptr; 4541 4542 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4543 } 4544 4545 template<typename Derived> 4546 QualType 4547 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4548 switch (T.getTypeLocClass()) { 4549 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4550 #define TYPELOC(CLASS, PARENT) \ 4551 case TypeLoc::CLASS: \ 4552 return getDerived().Transform##CLASS##Type(TLB, \ 4553 T.castAs<CLASS##TypeLoc>()); 4554 #include "clang/AST/TypeLocNodes.def" 4555 } 4556 4557 llvm_unreachable("unhandled type loc!"); 4558 } 4559 4560 template<typename Derived> 4561 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4562 if (!isa<DependentNameType>(T)) 4563 return TransformType(T); 4564 4565 if (getDerived().AlreadyTransformed(T)) 4566 return T; 4567 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4568 getDerived().getBaseLocation()); 4569 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4570 return NewDI ? NewDI->getType() : QualType(); 4571 } 4572 4573 template<typename Derived> 4574 TypeSourceInfo * 4575 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4576 if (!isa<DependentNameType>(DI->getType())) 4577 return TransformType(DI); 4578 4579 // Refine the base location to the type's location. 4580 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4581 getDerived().getBaseEntity()); 4582 if (getDerived().AlreadyTransformed(DI->getType())) 4583 return DI; 4584 4585 TypeLocBuilder TLB; 4586 4587 TypeLoc TL = DI->getTypeLoc(); 4588 TLB.reserve(TL.getFullDataSize()); 4589 4590 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4591 if (QTL) 4592 TL = QTL.getUnqualifiedLoc(); 4593 4594 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4595 4596 QualType Result = getDerived().TransformDependentNameType( 4597 TLB, DNTL, /*DeducedTSTContext*/true); 4598 if (Result.isNull()) 4599 return nullptr; 4600 4601 if (QTL) { 4602 Result = getDerived().RebuildQualifiedType(Result, QTL); 4603 if (Result.isNull()) 4604 return nullptr; 4605 TLB.TypeWasModifiedSafely(Result); 4606 } 4607 4608 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4609 } 4610 4611 template<typename Derived> 4612 QualType 4613 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4614 QualifiedTypeLoc T) { 4615 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4616 if (Result.isNull()) 4617 return QualType(); 4618 4619 Result = getDerived().RebuildQualifiedType(Result, T); 4620 4621 if (Result.isNull()) 4622 return QualType(); 4623 4624 // RebuildQualifiedType might have updated the type, but not in a way 4625 // that invalidates the TypeLoc. (There's no location information for 4626 // qualifiers.) 4627 TLB.TypeWasModifiedSafely(Result); 4628 4629 return Result; 4630 } 4631 4632 template <typename Derived> 4633 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4634 QualifiedTypeLoc TL) { 4635 4636 SourceLocation Loc = TL.getBeginLoc(); 4637 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4638 4639 if (((T.getAddressSpace() != LangAS::Default && 4640 Quals.getAddressSpace() != LangAS::Default)) && 4641 T.getAddressSpace() != Quals.getAddressSpace()) { 4642 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4643 << TL.getType() << T; 4644 return QualType(); 4645 } 4646 4647 // C++ [dcl.fct]p7: 4648 // [When] adding cv-qualifications on top of the function type [...] the 4649 // cv-qualifiers are ignored. 4650 if (T->isFunctionType()) { 4651 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4652 Quals.getAddressSpace()); 4653 return T; 4654 } 4655 4656 // C++ [dcl.ref]p1: 4657 // when the cv-qualifiers are introduced through the use of a typedef-name 4658 // or decltype-specifier [...] the cv-qualifiers are ignored. 4659 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4660 // applied to a reference type. 4661 if (T->isReferenceType()) { 4662 // The only qualifier that applies to a reference type is restrict. 4663 if (!Quals.hasRestrict()) 4664 return T; 4665 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4666 } 4667 4668 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4669 // resulting type. 4670 if (Quals.hasObjCLifetime()) { 4671 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4672 Quals.removeObjCLifetime(); 4673 else if (T.getObjCLifetime()) { 4674 // Objective-C ARC: 4675 // A lifetime qualifier applied to a substituted template parameter 4676 // overrides the lifetime qualifier from the template argument. 4677 const AutoType *AutoTy; 4678 if (const SubstTemplateTypeParmType *SubstTypeParam 4679 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4680 QualType Replacement = SubstTypeParam->getReplacementType(); 4681 Qualifiers Qs = Replacement.getQualifiers(); 4682 Qs.removeObjCLifetime(); 4683 Replacement = SemaRef.Context.getQualifiedType( 4684 Replacement.getUnqualifiedType(), Qs); 4685 T = SemaRef.Context.getSubstTemplateTypeParmType( 4686 SubstTypeParam->getReplacedParameter(), Replacement); 4687 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4688 // 'auto' types behave the same way as template parameters. 4689 QualType Deduced = AutoTy->getDeducedType(); 4690 Qualifiers Qs = Deduced.getQualifiers(); 4691 Qs.removeObjCLifetime(); 4692 Deduced = 4693 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4694 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4695 AutoTy->isDependentType(), 4696 /*isPack=*/false, 4697 AutoTy->getTypeConstraintConcept(), 4698 AutoTy->getTypeConstraintArguments()); 4699 } else { 4700 // Otherwise, complain about the addition of a qualifier to an 4701 // already-qualified type. 4702 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4703 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4704 Quals.removeObjCLifetime(); 4705 } 4706 } 4707 } 4708 4709 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4710 } 4711 4712 template<typename Derived> 4713 TypeLoc 4714 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4715 QualType ObjectType, 4716 NamedDecl *UnqualLookup, 4717 CXXScopeSpec &SS) { 4718 if (getDerived().AlreadyTransformed(TL.getType())) 4719 return TL; 4720 4721 TypeSourceInfo *TSI = 4722 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4723 if (TSI) 4724 return TSI->getTypeLoc(); 4725 return TypeLoc(); 4726 } 4727 4728 template<typename Derived> 4729 TypeSourceInfo * 4730 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4731 QualType ObjectType, 4732 NamedDecl *UnqualLookup, 4733 CXXScopeSpec &SS) { 4734 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4735 return TSInfo; 4736 4737 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4738 UnqualLookup, SS); 4739 } 4740 4741 template <typename Derived> 4742 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4743 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4744 CXXScopeSpec &SS) { 4745 QualType T = TL.getType(); 4746 assert(!getDerived().AlreadyTransformed(T)); 4747 4748 TypeLocBuilder TLB; 4749 QualType Result; 4750 4751 if (isa<TemplateSpecializationType>(T)) { 4752 TemplateSpecializationTypeLoc SpecTL = 4753 TL.castAs<TemplateSpecializationTypeLoc>(); 4754 4755 TemplateName Template = getDerived().TransformTemplateName( 4756 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4757 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4758 if (Template.isNull()) 4759 return nullptr; 4760 4761 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4762 Template); 4763 } else if (isa<DependentTemplateSpecializationType>(T)) { 4764 DependentTemplateSpecializationTypeLoc SpecTL = 4765 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4766 4767 TemplateName Template 4768 = getDerived().RebuildTemplateName(SS, 4769 SpecTL.getTemplateKeywordLoc(), 4770 *SpecTL.getTypePtr()->getIdentifier(), 4771 SpecTL.getTemplateNameLoc(), 4772 ObjectType, UnqualLookup, 4773 /*AllowInjectedClassName*/true); 4774 if (Template.isNull()) 4775 return nullptr; 4776 4777 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4778 SpecTL, 4779 Template, 4780 SS); 4781 } else { 4782 // Nothing special needs to be done for these. 4783 Result = getDerived().TransformType(TLB, TL); 4784 } 4785 4786 if (Result.isNull()) 4787 return nullptr; 4788 4789 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4790 } 4791 4792 template <class TyLoc> static inline 4793 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4794 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4795 NewT.setNameLoc(T.getNameLoc()); 4796 return T.getType(); 4797 } 4798 4799 template<typename Derived> 4800 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4801 BuiltinTypeLoc T) { 4802 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4803 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4804 if (T.needsExtraLocalData()) 4805 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4806 return T.getType(); 4807 } 4808 4809 template<typename Derived> 4810 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4811 ComplexTypeLoc T) { 4812 // FIXME: recurse? 4813 return TransformTypeSpecType(TLB, T); 4814 } 4815 4816 template <typename Derived> 4817 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4818 AdjustedTypeLoc TL) { 4819 // Adjustments applied during transformation are handled elsewhere. 4820 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4821 } 4822 4823 template<typename Derived> 4824 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4825 DecayedTypeLoc TL) { 4826 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4827 if (OriginalType.isNull()) 4828 return QualType(); 4829 4830 QualType Result = TL.getType(); 4831 if (getDerived().AlwaysRebuild() || 4832 OriginalType != TL.getOriginalLoc().getType()) 4833 Result = SemaRef.Context.getDecayedType(OriginalType); 4834 TLB.push<DecayedTypeLoc>(Result); 4835 // Nothing to set for DecayedTypeLoc. 4836 return Result; 4837 } 4838 4839 template<typename Derived> 4840 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4841 PointerTypeLoc TL) { 4842 QualType PointeeType 4843 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4844 if (PointeeType.isNull()) 4845 return QualType(); 4846 4847 QualType Result = TL.getType(); 4848 if (PointeeType->getAs<ObjCObjectType>()) { 4849 // A dependent pointer type 'T *' has is being transformed such 4850 // that an Objective-C class type is being replaced for 'T'. The 4851 // resulting pointer type is an ObjCObjectPointerType, not a 4852 // PointerType. 4853 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4854 4855 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4856 NewT.setStarLoc(TL.getStarLoc()); 4857 return Result; 4858 } 4859 4860 if (getDerived().AlwaysRebuild() || 4861 PointeeType != TL.getPointeeLoc().getType()) { 4862 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4863 if (Result.isNull()) 4864 return QualType(); 4865 } 4866 4867 // Objective-C ARC can add lifetime qualifiers to the type that we're 4868 // pointing to. 4869 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4870 4871 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4872 NewT.setSigilLoc(TL.getSigilLoc()); 4873 return Result; 4874 } 4875 4876 template<typename Derived> 4877 QualType 4878 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4879 BlockPointerTypeLoc TL) { 4880 QualType PointeeType 4881 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4882 if (PointeeType.isNull()) 4883 return QualType(); 4884 4885 QualType Result = TL.getType(); 4886 if (getDerived().AlwaysRebuild() || 4887 PointeeType != TL.getPointeeLoc().getType()) { 4888 Result = getDerived().RebuildBlockPointerType(PointeeType, 4889 TL.getSigilLoc()); 4890 if (Result.isNull()) 4891 return QualType(); 4892 } 4893 4894 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4895 NewT.setSigilLoc(TL.getSigilLoc()); 4896 return Result; 4897 } 4898 4899 /// Transforms a reference type. Note that somewhat paradoxically we 4900 /// don't care whether the type itself is an l-value type or an r-value 4901 /// type; we only care if the type was *written* as an l-value type 4902 /// or an r-value type. 4903 template<typename Derived> 4904 QualType 4905 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4906 ReferenceTypeLoc TL) { 4907 const ReferenceType *T = TL.getTypePtr(); 4908 4909 // Note that this works with the pointee-as-written. 4910 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4911 if (PointeeType.isNull()) 4912 return QualType(); 4913 4914 QualType Result = TL.getType(); 4915 if (getDerived().AlwaysRebuild() || 4916 PointeeType != T->getPointeeTypeAsWritten()) { 4917 Result = getDerived().RebuildReferenceType(PointeeType, 4918 T->isSpelledAsLValue(), 4919 TL.getSigilLoc()); 4920 if (Result.isNull()) 4921 return QualType(); 4922 } 4923 4924 // Objective-C ARC can add lifetime qualifiers to the type that we're 4925 // referring to. 4926 TLB.TypeWasModifiedSafely( 4927 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4928 4929 // r-value references can be rebuilt as l-value references. 4930 ReferenceTypeLoc NewTL; 4931 if (isa<LValueReferenceType>(Result)) 4932 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4933 else 4934 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4935 NewTL.setSigilLoc(TL.getSigilLoc()); 4936 4937 return Result; 4938 } 4939 4940 template<typename Derived> 4941 QualType 4942 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4943 LValueReferenceTypeLoc TL) { 4944 return TransformReferenceType(TLB, TL); 4945 } 4946 4947 template<typename Derived> 4948 QualType 4949 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4950 RValueReferenceTypeLoc TL) { 4951 return TransformReferenceType(TLB, TL); 4952 } 4953 4954 template<typename Derived> 4955 QualType 4956 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4957 MemberPointerTypeLoc TL) { 4958 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4959 if (PointeeType.isNull()) 4960 return QualType(); 4961 4962 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4963 TypeSourceInfo *NewClsTInfo = nullptr; 4964 if (OldClsTInfo) { 4965 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4966 if (!NewClsTInfo) 4967 return QualType(); 4968 } 4969 4970 const MemberPointerType *T = TL.getTypePtr(); 4971 QualType OldClsType = QualType(T->getClass(), 0); 4972 QualType NewClsType; 4973 if (NewClsTInfo) 4974 NewClsType = NewClsTInfo->getType(); 4975 else { 4976 NewClsType = getDerived().TransformType(OldClsType); 4977 if (NewClsType.isNull()) 4978 return QualType(); 4979 } 4980 4981 QualType Result = TL.getType(); 4982 if (getDerived().AlwaysRebuild() || 4983 PointeeType != T->getPointeeType() || 4984 NewClsType != OldClsType) { 4985 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4986 TL.getStarLoc()); 4987 if (Result.isNull()) 4988 return QualType(); 4989 } 4990 4991 // If we had to adjust the pointee type when building a member pointer, make 4992 // sure to push TypeLoc info for it. 4993 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4994 if (MPT && PointeeType != MPT->getPointeeType()) { 4995 assert(isa<AdjustedType>(MPT->getPointeeType())); 4996 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4997 } 4998 4999 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5000 NewTL.setSigilLoc(TL.getSigilLoc()); 5001 NewTL.setClassTInfo(NewClsTInfo); 5002 5003 return Result; 5004 } 5005 5006 template<typename Derived> 5007 QualType 5008 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5009 ConstantArrayTypeLoc TL) { 5010 const ConstantArrayType *T = TL.getTypePtr(); 5011 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5012 if (ElementType.isNull()) 5013 return QualType(); 5014 5015 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5016 Expr *OldSize = TL.getSizeExpr(); 5017 if (!OldSize) 5018 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5019 Expr *NewSize = nullptr; 5020 if (OldSize) { 5021 EnterExpressionEvaluationContext Unevaluated( 5022 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5023 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5024 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5025 } 5026 5027 QualType Result = TL.getType(); 5028 if (getDerived().AlwaysRebuild() || 5029 ElementType != T->getElementType() || 5030 (T->getSizeExpr() && NewSize != OldSize)) { 5031 Result = getDerived().RebuildConstantArrayType(ElementType, 5032 T->getSizeModifier(), 5033 T->getSize(), NewSize, 5034 T->getIndexTypeCVRQualifiers(), 5035 TL.getBracketsRange()); 5036 if (Result.isNull()) 5037 return QualType(); 5038 } 5039 5040 // We might have either a ConstantArrayType or a VariableArrayType now: 5041 // a ConstantArrayType is allowed to have an element type which is a 5042 // VariableArrayType if the type is dependent. Fortunately, all array 5043 // types have the same location layout. 5044 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5045 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5046 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5047 NewTL.setSizeExpr(NewSize); 5048 5049 return Result; 5050 } 5051 5052 template<typename Derived> 5053 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5054 TypeLocBuilder &TLB, 5055 IncompleteArrayTypeLoc TL) { 5056 const IncompleteArrayType *T = TL.getTypePtr(); 5057 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5058 if (ElementType.isNull()) 5059 return QualType(); 5060 5061 QualType Result = TL.getType(); 5062 if (getDerived().AlwaysRebuild() || 5063 ElementType != T->getElementType()) { 5064 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5065 T->getSizeModifier(), 5066 T->getIndexTypeCVRQualifiers(), 5067 TL.getBracketsRange()); 5068 if (Result.isNull()) 5069 return QualType(); 5070 } 5071 5072 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5073 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5074 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5075 NewTL.setSizeExpr(nullptr); 5076 5077 return Result; 5078 } 5079 5080 template<typename Derived> 5081 QualType 5082 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5083 VariableArrayTypeLoc TL) { 5084 const VariableArrayType *T = TL.getTypePtr(); 5085 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5086 if (ElementType.isNull()) 5087 return QualType(); 5088 5089 ExprResult SizeResult; 5090 { 5091 EnterExpressionEvaluationContext Context( 5092 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5093 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5094 } 5095 if (SizeResult.isInvalid()) 5096 return QualType(); 5097 SizeResult = 5098 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5099 if (SizeResult.isInvalid()) 5100 return QualType(); 5101 5102 Expr *Size = SizeResult.get(); 5103 5104 QualType Result = TL.getType(); 5105 if (getDerived().AlwaysRebuild() || 5106 ElementType != T->getElementType() || 5107 Size != T->getSizeExpr()) { 5108 Result = getDerived().RebuildVariableArrayType(ElementType, 5109 T->getSizeModifier(), 5110 Size, 5111 T->getIndexTypeCVRQualifiers(), 5112 TL.getBracketsRange()); 5113 if (Result.isNull()) 5114 return QualType(); 5115 } 5116 5117 // We might have constant size array now, but fortunately it has the same 5118 // location layout. 5119 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5120 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5121 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5122 NewTL.setSizeExpr(Size); 5123 5124 return Result; 5125 } 5126 5127 template<typename Derived> 5128 QualType 5129 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5130 DependentSizedArrayTypeLoc TL) { 5131 const DependentSizedArrayType *T = TL.getTypePtr(); 5132 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5133 if (ElementType.isNull()) 5134 return QualType(); 5135 5136 // Array bounds are constant expressions. 5137 EnterExpressionEvaluationContext Unevaluated( 5138 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5139 5140 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5141 Expr *origSize = TL.getSizeExpr(); 5142 if (!origSize) origSize = T->getSizeExpr(); 5143 5144 ExprResult sizeResult 5145 = getDerived().TransformExpr(origSize); 5146 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5147 if (sizeResult.isInvalid()) 5148 return QualType(); 5149 5150 Expr *size = sizeResult.get(); 5151 5152 QualType Result = TL.getType(); 5153 if (getDerived().AlwaysRebuild() || 5154 ElementType != T->getElementType() || 5155 size != origSize) { 5156 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5157 T->getSizeModifier(), 5158 size, 5159 T->getIndexTypeCVRQualifiers(), 5160 TL.getBracketsRange()); 5161 if (Result.isNull()) 5162 return QualType(); 5163 } 5164 5165 // We might have any sort of array type now, but fortunately they 5166 // all have the same location layout. 5167 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5168 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5169 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5170 NewTL.setSizeExpr(size); 5171 5172 return Result; 5173 } 5174 5175 template <typename Derived> 5176 QualType TreeTransform<Derived>::TransformDependentVectorType( 5177 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5178 const DependentVectorType *T = TL.getTypePtr(); 5179 QualType ElementType = getDerived().TransformType(T->getElementType()); 5180 if (ElementType.isNull()) 5181 return QualType(); 5182 5183 EnterExpressionEvaluationContext Unevaluated( 5184 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5185 5186 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5187 Size = SemaRef.ActOnConstantExpression(Size); 5188 if (Size.isInvalid()) 5189 return QualType(); 5190 5191 QualType Result = TL.getType(); 5192 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5193 Size.get() != T->getSizeExpr()) { 5194 Result = getDerived().RebuildDependentVectorType( 5195 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5196 if (Result.isNull()) 5197 return QualType(); 5198 } 5199 5200 // Result might be dependent or not. 5201 if (isa<DependentVectorType>(Result)) { 5202 DependentVectorTypeLoc NewTL = 5203 TLB.push<DependentVectorTypeLoc>(Result); 5204 NewTL.setNameLoc(TL.getNameLoc()); 5205 } else { 5206 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5207 NewTL.setNameLoc(TL.getNameLoc()); 5208 } 5209 5210 return Result; 5211 } 5212 5213 template<typename Derived> 5214 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5215 TypeLocBuilder &TLB, 5216 DependentSizedExtVectorTypeLoc TL) { 5217 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5218 5219 // FIXME: ext vector locs should be nested 5220 QualType ElementType = getDerived().TransformType(T->getElementType()); 5221 if (ElementType.isNull()) 5222 return QualType(); 5223 5224 // Vector sizes are constant expressions. 5225 EnterExpressionEvaluationContext Unevaluated( 5226 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5227 5228 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5229 Size = SemaRef.ActOnConstantExpression(Size); 5230 if (Size.isInvalid()) 5231 return QualType(); 5232 5233 QualType Result = TL.getType(); 5234 if (getDerived().AlwaysRebuild() || 5235 ElementType != T->getElementType() || 5236 Size.get() != T->getSizeExpr()) { 5237 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5238 Size.get(), 5239 T->getAttributeLoc()); 5240 if (Result.isNull()) 5241 return QualType(); 5242 } 5243 5244 // Result might be dependent or not. 5245 if (isa<DependentSizedExtVectorType>(Result)) { 5246 DependentSizedExtVectorTypeLoc NewTL 5247 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5248 NewTL.setNameLoc(TL.getNameLoc()); 5249 } else { 5250 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5251 NewTL.setNameLoc(TL.getNameLoc()); 5252 } 5253 5254 return Result; 5255 } 5256 5257 template <typename Derived> 5258 QualType 5259 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5260 ConstantMatrixTypeLoc TL) { 5261 const ConstantMatrixType *T = TL.getTypePtr(); 5262 QualType ElementType = getDerived().TransformType(T->getElementType()); 5263 if (ElementType.isNull()) 5264 return QualType(); 5265 5266 QualType Result = TL.getType(); 5267 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5268 Result = getDerived().RebuildConstantMatrixType( 5269 ElementType, T->getNumRows(), T->getNumColumns()); 5270 if (Result.isNull()) 5271 return QualType(); 5272 } 5273 5274 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5275 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5276 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5277 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5278 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5279 5280 return Result; 5281 } 5282 5283 template <typename Derived> 5284 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5285 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5286 const DependentSizedMatrixType *T = TL.getTypePtr(); 5287 5288 QualType ElementType = getDerived().TransformType(T->getElementType()); 5289 if (ElementType.isNull()) { 5290 return QualType(); 5291 } 5292 5293 // Matrix dimensions are constant expressions. 5294 EnterExpressionEvaluationContext Unevaluated( 5295 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5296 5297 Expr *origRows = TL.getAttrRowOperand(); 5298 if (!origRows) 5299 origRows = T->getRowExpr(); 5300 Expr *origColumns = TL.getAttrColumnOperand(); 5301 if (!origColumns) 5302 origColumns = T->getColumnExpr(); 5303 5304 ExprResult rowResult = getDerived().TransformExpr(origRows); 5305 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5306 if (rowResult.isInvalid()) 5307 return QualType(); 5308 5309 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5310 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5311 if (columnResult.isInvalid()) 5312 return QualType(); 5313 5314 Expr *rows = rowResult.get(); 5315 Expr *columns = columnResult.get(); 5316 5317 QualType Result = TL.getType(); 5318 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5319 rows != origRows || columns != origColumns) { 5320 Result = getDerived().RebuildDependentSizedMatrixType( 5321 ElementType, rows, columns, T->getAttributeLoc()); 5322 5323 if (Result.isNull()) 5324 return QualType(); 5325 } 5326 5327 // We might have any sort of matrix type now, but fortunately they 5328 // all have the same location layout. 5329 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5330 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5331 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5332 NewTL.setAttrRowOperand(rows); 5333 NewTL.setAttrColumnOperand(columns); 5334 return Result; 5335 } 5336 5337 template <typename Derived> 5338 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5339 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5340 const DependentAddressSpaceType *T = TL.getTypePtr(); 5341 5342 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5343 5344 if (pointeeType.isNull()) 5345 return QualType(); 5346 5347 // Address spaces are constant expressions. 5348 EnterExpressionEvaluationContext Unevaluated( 5349 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5350 5351 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5352 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5353 if (AddrSpace.isInvalid()) 5354 return QualType(); 5355 5356 QualType Result = TL.getType(); 5357 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5358 AddrSpace.get() != T->getAddrSpaceExpr()) { 5359 Result = getDerived().RebuildDependentAddressSpaceType( 5360 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5361 if (Result.isNull()) 5362 return QualType(); 5363 } 5364 5365 // Result might be dependent or not. 5366 if (isa<DependentAddressSpaceType>(Result)) { 5367 DependentAddressSpaceTypeLoc NewTL = 5368 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5369 5370 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5371 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5372 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5373 5374 } else { 5375 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5376 Result, getDerived().getBaseLocation()); 5377 TransformType(TLB, DI->getTypeLoc()); 5378 } 5379 5380 return Result; 5381 } 5382 5383 template <typename Derived> 5384 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5385 VectorTypeLoc TL) { 5386 const VectorType *T = TL.getTypePtr(); 5387 QualType ElementType = getDerived().TransformType(T->getElementType()); 5388 if (ElementType.isNull()) 5389 return QualType(); 5390 5391 QualType Result = TL.getType(); 5392 if (getDerived().AlwaysRebuild() || 5393 ElementType != T->getElementType()) { 5394 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5395 T->getVectorKind()); 5396 if (Result.isNull()) 5397 return QualType(); 5398 } 5399 5400 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5401 NewTL.setNameLoc(TL.getNameLoc()); 5402 5403 return Result; 5404 } 5405 5406 template<typename Derived> 5407 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5408 ExtVectorTypeLoc TL) { 5409 const VectorType *T = TL.getTypePtr(); 5410 QualType ElementType = getDerived().TransformType(T->getElementType()); 5411 if (ElementType.isNull()) 5412 return QualType(); 5413 5414 QualType Result = TL.getType(); 5415 if (getDerived().AlwaysRebuild() || 5416 ElementType != T->getElementType()) { 5417 Result = getDerived().RebuildExtVectorType(ElementType, 5418 T->getNumElements(), 5419 /*FIXME*/ SourceLocation()); 5420 if (Result.isNull()) 5421 return QualType(); 5422 } 5423 5424 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5425 NewTL.setNameLoc(TL.getNameLoc()); 5426 5427 return Result; 5428 } 5429 5430 template <typename Derived> 5431 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5432 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5433 bool ExpectParameterPack) { 5434 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5435 TypeSourceInfo *NewDI = nullptr; 5436 5437 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5438 // If we're substituting into a pack expansion type and we know the 5439 // length we want to expand to, just substitute for the pattern. 5440 TypeLoc OldTL = OldDI->getTypeLoc(); 5441 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5442 5443 TypeLocBuilder TLB; 5444 TypeLoc NewTL = OldDI->getTypeLoc(); 5445 TLB.reserve(NewTL.getFullDataSize()); 5446 5447 QualType Result = getDerived().TransformType(TLB, 5448 OldExpansionTL.getPatternLoc()); 5449 if (Result.isNull()) 5450 return nullptr; 5451 5452 Result = RebuildPackExpansionType(Result, 5453 OldExpansionTL.getPatternLoc().getSourceRange(), 5454 OldExpansionTL.getEllipsisLoc(), 5455 NumExpansions); 5456 if (Result.isNull()) 5457 return nullptr; 5458 5459 PackExpansionTypeLoc NewExpansionTL 5460 = TLB.push<PackExpansionTypeLoc>(Result); 5461 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5462 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5463 } else 5464 NewDI = getDerived().TransformType(OldDI); 5465 if (!NewDI) 5466 return nullptr; 5467 5468 if (NewDI == OldDI && indexAdjustment == 0) 5469 return OldParm; 5470 5471 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5472 OldParm->getDeclContext(), 5473 OldParm->getInnerLocStart(), 5474 OldParm->getLocation(), 5475 OldParm->getIdentifier(), 5476 NewDI->getType(), 5477 NewDI, 5478 OldParm->getStorageClass(), 5479 /* DefArg */ nullptr); 5480 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5481 OldParm->getFunctionScopeIndex() + indexAdjustment); 5482 transformedLocalDecl(OldParm, {newParm}); 5483 return newParm; 5484 } 5485 5486 template <typename Derived> 5487 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5488 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5489 const QualType *ParamTypes, 5490 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5491 SmallVectorImpl<QualType> &OutParamTypes, 5492 SmallVectorImpl<ParmVarDecl *> *PVars, 5493 Sema::ExtParameterInfoBuilder &PInfos) { 5494 int indexAdjustment = 0; 5495 5496 unsigned NumParams = Params.size(); 5497 for (unsigned i = 0; i != NumParams; ++i) { 5498 if (ParmVarDecl *OldParm = Params[i]) { 5499 assert(OldParm->getFunctionScopeIndex() == i); 5500 5501 Optional<unsigned> NumExpansions; 5502 ParmVarDecl *NewParm = nullptr; 5503 if (OldParm->isParameterPack()) { 5504 // We have a function parameter pack that may need to be expanded. 5505 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5506 5507 // Find the parameter packs that could be expanded. 5508 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5509 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5510 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5511 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5512 5513 // Determine whether we should expand the parameter packs. 5514 bool ShouldExpand = false; 5515 bool RetainExpansion = false; 5516 Optional<unsigned> OrigNumExpansions; 5517 if (Unexpanded.size() > 0) { 5518 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5519 NumExpansions = OrigNumExpansions; 5520 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5521 Pattern.getSourceRange(), 5522 Unexpanded, 5523 ShouldExpand, 5524 RetainExpansion, 5525 NumExpansions)) { 5526 return true; 5527 } 5528 } else { 5529 #ifndef NDEBUG 5530 const AutoType *AT = 5531 Pattern.getType().getTypePtr()->getContainedAutoType(); 5532 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5533 "Could not find parameter packs or undeduced auto type!"); 5534 #endif 5535 } 5536 5537 if (ShouldExpand) { 5538 // Expand the function parameter pack into multiple, separate 5539 // parameters. 5540 getDerived().ExpandingFunctionParameterPack(OldParm); 5541 for (unsigned I = 0; I != *NumExpansions; ++I) { 5542 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5543 ParmVarDecl *NewParm 5544 = getDerived().TransformFunctionTypeParam(OldParm, 5545 indexAdjustment++, 5546 OrigNumExpansions, 5547 /*ExpectParameterPack=*/false); 5548 if (!NewParm) 5549 return true; 5550 5551 if (ParamInfos) 5552 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5553 OutParamTypes.push_back(NewParm->getType()); 5554 if (PVars) 5555 PVars->push_back(NewParm); 5556 } 5557 5558 // If we're supposed to retain a pack expansion, do so by temporarily 5559 // forgetting the partially-substituted parameter pack. 5560 if (RetainExpansion) { 5561 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5562 ParmVarDecl *NewParm 5563 = getDerived().TransformFunctionTypeParam(OldParm, 5564 indexAdjustment++, 5565 OrigNumExpansions, 5566 /*ExpectParameterPack=*/false); 5567 if (!NewParm) 5568 return true; 5569 5570 if (ParamInfos) 5571 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5572 OutParamTypes.push_back(NewParm->getType()); 5573 if (PVars) 5574 PVars->push_back(NewParm); 5575 } 5576 5577 // The next parameter should have the same adjustment as the 5578 // last thing we pushed, but we post-incremented indexAdjustment 5579 // on every push. Also, if we push nothing, the adjustment should 5580 // go down by one. 5581 indexAdjustment--; 5582 5583 // We're done with the pack expansion. 5584 continue; 5585 } 5586 5587 // We'll substitute the parameter now without expanding the pack 5588 // expansion. 5589 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5590 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5591 indexAdjustment, 5592 NumExpansions, 5593 /*ExpectParameterPack=*/true); 5594 assert(NewParm->isParameterPack() && 5595 "Parameter pack no longer a parameter pack after " 5596 "transformation."); 5597 } else { 5598 NewParm = getDerived().TransformFunctionTypeParam( 5599 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5600 } 5601 5602 if (!NewParm) 5603 return true; 5604 5605 if (ParamInfos) 5606 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5607 OutParamTypes.push_back(NewParm->getType()); 5608 if (PVars) 5609 PVars->push_back(NewParm); 5610 continue; 5611 } 5612 5613 // Deal with the possibility that we don't have a parameter 5614 // declaration for this parameter. 5615 QualType OldType = ParamTypes[i]; 5616 bool IsPackExpansion = false; 5617 Optional<unsigned> NumExpansions; 5618 QualType NewType; 5619 if (const PackExpansionType *Expansion 5620 = dyn_cast<PackExpansionType>(OldType)) { 5621 // We have a function parameter pack that may need to be expanded. 5622 QualType Pattern = Expansion->getPattern(); 5623 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5624 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5625 5626 // Determine whether we should expand the parameter packs. 5627 bool ShouldExpand = false; 5628 bool RetainExpansion = false; 5629 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5630 Unexpanded, 5631 ShouldExpand, 5632 RetainExpansion, 5633 NumExpansions)) { 5634 return true; 5635 } 5636 5637 if (ShouldExpand) { 5638 // Expand the function parameter pack into multiple, separate 5639 // parameters. 5640 for (unsigned I = 0; I != *NumExpansions; ++I) { 5641 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5642 QualType NewType = getDerived().TransformType(Pattern); 5643 if (NewType.isNull()) 5644 return true; 5645 5646 if (NewType->containsUnexpandedParameterPack()) { 5647 NewType = 5648 getSema().getASTContext().getPackExpansionType(NewType, None); 5649 5650 if (NewType.isNull()) 5651 return true; 5652 } 5653 5654 if (ParamInfos) 5655 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5656 OutParamTypes.push_back(NewType); 5657 if (PVars) 5658 PVars->push_back(nullptr); 5659 } 5660 5661 // We're done with the pack expansion. 5662 continue; 5663 } 5664 5665 // If we're supposed to retain a pack expansion, do so by temporarily 5666 // forgetting the partially-substituted parameter pack. 5667 if (RetainExpansion) { 5668 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5669 QualType NewType = getDerived().TransformType(Pattern); 5670 if (NewType.isNull()) 5671 return true; 5672 5673 if (ParamInfos) 5674 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5675 OutParamTypes.push_back(NewType); 5676 if (PVars) 5677 PVars->push_back(nullptr); 5678 } 5679 5680 // We'll substitute the parameter now without expanding the pack 5681 // expansion. 5682 OldType = Expansion->getPattern(); 5683 IsPackExpansion = true; 5684 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5685 NewType = getDerived().TransformType(OldType); 5686 } else { 5687 NewType = getDerived().TransformType(OldType); 5688 } 5689 5690 if (NewType.isNull()) 5691 return true; 5692 5693 if (IsPackExpansion) 5694 NewType = getSema().Context.getPackExpansionType(NewType, 5695 NumExpansions); 5696 5697 if (ParamInfos) 5698 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5699 OutParamTypes.push_back(NewType); 5700 if (PVars) 5701 PVars->push_back(nullptr); 5702 } 5703 5704 #ifndef NDEBUG 5705 if (PVars) { 5706 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5707 if (ParmVarDecl *parm = (*PVars)[i]) 5708 assert(parm->getFunctionScopeIndex() == i); 5709 } 5710 #endif 5711 5712 return false; 5713 } 5714 5715 template<typename Derived> 5716 QualType 5717 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5718 FunctionProtoTypeLoc TL) { 5719 SmallVector<QualType, 4> ExceptionStorage; 5720 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5721 return getDerived().TransformFunctionProtoType( 5722 TLB, TL, nullptr, Qualifiers(), 5723 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5724 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5725 ExceptionStorage, Changed); 5726 }); 5727 } 5728 5729 template<typename Derived> template<typename Fn> 5730 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5731 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5732 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5733 5734 // Transform the parameters and return type. 5735 // 5736 // We are required to instantiate the params and return type in source order. 5737 // When the function has a trailing return type, we instantiate the 5738 // parameters before the return type, since the return type can then refer 5739 // to the parameters themselves (via decltype, sizeof, etc.). 5740 // 5741 SmallVector<QualType, 4> ParamTypes; 5742 SmallVector<ParmVarDecl*, 4> ParamDecls; 5743 Sema::ExtParameterInfoBuilder ExtParamInfos; 5744 const FunctionProtoType *T = TL.getTypePtr(); 5745 5746 QualType ResultType; 5747 5748 if (T->hasTrailingReturn()) { 5749 if (getDerived().TransformFunctionTypeParams( 5750 TL.getBeginLoc(), TL.getParams(), 5751 TL.getTypePtr()->param_type_begin(), 5752 T->getExtParameterInfosOrNull(), 5753 ParamTypes, &ParamDecls, ExtParamInfos)) 5754 return QualType(); 5755 5756 { 5757 // C++11 [expr.prim.general]p3: 5758 // If a declaration declares a member function or member function 5759 // template of a class X, the expression this is a prvalue of type 5760 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5761 // and the end of the function-definition, member-declarator, or 5762 // declarator. 5763 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5764 5765 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5766 if (ResultType.isNull()) 5767 return QualType(); 5768 } 5769 } 5770 else { 5771 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5772 if (ResultType.isNull()) 5773 return QualType(); 5774 5775 if (getDerived().TransformFunctionTypeParams( 5776 TL.getBeginLoc(), TL.getParams(), 5777 TL.getTypePtr()->param_type_begin(), 5778 T->getExtParameterInfosOrNull(), 5779 ParamTypes, &ParamDecls, ExtParamInfos)) 5780 return QualType(); 5781 } 5782 5783 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5784 5785 bool EPIChanged = false; 5786 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5787 return QualType(); 5788 5789 // Handle extended parameter information. 5790 if (auto NewExtParamInfos = 5791 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5792 if (!EPI.ExtParameterInfos || 5793 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5794 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5795 EPIChanged = true; 5796 } 5797 EPI.ExtParameterInfos = NewExtParamInfos; 5798 } else if (EPI.ExtParameterInfos) { 5799 EPIChanged = true; 5800 EPI.ExtParameterInfos = nullptr; 5801 } 5802 5803 QualType Result = TL.getType(); 5804 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5805 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5806 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5807 if (Result.isNull()) 5808 return QualType(); 5809 } 5810 5811 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5812 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5813 NewTL.setLParenLoc(TL.getLParenLoc()); 5814 NewTL.setRParenLoc(TL.getRParenLoc()); 5815 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5816 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5817 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5818 NewTL.setParam(i, ParamDecls[i]); 5819 5820 return Result; 5821 } 5822 5823 template<typename Derived> 5824 bool TreeTransform<Derived>::TransformExceptionSpec( 5825 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5826 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5827 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5828 5829 // Instantiate a dynamic noexcept expression, if any. 5830 if (isComputedNoexcept(ESI.Type)) { 5831 EnterExpressionEvaluationContext Unevaluated( 5832 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5833 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5834 if (NoexceptExpr.isInvalid()) 5835 return true; 5836 5837 ExceptionSpecificationType EST = ESI.Type; 5838 NoexceptExpr = 5839 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5840 if (NoexceptExpr.isInvalid()) 5841 return true; 5842 5843 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5844 Changed = true; 5845 ESI.NoexceptExpr = NoexceptExpr.get(); 5846 ESI.Type = EST; 5847 } 5848 5849 if (ESI.Type != EST_Dynamic) 5850 return false; 5851 5852 // Instantiate a dynamic exception specification's type. 5853 for (QualType T : ESI.Exceptions) { 5854 if (const PackExpansionType *PackExpansion = 5855 T->getAs<PackExpansionType>()) { 5856 Changed = true; 5857 5858 // We have a pack expansion. Instantiate it. 5859 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5860 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5861 Unexpanded); 5862 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5863 5864 // Determine whether the set of unexpanded parameter packs can and 5865 // should 5866 // be expanded. 5867 bool Expand = false; 5868 bool RetainExpansion = false; 5869 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5870 // FIXME: Track the location of the ellipsis (and track source location 5871 // information for the types in the exception specification in general). 5872 if (getDerived().TryExpandParameterPacks( 5873 Loc, SourceRange(), Unexpanded, Expand, 5874 RetainExpansion, NumExpansions)) 5875 return true; 5876 5877 if (!Expand) { 5878 // We can't expand this pack expansion into separate arguments yet; 5879 // just substitute into the pattern and create a new pack expansion 5880 // type. 5881 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5882 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5883 if (U.isNull()) 5884 return true; 5885 5886 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5887 Exceptions.push_back(U); 5888 continue; 5889 } 5890 5891 // Substitute into the pack expansion pattern for each slice of the 5892 // pack. 5893 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5894 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5895 5896 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5897 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5898 return true; 5899 5900 Exceptions.push_back(U); 5901 } 5902 } else { 5903 QualType U = getDerived().TransformType(T); 5904 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5905 return true; 5906 if (T != U) 5907 Changed = true; 5908 5909 Exceptions.push_back(U); 5910 } 5911 } 5912 5913 ESI.Exceptions = Exceptions; 5914 if (ESI.Exceptions.empty()) 5915 ESI.Type = EST_DynamicNone; 5916 return false; 5917 } 5918 5919 template<typename Derived> 5920 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5921 TypeLocBuilder &TLB, 5922 FunctionNoProtoTypeLoc TL) { 5923 const FunctionNoProtoType *T = TL.getTypePtr(); 5924 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5925 if (ResultType.isNull()) 5926 return QualType(); 5927 5928 QualType Result = TL.getType(); 5929 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5930 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5931 5932 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5933 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5934 NewTL.setLParenLoc(TL.getLParenLoc()); 5935 NewTL.setRParenLoc(TL.getRParenLoc()); 5936 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5937 5938 return Result; 5939 } 5940 5941 template<typename Derived> QualType 5942 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5943 UnresolvedUsingTypeLoc TL) { 5944 const UnresolvedUsingType *T = TL.getTypePtr(); 5945 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5946 if (!D) 5947 return QualType(); 5948 5949 QualType Result = TL.getType(); 5950 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5951 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5952 if (Result.isNull()) 5953 return QualType(); 5954 } 5955 5956 // We might get an arbitrary type spec type back. We should at 5957 // least always get a type spec type, though. 5958 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5959 NewTL.setNameLoc(TL.getNameLoc()); 5960 5961 return Result; 5962 } 5963 5964 template<typename Derived> 5965 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5966 TypedefTypeLoc TL) { 5967 const TypedefType *T = TL.getTypePtr(); 5968 TypedefNameDecl *Typedef 5969 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5970 T->getDecl())); 5971 if (!Typedef) 5972 return QualType(); 5973 5974 QualType Result = TL.getType(); 5975 if (getDerived().AlwaysRebuild() || 5976 Typedef != T->getDecl()) { 5977 Result = getDerived().RebuildTypedefType(Typedef); 5978 if (Result.isNull()) 5979 return QualType(); 5980 } 5981 5982 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5983 NewTL.setNameLoc(TL.getNameLoc()); 5984 5985 return Result; 5986 } 5987 5988 template<typename Derived> 5989 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5990 TypeOfExprTypeLoc TL) { 5991 // typeof expressions are not potentially evaluated contexts 5992 EnterExpressionEvaluationContext Unevaluated( 5993 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5994 Sema::ReuseLambdaContextDecl); 5995 5996 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5997 if (E.isInvalid()) 5998 return QualType(); 5999 6000 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6001 if (E.isInvalid()) 6002 return QualType(); 6003 6004 QualType Result = TL.getType(); 6005 if (getDerived().AlwaysRebuild() || 6006 E.get() != TL.getUnderlyingExpr()) { 6007 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6008 if (Result.isNull()) 6009 return QualType(); 6010 } 6011 else E.get(); 6012 6013 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6014 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6015 NewTL.setLParenLoc(TL.getLParenLoc()); 6016 NewTL.setRParenLoc(TL.getRParenLoc()); 6017 6018 return Result; 6019 } 6020 6021 template<typename Derived> 6022 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6023 TypeOfTypeLoc TL) { 6024 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6025 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6026 if (!New_Under_TI) 6027 return QualType(); 6028 6029 QualType Result = TL.getType(); 6030 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6031 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6032 if (Result.isNull()) 6033 return QualType(); 6034 } 6035 6036 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6037 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6038 NewTL.setLParenLoc(TL.getLParenLoc()); 6039 NewTL.setRParenLoc(TL.getRParenLoc()); 6040 NewTL.setUnderlyingTInfo(New_Under_TI); 6041 6042 return Result; 6043 } 6044 6045 template<typename Derived> 6046 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6047 DecltypeTypeLoc TL) { 6048 const DecltypeType *T = TL.getTypePtr(); 6049 6050 // decltype expressions are not potentially evaluated contexts 6051 EnterExpressionEvaluationContext Unevaluated( 6052 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6053 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6054 6055 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6056 if (E.isInvalid()) 6057 return QualType(); 6058 6059 E = getSema().ActOnDecltypeExpression(E.get()); 6060 if (E.isInvalid()) 6061 return QualType(); 6062 6063 QualType Result = TL.getType(); 6064 if (getDerived().AlwaysRebuild() || 6065 E.get() != T->getUnderlyingExpr()) { 6066 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6067 if (Result.isNull()) 6068 return QualType(); 6069 } 6070 else E.get(); 6071 6072 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6073 NewTL.setNameLoc(TL.getNameLoc()); 6074 6075 return Result; 6076 } 6077 6078 template<typename Derived> 6079 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6080 TypeLocBuilder &TLB, 6081 UnaryTransformTypeLoc TL) { 6082 QualType Result = TL.getType(); 6083 if (Result->isDependentType()) { 6084 const UnaryTransformType *T = TL.getTypePtr(); 6085 QualType NewBase = 6086 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6087 Result = getDerived().RebuildUnaryTransformType(NewBase, 6088 T->getUTTKind(), 6089 TL.getKWLoc()); 6090 if (Result.isNull()) 6091 return QualType(); 6092 } 6093 6094 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6095 NewTL.setKWLoc(TL.getKWLoc()); 6096 NewTL.setParensRange(TL.getParensRange()); 6097 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6098 return Result; 6099 } 6100 6101 template<typename Derived> 6102 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6103 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6104 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6105 6106 CXXScopeSpec SS; 6107 TemplateName TemplateName = getDerived().TransformTemplateName( 6108 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6109 if (TemplateName.isNull()) 6110 return QualType(); 6111 6112 QualType OldDeduced = T->getDeducedType(); 6113 QualType NewDeduced; 6114 if (!OldDeduced.isNull()) { 6115 NewDeduced = getDerived().TransformType(OldDeduced); 6116 if (NewDeduced.isNull()) 6117 return QualType(); 6118 } 6119 6120 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6121 TemplateName, NewDeduced); 6122 if (Result.isNull()) 6123 return QualType(); 6124 6125 DeducedTemplateSpecializationTypeLoc NewTL = 6126 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6127 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6128 6129 return Result; 6130 } 6131 6132 template<typename Derived> 6133 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6134 RecordTypeLoc TL) { 6135 const RecordType *T = TL.getTypePtr(); 6136 RecordDecl *Record 6137 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6138 T->getDecl())); 6139 if (!Record) 6140 return QualType(); 6141 6142 QualType Result = TL.getType(); 6143 if (getDerived().AlwaysRebuild() || 6144 Record != T->getDecl()) { 6145 Result = getDerived().RebuildRecordType(Record); 6146 if (Result.isNull()) 6147 return QualType(); 6148 } 6149 6150 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6151 NewTL.setNameLoc(TL.getNameLoc()); 6152 6153 return Result; 6154 } 6155 6156 template<typename Derived> 6157 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6158 EnumTypeLoc TL) { 6159 const EnumType *T = TL.getTypePtr(); 6160 EnumDecl *Enum 6161 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6162 T->getDecl())); 6163 if (!Enum) 6164 return QualType(); 6165 6166 QualType Result = TL.getType(); 6167 if (getDerived().AlwaysRebuild() || 6168 Enum != T->getDecl()) { 6169 Result = getDerived().RebuildEnumType(Enum); 6170 if (Result.isNull()) 6171 return QualType(); 6172 } 6173 6174 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6175 NewTL.setNameLoc(TL.getNameLoc()); 6176 6177 return Result; 6178 } 6179 6180 template<typename Derived> 6181 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6182 TypeLocBuilder &TLB, 6183 InjectedClassNameTypeLoc TL) { 6184 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6185 TL.getTypePtr()->getDecl()); 6186 if (!D) return QualType(); 6187 6188 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6189 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6190 return T; 6191 } 6192 6193 template<typename Derived> 6194 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6195 TypeLocBuilder &TLB, 6196 TemplateTypeParmTypeLoc TL) { 6197 return TransformTypeSpecType(TLB, TL); 6198 } 6199 6200 template<typename Derived> 6201 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6202 TypeLocBuilder &TLB, 6203 SubstTemplateTypeParmTypeLoc TL) { 6204 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6205 6206 // Substitute into the replacement type, which itself might involve something 6207 // that needs to be transformed. This only tends to occur with default 6208 // template arguments of template template parameters. 6209 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6210 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6211 if (Replacement.isNull()) 6212 return QualType(); 6213 6214 // Always canonicalize the replacement type. 6215 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6216 QualType Result 6217 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6218 Replacement); 6219 6220 // Propagate type-source information. 6221 SubstTemplateTypeParmTypeLoc NewTL 6222 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6223 NewTL.setNameLoc(TL.getNameLoc()); 6224 return Result; 6225 6226 } 6227 6228 template<typename Derived> 6229 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6230 TypeLocBuilder &TLB, 6231 SubstTemplateTypeParmPackTypeLoc TL) { 6232 return TransformTypeSpecType(TLB, TL); 6233 } 6234 6235 template<typename Derived> 6236 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6237 TypeLocBuilder &TLB, 6238 TemplateSpecializationTypeLoc TL) { 6239 const TemplateSpecializationType *T = TL.getTypePtr(); 6240 6241 // The nested-name-specifier never matters in a TemplateSpecializationType, 6242 // because we can't have a dependent nested-name-specifier anyway. 6243 CXXScopeSpec SS; 6244 TemplateName Template 6245 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6246 TL.getTemplateNameLoc()); 6247 if (Template.isNull()) 6248 return QualType(); 6249 6250 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6251 } 6252 6253 template<typename Derived> 6254 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6255 AtomicTypeLoc TL) { 6256 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6257 if (ValueType.isNull()) 6258 return QualType(); 6259 6260 QualType Result = TL.getType(); 6261 if (getDerived().AlwaysRebuild() || 6262 ValueType != TL.getValueLoc().getType()) { 6263 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6264 if (Result.isNull()) 6265 return QualType(); 6266 } 6267 6268 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6269 NewTL.setKWLoc(TL.getKWLoc()); 6270 NewTL.setLParenLoc(TL.getLParenLoc()); 6271 NewTL.setRParenLoc(TL.getRParenLoc()); 6272 6273 return Result; 6274 } 6275 6276 template <typename Derived> 6277 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6278 PipeTypeLoc TL) { 6279 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6280 if (ValueType.isNull()) 6281 return QualType(); 6282 6283 QualType Result = TL.getType(); 6284 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6285 const PipeType *PT = Result->castAs<PipeType>(); 6286 bool isReadPipe = PT->isReadOnly(); 6287 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6288 if (Result.isNull()) 6289 return QualType(); 6290 } 6291 6292 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6293 NewTL.setKWLoc(TL.getKWLoc()); 6294 6295 return Result; 6296 } 6297 6298 template <typename Derived> 6299 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6300 ExtIntTypeLoc TL) { 6301 const ExtIntType *EIT = TL.getTypePtr(); 6302 QualType Result = TL.getType(); 6303 6304 if (getDerived().AlwaysRebuild()) { 6305 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6306 EIT->getNumBits(), TL.getNameLoc()); 6307 if (Result.isNull()) 6308 return QualType(); 6309 } 6310 6311 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6312 NewTL.setNameLoc(TL.getNameLoc()); 6313 return Result; 6314 } 6315 6316 template <typename Derived> 6317 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6318 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6319 const DependentExtIntType *EIT = TL.getTypePtr(); 6320 6321 EnterExpressionEvaluationContext Unevaluated( 6322 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6323 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6324 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6325 6326 if (BitsExpr.isInvalid()) 6327 return QualType(); 6328 6329 QualType Result = TL.getType(); 6330 6331 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6332 Result = getDerived().RebuildDependentExtIntType( 6333 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6334 6335 if (Result.isNull()) 6336 return QualType(); 6337 } 6338 6339 if (isa<DependentExtIntType>(Result)) { 6340 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6341 NewTL.setNameLoc(TL.getNameLoc()); 6342 } else { 6343 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6344 NewTL.setNameLoc(TL.getNameLoc()); 6345 } 6346 return Result; 6347 } 6348 6349 /// Simple iterator that traverses the template arguments in a 6350 /// container that provides a \c getArgLoc() member function. 6351 /// 6352 /// This iterator is intended to be used with the iterator form of 6353 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6354 template<typename ArgLocContainer> 6355 class TemplateArgumentLocContainerIterator { 6356 ArgLocContainer *Container; 6357 unsigned Index; 6358 6359 public: 6360 typedef TemplateArgumentLoc value_type; 6361 typedef TemplateArgumentLoc reference; 6362 typedef int difference_type; 6363 typedef std::input_iterator_tag iterator_category; 6364 6365 class pointer { 6366 TemplateArgumentLoc Arg; 6367 6368 public: 6369 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6370 6371 const TemplateArgumentLoc *operator->() const { 6372 return &Arg; 6373 } 6374 }; 6375 6376 6377 TemplateArgumentLocContainerIterator() {} 6378 6379 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6380 unsigned Index) 6381 : Container(&Container), Index(Index) { } 6382 6383 TemplateArgumentLocContainerIterator &operator++() { 6384 ++Index; 6385 return *this; 6386 } 6387 6388 TemplateArgumentLocContainerIterator operator++(int) { 6389 TemplateArgumentLocContainerIterator Old(*this); 6390 ++(*this); 6391 return Old; 6392 } 6393 6394 TemplateArgumentLoc operator*() const { 6395 return Container->getArgLoc(Index); 6396 } 6397 6398 pointer operator->() const { 6399 return pointer(Container->getArgLoc(Index)); 6400 } 6401 6402 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6403 const TemplateArgumentLocContainerIterator &Y) { 6404 return X.Container == Y.Container && X.Index == Y.Index; 6405 } 6406 6407 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6408 const TemplateArgumentLocContainerIterator &Y) { 6409 return !(X == Y); 6410 } 6411 }; 6412 6413 template<typename Derived> 6414 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6415 AutoTypeLoc TL) { 6416 const AutoType *T = TL.getTypePtr(); 6417 QualType OldDeduced = T->getDeducedType(); 6418 QualType NewDeduced; 6419 if (!OldDeduced.isNull()) { 6420 NewDeduced = getDerived().TransformType(OldDeduced); 6421 if (NewDeduced.isNull()) 6422 return QualType(); 6423 } 6424 6425 ConceptDecl *NewCD = nullptr; 6426 TemplateArgumentListInfo NewTemplateArgs; 6427 NestedNameSpecifierLoc NewNestedNameSpec; 6428 if (TL.getTypePtr()->isConstrained()) { 6429 NewCD = cast_or_null<ConceptDecl>( 6430 getDerived().TransformDecl( 6431 TL.getConceptNameLoc(), 6432 TL.getTypePtr()->getTypeConstraintConcept())); 6433 6434 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6435 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6436 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6437 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6438 ArgIterator(TL, 6439 TL.getNumArgs()), 6440 NewTemplateArgs)) 6441 return QualType(); 6442 6443 if (TL.getNestedNameSpecifierLoc()) { 6444 NewNestedNameSpec 6445 = getDerived().TransformNestedNameSpecifierLoc( 6446 TL.getNestedNameSpecifierLoc()); 6447 if (!NewNestedNameSpec) 6448 return QualType(); 6449 } 6450 } 6451 6452 QualType Result = TL.getType(); 6453 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6454 T->isDependentType()) { 6455 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6456 NewArgList.reserve(NewArgList.size()); 6457 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6458 NewArgList.push_back(ArgLoc.getArgument()); 6459 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6460 NewArgList); 6461 if (Result.isNull()) 6462 return QualType(); 6463 } 6464 6465 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6466 NewTL.setNameLoc(TL.getNameLoc()); 6467 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6468 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6469 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6470 NewTL.setFoundDecl(TL.getFoundDecl()); 6471 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6472 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6473 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6474 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6475 6476 return Result; 6477 } 6478 6479 template <typename Derived> 6480 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6481 TypeLocBuilder &TLB, 6482 TemplateSpecializationTypeLoc TL, 6483 TemplateName Template) { 6484 TemplateArgumentListInfo NewTemplateArgs; 6485 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6486 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6487 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6488 ArgIterator; 6489 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6490 ArgIterator(TL, TL.getNumArgs()), 6491 NewTemplateArgs)) 6492 return QualType(); 6493 6494 // FIXME: maybe don't rebuild if all the template arguments are the same. 6495 6496 QualType Result = 6497 getDerived().RebuildTemplateSpecializationType(Template, 6498 TL.getTemplateNameLoc(), 6499 NewTemplateArgs); 6500 6501 if (!Result.isNull()) { 6502 // Specializations of template template parameters are represented as 6503 // TemplateSpecializationTypes, and substitution of type alias templates 6504 // within a dependent context can transform them into 6505 // DependentTemplateSpecializationTypes. 6506 if (isa<DependentTemplateSpecializationType>(Result)) { 6507 DependentTemplateSpecializationTypeLoc NewTL 6508 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6509 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6510 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6511 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6512 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6513 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6514 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6515 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6516 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6517 return Result; 6518 } 6519 6520 TemplateSpecializationTypeLoc NewTL 6521 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6522 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6523 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6524 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6525 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6526 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6527 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6528 } 6529 6530 return Result; 6531 } 6532 6533 template <typename Derived> 6534 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6535 TypeLocBuilder &TLB, 6536 DependentTemplateSpecializationTypeLoc TL, 6537 TemplateName Template, 6538 CXXScopeSpec &SS) { 6539 TemplateArgumentListInfo NewTemplateArgs; 6540 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6541 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6542 typedef TemplateArgumentLocContainerIterator< 6543 DependentTemplateSpecializationTypeLoc> ArgIterator; 6544 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6545 ArgIterator(TL, TL.getNumArgs()), 6546 NewTemplateArgs)) 6547 return QualType(); 6548 6549 // FIXME: maybe don't rebuild if all the template arguments are the same. 6550 6551 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6552 QualType Result 6553 = getSema().Context.getDependentTemplateSpecializationType( 6554 TL.getTypePtr()->getKeyword(), 6555 DTN->getQualifier(), 6556 DTN->getIdentifier(), 6557 NewTemplateArgs); 6558 6559 DependentTemplateSpecializationTypeLoc NewTL 6560 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6561 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6562 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6563 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6564 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6565 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6566 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6567 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6568 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6569 return Result; 6570 } 6571 6572 QualType Result 6573 = getDerived().RebuildTemplateSpecializationType(Template, 6574 TL.getTemplateNameLoc(), 6575 NewTemplateArgs); 6576 6577 if (!Result.isNull()) { 6578 /// FIXME: Wrap this in an elaborated-type-specifier? 6579 TemplateSpecializationTypeLoc NewTL 6580 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6581 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6582 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6583 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6584 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6585 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6586 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6587 } 6588 6589 return Result; 6590 } 6591 6592 template<typename Derived> 6593 QualType 6594 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6595 ElaboratedTypeLoc TL) { 6596 const ElaboratedType *T = TL.getTypePtr(); 6597 6598 NestedNameSpecifierLoc QualifierLoc; 6599 // NOTE: the qualifier in an ElaboratedType is optional. 6600 if (TL.getQualifierLoc()) { 6601 QualifierLoc 6602 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6603 if (!QualifierLoc) 6604 return QualType(); 6605 } 6606 6607 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6608 if (NamedT.isNull()) 6609 return QualType(); 6610 6611 // C++0x [dcl.type.elab]p2: 6612 // If the identifier resolves to a typedef-name or the simple-template-id 6613 // resolves to an alias template specialization, the 6614 // elaborated-type-specifier is ill-formed. 6615 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6616 if (const TemplateSpecializationType *TST = 6617 NamedT->getAs<TemplateSpecializationType>()) { 6618 TemplateName Template = TST->getTemplateName(); 6619 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6620 Template.getAsTemplateDecl())) { 6621 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6622 diag::err_tag_reference_non_tag) 6623 << TAT << Sema::NTK_TypeAliasTemplate 6624 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6625 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6626 } 6627 } 6628 } 6629 6630 QualType Result = TL.getType(); 6631 if (getDerived().AlwaysRebuild() || 6632 QualifierLoc != TL.getQualifierLoc() || 6633 NamedT != T->getNamedType()) { 6634 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6635 T->getKeyword(), 6636 QualifierLoc, NamedT); 6637 if (Result.isNull()) 6638 return QualType(); 6639 } 6640 6641 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6642 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6643 NewTL.setQualifierLoc(QualifierLoc); 6644 return Result; 6645 } 6646 6647 template<typename Derived> 6648 QualType TreeTransform<Derived>::TransformAttributedType( 6649 TypeLocBuilder &TLB, 6650 AttributedTypeLoc TL) { 6651 const AttributedType *oldType = TL.getTypePtr(); 6652 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6653 if (modifiedType.isNull()) 6654 return QualType(); 6655 6656 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6657 const Attr *oldAttr = TL.getAttr(); 6658 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6659 if (oldAttr && !newAttr) 6660 return QualType(); 6661 6662 QualType result = TL.getType(); 6663 6664 // FIXME: dependent operand expressions? 6665 if (getDerived().AlwaysRebuild() || 6666 modifiedType != oldType->getModifiedType()) { 6667 // TODO: this is really lame; we should really be rebuilding the 6668 // equivalent type from first principles. 6669 QualType equivalentType 6670 = getDerived().TransformType(oldType->getEquivalentType()); 6671 if (equivalentType.isNull()) 6672 return QualType(); 6673 6674 // Check whether we can add nullability; it is only represented as 6675 // type sugar, and therefore cannot be diagnosed in any other way. 6676 if (auto nullability = oldType->getImmediateNullability()) { 6677 if (!modifiedType->canHaveNullability()) { 6678 SemaRef.Diag(TL.getAttr()->getLocation(), 6679 diag::err_nullability_nonpointer) 6680 << DiagNullabilityKind(*nullability, false) << modifiedType; 6681 return QualType(); 6682 } 6683 } 6684 6685 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6686 modifiedType, 6687 equivalentType); 6688 } 6689 6690 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6691 newTL.setAttr(newAttr); 6692 return result; 6693 } 6694 6695 template<typename Derived> 6696 QualType 6697 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6698 ParenTypeLoc TL) { 6699 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6700 if (Inner.isNull()) 6701 return QualType(); 6702 6703 QualType Result = TL.getType(); 6704 if (getDerived().AlwaysRebuild() || 6705 Inner != TL.getInnerLoc().getType()) { 6706 Result = getDerived().RebuildParenType(Inner); 6707 if (Result.isNull()) 6708 return QualType(); 6709 } 6710 6711 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6712 NewTL.setLParenLoc(TL.getLParenLoc()); 6713 NewTL.setRParenLoc(TL.getRParenLoc()); 6714 return Result; 6715 } 6716 6717 template <typename Derived> 6718 QualType 6719 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6720 MacroQualifiedTypeLoc TL) { 6721 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6722 if (Inner.isNull()) 6723 return QualType(); 6724 6725 QualType Result = TL.getType(); 6726 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6727 Result = 6728 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6729 if (Result.isNull()) 6730 return QualType(); 6731 } 6732 6733 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6734 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6735 return Result; 6736 } 6737 6738 template<typename Derived> 6739 QualType TreeTransform<Derived>::TransformDependentNameType( 6740 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6741 return TransformDependentNameType(TLB, TL, false); 6742 } 6743 6744 template<typename Derived> 6745 QualType TreeTransform<Derived>::TransformDependentNameType( 6746 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6747 const DependentNameType *T = TL.getTypePtr(); 6748 6749 NestedNameSpecifierLoc QualifierLoc 6750 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6751 if (!QualifierLoc) 6752 return QualType(); 6753 6754 QualType Result 6755 = getDerived().RebuildDependentNameType(T->getKeyword(), 6756 TL.getElaboratedKeywordLoc(), 6757 QualifierLoc, 6758 T->getIdentifier(), 6759 TL.getNameLoc(), 6760 DeducedTSTContext); 6761 if (Result.isNull()) 6762 return QualType(); 6763 6764 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6765 QualType NamedT = ElabT->getNamedType(); 6766 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6767 6768 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6769 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6770 NewTL.setQualifierLoc(QualifierLoc); 6771 } else { 6772 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6773 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6774 NewTL.setQualifierLoc(QualifierLoc); 6775 NewTL.setNameLoc(TL.getNameLoc()); 6776 } 6777 return Result; 6778 } 6779 6780 template<typename Derived> 6781 QualType TreeTransform<Derived>:: 6782 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6783 DependentTemplateSpecializationTypeLoc TL) { 6784 NestedNameSpecifierLoc QualifierLoc; 6785 if (TL.getQualifierLoc()) { 6786 QualifierLoc 6787 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6788 if (!QualifierLoc) 6789 return QualType(); 6790 } 6791 6792 return getDerived() 6793 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6794 } 6795 6796 template<typename Derived> 6797 QualType TreeTransform<Derived>:: 6798 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6799 DependentTemplateSpecializationTypeLoc TL, 6800 NestedNameSpecifierLoc QualifierLoc) { 6801 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6802 6803 TemplateArgumentListInfo NewTemplateArgs; 6804 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6805 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6806 6807 typedef TemplateArgumentLocContainerIterator< 6808 DependentTemplateSpecializationTypeLoc> ArgIterator; 6809 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6810 ArgIterator(TL, TL.getNumArgs()), 6811 NewTemplateArgs)) 6812 return QualType(); 6813 6814 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6815 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6816 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6817 /*AllowInjectedClassName*/ false); 6818 if (Result.isNull()) 6819 return QualType(); 6820 6821 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6822 QualType NamedT = ElabT->getNamedType(); 6823 6824 // Copy information relevant to the template specialization. 6825 TemplateSpecializationTypeLoc NamedTL 6826 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6827 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6828 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6829 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6830 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6831 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6832 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6833 6834 // Copy information relevant to the elaborated type. 6835 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6836 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6837 NewTL.setQualifierLoc(QualifierLoc); 6838 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6839 DependentTemplateSpecializationTypeLoc SpecTL 6840 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6841 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6842 SpecTL.setQualifierLoc(QualifierLoc); 6843 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6844 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6845 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6846 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6847 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6848 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6849 } else { 6850 TemplateSpecializationTypeLoc SpecTL 6851 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6852 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6853 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6854 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6855 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6856 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6857 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6858 } 6859 return Result; 6860 } 6861 6862 template<typename Derived> 6863 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6864 PackExpansionTypeLoc TL) { 6865 QualType Pattern 6866 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6867 if (Pattern.isNull()) 6868 return QualType(); 6869 6870 QualType Result = TL.getType(); 6871 if (getDerived().AlwaysRebuild() || 6872 Pattern != TL.getPatternLoc().getType()) { 6873 Result = getDerived().RebuildPackExpansionType(Pattern, 6874 TL.getPatternLoc().getSourceRange(), 6875 TL.getEllipsisLoc(), 6876 TL.getTypePtr()->getNumExpansions()); 6877 if (Result.isNull()) 6878 return QualType(); 6879 } 6880 6881 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6882 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6883 return Result; 6884 } 6885 6886 template<typename Derived> 6887 QualType 6888 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6889 ObjCInterfaceTypeLoc TL) { 6890 // ObjCInterfaceType is never dependent. 6891 TLB.pushFullCopy(TL); 6892 return TL.getType(); 6893 } 6894 6895 template<typename Derived> 6896 QualType 6897 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6898 ObjCTypeParamTypeLoc TL) { 6899 const ObjCTypeParamType *T = TL.getTypePtr(); 6900 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6901 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6902 if (!OTP) 6903 return QualType(); 6904 6905 QualType Result = TL.getType(); 6906 if (getDerived().AlwaysRebuild() || 6907 OTP != T->getDecl()) { 6908 Result = getDerived().RebuildObjCTypeParamType(OTP, 6909 TL.getProtocolLAngleLoc(), 6910 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6911 TL.getNumProtocols()), 6912 TL.getProtocolLocs(), 6913 TL.getProtocolRAngleLoc()); 6914 if (Result.isNull()) 6915 return QualType(); 6916 } 6917 6918 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6919 if (TL.getNumProtocols()) { 6920 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6921 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6922 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6923 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6924 } 6925 return Result; 6926 } 6927 6928 template<typename Derived> 6929 QualType 6930 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6931 ObjCObjectTypeLoc TL) { 6932 // Transform base type. 6933 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6934 if (BaseType.isNull()) 6935 return QualType(); 6936 6937 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6938 6939 // Transform type arguments. 6940 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6941 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6942 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6943 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6944 QualType TypeArg = TypeArgInfo->getType(); 6945 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6946 AnyChanged = true; 6947 6948 // We have a pack expansion. Instantiate it. 6949 const auto *PackExpansion = PackExpansionLoc.getType() 6950 ->castAs<PackExpansionType>(); 6951 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6952 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6953 Unexpanded); 6954 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6955 6956 // Determine whether the set of unexpanded parameter packs can 6957 // and should be expanded. 6958 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6959 bool Expand = false; 6960 bool RetainExpansion = false; 6961 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6962 if (getDerived().TryExpandParameterPacks( 6963 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6964 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6965 return QualType(); 6966 6967 if (!Expand) { 6968 // We can't expand this pack expansion into separate arguments yet; 6969 // just substitute into the pattern and create a new pack expansion 6970 // type. 6971 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6972 6973 TypeLocBuilder TypeArgBuilder; 6974 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6975 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6976 PatternLoc); 6977 if (NewPatternType.isNull()) 6978 return QualType(); 6979 6980 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6981 NewPatternType, NumExpansions); 6982 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6983 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6984 NewTypeArgInfos.push_back( 6985 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6986 continue; 6987 } 6988 6989 // Substitute into the pack expansion pattern for each slice of the 6990 // pack. 6991 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6992 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6993 6994 TypeLocBuilder TypeArgBuilder; 6995 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6996 6997 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6998 PatternLoc); 6999 if (NewTypeArg.isNull()) 7000 return QualType(); 7001 7002 NewTypeArgInfos.push_back( 7003 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7004 } 7005 7006 continue; 7007 } 7008 7009 TypeLocBuilder TypeArgBuilder; 7010 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7011 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7012 if (NewTypeArg.isNull()) 7013 return QualType(); 7014 7015 // If nothing changed, just keep the old TypeSourceInfo. 7016 if (NewTypeArg == TypeArg) { 7017 NewTypeArgInfos.push_back(TypeArgInfo); 7018 continue; 7019 } 7020 7021 NewTypeArgInfos.push_back( 7022 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7023 AnyChanged = true; 7024 } 7025 7026 QualType Result = TL.getType(); 7027 if (getDerived().AlwaysRebuild() || AnyChanged) { 7028 // Rebuild the type. 7029 Result = getDerived().RebuildObjCObjectType( 7030 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7031 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7032 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7033 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7034 7035 if (Result.isNull()) 7036 return QualType(); 7037 } 7038 7039 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7040 NewT.setHasBaseTypeAsWritten(true); 7041 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7042 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7043 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7044 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7045 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7046 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7047 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7048 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7049 return Result; 7050 } 7051 7052 template<typename Derived> 7053 QualType 7054 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7055 ObjCObjectPointerTypeLoc TL) { 7056 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7057 if (PointeeType.isNull()) 7058 return QualType(); 7059 7060 QualType Result = TL.getType(); 7061 if (getDerived().AlwaysRebuild() || 7062 PointeeType != TL.getPointeeLoc().getType()) { 7063 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7064 TL.getStarLoc()); 7065 if (Result.isNull()) 7066 return QualType(); 7067 } 7068 7069 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7070 NewT.setStarLoc(TL.getStarLoc()); 7071 return Result; 7072 } 7073 7074 //===----------------------------------------------------------------------===// 7075 // Statement transformation 7076 //===----------------------------------------------------------------------===// 7077 template<typename Derived> 7078 StmtResult 7079 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7080 return S; 7081 } 7082 7083 template<typename Derived> 7084 StmtResult 7085 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7086 return getDerived().TransformCompoundStmt(S, false); 7087 } 7088 7089 template<typename Derived> 7090 StmtResult 7091 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7092 bool IsStmtExpr) { 7093 Sema::CompoundScopeRAII CompoundScope(getSema()); 7094 7095 const Stmt *ExprResult = S->getStmtExprResult(); 7096 bool SubStmtInvalid = false; 7097 bool SubStmtChanged = false; 7098 SmallVector<Stmt*, 8> Statements; 7099 for (auto *B : S->body()) { 7100 StmtResult Result = getDerived().TransformStmt( 7101 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7102 7103 if (Result.isInvalid()) { 7104 // Immediately fail if this was a DeclStmt, since it's very 7105 // likely that this will cause problems for future statements. 7106 if (isa<DeclStmt>(B)) 7107 return StmtError(); 7108 7109 // Otherwise, just keep processing substatements and fail later. 7110 SubStmtInvalid = true; 7111 continue; 7112 } 7113 7114 SubStmtChanged = SubStmtChanged || Result.get() != B; 7115 Statements.push_back(Result.getAs<Stmt>()); 7116 } 7117 7118 if (SubStmtInvalid) 7119 return StmtError(); 7120 7121 if (!getDerived().AlwaysRebuild() && 7122 !SubStmtChanged) 7123 return S; 7124 7125 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7126 Statements, 7127 S->getRBracLoc(), 7128 IsStmtExpr); 7129 } 7130 7131 template<typename Derived> 7132 StmtResult 7133 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7134 ExprResult LHS, RHS; 7135 { 7136 EnterExpressionEvaluationContext Unevaluated( 7137 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7138 7139 // Transform the left-hand case value. 7140 LHS = getDerived().TransformExpr(S->getLHS()); 7141 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7142 if (LHS.isInvalid()) 7143 return StmtError(); 7144 7145 // Transform the right-hand case value (for the GNU case-range extension). 7146 RHS = getDerived().TransformExpr(S->getRHS()); 7147 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7148 if (RHS.isInvalid()) 7149 return StmtError(); 7150 } 7151 7152 // Build the case statement. 7153 // Case statements are always rebuilt so that they will attached to their 7154 // transformed switch statement. 7155 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7156 LHS.get(), 7157 S->getEllipsisLoc(), 7158 RHS.get(), 7159 S->getColonLoc()); 7160 if (Case.isInvalid()) 7161 return StmtError(); 7162 7163 // Transform the statement following the case 7164 StmtResult SubStmt = 7165 getDerived().TransformStmt(S->getSubStmt()); 7166 if (SubStmt.isInvalid()) 7167 return StmtError(); 7168 7169 // Attach the body to the case statement 7170 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7171 } 7172 7173 template <typename Derived> 7174 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7175 // Transform the statement following the default case 7176 StmtResult SubStmt = 7177 getDerived().TransformStmt(S->getSubStmt()); 7178 if (SubStmt.isInvalid()) 7179 return StmtError(); 7180 7181 // Default statements are always rebuilt 7182 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7183 SubStmt.get()); 7184 } 7185 7186 template<typename Derived> 7187 StmtResult 7188 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7189 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7190 if (SubStmt.isInvalid()) 7191 return StmtError(); 7192 7193 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7194 S->getDecl()); 7195 if (!LD) 7196 return StmtError(); 7197 7198 // If we're transforming "in-place" (we're not creating new local 7199 // declarations), assume we're replacing the old label statement 7200 // and clear out the reference to it. 7201 if (LD == S->getDecl()) 7202 S->getDecl()->setStmt(nullptr); 7203 7204 // FIXME: Pass the real colon location in. 7205 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7206 cast<LabelDecl>(LD), SourceLocation(), 7207 SubStmt.get()); 7208 } 7209 7210 template <typename Derived> 7211 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7212 if (!R) 7213 return R; 7214 7215 switch (R->getKind()) { 7216 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7217 #define ATTR(X) 7218 #define PRAGMA_SPELLING_ATTR(X) \ 7219 case attr::X: \ 7220 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7221 #include "clang/Basic/AttrList.inc" 7222 default: 7223 return R; 7224 } 7225 } 7226 7227 template <typename Derived> 7228 StmtResult 7229 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7230 StmtDiscardKind SDK) { 7231 bool AttrsChanged = false; 7232 SmallVector<const Attr *, 1> Attrs; 7233 7234 // Visit attributes and keep track if any are transformed. 7235 for (const auto *I : S->getAttrs()) { 7236 const Attr *R = getDerived().TransformAttr(I); 7237 AttrsChanged |= (I != R); 7238 Attrs.push_back(R); 7239 } 7240 7241 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7242 if (SubStmt.isInvalid()) 7243 return StmtError(); 7244 7245 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7246 return S; 7247 7248 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7249 SubStmt.get()); 7250 } 7251 7252 template<typename Derived> 7253 StmtResult 7254 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7255 // Transform the initialization statement 7256 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7257 if (Init.isInvalid()) 7258 return StmtError(); 7259 7260 // Transform the condition 7261 Sema::ConditionResult Cond = getDerived().TransformCondition( 7262 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7263 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7264 : Sema::ConditionKind::Boolean); 7265 if (Cond.isInvalid()) 7266 return StmtError(); 7267 7268 // If this is a constexpr if, determine which arm we should instantiate. 7269 llvm::Optional<bool> ConstexprConditionValue; 7270 if (S->isConstexpr()) 7271 ConstexprConditionValue = Cond.getKnownValue(); 7272 7273 // Transform the "then" branch. 7274 StmtResult Then; 7275 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7276 Then = getDerived().TransformStmt(S->getThen()); 7277 if (Then.isInvalid()) 7278 return StmtError(); 7279 } else { 7280 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7281 } 7282 7283 // Transform the "else" branch. 7284 StmtResult Else; 7285 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7286 Else = getDerived().TransformStmt(S->getElse()); 7287 if (Else.isInvalid()) 7288 return StmtError(); 7289 } 7290 7291 if (!getDerived().AlwaysRebuild() && 7292 Init.get() == S->getInit() && 7293 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7294 Then.get() == S->getThen() && 7295 Else.get() == S->getElse()) 7296 return S; 7297 7298 return getDerived().RebuildIfStmt( 7299 S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, 7300 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7301 } 7302 7303 template<typename Derived> 7304 StmtResult 7305 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7306 // Transform the initialization statement 7307 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7308 if (Init.isInvalid()) 7309 return StmtError(); 7310 7311 // Transform the condition. 7312 Sema::ConditionResult Cond = getDerived().TransformCondition( 7313 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7314 Sema::ConditionKind::Switch); 7315 if (Cond.isInvalid()) 7316 return StmtError(); 7317 7318 // Rebuild the switch statement. 7319 StmtResult Switch = 7320 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7321 Init.get(), Cond, S->getRParenLoc()); 7322 if (Switch.isInvalid()) 7323 return StmtError(); 7324 7325 // Transform the body of the switch statement. 7326 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7327 if (Body.isInvalid()) 7328 return StmtError(); 7329 7330 // Complete the switch statement. 7331 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7332 Body.get()); 7333 } 7334 7335 template<typename Derived> 7336 StmtResult 7337 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7338 // Transform the condition 7339 Sema::ConditionResult Cond = getDerived().TransformCondition( 7340 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7341 Sema::ConditionKind::Boolean); 7342 if (Cond.isInvalid()) 7343 return StmtError(); 7344 7345 // Transform the body 7346 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7347 if (Body.isInvalid()) 7348 return StmtError(); 7349 7350 if (!getDerived().AlwaysRebuild() && 7351 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7352 Body.get() == S->getBody()) 7353 return Owned(S); 7354 7355 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7356 Cond, S->getRParenLoc(), Body.get()); 7357 } 7358 7359 template<typename Derived> 7360 StmtResult 7361 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7362 // Transform the body 7363 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7364 if (Body.isInvalid()) 7365 return StmtError(); 7366 7367 // Transform the condition 7368 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7369 if (Cond.isInvalid()) 7370 return StmtError(); 7371 7372 if (!getDerived().AlwaysRebuild() && 7373 Cond.get() == S->getCond() && 7374 Body.get() == S->getBody()) 7375 return S; 7376 7377 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7378 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7379 S->getRParenLoc()); 7380 } 7381 7382 template<typename Derived> 7383 StmtResult 7384 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7385 if (getSema().getLangOpts().OpenMP) 7386 getSema().startOpenMPLoop(); 7387 7388 // Transform the initialization statement 7389 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7390 if (Init.isInvalid()) 7391 return StmtError(); 7392 7393 // In OpenMP loop region loop control variable must be captured and be 7394 // private. Perform analysis of first part (if any). 7395 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7396 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7397 7398 // Transform the condition 7399 Sema::ConditionResult Cond = getDerived().TransformCondition( 7400 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7401 Sema::ConditionKind::Boolean); 7402 if (Cond.isInvalid()) 7403 return StmtError(); 7404 7405 // Transform the increment 7406 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7407 if (Inc.isInvalid()) 7408 return StmtError(); 7409 7410 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7411 if (S->getInc() && !FullInc.get()) 7412 return StmtError(); 7413 7414 // Transform the body 7415 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7416 if (Body.isInvalid()) 7417 return StmtError(); 7418 7419 if (!getDerived().AlwaysRebuild() && 7420 Init.get() == S->getInit() && 7421 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7422 Inc.get() == S->getInc() && 7423 Body.get() == S->getBody()) 7424 return S; 7425 7426 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7427 Init.get(), Cond, FullInc, 7428 S->getRParenLoc(), Body.get()); 7429 } 7430 7431 template<typename Derived> 7432 StmtResult 7433 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7434 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7435 S->getLabel()); 7436 if (!LD) 7437 return StmtError(); 7438 7439 // Goto statements must always be rebuilt, to resolve the label. 7440 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7441 cast<LabelDecl>(LD)); 7442 } 7443 7444 template<typename Derived> 7445 StmtResult 7446 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7447 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7448 if (Target.isInvalid()) 7449 return StmtError(); 7450 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7451 7452 if (!getDerived().AlwaysRebuild() && 7453 Target.get() == S->getTarget()) 7454 return S; 7455 7456 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7457 Target.get()); 7458 } 7459 7460 template<typename Derived> 7461 StmtResult 7462 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7463 return S; 7464 } 7465 7466 template<typename Derived> 7467 StmtResult 7468 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7469 return S; 7470 } 7471 7472 template<typename Derived> 7473 StmtResult 7474 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7475 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7476 /*NotCopyInit*/false); 7477 if (Result.isInvalid()) 7478 return StmtError(); 7479 7480 // FIXME: We always rebuild the return statement because there is no way 7481 // to tell whether the return type of the function has changed. 7482 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7483 } 7484 7485 template<typename Derived> 7486 StmtResult 7487 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7488 bool DeclChanged = false; 7489 SmallVector<Decl *, 4> Decls; 7490 for (auto *D : S->decls()) { 7491 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7492 if (!Transformed) 7493 return StmtError(); 7494 7495 if (Transformed != D) 7496 DeclChanged = true; 7497 7498 Decls.push_back(Transformed); 7499 } 7500 7501 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7502 return S; 7503 7504 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7505 } 7506 7507 template<typename Derived> 7508 StmtResult 7509 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7510 7511 SmallVector<Expr*, 8> Constraints; 7512 SmallVector<Expr*, 8> Exprs; 7513 SmallVector<IdentifierInfo *, 4> Names; 7514 7515 ExprResult AsmString; 7516 SmallVector<Expr*, 8> Clobbers; 7517 7518 bool ExprsChanged = false; 7519 7520 // Go through the outputs. 7521 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7522 Names.push_back(S->getOutputIdentifier(I)); 7523 7524 // No need to transform the constraint literal. 7525 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7526 7527 // Transform the output expr. 7528 Expr *OutputExpr = S->getOutputExpr(I); 7529 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7530 if (Result.isInvalid()) 7531 return StmtError(); 7532 7533 ExprsChanged |= Result.get() != OutputExpr; 7534 7535 Exprs.push_back(Result.get()); 7536 } 7537 7538 // Go through the inputs. 7539 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7540 Names.push_back(S->getInputIdentifier(I)); 7541 7542 // No need to transform the constraint literal. 7543 Constraints.push_back(S->getInputConstraintLiteral(I)); 7544 7545 // Transform the input expr. 7546 Expr *InputExpr = S->getInputExpr(I); 7547 ExprResult Result = getDerived().TransformExpr(InputExpr); 7548 if (Result.isInvalid()) 7549 return StmtError(); 7550 7551 ExprsChanged |= Result.get() != InputExpr; 7552 7553 Exprs.push_back(Result.get()); 7554 } 7555 7556 // Go through the Labels. 7557 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7558 Names.push_back(S->getLabelIdentifier(I)); 7559 7560 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7561 if (Result.isInvalid()) 7562 return StmtError(); 7563 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7564 Exprs.push_back(Result.get()); 7565 } 7566 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7567 return S; 7568 7569 // Go through the clobbers. 7570 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7571 Clobbers.push_back(S->getClobberStringLiteral(I)); 7572 7573 // No need to transform the asm string literal. 7574 AsmString = S->getAsmString(); 7575 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7576 S->isVolatile(), S->getNumOutputs(), 7577 S->getNumInputs(), Names.data(), 7578 Constraints, Exprs, AsmString.get(), 7579 Clobbers, S->getNumLabels(), 7580 S->getRParenLoc()); 7581 } 7582 7583 template<typename Derived> 7584 StmtResult 7585 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7586 ArrayRef<Token> AsmToks = 7587 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7588 7589 bool HadError = false, HadChange = false; 7590 7591 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7592 SmallVector<Expr*, 8> TransformedExprs; 7593 TransformedExprs.reserve(SrcExprs.size()); 7594 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7595 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7596 if (!Result.isUsable()) { 7597 HadError = true; 7598 } else { 7599 HadChange |= (Result.get() != SrcExprs[i]); 7600 TransformedExprs.push_back(Result.get()); 7601 } 7602 } 7603 7604 if (HadError) return StmtError(); 7605 if (!HadChange && !getDerived().AlwaysRebuild()) 7606 return Owned(S); 7607 7608 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7609 AsmToks, S->getAsmString(), 7610 S->getNumOutputs(), S->getNumInputs(), 7611 S->getAllConstraints(), S->getClobbers(), 7612 TransformedExprs, S->getEndLoc()); 7613 } 7614 7615 // C++ Coroutines TS 7616 7617 template<typename Derived> 7618 StmtResult 7619 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7620 auto *ScopeInfo = SemaRef.getCurFunction(); 7621 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7622 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7623 ScopeInfo->NeedsCoroutineSuspends && 7624 ScopeInfo->CoroutineSuspends.first == nullptr && 7625 ScopeInfo->CoroutineSuspends.second == nullptr && 7626 "expected clean scope info"); 7627 7628 // Set that we have (possibly-invalid) suspend points before we do anything 7629 // that may fail. 7630 ScopeInfo->setNeedsCoroutineSuspends(false); 7631 7632 // We re-build the coroutine promise object (and the coroutine parameters its 7633 // type and constructor depend on) based on the types used in our current 7634 // function. We must do so, and set it on the current FunctionScopeInfo, 7635 // before attempting to transform the other parts of the coroutine body 7636 // statement, such as the implicit suspend statements (because those 7637 // statements reference the FunctionScopeInfo::CoroutinePromise). 7638 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7639 return StmtError(); 7640 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7641 if (!Promise) 7642 return StmtError(); 7643 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7644 ScopeInfo->CoroutinePromise = Promise; 7645 7646 // Transform the implicit coroutine statements constructed using dependent 7647 // types during the previous parse: initial and final suspensions, the return 7648 // object, and others. We also transform the coroutine function's body. 7649 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7650 if (InitSuspend.isInvalid()) 7651 return StmtError(); 7652 StmtResult FinalSuspend = 7653 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7654 if (FinalSuspend.isInvalid() || 7655 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7656 return StmtError(); 7657 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7658 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7659 7660 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7661 if (BodyRes.isInvalid()) 7662 return StmtError(); 7663 7664 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7665 if (Builder.isInvalid()) 7666 return StmtError(); 7667 7668 Expr *ReturnObject = S->getReturnValueInit(); 7669 assert(ReturnObject && "the return object is expected to be valid"); 7670 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7671 /*NoCopyInit*/ false); 7672 if (Res.isInvalid()) 7673 return StmtError(); 7674 Builder.ReturnValue = Res.get(); 7675 7676 // If during the previous parse the coroutine still had a dependent promise 7677 // statement, we may need to build some implicit coroutine statements 7678 // (such as exception and fallthrough handlers) for the first time. 7679 if (S->hasDependentPromiseType()) { 7680 // We can only build these statements, however, if the current promise type 7681 // is not dependent. 7682 if (!Promise->getType()->isDependentType()) { 7683 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7684 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7685 "these nodes should not have been built yet"); 7686 if (!Builder.buildDependentStatements()) 7687 return StmtError(); 7688 } 7689 } else { 7690 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7691 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7692 if (Res.isInvalid()) 7693 return StmtError(); 7694 Builder.OnFallthrough = Res.get(); 7695 } 7696 7697 if (auto *OnException = S->getExceptionHandler()) { 7698 StmtResult Res = getDerived().TransformStmt(OnException); 7699 if (Res.isInvalid()) 7700 return StmtError(); 7701 Builder.OnException = Res.get(); 7702 } 7703 7704 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7705 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7706 if (Res.isInvalid()) 7707 return StmtError(); 7708 Builder.ReturnStmtOnAllocFailure = Res.get(); 7709 } 7710 7711 // Transform any additional statements we may have already built 7712 assert(S->getAllocate() && S->getDeallocate() && 7713 "allocation and deallocation calls must already be built"); 7714 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7715 if (AllocRes.isInvalid()) 7716 return StmtError(); 7717 Builder.Allocate = AllocRes.get(); 7718 7719 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7720 if (DeallocRes.isInvalid()) 7721 return StmtError(); 7722 Builder.Deallocate = DeallocRes.get(); 7723 7724 assert(S->getResultDecl() && "ResultDecl must already be built"); 7725 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7726 if (ResultDecl.isInvalid()) 7727 return StmtError(); 7728 Builder.ResultDecl = ResultDecl.get(); 7729 7730 if (auto *ReturnStmt = S->getReturnStmt()) { 7731 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7732 if (Res.isInvalid()) 7733 return StmtError(); 7734 Builder.ReturnStmt = Res.get(); 7735 } 7736 } 7737 7738 return getDerived().RebuildCoroutineBodyStmt(Builder); 7739 } 7740 7741 template<typename Derived> 7742 StmtResult 7743 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7744 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7745 /*NotCopyInit*/false); 7746 if (Result.isInvalid()) 7747 return StmtError(); 7748 7749 // Always rebuild; we don't know if this needs to be injected into a new 7750 // context or if the promise type has changed. 7751 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7752 S->isImplicit()); 7753 } 7754 7755 template<typename Derived> 7756 ExprResult 7757 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7758 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7759 /*NotCopyInit*/false); 7760 if (Result.isInvalid()) 7761 return ExprError(); 7762 7763 // Always rebuild; we don't know if this needs to be injected into a new 7764 // context or if the promise type has changed. 7765 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7766 E->isImplicit()); 7767 } 7768 7769 template <typename Derived> 7770 ExprResult 7771 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7772 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7773 /*NotCopyInit*/ false); 7774 if (OperandResult.isInvalid()) 7775 return ExprError(); 7776 7777 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7778 E->getOperatorCoawaitLookup()); 7779 7780 if (LookupResult.isInvalid()) 7781 return ExprError(); 7782 7783 // Always rebuild; we don't know if this needs to be injected into a new 7784 // context or if the promise type has changed. 7785 return getDerived().RebuildDependentCoawaitExpr( 7786 E->getKeywordLoc(), OperandResult.get(), 7787 cast<UnresolvedLookupExpr>(LookupResult.get())); 7788 } 7789 7790 template<typename Derived> 7791 ExprResult 7792 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7793 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7794 /*NotCopyInit*/false); 7795 if (Result.isInvalid()) 7796 return ExprError(); 7797 7798 // Always rebuild; we don't know if this needs to be injected into a new 7799 // context or if the promise type has changed. 7800 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7801 } 7802 7803 // Objective-C Statements. 7804 7805 template<typename Derived> 7806 StmtResult 7807 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7808 // Transform the body of the @try. 7809 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7810 if (TryBody.isInvalid()) 7811 return StmtError(); 7812 7813 // Transform the @catch statements (if present). 7814 bool AnyCatchChanged = false; 7815 SmallVector<Stmt*, 8> CatchStmts; 7816 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7817 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7818 if (Catch.isInvalid()) 7819 return StmtError(); 7820 if (Catch.get() != S->getCatchStmt(I)) 7821 AnyCatchChanged = true; 7822 CatchStmts.push_back(Catch.get()); 7823 } 7824 7825 // Transform the @finally statement (if present). 7826 StmtResult Finally; 7827 if (S->getFinallyStmt()) { 7828 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7829 if (Finally.isInvalid()) 7830 return StmtError(); 7831 } 7832 7833 // If nothing changed, just retain this statement. 7834 if (!getDerived().AlwaysRebuild() && 7835 TryBody.get() == S->getTryBody() && 7836 !AnyCatchChanged && 7837 Finally.get() == S->getFinallyStmt()) 7838 return S; 7839 7840 // Build a new statement. 7841 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7842 CatchStmts, Finally.get()); 7843 } 7844 7845 template<typename Derived> 7846 StmtResult 7847 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7848 // Transform the @catch parameter, if there is one. 7849 VarDecl *Var = nullptr; 7850 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7851 TypeSourceInfo *TSInfo = nullptr; 7852 if (FromVar->getTypeSourceInfo()) { 7853 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7854 if (!TSInfo) 7855 return StmtError(); 7856 } 7857 7858 QualType T; 7859 if (TSInfo) 7860 T = TSInfo->getType(); 7861 else { 7862 T = getDerived().TransformType(FromVar->getType()); 7863 if (T.isNull()) 7864 return StmtError(); 7865 } 7866 7867 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7868 if (!Var) 7869 return StmtError(); 7870 } 7871 7872 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7873 if (Body.isInvalid()) 7874 return StmtError(); 7875 7876 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7877 S->getRParenLoc(), 7878 Var, Body.get()); 7879 } 7880 7881 template<typename Derived> 7882 StmtResult 7883 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7884 // Transform the body. 7885 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7886 if (Body.isInvalid()) 7887 return StmtError(); 7888 7889 // If nothing changed, just retain this statement. 7890 if (!getDerived().AlwaysRebuild() && 7891 Body.get() == S->getFinallyBody()) 7892 return S; 7893 7894 // Build a new statement. 7895 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7896 Body.get()); 7897 } 7898 7899 template<typename Derived> 7900 StmtResult 7901 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7902 ExprResult Operand; 7903 if (S->getThrowExpr()) { 7904 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7905 if (Operand.isInvalid()) 7906 return StmtError(); 7907 } 7908 7909 if (!getDerived().AlwaysRebuild() && 7910 Operand.get() == S->getThrowExpr()) 7911 return S; 7912 7913 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7914 } 7915 7916 template<typename Derived> 7917 StmtResult 7918 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7919 ObjCAtSynchronizedStmt *S) { 7920 // Transform the object we are locking. 7921 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7922 if (Object.isInvalid()) 7923 return StmtError(); 7924 Object = 7925 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7926 Object.get()); 7927 if (Object.isInvalid()) 7928 return StmtError(); 7929 7930 // Transform the body. 7931 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7932 if (Body.isInvalid()) 7933 return StmtError(); 7934 7935 // If nothing change, just retain the current statement. 7936 if (!getDerived().AlwaysRebuild() && 7937 Object.get() == S->getSynchExpr() && 7938 Body.get() == S->getSynchBody()) 7939 return S; 7940 7941 // Build a new statement. 7942 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7943 Object.get(), Body.get()); 7944 } 7945 7946 template<typename Derived> 7947 StmtResult 7948 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7949 ObjCAutoreleasePoolStmt *S) { 7950 // Transform the body. 7951 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7952 if (Body.isInvalid()) 7953 return StmtError(); 7954 7955 // If nothing changed, just retain this statement. 7956 if (!getDerived().AlwaysRebuild() && 7957 Body.get() == S->getSubStmt()) 7958 return S; 7959 7960 // Build a new statement. 7961 return getDerived().RebuildObjCAutoreleasePoolStmt( 7962 S->getAtLoc(), Body.get()); 7963 } 7964 7965 template<typename Derived> 7966 StmtResult 7967 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7968 ObjCForCollectionStmt *S) { 7969 // Transform the element statement. 7970 StmtResult Element = 7971 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7972 if (Element.isInvalid()) 7973 return StmtError(); 7974 7975 // Transform the collection expression. 7976 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7977 if (Collection.isInvalid()) 7978 return StmtError(); 7979 7980 // Transform the body. 7981 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7982 if (Body.isInvalid()) 7983 return StmtError(); 7984 7985 // If nothing changed, just retain this statement. 7986 if (!getDerived().AlwaysRebuild() && 7987 Element.get() == S->getElement() && 7988 Collection.get() == S->getCollection() && 7989 Body.get() == S->getBody()) 7990 return S; 7991 7992 // Build a new statement. 7993 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7994 Element.get(), 7995 Collection.get(), 7996 S->getRParenLoc(), 7997 Body.get()); 7998 } 7999 8000 template <typename Derived> 8001 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8002 // Transform the exception declaration, if any. 8003 VarDecl *Var = nullptr; 8004 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8005 TypeSourceInfo *T = 8006 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8007 if (!T) 8008 return StmtError(); 8009 8010 Var = getDerived().RebuildExceptionDecl( 8011 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8012 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8013 if (!Var || Var->isInvalidDecl()) 8014 return StmtError(); 8015 } 8016 8017 // Transform the actual exception handler. 8018 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8019 if (Handler.isInvalid()) 8020 return StmtError(); 8021 8022 if (!getDerived().AlwaysRebuild() && !Var && 8023 Handler.get() == S->getHandlerBlock()) 8024 return S; 8025 8026 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8027 } 8028 8029 template <typename Derived> 8030 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8031 // Transform the try block itself. 8032 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8033 if (TryBlock.isInvalid()) 8034 return StmtError(); 8035 8036 // Transform the handlers. 8037 bool HandlerChanged = false; 8038 SmallVector<Stmt *, 8> Handlers; 8039 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8040 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8041 if (Handler.isInvalid()) 8042 return StmtError(); 8043 8044 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8045 Handlers.push_back(Handler.getAs<Stmt>()); 8046 } 8047 8048 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8049 !HandlerChanged) 8050 return S; 8051 8052 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8053 Handlers); 8054 } 8055 8056 template<typename Derived> 8057 StmtResult 8058 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8059 StmtResult Init = 8060 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8061 if (Init.isInvalid()) 8062 return StmtError(); 8063 8064 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8065 if (Range.isInvalid()) 8066 return StmtError(); 8067 8068 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8069 if (Begin.isInvalid()) 8070 return StmtError(); 8071 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8072 if (End.isInvalid()) 8073 return StmtError(); 8074 8075 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8076 if (Cond.isInvalid()) 8077 return StmtError(); 8078 if (Cond.get()) 8079 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8080 if (Cond.isInvalid()) 8081 return StmtError(); 8082 if (Cond.get()) 8083 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8084 8085 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8086 if (Inc.isInvalid()) 8087 return StmtError(); 8088 if (Inc.get()) 8089 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8090 8091 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8092 if (LoopVar.isInvalid()) 8093 return StmtError(); 8094 8095 StmtResult NewStmt = S; 8096 if (getDerived().AlwaysRebuild() || 8097 Init.get() != S->getInit() || 8098 Range.get() != S->getRangeStmt() || 8099 Begin.get() != S->getBeginStmt() || 8100 End.get() != S->getEndStmt() || 8101 Cond.get() != S->getCond() || 8102 Inc.get() != S->getInc() || 8103 LoopVar.get() != S->getLoopVarStmt()) { 8104 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8105 S->getCoawaitLoc(), Init.get(), 8106 S->getColonLoc(), Range.get(), 8107 Begin.get(), End.get(), 8108 Cond.get(), 8109 Inc.get(), LoopVar.get(), 8110 S->getRParenLoc()); 8111 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8112 // Might not have attached any initializer to the loop variable. 8113 getSema().ActOnInitializerError( 8114 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8115 return StmtError(); 8116 } 8117 } 8118 8119 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8120 if (Body.isInvalid()) 8121 return StmtError(); 8122 8123 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8124 // it now so we have a new statement to attach the body to. 8125 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8126 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8127 S->getCoawaitLoc(), Init.get(), 8128 S->getColonLoc(), Range.get(), 8129 Begin.get(), End.get(), 8130 Cond.get(), 8131 Inc.get(), LoopVar.get(), 8132 S->getRParenLoc()); 8133 if (NewStmt.isInvalid()) 8134 return StmtError(); 8135 } 8136 8137 if (NewStmt.get() == S) 8138 return S; 8139 8140 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8141 } 8142 8143 template<typename Derived> 8144 StmtResult 8145 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8146 MSDependentExistsStmt *S) { 8147 // Transform the nested-name-specifier, if any. 8148 NestedNameSpecifierLoc QualifierLoc; 8149 if (S->getQualifierLoc()) { 8150 QualifierLoc 8151 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8152 if (!QualifierLoc) 8153 return StmtError(); 8154 } 8155 8156 // Transform the declaration name. 8157 DeclarationNameInfo NameInfo = S->getNameInfo(); 8158 if (NameInfo.getName()) { 8159 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8160 if (!NameInfo.getName()) 8161 return StmtError(); 8162 } 8163 8164 // Check whether anything changed. 8165 if (!getDerived().AlwaysRebuild() && 8166 QualifierLoc == S->getQualifierLoc() && 8167 NameInfo.getName() == S->getNameInfo().getName()) 8168 return S; 8169 8170 // Determine whether this name exists, if we can. 8171 CXXScopeSpec SS; 8172 SS.Adopt(QualifierLoc); 8173 bool Dependent = false; 8174 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8175 case Sema::IER_Exists: 8176 if (S->isIfExists()) 8177 break; 8178 8179 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8180 8181 case Sema::IER_DoesNotExist: 8182 if (S->isIfNotExists()) 8183 break; 8184 8185 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8186 8187 case Sema::IER_Dependent: 8188 Dependent = true; 8189 break; 8190 8191 case Sema::IER_Error: 8192 return StmtError(); 8193 } 8194 8195 // We need to continue with the instantiation, so do so now. 8196 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8197 if (SubStmt.isInvalid()) 8198 return StmtError(); 8199 8200 // If we have resolved the name, just transform to the substatement. 8201 if (!Dependent) 8202 return SubStmt; 8203 8204 // The name is still dependent, so build a dependent expression again. 8205 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8206 S->isIfExists(), 8207 QualifierLoc, 8208 NameInfo, 8209 SubStmt.get()); 8210 } 8211 8212 template<typename Derived> 8213 ExprResult 8214 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8215 NestedNameSpecifierLoc QualifierLoc; 8216 if (E->getQualifierLoc()) { 8217 QualifierLoc 8218 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8219 if (!QualifierLoc) 8220 return ExprError(); 8221 } 8222 8223 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8224 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8225 if (!PD) 8226 return ExprError(); 8227 8228 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8229 if (Base.isInvalid()) 8230 return ExprError(); 8231 8232 return new (SemaRef.getASTContext()) 8233 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8234 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8235 QualifierLoc, E->getMemberLoc()); 8236 } 8237 8238 template <typename Derived> 8239 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8240 MSPropertySubscriptExpr *E) { 8241 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8242 if (BaseRes.isInvalid()) 8243 return ExprError(); 8244 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8245 if (IdxRes.isInvalid()) 8246 return ExprError(); 8247 8248 if (!getDerived().AlwaysRebuild() && 8249 BaseRes.get() == E->getBase() && 8250 IdxRes.get() == E->getIdx()) 8251 return E; 8252 8253 return getDerived().RebuildArraySubscriptExpr( 8254 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8255 } 8256 8257 template <typename Derived> 8258 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8259 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8260 if (TryBlock.isInvalid()) 8261 return StmtError(); 8262 8263 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8264 if (Handler.isInvalid()) 8265 return StmtError(); 8266 8267 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8268 Handler.get() == S->getHandler()) 8269 return S; 8270 8271 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8272 TryBlock.get(), Handler.get()); 8273 } 8274 8275 template <typename Derived> 8276 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8277 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8278 if (Block.isInvalid()) 8279 return StmtError(); 8280 8281 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8282 } 8283 8284 template <typename Derived> 8285 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8286 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8287 if (FilterExpr.isInvalid()) 8288 return StmtError(); 8289 8290 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8291 if (Block.isInvalid()) 8292 return StmtError(); 8293 8294 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8295 Block.get()); 8296 } 8297 8298 template <typename Derived> 8299 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8300 if (isa<SEHFinallyStmt>(Handler)) 8301 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8302 else 8303 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8304 } 8305 8306 template<typename Derived> 8307 StmtResult 8308 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8309 return S; 8310 } 8311 8312 //===----------------------------------------------------------------------===// 8313 // OpenMP directive transformation 8314 //===----------------------------------------------------------------------===// 8315 template <typename Derived> 8316 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8317 OMPExecutableDirective *D) { 8318 8319 // Transform the clauses 8320 llvm::SmallVector<OMPClause *, 16> TClauses; 8321 ArrayRef<OMPClause *> Clauses = D->clauses(); 8322 TClauses.reserve(Clauses.size()); 8323 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8324 I != E; ++I) { 8325 if (*I) { 8326 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8327 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8328 getDerived().getSema().EndOpenMPClause(); 8329 if (Clause) 8330 TClauses.push_back(Clause); 8331 } else { 8332 TClauses.push_back(nullptr); 8333 } 8334 } 8335 StmtResult AssociatedStmt; 8336 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8337 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8338 /*CurScope=*/nullptr); 8339 StmtResult Body; 8340 { 8341 Sema::CompoundScopeRAII CompoundScope(getSema()); 8342 Stmt *CS; 8343 if (D->getDirectiveKind() == OMPD_atomic || 8344 D->getDirectiveKind() == OMPD_critical || 8345 D->getDirectiveKind() == OMPD_section || 8346 D->getDirectiveKind() == OMPD_master) 8347 CS = D->getAssociatedStmt(); 8348 else 8349 CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 8350 Body = getDerived().TransformStmt(CS); 8351 } 8352 AssociatedStmt = 8353 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8354 if (AssociatedStmt.isInvalid()) { 8355 return StmtError(); 8356 } 8357 } 8358 if (TClauses.size() != Clauses.size()) { 8359 return StmtError(); 8360 } 8361 8362 // Transform directive name for 'omp critical' directive. 8363 DeclarationNameInfo DirName; 8364 if (D->getDirectiveKind() == OMPD_critical) { 8365 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8366 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8367 } 8368 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8369 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8370 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8371 } else if (D->getDirectiveKind() == OMPD_cancel) { 8372 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8373 } 8374 8375 return getDerived().RebuildOMPExecutableDirective( 8376 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8377 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8378 } 8379 8380 template <typename Derived> 8381 StmtResult 8382 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8383 DeclarationNameInfo DirName; 8384 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8385 D->getBeginLoc()); 8386 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8387 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8388 return Res; 8389 } 8390 8391 template <typename Derived> 8392 StmtResult 8393 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8394 DeclarationNameInfo DirName; 8395 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8396 D->getBeginLoc()); 8397 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8398 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8399 return Res; 8400 } 8401 8402 template <typename Derived> 8403 StmtResult 8404 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8405 DeclarationNameInfo DirName; 8406 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8407 D->getBeginLoc()); 8408 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8409 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8410 return Res; 8411 } 8412 8413 template <typename Derived> 8414 StmtResult 8415 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8416 DeclarationNameInfo DirName; 8417 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8418 D->getBeginLoc()); 8419 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8420 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8421 return Res; 8422 } 8423 8424 template <typename Derived> 8425 StmtResult 8426 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8427 DeclarationNameInfo DirName; 8428 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8429 D->getBeginLoc()); 8430 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8431 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8432 return Res; 8433 } 8434 8435 template <typename Derived> 8436 StmtResult 8437 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8438 DeclarationNameInfo DirName; 8439 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8440 D->getBeginLoc()); 8441 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8442 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8443 return Res; 8444 } 8445 8446 template <typename Derived> 8447 StmtResult 8448 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8449 DeclarationNameInfo DirName; 8450 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8451 D->getBeginLoc()); 8452 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8453 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8454 return Res; 8455 } 8456 8457 template <typename Derived> 8458 StmtResult 8459 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8460 DeclarationNameInfo DirName; 8461 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8462 D->getBeginLoc()); 8463 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8464 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8465 return Res; 8466 } 8467 8468 template <typename Derived> 8469 StmtResult 8470 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8471 getDerived().getSema().StartOpenMPDSABlock( 8472 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8473 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8474 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8475 return Res; 8476 } 8477 8478 template <typename Derived> 8479 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8480 OMPParallelForDirective *D) { 8481 DeclarationNameInfo DirName; 8482 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8483 nullptr, D->getBeginLoc()); 8484 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8485 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8486 return Res; 8487 } 8488 8489 template <typename Derived> 8490 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8491 OMPParallelForSimdDirective *D) { 8492 DeclarationNameInfo DirName; 8493 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8494 nullptr, D->getBeginLoc()); 8495 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8496 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8497 return Res; 8498 } 8499 8500 template <typename Derived> 8501 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8502 OMPParallelMasterDirective *D) { 8503 DeclarationNameInfo DirName; 8504 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8505 nullptr, D->getBeginLoc()); 8506 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8507 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8508 return Res; 8509 } 8510 8511 template <typename Derived> 8512 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8513 OMPParallelSectionsDirective *D) { 8514 DeclarationNameInfo DirName; 8515 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8516 nullptr, D->getBeginLoc()); 8517 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8518 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8519 return Res; 8520 } 8521 8522 template <typename Derived> 8523 StmtResult 8524 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8525 DeclarationNameInfo DirName; 8526 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8527 D->getBeginLoc()); 8528 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8529 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8530 return Res; 8531 } 8532 8533 template <typename Derived> 8534 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8535 OMPTaskyieldDirective *D) { 8536 DeclarationNameInfo DirName; 8537 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8538 D->getBeginLoc()); 8539 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8540 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8541 return Res; 8542 } 8543 8544 template <typename Derived> 8545 StmtResult 8546 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8547 DeclarationNameInfo DirName; 8548 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8549 D->getBeginLoc()); 8550 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8551 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8552 return Res; 8553 } 8554 8555 template <typename Derived> 8556 StmtResult 8557 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8558 DeclarationNameInfo DirName; 8559 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8560 D->getBeginLoc()); 8561 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8562 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8563 return Res; 8564 } 8565 8566 template <typename Derived> 8567 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8568 OMPTaskgroupDirective *D) { 8569 DeclarationNameInfo DirName; 8570 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8571 D->getBeginLoc()); 8572 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8573 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8574 return Res; 8575 } 8576 8577 template <typename Derived> 8578 StmtResult 8579 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8580 DeclarationNameInfo DirName; 8581 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8582 D->getBeginLoc()); 8583 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8584 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8585 return Res; 8586 } 8587 8588 template <typename Derived> 8589 StmtResult 8590 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8591 DeclarationNameInfo DirName; 8592 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8593 D->getBeginLoc()); 8594 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8595 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8596 return Res; 8597 } 8598 8599 template <typename Derived> 8600 StmtResult 8601 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8602 DeclarationNameInfo DirName; 8603 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8604 D->getBeginLoc()); 8605 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8606 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8607 return Res; 8608 } 8609 8610 template <typename Derived> 8611 StmtResult 8612 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8613 DeclarationNameInfo DirName; 8614 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8615 D->getBeginLoc()); 8616 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8617 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8618 return Res; 8619 } 8620 8621 template <typename Derived> 8622 StmtResult 8623 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8624 DeclarationNameInfo DirName; 8625 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8626 D->getBeginLoc()); 8627 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8628 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8629 return Res; 8630 } 8631 8632 template <typename Derived> 8633 StmtResult 8634 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8635 DeclarationNameInfo DirName; 8636 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8637 D->getBeginLoc()); 8638 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8639 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8640 return Res; 8641 } 8642 8643 template <typename Derived> 8644 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8645 OMPTargetDataDirective *D) { 8646 DeclarationNameInfo DirName; 8647 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8648 D->getBeginLoc()); 8649 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8650 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8651 return Res; 8652 } 8653 8654 template <typename Derived> 8655 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8656 OMPTargetEnterDataDirective *D) { 8657 DeclarationNameInfo DirName; 8658 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8659 nullptr, D->getBeginLoc()); 8660 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8661 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8662 return Res; 8663 } 8664 8665 template <typename Derived> 8666 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8667 OMPTargetExitDataDirective *D) { 8668 DeclarationNameInfo DirName; 8669 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8670 nullptr, D->getBeginLoc()); 8671 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8672 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8673 return Res; 8674 } 8675 8676 template <typename Derived> 8677 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8678 OMPTargetParallelDirective *D) { 8679 DeclarationNameInfo DirName; 8680 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8681 nullptr, D->getBeginLoc()); 8682 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8683 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8684 return Res; 8685 } 8686 8687 template <typename Derived> 8688 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8689 OMPTargetParallelForDirective *D) { 8690 DeclarationNameInfo DirName; 8691 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8692 nullptr, D->getBeginLoc()); 8693 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8694 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8695 return Res; 8696 } 8697 8698 template <typename Derived> 8699 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8700 OMPTargetUpdateDirective *D) { 8701 DeclarationNameInfo DirName; 8702 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8703 nullptr, D->getBeginLoc()); 8704 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8705 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8706 return Res; 8707 } 8708 8709 template <typename Derived> 8710 StmtResult 8711 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8712 DeclarationNameInfo DirName; 8713 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8714 D->getBeginLoc()); 8715 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8716 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8717 return Res; 8718 } 8719 8720 template <typename Derived> 8721 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8722 OMPCancellationPointDirective *D) { 8723 DeclarationNameInfo DirName; 8724 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8725 nullptr, D->getBeginLoc()); 8726 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8727 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8728 return Res; 8729 } 8730 8731 template <typename Derived> 8732 StmtResult 8733 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8734 DeclarationNameInfo DirName; 8735 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8736 D->getBeginLoc()); 8737 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8738 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8739 return Res; 8740 } 8741 8742 template <typename Derived> 8743 StmtResult 8744 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8745 DeclarationNameInfo DirName; 8746 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8747 D->getBeginLoc()); 8748 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8749 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8750 return Res; 8751 } 8752 8753 template <typename Derived> 8754 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8755 OMPTaskLoopSimdDirective *D) { 8756 DeclarationNameInfo DirName; 8757 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8758 nullptr, D->getBeginLoc()); 8759 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8760 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8761 return Res; 8762 } 8763 8764 template <typename Derived> 8765 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8766 OMPMasterTaskLoopDirective *D) { 8767 DeclarationNameInfo DirName; 8768 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8769 nullptr, D->getBeginLoc()); 8770 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8771 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8772 return Res; 8773 } 8774 8775 template <typename Derived> 8776 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8777 OMPMasterTaskLoopSimdDirective *D) { 8778 DeclarationNameInfo DirName; 8779 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8780 nullptr, D->getBeginLoc()); 8781 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8782 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8783 return Res; 8784 } 8785 8786 template <typename Derived> 8787 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8788 OMPParallelMasterTaskLoopDirective *D) { 8789 DeclarationNameInfo DirName; 8790 getDerived().getSema().StartOpenMPDSABlock( 8791 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8792 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8793 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8794 return Res; 8795 } 8796 8797 template <typename Derived> 8798 StmtResult 8799 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8800 OMPParallelMasterTaskLoopSimdDirective *D) { 8801 DeclarationNameInfo DirName; 8802 getDerived().getSema().StartOpenMPDSABlock( 8803 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8804 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8805 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8806 return Res; 8807 } 8808 8809 template <typename Derived> 8810 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8811 OMPDistributeDirective *D) { 8812 DeclarationNameInfo DirName; 8813 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8814 D->getBeginLoc()); 8815 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8816 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8817 return Res; 8818 } 8819 8820 template <typename Derived> 8821 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8822 OMPDistributeParallelForDirective *D) { 8823 DeclarationNameInfo DirName; 8824 getDerived().getSema().StartOpenMPDSABlock( 8825 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8826 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8827 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8828 return Res; 8829 } 8830 8831 template <typename Derived> 8832 StmtResult 8833 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8834 OMPDistributeParallelForSimdDirective *D) { 8835 DeclarationNameInfo DirName; 8836 getDerived().getSema().StartOpenMPDSABlock( 8837 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8838 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8839 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8840 return Res; 8841 } 8842 8843 template <typename Derived> 8844 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8845 OMPDistributeSimdDirective *D) { 8846 DeclarationNameInfo DirName; 8847 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8848 nullptr, D->getBeginLoc()); 8849 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8850 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8851 return Res; 8852 } 8853 8854 template <typename Derived> 8855 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8856 OMPTargetParallelForSimdDirective *D) { 8857 DeclarationNameInfo DirName; 8858 getDerived().getSema().StartOpenMPDSABlock( 8859 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8860 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8861 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8862 return Res; 8863 } 8864 8865 template <typename Derived> 8866 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8867 OMPTargetSimdDirective *D) { 8868 DeclarationNameInfo DirName; 8869 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8870 D->getBeginLoc()); 8871 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8872 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8873 return Res; 8874 } 8875 8876 template <typename Derived> 8877 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8878 OMPTeamsDistributeDirective *D) { 8879 DeclarationNameInfo DirName; 8880 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8881 nullptr, D->getBeginLoc()); 8882 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8883 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8884 return Res; 8885 } 8886 8887 template <typename Derived> 8888 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8889 OMPTeamsDistributeSimdDirective *D) { 8890 DeclarationNameInfo DirName; 8891 getDerived().getSema().StartOpenMPDSABlock( 8892 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8893 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8894 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8895 return Res; 8896 } 8897 8898 template <typename Derived> 8899 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8900 OMPTeamsDistributeParallelForSimdDirective *D) { 8901 DeclarationNameInfo DirName; 8902 getDerived().getSema().StartOpenMPDSABlock( 8903 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8904 D->getBeginLoc()); 8905 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8906 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8907 return Res; 8908 } 8909 8910 template <typename Derived> 8911 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8912 OMPTeamsDistributeParallelForDirective *D) { 8913 DeclarationNameInfo DirName; 8914 getDerived().getSema().StartOpenMPDSABlock( 8915 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8916 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8917 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8918 return Res; 8919 } 8920 8921 template <typename Derived> 8922 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8923 OMPTargetTeamsDirective *D) { 8924 DeclarationNameInfo DirName; 8925 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8926 nullptr, D->getBeginLoc()); 8927 auto Res = getDerived().TransformOMPExecutableDirective(D); 8928 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8929 return Res; 8930 } 8931 8932 template <typename Derived> 8933 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8934 OMPTargetTeamsDistributeDirective *D) { 8935 DeclarationNameInfo DirName; 8936 getDerived().getSema().StartOpenMPDSABlock( 8937 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8938 auto Res = getDerived().TransformOMPExecutableDirective(D); 8939 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8940 return Res; 8941 } 8942 8943 template <typename Derived> 8944 StmtResult 8945 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8946 OMPTargetTeamsDistributeParallelForDirective *D) { 8947 DeclarationNameInfo DirName; 8948 getDerived().getSema().StartOpenMPDSABlock( 8949 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8950 D->getBeginLoc()); 8951 auto Res = getDerived().TransformOMPExecutableDirective(D); 8952 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8953 return Res; 8954 } 8955 8956 template <typename Derived> 8957 StmtResult TreeTransform<Derived>:: 8958 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8959 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8960 DeclarationNameInfo DirName; 8961 getDerived().getSema().StartOpenMPDSABlock( 8962 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8963 D->getBeginLoc()); 8964 auto Res = getDerived().TransformOMPExecutableDirective(D); 8965 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8966 return Res; 8967 } 8968 8969 template <typename Derived> 8970 StmtResult 8971 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8972 OMPTargetTeamsDistributeSimdDirective *D) { 8973 DeclarationNameInfo DirName; 8974 getDerived().getSema().StartOpenMPDSABlock( 8975 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8976 auto Res = getDerived().TransformOMPExecutableDirective(D); 8977 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8978 return Res; 8979 } 8980 8981 8982 //===----------------------------------------------------------------------===// 8983 // OpenMP clause transformation 8984 //===----------------------------------------------------------------------===// 8985 template <typename Derived> 8986 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8987 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8988 if (Cond.isInvalid()) 8989 return nullptr; 8990 return getDerived().RebuildOMPIfClause( 8991 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8992 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8993 } 8994 8995 template <typename Derived> 8996 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8997 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8998 if (Cond.isInvalid()) 8999 return nullptr; 9000 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9001 C->getLParenLoc(), C->getEndLoc()); 9002 } 9003 9004 template <typename Derived> 9005 OMPClause * 9006 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9007 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9008 if (NumThreads.isInvalid()) 9009 return nullptr; 9010 return getDerived().RebuildOMPNumThreadsClause( 9011 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9012 } 9013 9014 template <typename Derived> 9015 OMPClause * 9016 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9017 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9018 if (E.isInvalid()) 9019 return nullptr; 9020 return getDerived().RebuildOMPSafelenClause( 9021 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9022 } 9023 9024 template <typename Derived> 9025 OMPClause * 9026 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9027 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9028 if (E.isInvalid()) 9029 return nullptr; 9030 return getDerived().RebuildOMPAllocatorClause( 9031 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9032 } 9033 9034 template <typename Derived> 9035 OMPClause * 9036 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9037 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9038 if (E.isInvalid()) 9039 return nullptr; 9040 return getDerived().RebuildOMPSimdlenClause( 9041 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9042 } 9043 9044 template <typename Derived> 9045 OMPClause * 9046 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9047 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9048 if (E.isInvalid()) 9049 return nullptr; 9050 return getDerived().RebuildOMPCollapseClause( 9051 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9052 } 9053 9054 template <typename Derived> 9055 OMPClause * 9056 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9057 return getDerived().RebuildOMPDefaultClause( 9058 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9059 C->getLParenLoc(), C->getEndLoc()); 9060 } 9061 9062 template <typename Derived> 9063 OMPClause * 9064 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9065 return getDerived().RebuildOMPProcBindClause( 9066 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9067 C->getLParenLoc(), C->getEndLoc()); 9068 } 9069 9070 template <typename Derived> 9071 OMPClause * 9072 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9073 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9074 if (E.isInvalid()) 9075 return nullptr; 9076 return getDerived().RebuildOMPScheduleClause( 9077 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9078 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9079 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9080 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9081 } 9082 9083 template <typename Derived> 9084 OMPClause * 9085 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9086 ExprResult E; 9087 if (auto *Num = C->getNumForLoops()) { 9088 E = getDerived().TransformExpr(Num); 9089 if (E.isInvalid()) 9090 return nullptr; 9091 } 9092 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9093 C->getLParenLoc(), E.get()); 9094 } 9095 9096 template <typename Derived> 9097 OMPClause * 9098 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9099 ExprResult E; 9100 if (Expr *Evt = C->getEventHandler()) { 9101 E = getDerived().TransformExpr(Evt); 9102 if (E.isInvalid()) 9103 return nullptr; 9104 } 9105 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9106 C->getLParenLoc(), C->getEndLoc()); 9107 } 9108 9109 template <typename Derived> 9110 OMPClause * 9111 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9112 // No need to rebuild this clause, no template-dependent parameters. 9113 return C; 9114 } 9115 9116 template <typename Derived> 9117 OMPClause * 9118 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9119 // No need to rebuild this clause, no template-dependent parameters. 9120 return C; 9121 } 9122 9123 template <typename Derived> 9124 OMPClause * 9125 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9126 // No need to rebuild this clause, no template-dependent parameters. 9127 return C; 9128 } 9129 9130 template <typename Derived> 9131 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9132 // No need to rebuild this clause, no template-dependent parameters. 9133 return C; 9134 } 9135 9136 template <typename Derived> 9137 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9138 // No need to rebuild this clause, no template-dependent parameters. 9139 return C; 9140 } 9141 9142 template <typename Derived> 9143 OMPClause * 9144 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9145 // No need to rebuild this clause, no template-dependent parameters. 9146 return C; 9147 } 9148 9149 template <typename Derived> 9150 OMPClause * 9151 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9152 // No need to rebuild this clause, no template-dependent parameters. 9153 return C; 9154 } 9155 9156 template <typename Derived> 9157 OMPClause * 9158 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9159 // No need to rebuild this clause, no template-dependent parameters. 9160 return C; 9161 } 9162 9163 template <typename Derived> 9164 OMPClause * 9165 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9166 // No need to rebuild this clause, no template-dependent parameters. 9167 return C; 9168 } 9169 9170 template <typename Derived> 9171 OMPClause * 9172 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9173 // No need to rebuild this clause, no template-dependent parameters. 9174 return C; 9175 } 9176 9177 template <typename Derived> 9178 OMPClause * 9179 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9180 // No need to rebuild this clause, no template-dependent parameters. 9181 return C; 9182 } 9183 9184 template <typename Derived> 9185 OMPClause * 9186 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9187 // No need to rebuild this clause, no template-dependent parameters. 9188 return C; 9189 } 9190 9191 template <typename Derived> 9192 OMPClause * 9193 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9194 // No need to rebuild this clause, no template-dependent parameters. 9195 return C; 9196 } 9197 9198 template <typename Derived> 9199 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9200 // No need to rebuild this clause, no template-dependent parameters. 9201 return C; 9202 } 9203 9204 template <typename Derived> 9205 OMPClause * 9206 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9207 // No need to rebuild this clause, no template-dependent parameters. 9208 return C; 9209 } 9210 9211 template <typename Derived> 9212 OMPClause * 9213 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9214 // No need to rebuild this clause, no template-dependent parameters. 9215 return C; 9216 } 9217 9218 template <typename Derived> 9219 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9220 OMPUnifiedAddressClause *C) { 9221 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9222 } 9223 9224 template <typename Derived> 9225 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9226 OMPUnifiedSharedMemoryClause *C) { 9227 llvm_unreachable( 9228 "unified_shared_memory clause cannot appear in dependent context"); 9229 } 9230 9231 template <typename Derived> 9232 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9233 OMPReverseOffloadClause *C) { 9234 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9235 } 9236 9237 template <typename Derived> 9238 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9239 OMPDynamicAllocatorsClause *C) { 9240 llvm_unreachable( 9241 "dynamic_allocators clause cannot appear in dependent context"); 9242 } 9243 9244 template <typename Derived> 9245 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9246 OMPAtomicDefaultMemOrderClause *C) { 9247 llvm_unreachable( 9248 "atomic_default_mem_order clause cannot appear in dependent context"); 9249 } 9250 9251 template <typename Derived> 9252 OMPClause * 9253 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9254 llvm::SmallVector<Expr *, 16> Vars; 9255 Vars.reserve(C->varlist_size()); 9256 for (auto *VE : C->varlists()) { 9257 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9258 if (EVar.isInvalid()) 9259 return nullptr; 9260 Vars.push_back(EVar.get()); 9261 } 9262 return getDerived().RebuildOMPPrivateClause( 9263 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9264 } 9265 9266 template <typename Derived> 9267 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9268 OMPFirstprivateClause *C) { 9269 llvm::SmallVector<Expr *, 16> Vars; 9270 Vars.reserve(C->varlist_size()); 9271 for (auto *VE : C->varlists()) { 9272 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9273 if (EVar.isInvalid()) 9274 return nullptr; 9275 Vars.push_back(EVar.get()); 9276 } 9277 return getDerived().RebuildOMPFirstprivateClause( 9278 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9279 } 9280 9281 template <typename Derived> 9282 OMPClause * 9283 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9284 llvm::SmallVector<Expr *, 16> Vars; 9285 Vars.reserve(C->varlist_size()); 9286 for (auto *VE : C->varlists()) { 9287 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9288 if (EVar.isInvalid()) 9289 return nullptr; 9290 Vars.push_back(EVar.get()); 9291 } 9292 return getDerived().RebuildOMPLastprivateClause( 9293 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9294 C->getLParenLoc(), C->getEndLoc()); 9295 } 9296 9297 template <typename Derived> 9298 OMPClause * 9299 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9300 llvm::SmallVector<Expr *, 16> Vars; 9301 Vars.reserve(C->varlist_size()); 9302 for (auto *VE : C->varlists()) { 9303 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9304 if (EVar.isInvalid()) 9305 return nullptr; 9306 Vars.push_back(EVar.get()); 9307 } 9308 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9309 C->getLParenLoc(), C->getEndLoc()); 9310 } 9311 9312 template <typename Derived> 9313 OMPClause * 9314 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9315 llvm::SmallVector<Expr *, 16> Vars; 9316 Vars.reserve(C->varlist_size()); 9317 for (auto *VE : C->varlists()) { 9318 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9319 if (EVar.isInvalid()) 9320 return nullptr; 9321 Vars.push_back(EVar.get()); 9322 } 9323 CXXScopeSpec ReductionIdScopeSpec; 9324 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9325 9326 DeclarationNameInfo NameInfo = C->getNameInfo(); 9327 if (NameInfo.getName()) { 9328 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9329 if (!NameInfo.getName()) 9330 return nullptr; 9331 } 9332 // Build a list of all UDR decls with the same names ranged by the Scopes. 9333 // The Scope boundary is a duplication of the previous decl. 9334 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9335 for (auto *E : C->reduction_ops()) { 9336 // Transform all the decls. 9337 if (E) { 9338 auto *ULE = cast<UnresolvedLookupExpr>(E); 9339 UnresolvedSet<8> Decls; 9340 for (auto *D : ULE->decls()) { 9341 NamedDecl *InstD = 9342 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9343 Decls.addDecl(InstD, InstD->getAccess()); 9344 } 9345 UnresolvedReductions.push_back( 9346 UnresolvedLookupExpr::Create( 9347 SemaRef.Context, /*NamingClass=*/nullptr, 9348 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9349 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9350 Decls.begin(), Decls.end())); 9351 } else 9352 UnresolvedReductions.push_back(nullptr); 9353 } 9354 return getDerived().RebuildOMPReductionClause( 9355 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9356 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9357 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9358 } 9359 9360 template <typename Derived> 9361 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9362 OMPTaskReductionClause *C) { 9363 llvm::SmallVector<Expr *, 16> Vars; 9364 Vars.reserve(C->varlist_size()); 9365 for (auto *VE : C->varlists()) { 9366 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9367 if (EVar.isInvalid()) 9368 return nullptr; 9369 Vars.push_back(EVar.get()); 9370 } 9371 CXXScopeSpec ReductionIdScopeSpec; 9372 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9373 9374 DeclarationNameInfo NameInfo = C->getNameInfo(); 9375 if (NameInfo.getName()) { 9376 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9377 if (!NameInfo.getName()) 9378 return nullptr; 9379 } 9380 // Build a list of all UDR decls with the same names ranged by the Scopes. 9381 // The Scope boundary is a duplication of the previous decl. 9382 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9383 for (auto *E : C->reduction_ops()) { 9384 // Transform all the decls. 9385 if (E) { 9386 auto *ULE = cast<UnresolvedLookupExpr>(E); 9387 UnresolvedSet<8> Decls; 9388 for (auto *D : ULE->decls()) { 9389 NamedDecl *InstD = 9390 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9391 Decls.addDecl(InstD, InstD->getAccess()); 9392 } 9393 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9394 SemaRef.Context, /*NamingClass=*/nullptr, 9395 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9396 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9397 } else 9398 UnresolvedReductions.push_back(nullptr); 9399 } 9400 return getDerived().RebuildOMPTaskReductionClause( 9401 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9402 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9403 } 9404 9405 template <typename Derived> 9406 OMPClause * 9407 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9408 llvm::SmallVector<Expr *, 16> Vars; 9409 Vars.reserve(C->varlist_size()); 9410 for (auto *VE : C->varlists()) { 9411 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9412 if (EVar.isInvalid()) 9413 return nullptr; 9414 Vars.push_back(EVar.get()); 9415 } 9416 CXXScopeSpec ReductionIdScopeSpec; 9417 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9418 9419 DeclarationNameInfo NameInfo = C->getNameInfo(); 9420 if (NameInfo.getName()) { 9421 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9422 if (!NameInfo.getName()) 9423 return nullptr; 9424 } 9425 // Build a list of all UDR decls with the same names ranged by the Scopes. 9426 // The Scope boundary is a duplication of the previous decl. 9427 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9428 for (auto *E : C->reduction_ops()) { 9429 // Transform all the decls. 9430 if (E) { 9431 auto *ULE = cast<UnresolvedLookupExpr>(E); 9432 UnresolvedSet<8> Decls; 9433 for (auto *D : ULE->decls()) { 9434 NamedDecl *InstD = 9435 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9436 Decls.addDecl(InstD, InstD->getAccess()); 9437 } 9438 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9439 SemaRef.Context, /*NamingClass=*/nullptr, 9440 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9441 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9442 } else 9443 UnresolvedReductions.push_back(nullptr); 9444 } 9445 return getDerived().RebuildOMPInReductionClause( 9446 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9447 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9448 } 9449 9450 template <typename Derived> 9451 OMPClause * 9452 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9453 llvm::SmallVector<Expr *, 16> Vars; 9454 Vars.reserve(C->varlist_size()); 9455 for (auto *VE : C->varlists()) { 9456 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9457 if (EVar.isInvalid()) 9458 return nullptr; 9459 Vars.push_back(EVar.get()); 9460 } 9461 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9462 if (Step.isInvalid()) 9463 return nullptr; 9464 return getDerived().RebuildOMPLinearClause( 9465 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9466 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9467 } 9468 9469 template <typename Derived> 9470 OMPClause * 9471 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9472 llvm::SmallVector<Expr *, 16> Vars; 9473 Vars.reserve(C->varlist_size()); 9474 for (auto *VE : C->varlists()) { 9475 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9476 if (EVar.isInvalid()) 9477 return nullptr; 9478 Vars.push_back(EVar.get()); 9479 } 9480 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9481 if (Alignment.isInvalid()) 9482 return nullptr; 9483 return getDerived().RebuildOMPAlignedClause( 9484 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9485 C->getColonLoc(), C->getEndLoc()); 9486 } 9487 9488 template <typename Derived> 9489 OMPClause * 9490 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9491 llvm::SmallVector<Expr *, 16> Vars; 9492 Vars.reserve(C->varlist_size()); 9493 for (auto *VE : C->varlists()) { 9494 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9495 if (EVar.isInvalid()) 9496 return nullptr; 9497 Vars.push_back(EVar.get()); 9498 } 9499 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9500 C->getLParenLoc(), C->getEndLoc()); 9501 } 9502 9503 template <typename Derived> 9504 OMPClause * 9505 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9506 llvm::SmallVector<Expr *, 16> Vars; 9507 Vars.reserve(C->varlist_size()); 9508 for (auto *VE : C->varlists()) { 9509 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9510 if (EVar.isInvalid()) 9511 return nullptr; 9512 Vars.push_back(EVar.get()); 9513 } 9514 return getDerived().RebuildOMPCopyprivateClause( 9515 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9516 } 9517 9518 template <typename Derived> 9519 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9520 llvm::SmallVector<Expr *, 16> Vars; 9521 Vars.reserve(C->varlist_size()); 9522 for (auto *VE : C->varlists()) { 9523 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9524 if (EVar.isInvalid()) 9525 return nullptr; 9526 Vars.push_back(EVar.get()); 9527 } 9528 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9529 C->getLParenLoc(), C->getEndLoc()); 9530 } 9531 9532 template <typename Derived> 9533 OMPClause * 9534 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9535 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9536 if (E.isInvalid()) 9537 return nullptr; 9538 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9539 C->getLParenLoc(), C->getEndLoc()); 9540 } 9541 9542 template <typename Derived> 9543 OMPClause * 9544 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9545 llvm::SmallVector<Expr *, 16> Vars; 9546 Expr *DepModifier = C->getModifier(); 9547 if (DepModifier) { 9548 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9549 if (DepModRes.isInvalid()) 9550 return nullptr; 9551 DepModifier = DepModRes.get(); 9552 } 9553 Vars.reserve(C->varlist_size()); 9554 for (auto *VE : C->varlists()) { 9555 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9556 if (EVar.isInvalid()) 9557 return nullptr; 9558 Vars.push_back(EVar.get()); 9559 } 9560 return getDerived().RebuildOMPDependClause( 9561 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9562 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9563 C->getEndLoc()); 9564 } 9565 9566 template <typename Derived> 9567 OMPClause * 9568 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9569 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9570 if (E.isInvalid()) 9571 return nullptr; 9572 return getDerived().RebuildOMPDeviceClause( 9573 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9574 C->getModifierLoc(), C->getEndLoc()); 9575 } 9576 9577 template <typename Derived, class T> 9578 bool transformOMPMappableExprListClause( 9579 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9580 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9581 DeclarationNameInfo &MapperIdInfo, 9582 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9583 // Transform expressions in the list. 9584 Vars.reserve(C->varlist_size()); 9585 for (auto *VE : C->varlists()) { 9586 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9587 if (EVar.isInvalid()) 9588 return true; 9589 Vars.push_back(EVar.get()); 9590 } 9591 // Transform mapper scope specifier and identifier. 9592 NestedNameSpecifierLoc QualifierLoc; 9593 if (C->getMapperQualifierLoc()) { 9594 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9595 C->getMapperQualifierLoc()); 9596 if (!QualifierLoc) 9597 return true; 9598 } 9599 MapperIdScopeSpec.Adopt(QualifierLoc); 9600 MapperIdInfo = C->getMapperIdInfo(); 9601 if (MapperIdInfo.getName()) { 9602 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9603 if (!MapperIdInfo.getName()) 9604 return true; 9605 } 9606 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9607 // the previous user-defined mapper lookup in dependent environment. 9608 for (auto *E : C->mapperlists()) { 9609 // Transform all the decls. 9610 if (E) { 9611 auto *ULE = cast<UnresolvedLookupExpr>(E); 9612 UnresolvedSet<8> Decls; 9613 for (auto *D : ULE->decls()) { 9614 NamedDecl *InstD = 9615 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9616 Decls.addDecl(InstD, InstD->getAccess()); 9617 } 9618 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9619 TT.getSema().Context, /*NamingClass=*/nullptr, 9620 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9621 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9622 Decls.end())); 9623 } else { 9624 UnresolvedMappers.push_back(nullptr); 9625 } 9626 } 9627 return false; 9628 } 9629 9630 template <typename Derived> 9631 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9632 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9633 llvm::SmallVector<Expr *, 16> Vars; 9634 CXXScopeSpec MapperIdScopeSpec; 9635 DeclarationNameInfo MapperIdInfo; 9636 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9637 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9638 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9639 return nullptr; 9640 return getDerived().RebuildOMPMapClause( 9641 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9642 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9643 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9644 } 9645 9646 template <typename Derived> 9647 OMPClause * 9648 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9649 Expr *Allocator = C->getAllocator(); 9650 if (Allocator) { 9651 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9652 if (AllocatorRes.isInvalid()) 9653 return nullptr; 9654 Allocator = AllocatorRes.get(); 9655 } 9656 llvm::SmallVector<Expr *, 16> Vars; 9657 Vars.reserve(C->varlist_size()); 9658 for (auto *VE : C->varlists()) { 9659 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9660 if (EVar.isInvalid()) 9661 return nullptr; 9662 Vars.push_back(EVar.get()); 9663 } 9664 return getDerived().RebuildOMPAllocateClause( 9665 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9666 C->getEndLoc()); 9667 } 9668 9669 template <typename Derived> 9670 OMPClause * 9671 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9672 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9673 if (E.isInvalid()) 9674 return nullptr; 9675 return getDerived().RebuildOMPNumTeamsClause( 9676 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9677 } 9678 9679 template <typename Derived> 9680 OMPClause * 9681 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9682 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9683 if (E.isInvalid()) 9684 return nullptr; 9685 return getDerived().RebuildOMPThreadLimitClause( 9686 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9687 } 9688 9689 template <typename Derived> 9690 OMPClause * 9691 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9692 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9693 if (E.isInvalid()) 9694 return nullptr; 9695 return getDerived().RebuildOMPPriorityClause( 9696 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9697 } 9698 9699 template <typename Derived> 9700 OMPClause * 9701 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9702 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9703 if (E.isInvalid()) 9704 return nullptr; 9705 return getDerived().RebuildOMPGrainsizeClause( 9706 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9707 } 9708 9709 template <typename Derived> 9710 OMPClause * 9711 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9712 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9713 if (E.isInvalid()) 9714 return nullptr; 9715 return getDerived().RebuildOMPNumTasksClause( 9716 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9717 } 9718 9719 template <typename Derived> 9720 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9721 ExprResult E = getDerived().TransformExpr(C->getHint()); 9722 if (E.isInvalid()) 9723 return nullptr; 9724 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9725 C->getLParenLoc(), C->getEndLoc()); 9726 } 9727 9728 template <typename Derived> 9729 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9730 OMPDistScheduleClause *C) { 9731 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9732 if (E.isInvalid()) 9733 return nullptr; 9734 return getDerived().RebuildOMPDistScheduleClause( 9735 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9736 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9737 } 9738 9739 template <typename Derived> 9740 OMPClause * 9741 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9742 // Rebuild Defaultmap Clause since we need to invoke the checking of 9743 // defaultmap(none:variable-category) after template initialization. 9744 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9745 C->getDefaultmapKind(), 9746 C->getBeginLoc(), 9747 C->getLParenLoc(), 9748 C->getDefaultmapModifierLoc(), 9749 C->getDefaultmapKindLoc(), 9750 C->getEndLoc()); 9751 } 9752 9753 template <typename Derived> 9754 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9755 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9756 llvm::SmallVector<Expr *, 16> Vars; 9757 CXXScopeSpec MapperIdScopeSpec; 9758 DeclarationNameInfo MapperIdInfo; 9759 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9760 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9761 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9762 return nullptr; 9763 return getDerived().RebuildOMPToClause( 9764 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9765 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9766 } 9767 9768 template <typename Derived> 9769 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9770 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9771 llvm::SmallVector<Expr *, 16> Vars; 9772 CXXScopeSpec MapperIdScopeSpec; 9773 DeclarationNameInfo MapperIdInfo; 9774 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9775 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9776 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9777 return nullptr; 9778 return getDerived().RebuildOMPFromClause( 9779 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9780 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9781 } 9782 9783 template <typename Derived> 9784 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9785 OMPUseDevicePtrClause *C) { 9786 llvm::SmallVector<Expr *, 16> Vars; 9787 Vars.reserve(C->varlist_size()); 9788 for (auto *VE : C->varlists()) { 9789 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9790 if (EVar.isInvalid()) 9791 return nullptr; 9792 Vars.push_back(EVar.get()); 9793 } 9794 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9795 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9796 } 9797 9798 template <typename Derived> 9799 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 9800 OMPUseDeviceAddrClause *C) { 9801 llvm::SmallVector<Expr *, 16> Vars; 9802 Vars.reserve(C->varlist_size()); 9803 for (auto *VE : C->varlists()) { 9804 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9805 if (EVar.isInvalid()) 9806 return nullptr; 9807 Vars.push_back(EVar.get()); 9808 } 9809 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9810 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 9811 } 9812 9813 template <typename Derived> 9814 OMPClause * 9815 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9816 llvm::SmallVector<Expr *, 16> Vars; 9817 Vars.reserve(C->varlist_size()); 9818 for (auto *VE : C->varlists()) { 9819 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9820 if (EVar.isInvalid()) 9821 return nullptr; 9822 Vars.push_back(EVar.get()); 9823 } 9824 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9825 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9826 } 9827 9828 template <typename Derived> 9829 OMPClause * 9830 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9831 llvm::SmallVector<Expr *, 16> Vars; 9832 Vars.reserve(C->varlist_size()); 9833 for (auto *VE : C->varlists()) { 9834 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9835 if (EVar.isInvalid()) 9836 return nullptr; 9837 Vars.push_back(EVar.get()); 9838 } 9839 return getDerived().RebuildOMPNontemporalClause( 9840 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9841 } 9842 9843 template <typename Derived> 9844 OMPClause * 9845 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 9846 llvm::SmallVector<Expr *, 16> Vars; 9847 Vars.reserve(C->varlist_size()); 9848 for (auto *VE : C->varlists()) { 9849 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9850 if (EVar.isInvalid()) 9851 return nullptr; 9852 Vars.push_back(EVar.get()); 9853 } 9854 return getDerived().RebuildOMPInclusiveClause( 9855 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9856 } 9857 9858 template <typename Derived> 9859 OMPClause * 9860 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 9861 llvm::SmallVector<Expr *, 16> Vars; 9862 Vars.reserve(C->varlist_size()); 9863 for (auto *VE : C->varlists()) { 9864 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9865 if (EVar.isInvalid()) 9866 return nullptr; 9867 Vars.push_back(EVar.get()); 9868 } 9869 return getDerived().RebuildOMPExclusiveClause( 9870 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9871 } 9872 9873 template <typename Derived> 9874 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 9875 OMPUsesAllocatorsClause *C) { 9876 SmallVector<Sema::UsesAllocatorsData, 16> Data; 9877 Data.reserve(C->getNumberOfAllocators()); 9878 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 9879 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 9880 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 9881 if (Allocator.isInvalid()) 9882 continue; 9883 ExprResult AllocatorTraits; 9884 if (Expr *AT = D.AllocatorTraits) { 9885 AllocatorTraits = getDerived().TransformExpr(AT); 9886 if (AllocatorTraits.isInvalid()) 9887 continue; 9888 } 9889 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 9890 NewD.Allocator = Allocator.get(); 9891 NewD.AllocatorTraits = AllocatorTraits.get(); 9892 NewD.LParenLoc = D.LParenLoc; 9893 NewD.RParenLoc = D.RParenLoc; 9894 } 9895 return getDerived().RebuildOMPUsesAllocatorsClause( 9896 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9897 } 9898 9899 template <typename Derived> 9900 OMPClause * 9901 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 9902 SmallVector<Expr *, 4> Locators; 9903 Locators.reserve(C->varlist_size()); 9904 ExprResult ModifierRes; 9905 if (Expr *Modifier = C->getModifier()) { 9906 ModifierRes = getDerived().TransformExpr(Modifier); 9907 if (ModifierRes.isInvalid()) 9908 return nullptr; 9909 } 9910 for (Expr *E : C->varlists()) { 9911 ExprResult Locator = getDerived().TransformExpr(E); 9912 if (Locator.isInvalid()) 9913 continue; 9914 Locators.push_back(Locator.get()); 9915 } 9916 return getDerived().RebuildOMPAffinityClause( 9917 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 9918 ModifierRes.get(), Locators); 9919 } 9920 9921 template <typename Derived> 9922 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 9923 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 9924 C->getBeginLoc(), C->getLParenLoc(), 9925 C->getEndLoc()); 9926 } 9927 9928 //===----------------------------------------------------------------------===// 9929 // Expression transformation 9930 //===----------------------------------------------------------------------===// 9931 template<typename Derived> 9932 ExprResult 9933 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9934 return TransformExpr(E->getSubExpr()); 9935 } 9936 9937 template<typename Derived> 9938 ExprResult 9939 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9940 if (!E->isTypeDependent()) 9941 return E; 9942 9943 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9944 E->getIdentKind()); 9945 } 9946 9947 template<typename Derived> 9948 ExprResult 9949 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9950 NestedNameSpecifierLoc QualifierLoc; 9951 if (E->getQualifierLoc()) { 9952 QualifierLoc 9953 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9954 if (!QualifierLoc) 9955 return ExprError(); 9956 } 9957 9958 ValueDecl *ND 9959 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9960 E->getDecl())); 9961 if (!ND) 9962 return ExprError(); 9963 9964 NamedDecl *Found = ND; 9965 if (E->getFoundDecl() != E->getDecl()) { 9966 Found = cast_or_null<NamedDecl>( 9967 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 9968 if (!Found) 9969 return ExprError(); 9970 } 9971 9972 DeclarationNameInfo NameInfo = E->getNameInfo(); 9973 if (NameInfo.getName()) { 9974 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9975 if (!NameInfo.getName()) 9976 return ExprError(); 9977 } 9978 9979 if (!getDerived().AlwaysRebuild() && 9980 QualifierLoc == E->getQualifierLoc() && 9981 ND == E->getDecl() && 9982 Found == E->getFoundDecl() && 9983 NameInfo.getName() == E->getDecl()->getDeclName() && 9984 !E->hasExplicitTemplateArgs()) { 9985 9986 // Mark it referenced in the new context regardless. 9987 // FIXME: this is a bit instantiation-specific. 9988 SemaRef.MarkDeclRefReferenced(E); 9989 9990 return E; 9991 } 9992 9993 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9994 if (E->hasExplicitTemplateArgs()) { 9995 TemplateArgs = &TransArgs; 9996 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9997 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9998 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9999 E->getNumTemplateArgs(), 10000 TransArgs)) 10001 return ExprError(); 10002 } 10003 10004 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10005 Found, TemplateArgs); 10006 } 10007 10008 template<typename Derived> 10009 ExprResult 10010 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10011 return E; 10012 } 10013 10014 template <typename Derived> 10015 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10016 FixedPointLiteral *E) { 10017 return E; 10018 } 10019 10020 template<typename Derived> 10021 ExprResult 10022 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10023 return E; 10024 } 10025 10026 template<typename Derived> 10027 ExprResult 10028 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10029 return E; 10030 } 10031 10032 template<typename Derived> 10033 ExprResult 10034 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10035 return E; 10036 } 10037 10038 template<typename Derived> 10039 ExprResult 10040 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10041 return E; 10042 } 10043 10044 template<typename Derived> 10045 ExprResult 10046 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10047 if (FunctionDecl *FD = E->getDirectCallee()) 10048 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10049 return SemaRef.MaybeBindToTemporary(E); 10050 } 10051 10052 template<typename Derived> 10053 ExprResult 10054 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10055 ExprResult ControllingExpr = 10056 getDerived().TransformExpr(E->getControllingExpr()); 10057 if (ControllingExpr.isInvalid()) 10058 return ExprError(); 10059 10060 SmallVector<Expr *, 4> AssocExprs; 10061 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10062 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10063 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10064 if (TSI) { 10065 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10066 if (!AssocType) 10067 return ExprError(); 10068 AssocTypes.push_back(AssocType); 10069 } else { 10070 AssocTypes.push_back(nullptr); 10071 } 10072 10073 ExprResult AssocExpr = 10074 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10075 if (AssocExpr.isInvalid()) 10076 return ExprError(); 10077 AssocExprs.push_back(AssocExpr.get()); 10078 } 10079 10080 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10081 E->getDefaultLoc(), 10082 E->getRParenLoc(), 10083 ControllingExpr.get(), 10084 AssocTypes, 10085 AssocExprs); 10086 } 10087 10088 template<typename Derived> 10089 ExprResult 10090 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10091 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10092 if (SubExpr.isInvalid()) 10093 return ExprError(); 10094 10095 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10096 return E; 10097 10098 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10099 E->getRParen()); 10100 } 10101 10102 /// The operand of a unary address-of operator has special rules: it's 10103 /// allowed to refer to a non-static member of a class even if there's no 'this' 10104 /// object available. 10105 template<typename Derived> 10106 ExprResult 10107 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10108 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10109 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10110 else 10111 return getDerived().TransformExpr(E); 10112 } 10113 10114 template<typename Derived> 10115 ExprResult 10116 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10117 ExprResult SubExpr; 10118 if (E->getOpcode() == UO_AddrOf) 10119 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10120 else 10121 SubExpr = TransformExpr(E->getSubExpr()); 10122 if (SubExpr.isInvalid()) 10123 return ExprError(); 10124 10125 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10126 return E; 10127 10128 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10129 E->getOpcode(), 10130 SubExpr.get()); 10131 } 10132 10133 template<typename Derived> 10134 ExprResult 10135 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10136 // Transform the type. 10137 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10138 if (!Type) 10139 return ExprError(); 10140 10141 // Transform all of the components into components similar to what the 10142 // parser uses. 10143 // FIXME: It would be slightly more efficient in the non-dependent case to 10144 // just map FieldDecls, rather than requiring the rebuilder to look for 10145 // the fields again. However, __builtin_offsetof is rare enough in 10146 // template code that we don't care. 10147 bool ExprChanged = false; 10148 typedef Sema::OffsetOfComponent Component; 10149 SmallVector<Component, 4> Components; 10150 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10151 const OffsetOfNode &ON = E->getComponent(I); 10152 Component Comp; 10153 Comp.isBrackets = true; 10154 Comp.LocStart = ON.getSourceRange().getBegin(); 10155 Comp.LocEnd = ON.getSourceRange().getEnd(); 10156 switch (ON.getKind()) { 10157 case OffsetOfNode::Array: { 10158 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10159 ExprResult Index = getDerived().TransformExpr(FromIndex); 10160 if (Index.isInvalid()) 10161 return ExprError(); 10162 10163 ExprChanged = ExprChanged || Index.get() != FromIndex; 10164 Comp.isBrackets = true; 10165 Comp.U.E = Index.get(); 10166 break; 10167 } 10168 10169 case OffsetOfNode::Field: 10170 case OffsetOfNode::Identifier: 10171 Comp.isBrackets = false; 10172 Comp.U.IdentInfo = ON.getFieldName(); 10173 if (!Comp.U.IdentInfo) 10174 continue; 10175 10176 break; 10177 10178 case OffsetOfNode::Base: 10179 // Will be recomputed during the rebuild. 10180 continue; 10181 } 10182 10183 Components.push_back(Comp); 10184 } 10185 10186 // If nothing changed, retain the existing expression. 10187 if (!getDerived().AlwaysRebuild() && 10188 Type == E->getTypeSourceInfo() && 10189 !ExprChanged) 10190 return E; 10191 10192 // Build a new offsetof expression. 10193 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10194 Components, E->getRParenLoc()); 10195 } 10196 10197 template<typename Derived> 10198 ExprResult 10199 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10200 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10201 "opaque value expression requires transformation"); 10202 return E; 10203 } 10204 10205 template<typename Derived> 10206 ExprResult 10207 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10208 return E; 10209 } 10210 10211 template <typename Derived> 10212 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10213 llvm::SmallVector<Expr *, 8> Children; 10214 bool Changed = false; 10215 for (Expr *C : E->subExpressions()) { 10216 ExprResult NewC = getDerived().TransformExpr(C); 10217 if (NewC.isInvalid()) 10218 return ExprError(); 10219 Children.push_back(NewC.get()); 10220 10221 Changed |= NewC.get() != C; 10222 } 10223 if (!getDerived().AlwaysRebuild() && !Changed) 10224 return E; 10225 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10226 Children, E->getType()); 10227 } 10228 10229 template<typename Derived> 10230 ExprResult 10231 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10232 // Rebuild the syntactic form. The original syntactic form has 10233 // opaque-value expressions in it, so strip those away and rebuild 10234 // the result. This is a really awful way of doing this, but the 10235 // better solution (rebuilding the semantic expressions and 10236 // rebinding OVEs as necessary) doesn't work; we'd need 10237 // TreeTransform to not strip away implicit conversions. 10238 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10239 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10240 if (result.isInvalid()) return ExprError(); 10241 10242 // If that gives us a pseudo-object result back, the pseudo-object 10243 // expression must have been an lvalue-to-rvalue conversion which we 10244 // should reapply. 10245 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10246 result = SemaRef.checkPseudoObjectRValue(result.get()); 10247 10248 return result; 10249 } 10250 10251 template<typename Derived> 10252 ExprResult 10253 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10254 UnaryExprOrTypeTraitExpr *E) { 10255 if (E->isArgumentType()) { 10256 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10257 10258 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10259 if (!NewT) 10260 return ExprError(); 10261 10262 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10263 return E; 10264 10265 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10266 E->getKind(), 10267 E->getSourceRange()); 10268 } 10269 10270 // C++0x [expr.sizeof]p1: 10271 // The operand is either an expression, which is an unevaluated operand 10272 // [...] 10273 EnterExpressionEvaluationContext Unevaluated( 10274 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10275 Sema::ReuseLambdaContextDecl); 10276 10277 // Try to recover if we have something like sizeof(T::X) where X is a type. 10278 // Notably, there must be *exactly* one set of parens if X is a type. 10279 TypeSourceInfo *RecoveryTSI = nullptr; 10280 ExprResult SubExpr; 10281 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10282 if (auto *DRE = 10283 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10284 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10285 PE, DRE, false, &RecoveryTSI); 10286 else 10287 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10288 10289 if (RecoveryTSI) { 10290 return getDerived().RebuildUnaryExprOrTypeTrait( 10291 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10292 } else if (SubExpr.isInvalid()) 10293 return ExprError(); 10294 10295 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10296 return E; 10297 10298 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10299 E->getOperatorLoc(), 10300 E->getKind(), 10301 E->getSourceRange()); 10302 } 10303 10304 template<typename Derived> 10305 ExprResult 10306 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10307 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10308 if (LHS.isInvalid()) 10309 return ExprError(); 10310 10311 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10312 if (RHS.isInvalid()) 10313 return ExprError(); 10314 10315 10316 if (!getDerived().AlwaysRebuild() && 10317 LHS.get() == E->getLHS() && 10318 RHS.get() == E->getRHS()) 10319 return E; 10320 10321 return getDerived().RebuildArraySubscriptExpr( 10322 LHS.get(), 10323 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10324 } 10325 10326 template <typename Derived> 10327 ExprResult 10328 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10329 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10330 if (Base.isInvalid()) 10331 return ExprError(); 10332 10333 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10334 if (RowIdx.isInvalid()) 10335 return ExprError(); 10336 10337 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10338 if (ColumnIdx.isInvalid()) 10339 return ExprError(); 10340 10341 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10342 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10343 return E; 10344 10345 return getDerived().RebuildMatrixSubscriptExpr( 10346 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10347 } 10348 10349 template <typename Derived> 10350 ExprResult 10351 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10352 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10353 if (Base.isInvalid()) 10354 return ExprError(); 10355 10356 ExprResult LowerBound; 10357 if (E->getLowerBound()) { 10358 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10359 if (LowerBound.isInvalid()) 10360 return ExprError(); 10361 } 10362 10363 ExprResult Length; 10364 if (E->getLength()) { 10365 Length = getDerived().TransformExpr(E->getLength()); 10366 if (Length.isInvalid()) 10367 return ExprError(); 10368 } 10369 10370 ExprResult Stride; 10371 if (Expr *Str = E->getStride()) { 10372 Stride = getDerived().TransformExpr(Str); 10373 if (Stride.isInvalid()) 10374 return ExprError(); 10375 } 10376 10377 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10378 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10379 return E; 10380 10381 return getDerived().RebuildOMPArraySectionExpr( 10382 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10383 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10384 E->getRBracketLoc()); 10385 } 10386 10387 template <typename Derived> 10388 ExprResult 10389 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10390 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10391 if (Base.isInvalid()) 10392 return ExprError(); 10393 10394 SmallVector<Expr *, 4> Dims; 10395 bool ErrorFound = false; 10396 for (Expr *Dim : E->getDimensions()) { 10397 ExprResult DimRes = getDerived().TransformExpr(Dim); 10398 if (DimRes.isInvalid()) { 10399 ErrorFound = true; 10400 continue; 10401 } 10402 Dims.push_back(DimRes.get()); 10403 } 10404 10405 if (ErrorFound) 10406 return ExprError(); 10407 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10408 E->getRParenLoc(), Dims, 10409 E->getBracketsRanges()); 10410 } 10411 10412 template <typename Derived> 10413 ExprResult 10414 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10415 unsigned NumIterators = E->numOfIterators(); 10416 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10417 10418 bool ErrorFound = false; 10419 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10420 for (unsigned I = 0; I < NumIterators; ++I) { 10421 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10422 Data[I].DeclIdent = D->getIdentifier(); 10423 Data[I].DeclIdentLoc = D->getLocation(); 10424 if (D->getLocation() == D->getBeginLoc()) { 10425 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10426 "Implicit type must be int."); 10427 } else { 10428 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10429 QualType DeclTy = getDerived().TransformType(D->getType()); 10430 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10431 } 10432 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10433 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10434 ExprResult End = getDerived().TransformExpr(Range.End); 10435 ExprResult Step = getDerived().TransformExpr(Range.Step); 10436 ErrorFound = ErrorFound || 10437 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10438 !Data[I].Type.get().isNull())) || 10439 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10440 if (ErrorFound) 10441 continue; 10442 Data[I].Range.Begin = Begin.get(); 10443 Data[I].Range.End = End.get(); 10444 Data[I].Range.Step = Step.get(); 10445 Data[I].AssignLoc = E->getAssignLoc(I); 10446 Data[I].ColonLoc = E->getColonLoc(I); 10447 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10448 NeedToRebuild = 10449 NeedToRebuild || 10450 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10451 D->getType().getTypePtrOrNull()) || 10452 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10453 Range.Step != Data[I].Range.Step; 10454 } 10455 if (ErrorFound) 10456 return ExprError(); 10457 if (!NeedToRebuild) 10458 return E; 10459 10460 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10461 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10462 if (!Res.isUsable()) 10463 return Res; 10464 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10465 for (unsigned I = 0; I < NumIterators; ++I) 10466 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10467 IE->getIteratorDecl(I)); 10468 return Res; 10469 } 10470 10471 template<typename Derived> 10472 ExprResult 10473 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10474 // Transform the callee. 10475 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10476 if (Callee.isInvalid()) 10477 return ExprError(); 10478 10479 // Transform arguments. 10480 bool ArgChanged = false; 10481 SmallVector<Expr*, 8> Args; 10482 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10483 &ArgChanged)) 10484 return ExprError(); 10485 10486 if (!getDerived().AlwaysRebuild() && 10487 Callee.get() == E->getCallee() && 10488 !ArgChanged) 10489 return SemaRef.MaybeBindToTemporary(E); 10490 10491 // FIXME: Wrong source location information for the '('. 10492 SourceLocation FakeLParenLoc 10493 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10494 10495 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10496 if (E->hasStoredFPFeatures()) { 10497 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10498 getSema().CurFPFeatures = 10499 NewOverrides.applyOverrides(getSema().getLangOpts()); 10500 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10501 } 10502 10503 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10504 Args, 10505 E->getRParenLoc()); 10506 } 10507 10508 template<typename Derived> 10509 ExprResult 10510 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10511 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10512 if (Base.isInvalid()) 10513 return ExprError(); 10514 10515 NestedNameSpecifierLoc QualifierLoc; 10516 if (E->hasQualifier()) { 10517 QualifierLoc 10518 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10519 10520 if (!QualifierLoc) 10521 return ExprError(); 10522 } 10523 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10524 10525 ValueDecl *Member 10526 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10527 E->getMemberDecl())); 10528 if (!Member) 10529 return ExprError(); 10530 10531 NamedDecl *FoundDecl = E->getFoundDecl(); 10532 if (FoundDecl == E->getMemberDecl()) { 10533 FoundDecl = Member; 10534 } else { 10535 FoundDecl = cast_or_null<NamedDecl>( 10536 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10537 if (!FoundDecl) 10538 return ExprError(); 10539 } 10540 10541 if (!getDerived().AlwaysRebuild() && 10542 Base.get() == E->getBase() && 10543 QualifierLoc == E->getQualifierLoc() && 10544 Member == E->getMemberDecl() && 10545 FoundDecl == E->getFoundDecl() && 10546 !E->hasExplicitTemplateArgs()) { 10547 10548 // Mark it referenced in the new context regardless. 10549 // FIXME: this is a bit instantiation-specific. 10550 SemaRef.MarkMemberReferenced(E); 10551 10552 return E; 10553 } 10554 10555 TemplateArgumentListInfo TransArgs; 10556 if (E->hasExplicitTemplateArgs()) { 10557 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10558 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10559 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10560 E->getNumTemplateArgs(), 10561 TransArgs)) 10562 return ExprError(); 10563 } 10564 10565 // FIXME: Bogus source location for the operator 10566 SourceLocation FakeOperatorLoc = 10567 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10568 10569 // FIXME: to do this check properly, we will need to preserve the 10570 // first-qualifier-in-scope here, just in case we had a dependent 10571 // base (and therefore couldn't do the check) and a 10572 // nested-name-qualifier (and therefore could do the lookup). 10573 NamedDecl *FirstQualifierInScope = nullptr; 10574 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10575 if (MemberNameInfo.getName()) { 10576 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10577 if (!MemberNameInfo.getName()) 10578 return ExprError(); 10579 } 10580 10581 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10582 E->isArrow(), 10583 QualifierLoc, 10584 TemplateKWLoc, 10585 MemberNameInfo, 10586 Member, 10587 FoundDecl, 10588 (E->hasExplicitTemplateArgs() 10589 ? &TransArgs : nullptr), 10590 FirstQualifierInScope); 10591 } 10592 10593 template<typename Derived> 10594 ExprResult 10595 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10596 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10597 if (LHS.isInvalid()) 10598 return ExprError(); 10599 10600 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10601 if (RHS.isInvalid()) 10602 return ExprError(); 10603 10604 if (!getDerived().AlwaysRebuild() && 10605 LHS.get() == E->getLHS() && 10606 RHS.get() == E->getRHS()) 10607 return E; 10608 10609 if (E->isCompoundAssignmentOp()) 10610 // FPFeatures has already been established from trailing storage 10611 return getDerived().RebuildBinaryOperator( 10612 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10613 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10614 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10615 getSema().CurFPFeatures = 10616 NewOverrides.applyOverrides(getSema().getLangOpts()); 10617 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10618 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10619 LHS.get(), RHS.get()); 10620 } 10621 10622 template <typename Derived> 10623 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10624 CXXRewrittenBinaryOperator *E) { 10625 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10626 10627 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10628 if (LHS.isInvalid()) 10629 return ExprError(); 10630 10631 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10632 if (RHS.isInvalid()) 10633 return ExprError(); 10634 10635 if (!getDerived().AlwaysRebuild() && 10636 LHS.get() == Decomp.LHS && 10637 RHS.get() == Decomp.RHS) 10638 return E; 10639 10640 // Extract the already-resolved callee declarations so that we can restrict 10641 // ourselves to using them as the unqualified lookup results when rebuilding. 10642 UnresolvedSet<2> UnqualLookups; 10643 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10644 const_cast<Expr *>(Decomp.InnerBinOp)}; 10645 for (Expr *PossibleBinOp : PossibleBinOps) { 10646 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10647 if (!Op) 10648 continue; 10649 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10650 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10651 continue; 10652 10653 // Transform the callee in case we built a call to a local extern 10654 // declaration. 10655 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10656 E->getOperatorLoc(), Callee->getFoundDecl())); 10657 if (!Found) 10658 return ExprError(); 10659 UnqualLookups.addDecl(Found); 10660 } 10661 10662 return getDerived().RebuildCXXRewrittenBinaryOperator( 10663 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10664 } 10665 10666 template<typename Derived> 10667 ExprResult 10668 TreeTransform<Derived>::TransformCompoundAssignOperator( 10669 CompoundAssignOperator *E) { 10670 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10671 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10672 getSema().CurFPFeatures = 10673 NewOverrides.applyOverrides(getSema().getLangOpts()); 10674 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10675 return getDerived().TransformBinaryOperator(E); 10676 } 10677 10678 template<typename Derived> 10679 ExprResult TreeTransform<Derived>:: 10680 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10681 // Just rebuild the common and RHS expressions and see whether we 10682 // get any changes. 10683 10684 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10685 if (commonExpr.isInvalid()) 10686 return ExprError(); 10687 10688 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10689 if (rhs.isInvalid()) 10690 return ExprError(); 10691 10692 if (!getDerived().AlwaysRebuild() && 10693 commonExpr.get() == e->getCommon() && 10694 rhs.get() == e->getFalseExpr()) 10695 return e; 10696 10697 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10698 e->getQuestionLoc(), 10699 nullptr, 10700 e->getColonLoc(), 10701 rhs.get()); 10702 } 10703 10704 template<typename Derived> 10705 ExprResult 10706 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10707 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10708 if (Cond.isInvalid()) 10709 return ExprError(); 10710 10711 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10712 if (LHS.isInvalid()) 10713 return ExprError(); 10714 10715 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10716 if (RHS.isInvalid()) 10717 return ExprError(); 10718 10719 if (!getDerived().AlwaysRebuild() && 10720 Cond.get() == E->getCond() && 10721 LHS.get() == E->getLHS() && 10722 RHS.get() == E->getRHS()) 10723 return E; 10724 10725 return getDerived().RebuildConditionalOperator(Cond.get(), 10726 E->getQuestionLoc(), 10727 LHS.get(), 10728 E->getColonLoc(), 10729 RHS.get()); 10730 } 10731 10732 template<typename Derived> 10733 ExprResult 10734 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10735 // Implicit casts are eliminated during transformation, since they 10736 // will be recomputed by semantic analysis after transformation. 10737 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10738 } 10739 10740 template<typename Derived> 10741 ExprResult 10742 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10743 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10744 if (!Type) 10745 return ExprError(); 10746 10747 ExprResult SubExpr 10748 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10749 if (SubExpr.isInvalid()) 10750 return ExprError(); 10751 10752 if (!getDerived().AlwaysRebuild() && 10753 Type == E->getTypeInfoAsWritten() && 10754 SubExpr.get() == E->getSubExpr()) 10755 return E; 10756 10757 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10758 Type, 10759 E->getRParenLoc(), 10760 SubExpr.get()); 10761 } 10762 10763 template<typename Derived> 10764 ExprResult 10765 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10766 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10767 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10768 if (!NewT) 10769 return ExprError(); 10770 10771 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10772 if (Init.isInvalid()) 10773 return ExprError(); 10774 10775 if (!getDerived().AlwaysRebuild() && 10776 OldT == NewT && 10777 Init.get() == E->getInitializer()) 10778 return SemaRef.MaybeBindToTemporary(E); 10779 10780 // Note: the expression type doesn't necessarily match the 10781 // type-as-written, but that's okay, because it should always be 10782 // derivable from the initializer. 10783 10784 return getDerived().RebuildCompoundLiteralExpr( 10785 E->getLParenLoc(), NewT, 10786 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10787 } 10788 10789 template<typename Derived> 10790 ExprResult 10791 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10792 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10793 if (Base.isInvalid()) 10794 return ExprError(); 10795 10796 if (!getDerived().AlwaysRebuild() && 10797 Base.get() == E->getBase()) 10798 return E; 10799 10800 // FIXME: Bad source location 10801 SourceLocation FakeOperatorLoc = 10802 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10803 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10804 E->getAccessorLoc(), 10805 E->getAccessor()); 10806 } 10807 10808 template<typename Derived> 10809 ExprResult 10810 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10811 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10812 E = Syntactic; 10813 10814 bool InitChanged = false; 10815 10816 EnterExpressionEvaluationContext Context( 10817 getSema(), EnterExpressionEvaluationContext::InitList); 10818 10819 SmallVector<Expr*, 4> Inits; 10820 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10821 Inits, &InitChanged)) 10822 return ExprError(); 10823 10824 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10825 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10826 // in some cases. We can't reuse it in general, because the syntactic and 10827 // semantic forms are linked, and we can't know that semantic form will 10828 // match even if the syntactic form does. 10829 } 10830 10831 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10832 E->getRBraceLoc()); 10833 } 10834 10835 template<typename Derived> 10836 ExprResult 10837 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10838 Designation Desig; 10839 10840 // transform the initializer value 10841 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10842 if (Init.isInvalid()) 10843 return ExprError(); 10844 10845 // transform the designators. 10846 SmallVector<Expr*, 4> ArrayExprs; 10847 bool ExprChanged = false; 10848 for (const DesignatedInitExpr::Designator &D : E->designators()) { 10849 if (D.isFieldDesignator()) { 10850 Desig.AddDesignator(Designator::getField(D.getFieldName(), 10851 D.getDotLoc(), 10852 D.getFieldLoc())); 10853 if (D.getField()) { 10854 FieldDecl *Field = cast_or_null<FieldDecl>( 10855 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 10856 if (Field != D.getField()) 10857 // Rebuild the expression when the transformed FieldDecl is 10858 // different to the already assigned FieldDecl. 10859 ExprChanged = true; 10860 } else { 10861 // Ensure that the designator expression is rebuilt when there isn't 10862 // a resolved FieldDecl in the designator as we don't want to assign 10863 // a FieldDecl to a pattern designator that will be instantiated again. 10864 ExprChanged = true; 10865 } 10866 continue; 10867 } 10868 10869 if (D.isArrayDesignator()) { 10870 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 10871 if (Index.isInvalid()) 10872 return ExprError(); 10873 10874 Desig.AddDesignator( 10875 Designator::getArray(Index.get(), D.getLBracketLoc())); 10876 10877 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 10878 ArrayExprs.push_back(Index.get()); 10879 continue; 10880 } 10881 10882 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 10883 ExprResult Start 10884 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 10885 if (Start.isInvalid()) 10886 return ExprError(); 10887 10888 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 10889 if (End.isInvalid()) 10890 return ExprError(); 10891 10892 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 10893 End.get(), 10894 D.getLBracketLoc(), 10895 D.getEllipsisLoc())); 10896 10897 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 10898 End.get() != E->getArrayRangeEnd(D); 10899 10900 ArrayExprs.push_back(Start.get()); 10901 ArrayExprs.push_back(End.get()); 10902 } 10903 10904 if (!getDerived().AlwaysRebuild() && 10905 Init.get() == E->getInit() && 10906 !ExprChanged) 10907 return E; 10908 10909 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 10910 E->getEqualOrColonLoc(), 10911 E->usesGNUSyntax(), Init.get()); 10912 } 10913 10914 // Seems that if TransformInitListExpr() only works on the syntactic form of an 10915 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 10916 template<typename Derived> 10917 ExprResult 10918 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 10919 DesignatedInitUpdateExpr *E) { 10920 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 10921 "initializer"); 10922 return ExprError(); 10923 } 10924 10925 template<typename Derived> 10926 ExprResult 10927 TreeTransform<Derived>::TransformNoInitExpr( 10928 NoInitExpr *E) { 10929 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 10930 return ExprError(); 10931 } 10932 10933 template<typename Derived> 10934 ExprResult 10935 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 10936 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 10937 return ExprError(); 10938 } 10939 10940 template<typename Derived> 10941 ExprResult 10942 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 10943 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 10944 return ExprError(); 10945 } 10946 10947 template<typename Derived> 10948 ExprResult 10949 TreeTransform<Derived>::TransformImplicitValueInitExpr( 10950 ImplicitValueInitExpr *E) { 10951 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 10952 10953 // FIXME: Will we ever have proper type location here? Will we actually 10954 // need to transform the type? 10955 QualType T = getDerived().TransformType(E->getType()); 10956 if (T.isNull()) 10957 return ExprError(); 10958 10959 if (!getDerived().AlwaysRebuild() && 10960 T == E->getType()) 10961 return E; 10962 10963 return getDerived().RebuildImplicitValueInitExpr(T); 10964 } 10965 10966 template<typename Derived> 10967 ExprResult 10968 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 10969 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 10970 if (!TInfo) 10971 return ExprError(); 10972 10973 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10974 if (SubExpr.isInvalid()) 10975 return ExprError(); 10976 10977 if (!getDerived().AlwaysRebuild() && 10978 TInfo == E->getWrittenTypeInfo() && 10979 SubExpr.get() == E->getSubExpr()) 10980 return E; 10981 10982 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 10983 TInfo, E->getRParenLoc()); 10984 } 10985 10986 template<typename Derived> 10987 ExprResult 10988 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 10989 bool ArgumentChanged = false; 10990 SmallVector<Expr*, 4> Inits; 10991 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 10992 &ArgumentChanged)) 10993 return ExprError(); 10994 10995 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 10996 Inits, 10997 E->getRParenLoc()); 10998 } 10999 11000 /// Transform an address-of-label expression. 11001 /// 11002 /// By default, the transformation of an address-of-label expression always 11003 /// rebuilds the expression, so that the label identifier can be resolved to 11004 /// the corresponding label statement by semantic analysis. 11005 template<typename Derived> 11006 ExprResult 11007 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11008 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11009 E->getLabel()); 11010 if (!LD) 11011 return ExprError(); 11012 11013 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11014 cast<LabelDecl>(LD)); 11015 } 11016 11017 template<typename Derived> 11018 ExprResult 11019 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11020 SemaRef.ActOnStartStmtExpr(); 11021 StmtResult SubStmt 11022 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11023 if (SubStmt.isInvalid()) { 11024 SemaRef.ActOnStmtExprError(); 11025 return ExprError(); 11026 } 11027 11028 unsigned OldDepth = E->getTemplateDepth(); 11029 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11030 11031 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11032 SubStmt.get() == E->getSubStmt()) { 11033 // Calling this an 'error' is unintuitive, but it does the right thing. 11034 SemaRef.ActOnStmtExprError(); 11035 return SemaRef.MaybeBindToTemporary(E); 11036 } 11037 11038 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11039 E->getRParenLoc(), NewDepth); 11040 } 11041 11042 template<typename Derived> 11043 ExprResult 11044 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11045 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11046 if (Cond.isInvalid()) 11047 return ExprError(); 11048 11049 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11050 if (LHS.isInvalid()) 11051 return ExprError(); 11052 11053 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11054 if (RHS.isInvalid()) 11055 return ExprError(); 11056 11057 if (!getDerived().AlwaysRebuild() && 11058 Cond.get() == E->getCond() && 11059 LHS.get() == E->getLHS() && 11060 RHS.get() == E->getRHS()) 11061 return E; 11062 11063 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11064 Cond.get(), LHS.get(), RHS.get(), 11065 E->getRParenLoc()); 11066 } 11067 11068 template<typename Derived> 11069 ExprResult 11070 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11071 return E; 11072 } 11073 11074 template<typename Derived> 11075 ExprResult 11076 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11077 switch (E->getOperator()) { 11078 case OO_New: 11079 case OO_Delete: 11080 case OO_Array_New: 11081 case OO_Array_Delete: 11082 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11083 11084 case OO_Call: { 11085 // This is a call to an object's operator(). 11086 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11087 11088 // Transform the object itself. 11089 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11090 if (Object.isInvalid()) 11091 return ExprError(); 11092 11093 // FIXME: Poor location information 11094 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11095 static_cast<Expr *>(Object.get())->getEndLoc()); 11096 11097 // Transform the call arguments. 11098 SmallVector<Expr*, 8> Args; 11099 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11100 Args)) 11101 return ExprError(); 11102 11103 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11104 E->getEndLoc()); 11105 } 11106 11107 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11108 case OO_##Name: 11109 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11110 #include "clang/Basic/OperatorKinds.def" 11111 case OO_Subscript: 11112 // Handled below. 11113 break; 11114 11115 case OO_Conditional: 11116 llvm_unreachable("conditional operator is not actually overloadable"); 11117 11118 case OO_None: 11119 case NUM_OVERLOADED_OPERATORS: 11120 llvm_unreachable("not an overloaded operator?"); 11121 } 11122 11123 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11124 if (Callee.isInvalid()) 11125 return ExprError(); 11126 11127 ExprResult First; 11128 if (E->getOperator() == OO_Amp) 11129 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11130 else 11131 First = getDerived().TransformExpr(E->getArg(0)); 11132 if (First.isInvalid()) 11133 return ExprError(); 11134 11135 ExprResult Second; 11136 if (E->getNumArgs() == 2) { 11137 Second = getDerived().TransformExpr(E->getArg(1)); 11138 if (Second.isInvalid()) 11139 return ExprError(); 11140 } 11141 11142 if (!getDerived().AlwaysRebuild() && 11143 Callee.get() == E->getCallee() && 11144 First.get() == E->getArg(0) && 11145 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11146 return SemaRef.MaybeBindToTemporary(E); 11147 11148 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11149 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11150 getSema().CurFPFeatures = 11151 NewOverrides.applyOverrides(getSema().getLangOpts()); 11152 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11153 11154 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11155 E->getOperatorLoc(), 11156 Callee.get(), 11157 First.get(), 11158 Second.get()); 11159 } 11160 11161 template<typename Derived> 11162 ExprResult 11163 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11164 return getDerived().TransformCallExpr(E); 11165 } 11166 11167 template <typename Derived> 11168 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11169 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11170 getSema().CurContext != E->getParentContext(); 11171 11172 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11173 return E; 11174 11175 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11176 E->getEndLoc(), 11177 getSema().CurContext); 11178 } 11179 11180 template<typename Derived> 11181 ExprResult 11182 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11183 // Transform the callee. 11184 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11185 if (Callee.isInvalid()) 11186 return ExprError(); 11187 11188 // Transform exec config. 11189 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11190 if (EC.isInvalid()) 11191 return ExprError(); 11192 11193 // Transform arguments. 11194 bool ArgChanged = false; 11195 SmallVector<Expr*, 8> Args; 11196 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11197 &ArgChanged)) 11198 return ExprError(); 11199 11200 if (!getDerived().AlwaysRebuild() && 11201 Callee.get() == E->getCallee() && 11202 !ArgChanged) 11203 return SemaRef.MaybeBindToTemporary(E); 11204 11205 // FIXME: Wrong source location information for the '('. 11206 SourceLocation FakeLParenLoc 11207 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11208 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11209 Args, 11210 E->getRParenLoc(), EC.get()); 11211 } 11212 11213 template<typename Derived> 11214 ExprResult 11215 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11216 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11217 if (!Type) 11218 return ExprError(); 11219 11220 ExprResult SubExpr 11221 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11222 if (SubExpr.isInvalid()) 11223 return ExprError(); 11224 11225 if (!getDerived().AlwaysRebuild() && 11226 Type == E->getTypeInfoAsWritten() && 11227 SubExpr.get() == E->getSubExpr()) 11228 return E; 11229 return getDerived().RebuildCXXNamedCastExpr( 11230 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11231 Type, E->getAngleBrackets().getEnd(), 11232 // FIXME. this should be '(' location 11233 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11234 } 11235 11236 template<typename Derived> 11237 ExprResult 11238 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11239 TypeSourceInfo *TSI = 11240 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11241 if (!TSI) 11242 return ExprError(); 11243 11244 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11245 if (Sub.isInvalid()) 11246 return ExprError(); 11247 11248 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11249 Sub.get(), BCE->getEndLoc()); 11250 } 11251 11252 template<typename Derived> 11253 ExprResult 11254 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11255 return getDerived().TransformCXXNamedCastExpr(E); 11256 } 11257 11258 template<typename Derived> 11259 ExprResult 11260 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11261 return getDerived().TransformCXXNamedCastExpr(E); 11262 } 11263 11264 template<typename Derived> 11265 ExprResult 11266 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11267 CXXReinterpretCastExpr *E) { 11268 return getDerived().TransformCXXNamedCastExpr(E); 11269 } 11270 11271 template<typename Derived> 11272 ExprResult 11273 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11274 return getDerived().TransformCXXNamedCastExpr(E); 11275 } 11276 11277 template<typename Derived> 11278 ExprResult 11279 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11280 return getDerived().TransformCXXNamedCastExpr(E); 11281 } 11282 11283 template<typename Derived> 11284 ExprResult 11285 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11286 CXXFunctionalCastExpr *E) { 11287 TypeSourceInfo *Type = 11288 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11289 if (!Type) 11290 return ExprError(); 11291 11292 ExprResult SubExpr 11293 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11294 if (SubExpr.isInvalid()) 11295 return ExprError(); 11296 11297 if (!getDerived().AlwaysRebuild() && 11298 Type == E->getTypeInfoAsWritten() && 11299 SubExpr.get() == E->getSubExpr()) 11300 return E; 11301 11302 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11303 E->getLParenLoc(), 11304 SubExpr.get(), 11305 E->getRParenLoc(), 11306 E->isListInitialization()); 11307 } 11308 11309 template<typename Derived> 11310 ExprResult 11311 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11312 if (E->isTypeOperand()) { 11313 TypeSourceInfo *TInfo 11314 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11315 if (!TInfo) 11316 return ExprError(); 11317 11318 if (!getDerived().AlwaysRebuild() && 11319 TInfo == E->getTypeOperandSourceInfo()) 11320 return E; 11321 11322 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11323 TInfo, E->getEndLoc()); 11324 } 11325 11326 // We don't know whether the subexpression is potentially evaluated until 11327 // after we perform semantic analysis. We speculatively assume it is 11328 // unevaluated; it will get fixed later if the subexpression is in fact 11329 // potentially evaluated. 11330 EnterExpressionEvaluationContext Unevaluated( 11331 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11332 Sema::ReuseLambdaContextDecl); 11333 11334 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11335 if (SubExpr.isInvalid()) 11336 return ExprError(); 11337 11338 if (!getDerived().AlwaysRebuild() && 11339 SubExpr.get() == E->getExprOperand()) 11340 return E; 11341 11342 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11343 SubExpr.get(), E->getEndLoc()); 11344 } 11345 11346 template<typename Derived> 11347 ExprResult 11348 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11349 if (E->isTypeOperand()) { 11350 TypeSourceInfo *TInfo 11351 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11352 if (!TInfo) 11353 return ExprError(); 11354 11355 if (!getDerived().AlwaysRebuild() && 11356 TInfo == E->getTypeOperandSourceInfo()) 11357 return E; 11358 11359 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11360 TInfo, E->getEndLoc()); 11361 } 11362 11363 EnterExpressionEvaluationContext Unevaluated( 11364 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11365 11366 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11367 if (SubExpr.isInvalid()) 11368 return ExprError(); 11369 11370 if (!getDerived().AlwaysRebuild() && 11371 SubExpr.get() == E->getExprOperand()) 11372 return E; 11373 11374 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11375 SubExpr.get(), E->getEndLoc()); 11376 } 11377 11378 template<typename Derived> 11379 ExprResult 11380 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11381 return E; 11382 } 11383 11384 template<typename Derived> 11385 ExprResult 11386 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11387 CXXNullPtrLiteralExpr *E) { 11388 return E; 11389 } 11390 11391 template<typename Derived> 11392 ExprResult 11393 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11394 QualType T = getSema().getCurrentThisType(); 11395 11396 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11397 // Mark it referenced in the new context regardless. 11398 // FIXME: this is a bit instantiation-specific. 11399 getSema().MarkThisReferenced(E); 11400 return E; 11401 } 11402 11403 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11404 } 11405 11406 template<typename Derived> 11407 ExprResult 11408 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11409 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11410 if (SubExpr.isInvalid()) 11411 return ExprError(); 11412 11413 if (!getDerived().AlwaysRebuild() && 11414 SubExpr.get() == E->getSubExpr()) 11415 return E; 11416 11417 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11418 E->isThrownVariableInScope()); 11419 } 11420 11421 template<typename Derived> 11422 ExprResult 11423 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11424 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11425 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11426 if (!Param) 11427 return ExprError(); 11428 11429 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11430 E->getUsedContext() == SemaRef.CurContext) 11431 return E; 11432 11433 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11434 } 11435 11436 template<typename Derived> 11437 ExprResult 11438 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11439 FieldDecl *Field = cast_or_null<FieldDecl>( 11440 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11441 if (!Field) 11442 return ExprError(); 11443 11444 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11445 E->getUsedContext() == SemaRef.CurContext) 11446 return E; 11447 11448 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11449 } 11450 11451 template<typename Derived> 11452 ExprResult 11453 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11454 CXXScalarValueInitExpr *E) { 11455 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11456 if (!T) 11457 return ExprError(); 11458 11459 if (!getDerived().AlwaysRebuild() && 11460 T == E->getTypeSourceInfo()) 11461 return E; 11462 11463 return getDerived().RebuildCXXScalarValueInitExpr(T, 11464 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11465 E->getRParenLoc()); 11466 } 11467 11468 template<typename Derived> 11469 ExprResult 11470 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11471 // Transform the type that we're allocating 11472 TypeSourceInfo *AllocTypeInfo = 11473 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11474 if (!AllocTypeInfo) 11475 return ExprError(); 11476 11477 // Transform the size of the array we're allocating (if any). 11478 Optional<Expr *> ArraySize; 11479 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11480 ExprResult NewArraySize; 11481 if (*OldArraySize) { 11482 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11483 if (NewArraySize.isInvalid()) 11484 return ExprError(); 11485 } 11486 ArraySize = NewArraySize.get(); 11487 } 11488 11489 // Transform the placement arguments (if any). 11490 bool ArgumentChanged = false; 11491 SmallVector<Expr*, 8> PlacementArgs; 11492 if (getDerived().TransformExprs(E->getPlacementArgs(), 11493 E->getNumPlacementArgs(), true, 11494 PlacementArgs, &ArgumentChanged)) 11495 return ExprError(); 11496 11497 // Transform the initializer (if any). 11498 Expr *OldInit = E->getInitializer(); 11499 ExprResult NewInit; 11500 if (OldInit) 11501 NewInit = getDerived().TransformInitializer(OldInit, true); 11502 if (NewInit.isInvalid()) 11503 return ExprError(); 11504 11505 // Transform new operator and delete operator. 11506 FunctionDecl *OperatorNew = nullptr; 11507 if (E->getOperatorNew()) { 11508 OperatorNew = cast_or_null<FunctionDecl>( 11509 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11510 if (!OperatorNew) 11511 return ExprError(); 11512 } 11513 11514 FunctionDecl *OperatorDelete = nullptr; 11515 if (E->getOperatorDelete()) { 11516 OperatorDelete = cast_or_null<FunctionDecl>( 11517 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11518 if (!OperatorDelete) 11519 return ExprError(); 11520 } 11521 11522 if (!getDerived().AlwaysRebuild() && 11523 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11524 ArraySize == E->getArraySize() && 11525 NewInit.get() == OldInit && 11526 OperatorNew == E->getOperatorNew() && 11527 OperatorDelete == E->getOperatorDelete() && 11528 !ArgumentChanged) { 11529 // Mark any declarations we need as referenced. 11530 // FIXME: instantiation-specific. 11531 if (OperatorNew) 11532 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11533 if (OperatorDelete) 11534 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11535 11536 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11537 QualType ElementType 11538 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11539 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11540 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11541 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11542 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11543 } 11544 } 11545 } 11546 11547 return E; 11548 } 11549 11550 QualType AllocType = AllocTypeInfo->getType(); 11551 if (!ArraySize) { 11552 // If no array size was specified, but the new expression was 11553 // instantiated with an array type (e.g., "new T" where T is 11554 // instantiated with "int[4]"), extract the outer bound from the 11555 // array type as our array size. We do this with constant and 11556 // dependently-sized array types. 11557 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11558 if (!ArrayT) { 11559 // Do nothing 11560 } else if (const ConstantArrayType *ConsArrayT 11561 = dyn_cast<ConstantArrayType>(ArrayT)) { 11562 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11563 SemaRef.Context.getSizeType(), 11564 /*FIXME:*/ E->getBeginLoc()); 11565 AllocType = ConsArrayT->getElementType(); 11566 } else if (const DependentSizedArrayType *DepArrayT 11567 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11568 if (DepArrayT->getSizeExpr()) { 11569 ArraySize = DepArrayT->getSizeExpr(); 11570 AllocType = DepArrayT->getElementType(); 11571 } 11572 } 11573 } 11574 11575 return getDerived().RebuildCXXNewExpr( 11576 E->getBeginLoc(), E->isGlobalNew(), 11577 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11578 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11579 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11580 } 11581 11582 template<typename Derived> 11583 ExprResult 11584 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11585 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11586 if (Operand.isInvalid()) 11587 return ExprError(); 11588 11589 // Transform the delete operator, if known. 11590 FunctionDecl *OperatorDelete = nullptr; 11591 if (E->getOperatorDelete()) { 11592 OperatorDelete = cast_or_null<FunctionDecl>( 11593 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11594 if (!OperatorDelete) 11595 return ExprError(); 11596 } 11597 11598 if (!getDerived().AlwaysRebuild() && 11599 Operand.get() == E->getArgument() && 11600 OperatorDelete == E->getOperatorDelete()) { 11601 // Mark any declarations we need as referenced. 11602 // FIXME: instantiation-specific. 11603 if (OperatorDelete) 11604 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11605 11606 if (!E->getArgument()->isTypeDependent()) { 11607 QualType Destroyed = SemaRef.Context.getBaseElementType( 11608 E->getDestroyedType()); 11609 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11610 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11611 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11612 SemaRef.LookupDestructor(Record)); 11613 } 11614 } 11615 11616 return E; 11617 } 11618 11619 return getDerived().RebuildCXXDeleteExpr( 11620 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11621 } 11622 11623 template<typename Derived> 11624 ExprResult 11625 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11626 CXXPseudoDestructorExpr *E) { 11627 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11628 if (Base.isInvalid()) 11629 return ExprError(); 11630 11631 ParsedType ObjectTypePtr; 11632 bool MayBePseudoDestructor = false; 11633 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11634 E->getOperatorLoc(), 11635 E->isArrow()? tok::arrow : tok::period, 11636 ObjectTypePtr, 11637 MayBePseudoDestructor); 11638 if (Base.isInvalid()) 11639 return ExprError(); 11640 11641 QualType ObjectType = ObjectTypePtr.get(); 11642 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11643 if (QualifierLoc) { 11644 QualifierLoc 11645 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11646 if (!QualifierLoc) 11647 return ExprError(); 11648 } 11649 CXXScopeSpec SS; 11650 SS.Adopt(QualifierLoc); 11651 11652 PseudoDestructorTypeStorage Destroyed; 11653 if (E->getDestroyedTypeInfo()) { 11654 TypeSourceInfo *DestroyedTypeInfo 11655 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11656 ObjectType, nullptr, SS); 11657 if (!DestroyedTypeInfo) 11658 return ExprError(); 11659 Destroyed = DestroyedTypeInfo; 11660 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11661 // We aren't likely to be able to resolve the identifier down to a type 11662 // now anyway, so just retain the identifier. 11663 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11664 E->getDestroyedTypeLoc()); 11665 } else { 11666 // Look for a destructor known with the given name. 11667 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11668 *E->getDestroyedTypeIdentifier(), 11669 E->getDestroyedTypeLoc(), 11670 /*Scope=*/nullptr, 11671 SS, ObjectTypePtr, 11672 false); 11673 if (!T) 11674 return ExprError(); 11675 11676 Destroyed 11677 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11678 E->getDestroyedTypeLoc()); 11679 } 11680 11681 TypeSourceInfo *ScopeTypeInfo = nullptr; 11682 if (E->getScopeTypeInfo()) { 11683 CXXScopeSpec EmptySS; 11684 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11685 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11686 if (!ScopeTypeInfo) 11687 return ExprError(); 11688 } 11689 11690 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11691 E->getOperatorLoc(), 11692 E->isArrow(), 11693 SS, 11694 ScopeTypeInfo, 11695 E->getColonColonLoc(), 11696 E->getTildeLoc(), 11697 Destroyed); 11698 } 11699 11700 template <typename Derived> 11701 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11702 bool RequiresADL, 11703 LookupResult &R) { 11704 // Transform all the decls. 11705 bool AllEmptyPacks = true; 11706 for (auto *OldD : Old->decls()) { 11707 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11708 if (!InstD) { 11709 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11710 // This can happen because of dependent hiding. 11711 if (isa<UsingShadowDecl>(OldD)) 11712 continue; 11713 else { 11714 R.clear(); 11715 return true; 11716 } 11717 } 11718 11719 // Expand using pack declarations. 11720 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11721 ArrayRef<NamedDecl*> Decls = SingleDecl; 11722 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11723 Decls = UPD->expansions(); 11724 11725 // Expand using declarations. 11726 for (auto *D : Decls) { 11727 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11728 for (auto *SD : UD->shadows()) 11729 R.addDecl(SD); 11730 } else { 11731 R.addDecl(D); 11732 } 11733 } 11734 11735 AllEmptyPacks &= Decls.empty(); 11736 }; 11737 11738 // C++ [temp.res]/8.4.2: 11739 // The program is ill-formed, no diagnostic required, if [...] lookup for 11740 // a name in the template definition found a using-declaration, but the 11741 // lookup in the corresponding scope in the instantiation odoes not find 11742 // any declarations because the using-declaration was a pack expansion and 11743 // the corresponding pack is empty 11744 if (AllEmptyPacks && !RequiresADL) { 11745 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11746 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11747 return true; 11748 } 11749 11750 // Resolve a kind, but don't do any further analysis. If it's 11751 // ambiguous, the callee needs to deal with it. 11752 R.resolveKind(); 11753 return false; 11754 } 11755 11756 template<typename Derived> 11757 ExprResult 11758 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11759 UnresolvedLookupExpr *Old) { 11760 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11761 Sema::LookupOrdinaryName); 11762 11763 // Transform the declaration set. 11764 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11765 return ExprError(); 11766 11767 // Rebuild the nested-name qualifier, if present. 11768 CXXScopeSpec SS; 11769 if (Old->getQualifierLoc()) { 11770 NestedNameSpecifierLoc QualifierLoc 11771 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11772 if (!QualifierLoc) 11773 return ExprError(); 11774 11775 SS.Adopt(QualifierLoc); 11776 } 11777 11778 if (Old->getNamingClass()) { 11779 CXXRecordDecl *NamingClass 11780 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11781 Old->getNameLoc(), 11782 Old->getNamingClass())); 11783 if (!NamingClass) { 11784 R.clear(); 11785 return ExprError(); 11786 } 11787 11788 R.setNamingClass(NamingClass); 11789 } 11790 11791 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11792 11793 // If we have neither explicit template arguments, nor the template keyword, 11794 // it's a normal declaration name or member reference. 11795 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11796 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11797 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11798 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11799 // give a good diagnostic. 11800 if (D && D->isCXXInstanceMember()) { 11801 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11802 /*TemplateArgs=*/nullptr, 11803 /*Scope=*/nullptr); 11804 } 11805 11806 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11807 } 11808 11809 // If we have template arguments, rebuild them, then rebuild the 11810 // templateid expression. 11811 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11812 if (Old->hasExplicitTemplateArgs() && 11813 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11814 Old->getNumTemplateArgs(), 11815 TransArgs)) { 11816 R.clear(); 11817 return ExprError(); 11818 } 11819 11820 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11821 Old->requiresADL(), &TransArgs); 11822 } 11823 11824 template<typename Derived> 11825 ExprResult 11826 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11827 bool ArgChanged = false; 11828 SmallVector<TypeSourceInfo *, 4> Args; 11829 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11830 TypeSourceInfo *From = E->getArg(I); 11831 TypeLoc FromTL = From->getTypeLoc(); 11832 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11833 TypeLocBuilder TLB; 11834 TLB.reserve(FromTL.getFullDataSize()); 11835 QualType To = getDerived().TransformType(TLB, FromTL); 11836 if (To.isNull()) 11837 return ExprError(); 11838 11839 if (To == From->getType()) 11840 Args.push_back(From); 11841 else { 11842 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11843 ArgChanged = true; 11844 } 11845 continue; 11846 } 11847 11848 ArgChanged = true; 11849 11850 // We have a pack expansion. Instantiate it. 11851 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 11852 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 11853 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11854 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 11855 11856 // Determine whether the set of unexpanded parameter packs can and should 11857 // be expanded. 11858 bool Expand = true; 11859 bool RetainExpansion = false; 11860 Optional<unsigned> OrigNumExpansions = 11861 ExpansionTL.getTypePtr()->getNumExpansions(); 11862 Optional<unsigned> NumExpansions = OrigNumExpansions; 11863 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 11864 PatternTL.getSourceRange(), 11865 Unexpanded, 11866 Expand, RetainExpansion, 11867 NumExpansions)) 11868 return ExprError(); 11869 11870 if (!Expand) { 11871 // The transform has determined that we should perform a simple 11872 // transformation on the pack expansion, producing another pack 11873 // expansion. 11874 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11875 11876 TypeLocBuilder TLB; 11877 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11878 11879 QualType To = getDerived().TransformType(TLB, PatternTL); 11880 if (To.isNull()) 11881 return ExprError(); 11882 11883 To = getDerived().RebuildPackExpansionType(To, 11884 PatternTL.getSourceRange(), 11885 ExpansionTL.getEllipsisLoc(), 11886 NumExpansions); 11887 if (To.isNull()) 11888 return ExprError(); 11889 11890 PackExpansionTypeLoc ToExpansionTL 11891 = TLB.push<PackExpansionTypeLoc>(To); 11892 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11893 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11894 continue; 11895 } 11896 11897 // Expand the pack expansion by substituting for each argument in the 11898 // pack(s). 11899 for (unsigned I = 0; I != *NumExpansions; ++I) { 11900 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 11901 TypeLocBuilder TLB; 11902 TLB.reserve(PatternTL.getFullDataSize()); 11903 QualType To = getDerived().TransformType(TLB, PatternTL); 11904 if (To.isNull()) 11905 return ExprError(); 11906 11907 if (To->containsUnexpandedParameterPack()) { 11908 To = getDerived().RebuildPackExpansionType(To, 11909 PatternTL.getSourceRange(), 11910 ExpansionTL.getEllipsisLoc(), 11911 NumExpansions); 11912 if (To.isNull()) 11913 return ExprError(); 11914 11915 PackExpansionTypeLoc ToExpansionTL 11916 = TLB.push<PackExpansionTypeLoc>(To); 11917 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11918 } 11919 11920 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11921 } 11922 11923 if (!RetainExpansion) 11924 continue; 11925 11926 // If we're supposed to retain a pack expansion, do so by temporarily 11927 // forgetting the partially-substituted parameter pack. 11928 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11929 11930 TypeLocBuilder TLB; 11931 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11932 11933 QualType To = getDerived().TransformType(TLB, PatternTL); 11934 if (To.isNull()) 11935 return ExprError(); 11936 11937 To = getDerived().RebuildPackExpansionType(To, 11938 PatternTL.getSourceRange(), 11939 ExpansionTL.getEllipsisLoc(), 11940 NumExpansions); 11941 if (To.isNull()) 11942 return ExprError(); 11943 11944 PackExpansionTypeLoc ToExpansionTL 11945 = TLB.push<PackExpansionTypeLoc>(To); 11946 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11947 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11948 } 11949 11950 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11951 return E; 11952 11953 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 11954 E->getEndLoc()); 11955 } 11956 11957 template<typename Derived> 11958 ExprResult 11959 TreeTransform<Derived>::TransformConceptSpecializationExpr( 11960 ConceptSpecializationExpr *E) { 11961 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 11962 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 11963 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11964 Old->NumTemplateArgs, TransArgs)) 11965 return ExprError(); 11966 11967 return getDerived().RebuildConceptSpecializationExpr( 11968 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 11969 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 11970 &TransArgs); 11971 } 11972 11973 template<typename Derived> 11974 ExprResult 11975 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 11976 SmallVector<ParmVarDecl*, 4> TransParams; 11977 SmallVector<QualType, 4> TransParamTypes; 11978 Sema::ExtParameterInfoBuilder ExtParamInfos; 11979 11980 // C++2a [expr.prim.req]p2 11981 // Expressions appearing within a requirement-body are unevaluated operands. 11982 EnterExpressionEvaluationContext Ctx( 11983 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11984 11985 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 11986 getSema().Context, getSema().CurContext, 11987 E->getBody()->getBeginLoc()); 11988 11989 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 11990 11991 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 11992 E->getLocalParameters(), 11993 /*ParamTypes=*/nullptr, 11994 /*ParamInfos=*/nullptr, 11995 TransParamTypes, &TransParams, 11996 ExtParamInfos)) 11997 return ExprError(); 11998 11999 for (ParmVarDecl *Param : TransParams) 12000 Param->setDeclContext(Body); 12001 12002 SmallVector<concepts::Requirement *, 4> TransReqs; 12003 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12004 TransReqs)) 12005 return ExprError(); 12006 12007 for (concepts::Requirement *Req : TransReqs) { 12008 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12009 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12010 ER->getReturnTypeRequirement() 12011 .getTypeConstraintTemplateParameterList()->getParam(0) 12012 ->setDeclContext(Body); 12013 } 12014 } 12015 } 12016 12017 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12018 TransParams, TransReqs, 12019 E->getRBraceLoc()); 12020 } 12021 12022 template<typename Derived> 12023 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12024 ArrayRef<concepts::Requirement *> Reqs, 12025 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12026 for (concepts::Requirement *Req : Reqs) { 12027 concepts::Requirement *TransReq = nullptr; 12028 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12029 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12030 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12031 TransReq = getDerived().TransformExprRequirement(ExprReq); 12032 else 12033 TransReq = getDerived().TransformNestedRequirement( 12034 cast<concepts::NestedRequirement>(Req)); 12035 if (!TransReq) 12036 return true; 12037 Transformed.push_back(TransReq); 12038 } 12039 return false; 12040 } 12041 12042 template<typename Derived> 12043 concepts::TypeRequirement * 12044 TreeTransform<Derived>::TransformTypeRequirement( 12045 concepts::TypeRequirement *Req) { 12046 if (Req->isSubstitutionFailure()) { 12047 if (getDerived().AlwaysRebuild()) 12048 return getDerived().RebuildTypeRequirement( 12049 Req->getSubstitutionDiagnostic()); 12050 return Req; 12051 } 12052 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12053 if (!TransType) 12054 return nullptr; 12055 return getDerived().RebuildTypeRequirement(TransType); 12056 } 12057 12058 template<typename Derived> 12059 concepts::ExprRequirement * 12060 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12061 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12062 if (Req->isExprSubstitutionFailure()) 12063 TransExpr = Req->getExprSubstitutionDiagnostic(); 12064 else { 12065 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12066 if (TransExprRes.isInvalid()) 12067 return nullptr; 12068 TransExpr = TransExprRes.get(); 12069 } 12070 12071 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12072 const auto &RetReq = Req->getReturnTypeRequirement(); 12073 if (RetReq.isEmpty()) 12074 TransRetReq.emplace(); 12075 else if (RetReq.isSubstitutionFailure()) 12076 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12077 else if (RetReq.isTypeConstraint()) { 12078 TemplateParameterList *OrigTPL = 12079 RetReq.getTypeConstraintTemplateParameterList(); 12080 TemplateParameterList *TPL = 12081 getDerived().TransformTemplateParameterList(OrigTPL); 12082 if (!TPL) 12083 return nullptr; 12084 TransRetReq.emplace(TPL); 12085 } 12086 assert(TransRetReq.hasValue() && 12087 "All code paths leading here must set TransRetReq"); 12088 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12089 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12090 Req->getNoexceptLoc(), 12091 std::move(*TransRetReq)); 12092 return getDerived().RebuildExprRequirement( 12093 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12094 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12095 } 12096 12097 template<typename Derived> 12098 concepts::NestedRequirement * 12099 TreeTransform<Derived>::TransformNestedRequirement( 12100 concepts::NestedRequirement *Req) { 12101 if (Req->isSubstitutionFailure()) { 12102 if (getDerived().AlwaysRebuild()) 12103 return getDerived().RebuildNestedRequirement( 12104 Req->getSubstitutionDiagnostic()); 12105 return Req; 12106 } 12107 ExprResult TransConstraint = 12108 getDerived().TransformExpr(Req->getConstraintExpr()); 12109 if (TransConstraint.isInvalid()) 12110 return nullptr; 12111 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12112 } 12113 12114 template<typename Derived> 12115 ExprResult 12116 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12117 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12118 if (!T) 12119 return ExprError(); 12120 12121 if (!getDerived().AlwaysRebuild() && 12122 T == E->getQueriedTypeSourceInfo()) 12123 return E; 12124 12125 ExprResult SubExpr; 12126 { 12127 EnterExpressionEvaluationContext Unevaluated( 12128 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12129 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12130 if (SubExpr.isInvalid()) 12131 return ExprError(); 12132 12133 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12134 return E; 12135 } 12136 12137 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12138 SubExpr.get(), E->getEndLoc()); 12139 } 12140 12141 template<typename Derived> 12142 ExprResult 12143 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12144 ExprResult SubExpr; 12145 { 12146 EnterExpressionEvaluationContext Unevaluated( 12147 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12148 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12149 if (SubExpr.isInvalid()) 12150 return ExprError(); 12151 12152 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12153 return E; 12154 } 12155 12156 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12157 SubExpr.get(), E->getEndLoc()); 12158 } 12159 12160 template <typename Derived> 12161 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12162 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12163 TypeSourceInfo **RecoveryTSI) { 12164 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12165 DRE, AddrTaken, RecoveryTSI); 12166 12167 // Propagate both errors and recovered types, which return ExprEmpty. 12168 if (!NewDRE.isUsable()) 12169 return NewDRE; 12170 12171 // We got an expr, wrap it up in parens. 12172 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12173 return PE; 12174 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12175 PE->getRParen()); 12176 } 12177 12178 template <typename Derived> 12179 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12180 DependentScopeDeclRefExpr *E) { 12181 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12182 nullptr); 12183 } 12184 12185 template<typename Derived> 12186 ExprResult 12187 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12188 DependentScopeDeclRefExpr *E, 12189 bool IsAddressOfOperand, 12190 TypeSourceInfo **RecoveryTSI) { 12191 assert(E->getQualifierLoc()); 12192 NestedNameSpecifierLoc QualifierLoc 12193 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12194 if (!QualifierLoc) 12195 return ExprError(); 12196 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12197 12198 // TODO: If this is a conversion-function-id, verify that the 12199 // destination type name (if present) resolves the same way after 12200 // instantiation as it did in the local scope. 12201 12202 DeclarationNameInfo NameInfo 12203 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12204 if (!NameInfo.getName()) 12205 return ExprError(); 12206 12207 if (!E->hasExplicitTemplateArgs()) { 12208 if (!getDerived().AlwaysRebuild() && 12209 QualifierLoc == E->getQualifierLoc() && 12210 // Note: it is sufficient to compare the Name component of NameInfo: 12211 // if name has not changed, DNLoc has not changed either. 12212 NameInfo.getName() == E->getDeclName()) 12213 return E; 12214 12215 return getDerived().RebuildDependentScopeDeclRefExpr( 12216 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12217 IsAddressOfOperand, RecoveryTSI); 12218 } 12219 12220 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12221 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12222 E->getNumTemplateArgs(), 12223 TransArgs)) 12224 return ExprError(); 12225 12226 return getDerived().RebuildDependentScopeDeclRefExpr( 12227 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12228 RecoveryTSI); 12229 } 12230 12231 template<typename Derived> 12232 ExprResult 12233 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12234 // CXXConstructExprs other than for list-initialization and 12235 // CXXTemporaryObjectExpr are always implicit, so when we have 12236 // a 1-argument construction we just transform that argument. 12237 if (getDerived().AllowSkippingCXXConstructExpr() && 12238 ((E->getNumArgs() == 1 || 12239 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12240 (!getDerived().DropCallArgument(E->getArg(0))) && 12241 !E->isListInitialization())) 12242 return getDerived().TransformExpr(E->getArg(0)); 12243 12244 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12245 12246 QualType T = getDerived().TransformType(E->getType()); 12247 if (T.isNull()) 12248 return ExprError(); 12249 12250 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12251 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12252 if (!Constructor) 12253 return ExprError(); 12254 12255 bool ArgumentChanged = false; 12256 SmallVector<Expr*, 8> Args; 12257 { 12258 EnterExpressionEvaluationContext Context( 12259 getSema(), EnterExpressionEvaluationContext::InitList, 12260 E->isListInitialization()); 12261 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12262 &ArgumentChanged)) 12263 return ExprError(); 12264 } 12265 12266 if (!getDerived().AlwaysRebuild() && 12267 T == E->getType() && 12268 Constructor == E->getConstructor() && 12269 !ArgumentChanged) { 12270 // Mark the constructor as referenced. 12271 // FIXME: Instantiation-specific 12272 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12273 return E; 12274 } 12275 12276 return getDerived().RebuildCXXConstructExpr( 12277 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12278 E->hadMultipleCandidates(), E->isListInitialization(), 12279 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12280 E->getConstructionKind(), E->getParenOrBraceRange()); 12281 } 12282 12283 template<typename Derived> 12284 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12285 CXXInheritedCtorInitExpr *E) { 12286 QualType T = getDerived().TransformType(E->getType()); 12287 if (T.isNull()) 12288 return ExprError(); 12289 12290 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12291 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12292 if (!Constructor) 12293 return ExprError(); 12294 12295 if (!getDerived().AlwaysRebuild() && 12296 T == E->getType() && 12297 Constructor == E->getConstructor()) { 12298 // Mark the constructor as referenced. 12299 // FIXME: Instantiation-specific 12300 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12301 return E; 12302 } 12303 12304 return getDerived().RebuildCXXInheritedCtorInitExpr( 12305 T, E->getLocation(), Constructor, 12306 E->constructsVBase(), E->inheritedFromVBase()); 12307 } 12308 12309 /// Transform a C++ temporary-binding expression. 12310 /// 12311 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12312 /// transform the subexpression and return that. 12313 template<typename Derived> 12314 ExprResult 12315 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12316 return getDerived().TransformExpr(E->getSubExpr()); 12317 } 12318 12319 /// Transform a C++ expression that contains cleanups that should 12320 /// be run after the expression is evaluated. 12321 /// 12322 /// Since ExprWithCleanups nodes are implicitly generated, we 12323 /// just transform the subexpression and return that. 12324 template<typename Derived> 12325 ExprResult 12326 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12327 return getDerived().TransformExpr(E->getSubExpr()); 12328 } 12329 12330 template<typename Derived> 12331 ExprResult 12332 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12333 CXXTemporaryObjectExpr *E) { 12334 TypeSourceInfo *T = 12335 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12336 if (!T) 12337 return ExprError(); 12338 12339 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12340 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12341 if (!Constructor) 12342 return ExprError(); 12343 12344 bool ArgumentChanged = false; 12345 SmallVector<Expr*, 8> Args; 12346 Args.reserve(E->getNumArgs()); 12347 { 12348 EnterExpressionEvaluationContext Context( 12349 getSema(), EnterExpressionEvaluationContext::InitList, 12350 E->isListInitialization()); 12351 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12352 &ArgumentChanged)) 12353 return ExprError(); 12354 } 12355 12356 if (!getDerived().AlwaysRebuild() && 12357 T == E->getTypeSourceInfo() && 12358 Constructor == E->getConstructor() && 12359 !ArgumentChanged) { 12360 // FIXME: Instantiation-specific 12361 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12362 return SemaRef.MaybeBindToTemporary(E); 12363 } 12364 12365 // FIXME: We should just pass E->isListInitialization(), but we're not 12366 // prepared to handle list-initialization without a child InitListExpr. 12367 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12368 return getDerived().RebuildCXXTemporaryObjectExpr( 12369 T, LParenLoc, Args, E->getEndLoc(), 12370 /*ListInitialization=*/LParenLoc.isInvalid()); 12371 } 12372 12373 template<typename Derived> 12374 ExprResult 12375 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12376 // Transform any init-capture expressions before entering the scope of the 12377 // lambda body, because they are not semantically within that scope. 12378 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12379 struct TransformedInitCapture { 12380 // The location of the ... if the result is retaining a pack expansion. 12381 SourceLocation EllipsisLoc; 12382 // Zero or more expansions of the init-capture. 12383 SmallVector<InitCaptureInfoTy, 4> Expansions; 12384 }; 12385 SmallVector<TransformedInitCapture, 4> InitCaptures; 12386 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12387 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12388 CEnd = E->capture_end(); 12389 C != CEnd; ++C) { 12390 if (!E->isInitCapture(C)) 12391 continue; 12392 12393 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12394 VarDecl *OldVD = C->getCapturedVar(); 12395 12396 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12397 Optional<unsigned> NumExpansions) { 12398 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12399 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12400 12401 if (NewExprInitResult.isInvalid()) { 12402 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12403 return; 12404 } 12405 Expr *NewExprInit = NewExprInitResult.get(); 12406 12407 QualType NewInitCaptureType = 12408 getSema().buildLambdaInitCaptureInitialization( 12409 C->getLocation(), OldVD->getType()->isReferenceType(), 12410 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12411 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12412 NewExprInit); 12413 Result.Expansions.push_back( 12414 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12415 }; 12416 12417 // If this is an init-capture pack, consider expanding the pack now. 12418 if (OldVD->isParameterPack()) { 12419 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12420 ->getTypeLoc() 12421 .castAs<PackExpansionTypeLoc>(); 12422 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12423 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12424 12425 // Determine whether the set of unexpanded parameter packs can and should 12426 // be expanded. 12427 bool Expand = true; 12428 bool RetainExpansion = false; 12429 Optional<unsigned> OrigNumExpansions = 12430 ExpansionTL.getTypePtr()->getNumExpansions(); 12431 Optional<unsigned> NumExpansions = OrigNumExpansions; 12432 if (getDerived().TryExpandParameterPacks( 12433 ExpansionTL.getEllipsisLoc(), 12434 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12435 RetainExpansion, NumExpansions)) 12436 return ExprError(); 12437 if (Expand) { 12438 for (unsigned I = 0; I != *NumExpansions; ++I) { 12439 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12440 SubstInitCapture(SourceLocation(), None); 12441 } 12442 } 12443 if (!Expand || RetainExpansion) { 12444 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12445 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12446 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12447 } 12448 } else { 12449 SubstInitCapture(SourceLocation(), None); 12450 } 12451 } 12452 12453 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12454 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12455 12456 // Transform the template parameters, and add them to the current 12457 // instantiation scope. The null case is handled correctly. 12458 auto TPL = getDerived().TransformTemplateParameterList( 12459 E->getTemplateParameterList()); 12460 LSI->GLTemplateParameterList = TPL; 12461 12462 // Transform the type of the original lambda's call operator. 12463 // The transformation MUST be done in the CurrentInstantiationScope since 12464 // it introduces a mapping of the original to the newly created 12465 // transformed parameters. 12466 TypeSourceInfo *NewCallOpTSI = nullptr; 12467 { 12468 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12469 FunctionProtoTypeLoc OldCallOpFPTL = 12470 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12471 12472 TypeLocBuilder NewCallOpTLBuilder; 12473 SmallVector<QualType, 4> ExceptionStorage; 12474 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12475 QualType NewCallOpType = TransformFunctionProtoType( 12476 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12477 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12478 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12479 ExceptionStorage, Changed); 12480 }); 12481 if (NewCallOpType.isNull()) 12482 return ExprError(); 12483 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12484 NewCallOpType); 12485 } 12486 12487 // Transform the trailing requires clause 12488 ExprResult NewTrailingRequiresClause; 12489 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12490 // FIXME: Concepts: Substitution into requires clause should only happen 12491 // when checking satisfaction. 12492 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12493 12494 // Create the local class that will describe the lambda. 12495 // FIXME: KnownDependent below is wrong when substituting inside a templated 12496 // context that isn't a DeclContext (such as a variable template). 12497 CXXRecordDecl *OldClass = E->getLambdaClass(); 12498 CXXRecordDecl *Class 12499 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12500 NewCallOpTSI, 12501 /*KnownDependent=*/false, 12502 E->getCaptureDefault()); 12503 getDerived().transformedLocalDecl(OldClass, {Class}); 12504 12505 Optional<std::tuple<unsigned, bool, Decl *>> Mangling; 12506 if (getDerived().ReplacingOriginal()) 12507 Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(), 12508 OldClass->hasKnownLambdaInternalLinkage(), 12509 OldClass->getLambdaContextDecl()); 12510 12511 // Build the call operator. 12512 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12513 Class, E->getIntroducerRange(), NewCallOpTSI, 12514 E->getCallOperator()->getEndLoc(), 12515 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12516 E->getCallOperator()->getConstexprKind(), 12517 NewTrailingRequiresClause.get()); 12518 12519 LSI->CallOperator = NewCallOperator; 12520 12521 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12522 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12523 12524 // Number the lambda for linkage purposes if necessary. 12525 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12526 12527 // Introduce the context of the call operator. 12528 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12529 /*NewThisContext*/false); 12530 12531 // Enter the scope of the lambda. 12532 getSema().buildLambdaScope(LSI, NewCallOperator, 12533 E->getIntroducerRange(), 12534 E->getCaptureDefault(), 12535 E->getCaptureDefaultLoc(), 12536 E->hasExplicitParameters(), 12537 E->hasExplicitResultType(), 12538 E->isMutable()); 12539 12540 bool Invalid = false; 12541 12542 // Transform captures. 12543 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12544 CEnd = E->capture_end(); 12545 C != CEnd; ++C) { 12546 // When we hit the first implicit capture, tell Sema that we've finished 12547 // the list of explicit captures. 12548 if (C->isImplicit()) 12549 break; 12550 12551 // Capturing 'this' is trivial. 12552 if (C->capturesThis()) { 12553 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12554 /*BuildAndDiagnose*/ true, nullptr, 12555 C->getCaptureKind() == LCK_StarThis); 12556 continue; 12557 } 12558 // Captured expression will be recaptured during captured variables 12559 // rebuilding. 12560 if (C->capturesVLAType()) 12561 continue; 12562 12563 // Rebuild init-captures, including the implied field declaration. 12564 if (E->isInitCapture(C)) { 12565 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12566 12567 VarDecl *OldVD = C->getCapturedVar(); 12568 llvm::SmallVector<Decl*, 4> NewVDs; 12569 12570 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12571 ExprResult Init = Info.first; 12572 QualType InitQualType = Info.second; 12573 if (Init.isInvalid() || InitQualType.isNull()) { 12574 Invalid = true; 12575 break; 12576 } 12577 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12578 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12579 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12580 if (!NewVD) { 12581 Invalid = true; 12582 break; 12583 } 12584 NewVDs.push_back(NewVD); 12585 getSema().addInitCapture(LSI, NewVD); 12586 } 12587 12588 if (Invalid) 12589 break; 12590 12591 getDerived().transformedLocalDecl(OldVD, NewVDs); 12592 continue; 12593 } 12594 12595 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12596 12597 // Determine the capture kind for Sema. 12598 Sema::TryCaptureKind Kind 12599 = C->isImplicit()? Sema::TryCapture_Implicit 12600 : C->getCaptureKind() == LCK_ByCopy 12601 ? Sema::TryCapture_ExplicitByVal 12602 : Sema::TryCapture_ExplicitByRef; 12603 SourceLocation EllipsisLoc; 12604 if (C->isPackExpansion()) { 12605 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12606 bool ShouldExpand = false; 12607 bool RetainExpansion = false; 12608 Optional<unsigned> NumExpansions; 12609 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12610 C->getLocation(), 12611 Unexpanded, 12612 ShouldExpand, RetainExpansion, 12613 NumExpansions)) { 12614 Invalid = true; 12615 continue; 12616 } 12617 12618 if (ShouldExpand) { 12619 // The transform has determined that we should perform an expansion; 12620 // transform and capture each of the arguments. 12621 // expansion of the pattern. Do so. 12622 VarDecl *Pack = C->getCapturedVar(); 12623 for (unsigned I = 0; I != *NumExpansions; ++I) { 12624 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12625 VarDecl *CapturedVar 12626 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12627 Pack)); 12628 if (!CapturedVar) { 12629 Invalid = true; 12630 continue; 12631 } 12632 12633 // Capture the transformed variable. 12634 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12635 } 12636 12637 // FIXME: Retain a pack expansion if RetainExpansion is true. 12638 12639 continue; 12640 } 12641 12642 EllipsisLoc = C->getEllipsisLoc(); 12643 } 12644 12645 // Transform the captured variable. 12646 VarDecl *CapturedVar 12647 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12648 C->getCapturedVar())); 12649 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12650 Invalid = true; 12651 continue; 12652 } 12653 12654 // Capture the transformed variable. 12655 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12656 EllipsisLoc); 12657 } 12658 getSema().finishLambdaExplicitCaptures(LSI); 12659 12660 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12661 // evaluation context even if we're not transforming the function body. 12662 getSema().PushExpressionEvaluationContext( 12663 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12664 12665 // Instantiate the body of the lambda expression. 12666 StmtResult Body = 12667 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12668 12669 // ActOnLambda* will pop the function scope for us. 12670 FuncScopeCleanup.disable(); 12671 12672 if (Body.isInvalid()) { 12673 SavedContext.pop(); 12674 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12675 /*IsInstantiation=*/true); 12676 return ExprError(); 12677 } 12678 12679 // Copy the LSI before ActOnFinishFunctionBody removes it. 12680 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12681 // the call operator. 12682 auto LSICopy = *LSI; 12683 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12684 /*IsInstantiation*/ true); 12685 SavedContext.pop(); 12686 12687 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12688 &LSICopy); 12689 } 12690 12691 template<typename Derived> 12692 StmtResult 12693 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12694 return TransformStmt(S); 12695 } 12696 12697 template<typename Derived> 12698 StmtResult 12699 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12700 // Transform captures. 12701 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12702 CEnd = E->capture_end(); 12703 C != CEnd; ++C) { 12704 // When we hit the first implicit capture, tell Sema that we've finished 12705 // the list of explicit captures. 12706 if (!C->isImplicit()) 12707 continue; 12708 12709 // Capturing 'this' is trivial. 12710 if (C->capturesThis()) { 12711 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12712 /*BuildAndDiagnose*/ true, nullptr, 12713 C->getCaptureKind() == LCK_StarThis); 12714 continue; 12715 } 12716 // Captured expression will be recaptured during captured variables 12717 // rebuilding. 12718 if (C->capturesVLAType()) 12719 continue; 12720 12721 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12722 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12723 12724 // Transform the captured variable. 12725 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12726 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12727 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12728 return StmtError(); 12729 12730 // Capture the transformed variable. 12731 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12732 } 12733 12734 return S; 12735 } 12736 12737 template<typename Derived> 12738 ExprResult 12739 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12740 CXXUnresolvedConstructExpr *E) { 12741 TypeSourceInfo *T = 12742 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12743 if (!T) 12744 return ExprError(); 12745 12746 bool ArgumentChanged = false; 12747 SmallVector<Expr*, 8> Args; 12748 Args.reserve(E->arg_size()); 12749 { 12750 EnterExpressionEvaluationContext Context( 12751 getSema(), EnterExpressionEvaluationContext::InitList, 12752 E->isListInitialization()); 12753 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 12754 &ArgumentChanged)) 12755 return ExprError(); 12756 } 12757 12758 if (!getDerived().AlwaysRebuild() && 12759 T == E->getTypeSourceInfo() && 12760 !ArgumentChanged) 12761 return E; 12762 12763 // FIXME: we're faking the locations of the commas 12764 return getDerived().RebuildCXXUnresolvedConstructExpr( 12765 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12766 } 12767 12768 template<typename Derived> 12769 ExprResult 12770 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12771 CXXDependentScopeMemberExpr *E) { 12772 // Transform the base of the expression. 12773 ExprResult Base((Expr*) nullptr); 12774 Expr *OldBase; 12775 QualType BaseType; 12776 QualType ObjectType; 12777 if (!E->isImplicitAccess()) { 12778 OldBase = E->getBase(); 12779 Base = getDerived().TransformExpr(OldBase); 12780 if (Base.isInvalid()) 12781 return ExprError(); 12782 12783 // Start the member reference and compute the object's type. 12784 ParsedType ObjectTy; 12785 bool MayBePseudoDestructor = false; 12786 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12787 E->getOperatorLoc(), 12788 E->isArrow()? tok::arrow : tok::period, 12789 ObjectTy, 12790 MayBePseudoDestructor); 12791 if (Base.isInvalid()) 12792 return ExprError(); 12793 12794 ObjectType = ObjectTy.get(); 12795 BaseType = ((Expr*) Base.get())->getType(); 12796 } else { 12797 OldBase = nullptr; 12798 BaseType = getDerived().TransformType(E->getBaseType()); 12799 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12800 } 12801 12802 // Transform the first part of the nested-name-specifier that qualifies 12803 // the member name. 12804 NamedDecl *FirstQualifierInScope 12805 = getDerived().TransformFirstQualifierInScope( 12806 E->getFirstQualifierFoundInScope(), 12807 E->getQualifierLoc().getBeginLoc()); 12808 12809 NestedNameSpecifierLoc QualifierLoc; 12810 if (E->getQualifier()) { 12811 QualifierLoc 12812 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12813 ObjectType, 12814 FirstQualifierInScope); 12815 if (!QualifierLoc) 12816 return ExprError(); 12817 } 12818 12819 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12820 12821 // TODO: If this is a conversion-function-id, verify that the 12822 // destination type name (if present) resolves the same way after 12823 // instantiation as it did in the local scope. 12824 12825 DeclarationNameInfo NameInfo 12826 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12827 if (!NameInfo.getName()) 12828 return ExprError(); 12829 12830 if (!E->hasExplicitTemplateArgs()) { 12831 // This is a reference to a member without an explicitly-specified 12832 // template argument list. Optimize for this common case. 12833 if (!getDerived().AlwaysRebuild() && 12834 Base.get() == OldBase && 12835 BaseType == E->getBaseType() && 12836 QualifierLoc == E->getQualifierLoc() && 12837 NameInfo.getName() == E->getMember() && 12838 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12839 return E; 12840 12841 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12842 BaseType, 12843 E->isArrow(), 12844 E->getOperatorLoc(), 12845 QualifierLoc, 12846 TemplateKWLoc, 12847 FirstQualifierInScope, 12848 NameInfo, 12849 /*TemplateArgs*/nullptr); 12850 } 12851 12852 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12853 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12854 E->getNumTemplateArgs(), 12855 TransArgs)) 12856 return ExprError(); 12857 12858 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12859 BaseType, 12860 E->isArrow(), 12861 E->getOperatorLoc(), 12862 QualifierLoc, 12863 TemplateKWLoc, 12864 FirstQualifierInScope, 12865 NameInfo, 12866 &TransArgs); 12867 } 12868 12869 template<typename Derived> 12870 ExprResult 12871 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 12872 // Transform the base of the expression. 12873 ExprResult Base((Expr*) nullptr); 12874 QualType BaseType; 12875 if (!Old->isImplicitAccess()) { 12876 Base = getDerived().TransformExpr(Old->getBase()); 12877 if (Base.isInvalid()) 12878 return ExprError(); 12879 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 12880 Old->isArrow()); 12881 if (Base.isInvalid()) 12882 return ExprError(); 12883 BaseType = Base.get()->getType(); 12884 } else { 12885 BaseType = getDerived().TransformType(Old->getBaseType()); 12886 } 12887 12888 NestedNameSpecifierLoc QualifierLoc; 12889 if (Old->getQualifierLoc()) { 12890 QualifierLoc 12891 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12892 if (!QualifierLoc) 12893 return ExprError(); 12894 } 12895 12896 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12897 12898 LookupResult R(SemaRef, Old->getMemberNameInfo(), 12899 Sema::LookupOrdinaryName); 12900 12901 // Transform the declaration set. 12902 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 12903 return ExprError(); 12904 12905 // Determine the naming class. 12906 if (Old->getNamingClass()) { 12907 CXXRecordDecl *NamingClass 12908 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12909 Old->getMemberLoc(), 12910 Old->getNamingClass())); 12911 if (!NamingClass) 12912 return ExprError(); 12913 12914 R.setNamingClass(NamingClass); 12915 } 12916 12917 TemplateArgumentListInfo TransArgs; 12918 if (Old->hasExplicitTemplateArgs()) { 12919 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 12920 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 12921 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12922 Old->getNumTemplateArgs(), 12923 TransArgs)) 12924 return ExprError(); 12925 } 12926 12927 // FIXME: to do this check properly, we will need to preserve the 12928 // first-qualifier-in-scope here, just in case we had a dependent 12929 // base (and therefore couldn't do the check) and a 12930 // nested-name-qualifier (and therefore could do the lookup). 12931 NamedDecl *FirstQualifierInScope = nullptr; 12932 12933 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 12934 BaseType, 12935 Old->getOperatorLoc(), 12936 Old->isArrow(), 12937 QualifierLoc, 12938 TemplateKWLoc, 12939 FirstQualifierInScope, 12940 R, 12941 (Old->hasExplicitTemplateArgs() 12942 ? &TransArgs : nullptr)); 12943 } 12944 12945 template<typename Derived> 12946 ExprResult 12947 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 12948 EnterExpressionEvaluationContext Unevaluated( 12949 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12950 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 12951 if (SubExpr.isInvalid()) 12952 return ExprError(); 12953 12954 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 12955 return E; 12956 12957 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 12958 } 12959 12960 template<typename Derived> 12961 ExprResult 12962 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 12963 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 12964 if (Pattern.isInvalid()) 12965 return ExprError(); 12966 12967 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 12968 return E; 12969 12970 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 12971 E->getNumExpansions()); 12972 } 12973 12974 template<typename Derived> 12975 ExprResult 12976 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 12977 // If E is not value-dependent, then nothing will change when we transform it. 12978 // Note: This is an instantiation-centric view. 12979 if (!E->isValueDependent()) 12980 return E; 12981 12982 EnterExpressionEvaluationContext Unevaluated( 12983 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 12984 12985 ArrayRef<TemplateArgument> PackArgs; 12986 TemplateArgument ArgStorage; 12987 12988 // Find the argument list to transform. 12989 if (E->isPartiallySubstituted()) { 12990 PackArgs = E->getPartialArguments(); 12991 } else if (E->isValueDependent()) { 12992 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 12993 bool ShouldExpand = false; 12994 bool RetainExpansion = false; 12995 Optional<unsigned> NumExpansions; 12996 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 12997 Unexpanded, 12998 ShouldExpand, RetainExpansion, 12999 NumExpansions)) 13000 return ExprError(); 13001 13002 // If we need to expand the pack, build a template argument from it and 13003 // expand that. 13004 if (ShouldExpand) { 13005 auto *Pack = E->getPack(); 13006 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13007 ArgStorage = getSema().Context.getPackExpansionType( 13008 getSema().Context.getTypeDeclType(TTPD), None); 13009 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13010 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13011 } else { 13012 auto *VD = cast<ValueDecl>(Pack); 13013 ExprResult DRE = getSema().BuildDeclRefExpr( 13014 VD, VD->getType().getNonLValueExprType(getSema().Context), 13015 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 13016 E->getPackLoc()); 13017 if (DRE.isInvalid()) 13018 return ExprError(); 13019 ArgStorage = new (getSema().Context) PackExpansionExpr( 13020 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13021 } 13022 PackArgs = ArgStorage; 13023 } 13024 } 13025 13026 // If we're not expanding the pack, just transform the decl. 13027 if (!PackArgs.size()) { 13028 auto *Pack = cast_or_null<NamedDecl>( 13029 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13030 if (!Pack) 13031 return ExprError(); 13032 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13033 E->getPackLoc(), 13034 E->getRParenLoc(), None, None); 13035 } 13036 13037 // Try to compute the result without performing a partial substitution. 13038 Optional<unsigned> Result = 0; 13039 for (const TemplateArgument &Arg : PackArgs) { 13040 if (!Arg.isPackExpansion()) { 13041 Result = *Result + 1; 13042 continue; 13043 } 13044 13045 TemplateArgumentLoc ArgLoc; 13046 InventTemplateArgumentLoc(Arg, ArgLoc); 13047 13048 // Find the pattern of the pack expansion. 13049 SourceLocation Ellipsis; 13050 Optional<unsigned> OrigNumExpansions; 13051 TemplateArgumentLoc Pattern = 13052 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13053 OrigNumExpansions); 13054 13055 // Substitute under the pack expansion. Do not expand the pack (yet). 13056 TemplateArgumentLoc OutPattern; 13057 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13058 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13059 /*Uneval*/ true)) 13060 return true; 13061 13062 // See if we can determine the number of arguments from the result. 13063 Optional<unsigned> NumExpansions = 13064 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13065 if (!NumExpansions) { 13066 // No: we must be in an alias template expansion, and we're going to need 13067 // to actually expand the packs. 13068 Result = None; 13069 break; 13070 } 13071 13072 Result = *Result + *NumExpansions; 13073 } 13074 13075 // Common case: we could determine the number of expansions without 13076 // substituting. 13077 if (Result) 13078 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13079 E->getPackLoc(), 13080 E->getRParenLoc(), *Result, None); 13081 13082 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13083 E->getPackLoc()); 13084 { 13085 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13086 typedef TemplateArgumentLocInventIterator< 13087 Derived, const TemplateArgument*> PackLocIterator; 13088 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13089 PackLocIterator(*this, PackArgs.end()), 13090 TransformedPackArgs, /*Uneval*/true)) 13091 return ExprError(); 13092 } 13093 13094 // Check whether we managed to fully-expand the pack. 13095 // FIXME: Is it possible for us to do so and not hit the early exit path? 13096 SmallVector<TemplateArgument, 8> Args; 13097 bool PartialSubstitution = false; 13098 for (auto &Loc : TransformedPackArgs.arguments()) { 13099 Args.push_back(Loc.getArgument()); 13100 if (Loc.getArgument().isPackExpansion()) 13101 PartialSubstitution = true; 13102 } 13103 13104 if (PartialSubstitution) 13105 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13106 E->getPackLoc(), 13107 E->getRParenLoc(), None, Args); 13108 13109 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13110 E->getPackLoc(), E->getRParenLoc(), 13111 Args.size(), None); 13112 } 13113 13114 template<typename Derived> 13115 ExprResult 13116 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13117 SubstNonTypeTemplateParmPackExpr *E) { 13118 // Default behavior is to do nothing with this transformation. 13119 return E; 13120 } 13121 13122 template<typename Derived> 13123 ExprResult 13124 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13125 SubstNonTypeTemplateParmExpr *E) { 13126 // Default behavior is to do nothing with this transformation. 13127 return E; 13128 } 13129 13130 template<typename Derived> 13131 ExprResult 13132 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13133 // Default behavior is to do nothing with this transformation. 13134 return E; 13135 } 13136 13137 template<typename Derived> 13138 ExprResult 13139 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13140 MaterializeTemporaryExpr *E) { 13141 return getDerived().TransformExpr(E->getSubExpr()); 13142 } 13143 13144 template<typename Derived> 13145 ExprResult 13146 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13147 UnresolvedLookupExpr *Callee = nullptr; 13148 if (Expr *OldCallee = E->getCallee()) { 13149 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13150 if (CalleeResult.isInvalid()) 13151 return ExprError(); 13152 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13153 } 13154 13155 Expr *Pattern = E->getPattern(); 13156 13157 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13158 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13159 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13160 13161 // Determine whether the set of unexpanded parameter packs can and should 13162 // be expanded. 13163 bool Expand = true; 13164 bool RetainExpansion = false; 13165 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13166 NumExpansions = OrigNumExpansions; 13167 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13168 Pattern->getSourceRange(), 13169 Unexpanded, 13170 Expand, RetainExpansion, 13171 NumExpansions)) 13172 return true; 13173 13174 if (!Expand) { 13175 // Do not expand any packs here, just transform and rebuild a fold 13176 // expression. 13177 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13178 13179 ExprResult LHS = 13180 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13181 if (LHS.isInvalid()) 13182 return true; 13183 13184 ExprResult RHS = 13185 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13186 if (RHS.isInvalid()) 13187 return true; 13188 13189 if (!getDerived().AlwaysRebuild() && 13190 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13191 return E; 13192 13193 return getDerived().RebuildCXXFoldExpr( 13194 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13195 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13196 } 13197 13198 // Formally a fold expression expands to nested parenthesized expressions. 13199 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13200 // them. 13201 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13202 SemaRef.Diag(E->getEllipsisLoc(), 13203 clang::diag::err_fold_expression_limit_exceeded) 13204 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13205 << E->getSourceRange(); 13206 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13207 return ExprError(); 13208 } 13209 13210 // The transform has determined that we should perform an elementwise 13211 // expansion of the pattern. Do so. 13212 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13213 if (Result.isInvalid()) 13214 return true; 13215 bool LeftFold = E->isLeftFold(); 13216 13217 // If we're retaining an expansion for a right fold, it is the innermost 13218 // component and takes the init (if any). 13219 if (!LeftFold && RetainExpansion) { 13220 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13221 13222 ExprResult Out = getDerived().TransformExpr(Pattern); 13223 if (Out.isInvalid()) 13224 return true; 13225 13226 Result = getDerived().RebuildCXXFoldExpr( 13227 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13228 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13229 if (Result.isInvalid()) 13230 return true; 13231 } 13232 13233 for (unsigned I = 0; I != *NumExpansions; ++I) { 13234 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13235 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13236 ExprResult Out = getDerived().TransformExpr(Pattern); 13237 if (Out.isInvalid()) 13238 return true; 13239 13240 if (Out.get()->containsUnexpandedParameterPack()) { 13241 // We still have a pack; retain a pack expansion for this slice. 13242 Result = getDerived().RebuildCXXFoldExpr( 13243 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13244 E->getOperator(), E->getEllipsisLoc(), 13245 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13246 OrigNumExpansions); 13247 } else if (Result.isUsable()) { 13248 // We've got down to a single element; build a binary operator. 13249 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13250 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13251 if (Callee) 13252 Result = getDerived().RebuildCXXOperatorCallExpr( 13253 BinaryOperator::getOverloadedOperator(E->getOperator()), 13254 E->getEllipsisLoc(), Callee, LHS, RHS); 13255 else 13256 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13257 E->getOperator(), LHS, RHS); 13258 } else 13259 Result = Out; 13260 13261 if (Result.isInvalid()) 13262 return true; 13263 } 13264 13265 // If we're retaining an expansion for a left fold, it is the outermost 13266 // component and takes the complete expansion so far as its init (if any). 13267 if (LeftFold && RetainExpansion) { 13268 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13269 13270 ExprResult Out = getDerived().TransformExpr(Pattern); 13271 if (Out.isInvalid()) 13272 return true; 13273 13274 Result = getDerived().RebuildCXXFoldExpr( 13275 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13276 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13277 if (Result.isInvalid()) 13278 return true; 13279 } 13280 13281 // If we had no init and an empty pack, and we're not retaining an expansion, 13282 // then produce a fallback value or error. 13283 if (Result.isUnset()) 13284 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13285 E->getOperator()); 13286 13287 return Result; 13288 } 13289 13290 template<typename Derived> 13291 ExprResult 13292 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13293 CXXStdInitializerListExpr *E) { 13294 return getDerived().TransformExpr(E->getSubExpr()); 13295 } 13296 13297 template<typename Derived> 13298 ExprResult 13299 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13300 return SemaRef.MaybeBindToTemporary(E); 13301 } 13302 13303 template<typename Derived> 13304 ExprResult 13305 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13306 return E; 13307 } 13308 13309 template<typename Derived> 13310 ExprResult 13311 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13312 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13313 if (SubExpr.isInvalid()) 13314 return ExprError(); 13315 13316 if (!getDerived().AlwaysRebuild() && 13317 SubExpr.get() == E->getSubExpr()) 13318 return E; 13319 13320 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13321 } 13322 13323 template<typename Derived> 13324 ExprResult 13325 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13326 // Transform each of the elements. 13327 SmallVector<Expr *, 8> Elements; 13328 bool ArgChanged = false; 13329 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13330 /*IsCall=*/false, Elements, &ArgChanged)) 13331 return ExprError(); 13332 13333 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13334 return SemaRef.MaybeBindToTemporary(E); 13335 13336 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13337 Elements.data(), 13338 Elements.size()); 13339 } 13340 13341 template<typename Derived> 13342 ExprResult 13343 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13344 ObjCDictionaryLiteral *E) { 13345 // Transform each of the elements. 13346 SmallVector<ObjCDictionaryElement, 8> Elements; 13347 bool ArgChanged = false; 13348 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13349 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13350 13351 if (OrigElement.isPackExpansion()) { 13352 // This key/value element is a pack expansion. 13353 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13354 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13355 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13356 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13357 13358 // Determine whether the set of unexpanded parameter packs can 13359 // and should be expanded. 13360 bool Expand = true; 13361 bool RetainExpansion = false; 13362 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13363 Optional<unsigned> NumExpansions = OrigNumExpansions; 13364 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13365 OrigElement.Value->getEndLoc()); 13366 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13367 PatternRange, Unexpanded, Expand, 13368 RetainExpansion, NumExpansions)) 13369 return ExprError(); 13370 13371 if (!Expand) { 13372 // The transform has determined that we should perform a simple 13373 // transformation on the pack expansion, producing another pack 13374 // expansion. 13375 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13376 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13377 if (Key.isInvalid()) 13378 return ExprError(); 13379 13380 if (Key.get() != OrigElement.Key) 13381 ArgChanged = true; 13382 13383 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13384 if (Value.isInvalid()) 13385 return ExprError(); 13386 13387 if (Value.get() != OrigElement.Value) 13388 ArgChanged = true; 13389 13390 ObjCDictionaryElement Expansion = { 13391 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13392 }; 13393 Elements.push_back(Expansion); 13394 continue; 13395 } 13396 13397 // Record right away that the argument was changed. This needs 13398 // to happen even if the array expands to nothing. 13399 ArgChanged = true; 13400 13401 // The transform has determined that we should perform an elementwise 13402 // expansion of the pattern. Do so. 13403 for (unsigned I = 0; I != *NumExpansions; ++I) { 13404 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13405 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13406 if (Key.isInvalid()) 13407 return ExprError(); 13408 13409 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13410 if (Value.isInvalid()) 13411 return ExprError(); 13412 13413 ObjCDictionaryElement Element = { 13414 Key.get(), Value.get(), SourceLocation(), NumExpansions 13415 }; 13416 13417 // If any unexpanded parameter packs remain, we still have a 13418 // pack expansion. 13419 // FIXME: Can this really happen? 13420 if (Key.get()->containsUnexpandedParameterPack() || 13421 Value.get()->containsUnexpandedParameterPack()) 13422 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13423 13424 Elements.push_back(Element); 13425 } 13426 13427 // FIXME: Retain a pack expansion if RetainExpansion is true. 13428 13429 // We've finished with this pack expansion. 13430 continue; 13431 } 13432 13433 // Transform and check key. 13434 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13435 if (Key.isInvalid()) 13436 return ExprError(); 13437 13438 if (Key.get() != OrigElement.Key) 13439 ArgChanged = true; 13440 13441 // Transform and check value. 13442 ExprResult Value 13443 = getDerived().TransformExpr(OrigElement.Value); 13444 if (Value.isInvalid()) 13445 return ExprError(); 13446 13447 if (Value.get() != OrigElement.Value) 13448 ArgChanged = true; 13449 13450 ObjCDictionaryElement Element = { 13451 Key.get(), Value.get(), SourceLocation(), None 13452 }; 13453 Elements.push_back(Element); 13454 } 13455 13456 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13457 return SemaRef.MaybeBindToTemporary(E); 13458 13459 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13460 Elements); 13461 } 13462 13463 template<typename Derived> 13464 ExprResult 13465 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13466 TypeSourceInfo *EncodedTypeInfo 13467 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13468 if (!EncodedTypeInfo) 13469 return ExprError(); 13470 13471 if (!getDerived().AlwaysRebuild() && 13472 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13473 return E; 13474 13475 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13476 EncodedTypeInfo, 13477 E->getRParenLoc()); 13478 } 13479 13480 template<typename Derived> 13481 ExprResult TreeTransform<Derived>:: 13482 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13483 // This is a kind of implicit conversion, and it needs to get dropped 13484 // and recomputed for the same general reasons that ImplicitCastExprs 13485 // do, as well a more specific one: this expression is only valid when 13486 // it appears *immediately* as an argument expression. 13487 return getDerived().TransformExpr(E->getSubExpr()); 13488 } 13489 13490 template<typename Derived> 13491 ExprResult TreeTransform<Derived>:: 13492 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13493 TypeSourceInfo *TSInfo 13494 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13495 if (!TSInfo) 13496 return ExprError(); 13497 13498 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13499 if (Result.isInvalid()) 13500 return ExprError(); 13501 13502 if (!getDerived().AlwaysRebuild() && 13503 TSInfo == E->getTypeInfoAsWritten() && 13504 Result.get() == E->getSubExpr()) 13505 return E; 13506 13507 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13508 E->getBridgeKeywordLoc(), TSInfo, 13509 Result.get()); 13510 } 13511 13512 template <typename Derived> 13513 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13514 ObjCAvailabilityCheckExpr *E) { 13515 return E; 13516 } 13517 13518 template<typename Derived> 13519 ExprResult 13520 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13521 // Transform arguments. 13522 bool ArgChanged = false; 13523 SmallVector<Expr*, 8> Args; 13524 Args.reserve(E->getNumArgs()); 13525 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13526 &ArgChanged)) 13527 return ExprError(); 13528 13529 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13530 // Class message: transform the receiver type. 13531 TypeSourceInfo *ReceiverTypeInfo 13532 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13533 if (!ReceiverTypeInfo) 13534 return ExprError(); 13535 13536 // If nothing changed, just retain the existing message send. 13537 if (!getDerived().AlwaysRebuild() && 13538 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13539 return SemaRef.MaybeBindToTemporary(E); 13540 13541 // Build a new class message send. 13542 SmallVector<SourceLocation, 16> SelLocs; 13543 E->getSelectorLocs(SelLocs); 13544 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13545 E->getSelector(), 13546 SelLocs, 13547 E->getMethodDecl(), 13548 E->getLeftLoc(), 13549 Args, 13550 E->getRightLoc()); 13551 } 13552 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13553 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13554 if (!E->getMethodDecl()) 13555 return ExprError(); 13556 13557 // Build a new class message send to 'super'. 13558 SmallVector<SourceLocation, 16> SelLocs; 13559 E->getSelectorLocs(SelLocs); 13560 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13561 E->getSelector(), 13562 SelLocs, 13563 E->getReceiverType(), 13564 E->getMethodDecl(), 13565 E->getLeftLoc(), 13566 Args, 13567 E->getRightLoc()); 13568 } 13569 13570 // Instance message: transform the receiver 13571 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13572 "Only class and instance messages may be instantiated"); 13573 ExprResult Receiver 13574 = getDerived().TransformExpr(E->getInstanceReceiver()); 13575 if (Receiver.isInvalid()) 13576 return ExprError(); 13577 13578 // If nothing changed, just retain the existing message send. 13579 if (!getDerived().AlwaysRebuild() && 13580 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13581 return SemaRef.MaybeBindToTemporary(E); 13582 13583 // Build a new instance message send. 13584 SmallVector<SourceLocation, 16> SelLocs; 13585 E->getSelectorLocs(SelLocs); 13586 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13587 E->getSelector(), 13588 SelLocs, 13589 E->getMethodDecl(), 13590 E->getLeftLoc(), 13591 Args, 13592 E->getRightLoc()); 13593 } 13594 13595 template<typename Derived> 13596 ExprResult 13597 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13598 return E; 13599 } 13600 13601 template<typename Derived> 13602 ExprResult 13603 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13604 return E; 13605 } 13606 13607 template<typename Derived> 13608 ExprResult 13609 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13610 // Transform the base expression. 13611 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13612 if (Base.isInvalid()) 13613 return ExprError(); 13614 13615 // We don't need to transform the ivar; it will never change. 13616 13617 // If nothing changed, just retain the existing expression. 13618 if (!getDerived().AlwaysRebuild() && 13619 Base.get() == E->getBase()) 13620 return E; 13621 13622 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13623 E->getLocation(), 13624 E->isArrow(), E->isFreeIvar()); 13625 } 13626 13627 template<typename Derived> 13628 ExprResult 13629 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13630 // 'super' and types never change. Property never changes. Just 13631 // retain the existing expression. 13632 if (!E->isObjectReceiver()) 13633 return E; 13634 13635 // Transform the base expression. 13636 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13637 if (Base.isInvalid()) 13638 return ExprError(); 13639 13640 // We don't need to transform the property; it will never change. 13641 13642 // If nothing changed, just retain the existing expression. 13643 if (!getDerived().AlwaysRebuild() && 13644 Base.get() == E->getBase()) 13645 return E; 13646 13647 if (E->isExplicitProperty()) 13648 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13649 E->getExplicitProperty(), 13650 E->getLocation()); 13651 13652 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13653 SemaRef.Context.PseudoObjectTy, 13654 E->getImplicitPropertyGetter(), 13655 E->getImplicitPropertySetter(), 13656 E->getLocation()); 13657 } 13658 13659 template<typename Derived> 13660 ExprResult 13661 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13662 // Transform the base expression. 13663 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13664 if (Base.isInvalid()) 13665 return ExprError(); 13666 13667 // Transform the key expression. 13668 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13669 if (Key.isInvalid()) 13670 return ExprError(); 13671 13672 // If nothing changed, just retain the existing expression. 13673 if (!getDerived().AlwaysRebuild() && 13674 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13675 return E; 13676 13677 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13678 Base.get(), Key.get(), 13679 E->getAtIndexMethodDecl(), 13680 E->setAtIndexMethodDecl()); 13681 } 13682 13683 template<typename Derived> 13684 ExprResult 13685 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13686 // Transform the base expression. 13687 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13688 if (Base.isInvalid()) 13689 return ExprError(); 13690 13691 // If nothing changed, just retain the existing expression. 13692 if (!getDerived().AlwaysRebuild() && 13693 Base.get() == E->getBase()) 13694 return E; 13695 13696 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13697 E->getOpLoc(), 13698 E->isArrow()); 13699 } 13700 13701 template<typename Derived> 13702 ExprResult 13703 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13704 bool ArgumentChanged = false; 13705 SmallVector<Expr*, 8> SubExprs; 13706 SubExprs.reserve(E->getNumSubExprs()); 13707 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13708 SubExprs, &ArgumentChanged)) 13709 return ExprError(); 13710 13711 if (!getDerived().AlwaysRebuild() && 13712 !ArgumentChanged) 13713 return E; 13714 13715 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13716 SubExprs, 13717 E->getRParenLoc()); 13718 } 13719 13720 template<typename Derived> 13721 ExprResult 13722 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13723 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13724 if (SrcExpr.isInvalid()) 13725 return ExprError(); 13726 13727 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13728 if (!Type) 13729 return ExprError(); 13730 13731 if (!getDerived().AlwaysRebuild() && 13732 Type == E->getTypeSourceInfo() && 13733 SrcExpr.get() == E->getSrcExpr()) 13734 return E; 13735 13736 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13737 SrcExpr.get(), Type, 13738 E->getRParenLoc()); 13739 } 13740 13741 template<typename Derived> 13742 ExprResult 13743 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13744 BlockDecl *oldBlock = E->getBlockDecl(); 13745 13746 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13747 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13748 13749 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13750 blockScope->TheDecl->setBlockMissingReturnType( 13751 oldBlock->blockMissingReturnType()); 13752 13753 SmallVector<ParmVarDecl*, 4> params; 13754 SmallVector<QualType, 4> paramTypes; 13755 13756 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13757 13758 // Parameter substitution. 13759 Sema::ExtParameterInfoBuilder extParamInfos; 13760 if (getDerived().TransformFunctionTypeParams( 13761 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13762 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13763 extParamInfos)) { 13764 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13765 return ExprError(); 13766 } 13767 13768 QualType exprResultType = 13769 getDerived().TransformType(exprFunctionType->getReturnType()); 13770 13771 auto epi = exprFunctionType->getExtProtoInfo(); 13772 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13773 13774 QualType functionType = 13775 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13776 blockScope->FunctionType = functionType; 13777 13778 // Set the parameters on the block decl. 13779 if (!params.empty()) 13780 blockScope->TheDecl->setParams(params); 13781 13782 if (!oldBlock->blockMissingReturnType()) { 13783 blockScope->HasImplicitReturnType = false; 13784 blockScope->ReturnType = exprResultType; 13785 } 13786 13787 // Transform the body 13788 StmtResult body = getDerived().TransformStmt(E->getBody()); 13789 if (body.isInvalid()) { 13790 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13791 return ExprError(); 13792 } 13793 13794 #ifndef NDEBUG 13795 // In builds with assertions, make sure that we captured everything we 13796 // captured before. 13797 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13798 for (const auto &I : oldBlock->captures()) { 13799 VarDecl *oldCapture = I.getVariable(); 13800 13801 // Ignore parameter packs. 13802 if (oldCapture->isParameterPack()) 13803 continue; 13804 13805 VarDecl *newCapture = 13806 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13807 oldCapture)); 13808 assert(blockScope->CaptureMap.count(newCapture)); 13809 } 13810 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13811 } 13812 #endif 13813 13814 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13815 /*Scope=*/nullptr); 13816 } 13817 13818 template<typename Derived> 13819 ExprResult 13820 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13821 llvm_unreachable("Cannot transform asType expressions yet"); 13822 } 13823 13824 template<typename Derived> 13825 ExprResult 13826 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13827 bool ArgumentChanged = false; 13828 SmallVector<Expr*, 8> SubExprs; 13829 SubExprs.reserve(E->getNumSubExprs()); 13830 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13831 SubExprs, &ArgumentChanged)) 13832 return ExprError(); 13833 13834 if (!getDerived().AlwaysRebuild() && 13835 !ArgumentChanged) 13836 return E; 13837 13838 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13839 E->getOp(), E->getRParenLoc()); 13840 } 13841 13842 //===----------------------------------------------------------------------===// 13843 // Type reconstruction 13844 //===----------------------------------------------------------------------===// 13845 13846 template<typename Derived> 13847 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 13848 SourceLocation Star) { 13849 return SemaRef.BuildPointerType(PointeeType, Star, 13850 getDerived().getBaseEntity()); 13851 } 13852 13853 template<typename Derived> 13854 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 13855 SourceLocation Star) { 13856 return SemaRef.BuildBlockPointerType(PointeeType, Star, 13857 getDerived().getBaseEntity()); 13858 } 13859 13860 template<typename Derived> 13861 QualType 13862 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 13863 bool WrittenAsLValue, 13864 SourceLocation Sigil) { 13865 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 13866 Sigil, getDerived().getBaseEntity()); 13867 } 13868 13869 template<typename Derived> 13870 QualType 13871 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 13872 QualType ClassType, 13873 SourceLocation Sigil) { 13874 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 13875 getDerived().getBaseEntity()); 13876 } 13877 13878 template<typename Derived> 13879 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 13880 const ObjCTypeParamDecl *Decl, 13881 SourceLocation ProtocolLAngleLoc, 13882 ArrayRef<ObjCProtocolDecl *> Protocols, 13883 ArrayRef<SourceLocation> ProtocolLocs, 13884 SourceLocation ProtocolRAngleLoc) { 13885 return SemaRef.BuildObjCTypeParamType(Decl, 13886 ProtocolLAngleLoc, Protocols, 13887 ProtocolLocs, ProtocolRAngleLoc, 13888 /*FailOnError=*/true); 13889 } 13890 13891 template<typename Derived> 13892 QualType TreeTransform<Derived>::RebuildObjCObjectType( 13893 QualType BaseType, 13894 SourceLocation Loc, 13895 SourceLocation TypeArgsLAngleLoc, 13896 ArrayRef<TypeSourceInfo *> TypeArgs, 13897 SourceLocation TypeArgsRAngleLoc, 13898 SourceLocation ProtocolLAngleLoc, 13899 ArrayRef<ObjCProtocolDecl *> Protocols, 13900 ArrayRef<SourceLocation> ProtocolLocs, 13901 SourceLocation ProtocolRAngleLoc) { 13902 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 13903 TypeArgs, TypeArgsRAngleLoc, 13904 ProtocolLAngleLoc, Protocols, ProtocolLocs, 13905 ProtocolRAngleLoc, 13906 /*FailOnError=*/true); 13907 } 13908 13909 template<typename Derived> 13910 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 13911 QualType PointeeType, 13912 SourceLocation Star) { 13913 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 13914 } 13915 13916 template<typename Derived> 13917 QualType 13918 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 13919 ArrayType::ArraySizeModifier SizeMod, 13920 const llvm::APInt *Size, 13921 Expr *SizeExpr, 13922 unsigned IndexTypeQuals, 13923 SourceRange BracketsRange) { 13924 if (SizeExpr || !Size) 13925 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 13926 IndexTypeQuals, BracketsRange, 13927 getDerived().getBaseEntity()); 13928 13929 QualType Types[] = { 13930 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 13931 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 13932 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 13933 }; 13934 const unsigned NumTypes = llvm::array_lengthof(Types); 13935 QualType SizeType; 13936 for (unsigned I = 0; I != NumTypes; ++I) 13937 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 13938 SizeType = Types[I]; 13939 break; 13940 } 13941 13942 // Note that we can return a VariableArrayType here in the case where 13943 // the element type was a dependent VariableArrayType. 13944 IntegerLiteral *ArraySize 13945 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 13946 /*FIXME*/BracketsRange.getBegin()); 13947 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 13948 IndexTypeQuals, BracketsRange, 13949 getDerived().getBaseEntity()); 13950 } 13951 13952 template<typename Derived> 13953 QualType 13954 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 13955 ArrayType::ArraySizeModifier SizeMod, 13956 const llvm::APInt &Size, 13957 Expr *SizeExpr, 13958 unsigned IndexTypeQuals, 13959 SourceRange BracketsRange) { 13960 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 13961 IndexTypeQuals, BracketsRange); 13962 } 13963 13964 template<typename Derived> 13965 QualType 13966 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 13967 ArrayType::ArraySizeModifier SizeMod, 13968 unsigned IndexTypeQuals, 13969 SourceRange BracketsRange) { 13970 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 13971 IndexTypeQuals, BracketsRange); 13972 } 13973 13974 template<typename Derived> 13975 QualType 13976 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 13977 ArrayType::ArraySizeModifier SizeMod, 13978 Expr *SizeExpr, 13979 unsigned IndexTypeQuals, 13980 SourceRange BracketsRange) { 13981 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13982 SizeExpr, 13983 IndexTypeQuals, BracketsRange); 13984 } 13985 13986 template<typename Derived> 13987 QualType 13988 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 13989 ArrayType::ArraySizeModifier SizeMod, 13990 Expr *SizeExpr, 13991 unsigned IndexTypeQuals, 13992 SourceRange BracketsRange) { 13993 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13994 SizeExpr, 13995 IndexTypeQuals, BracketsRange); 13996 } 13997 13998 template <typename Derived> 13999 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14000 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14001 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14002 AttributeLoc); 14003 } 14004 14005 template <typename Derived> 14006 QualType 14007 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14008 unsigned NumElements, 14009 VectorType::VectorKind VecKind) { 14010 // FIXME: semantic checking! 14011 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14012 } 14013 14014 template <typename Derived> 14015 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14016 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14017 VectorType::VectorKind VecKind) { 14018 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14019 } 14020 14021 template<typename Derived> 14022 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14023 unsigned NumElements, 14024 SourceLocation AttributeLoc) { 14025 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14026 NumElements, true); 14027 IntegerLiteral *VectorSize 14028 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14029 AttributeLoc); 14030 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14031 } 14032 14033 template<typename Derived> 14034 QualType 14035 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14036 Expr *SizeExpr, 14037 SourceLocation AttributeLoc) { 14038 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14039 } 14040 14041 template <typename Derived> 14042 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14043 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14044 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14045 NumColumns); 14046 } 14047 14048 template <typename Derived> 14049 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14050 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14051 SourceLocation AttributeLoc) { 14052 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14053 AttributeLoc); 14054 } 14055 14056 template<typename Derived> 14057 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14058 QualType T, 14059 MutableArrayRef<QualType> ParamTypes, 14060 const FunctionProtoType::ExtProtoInfo &EPI) { 14061 return SemaRef.BuildFunctionType(T, ParamTypes, 14062 getDerived().getBaseLocation(), 14063 getDerived().getBaseEntity(), 14064 EPI); 14065 } 14066 14067 template<typename Derived> 14068 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14069 return SemaRef.Context.getFunctionNoProtoType(T); 14070 } 14071 14072 template<typename Derived> 14073 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14074 Decl *D) { 14075 assert(D && "no decl found"); 14076 if (D->isInvalidDecl()) return QualType(); 14077 14078 // FIXME: Doesn't account for ObjCInterfaceDecl! 14079 TypeDecl *Ty; 14080 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14081 // A valid resolved using typename pack expansion decl can have multiple 14082 // UsingDecls, but they must each have exactly one type, and it must be 14083 // the same type in every case. But we must have at least one expansion! 14084 if (UPD->expansions().empty()) { 14085 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14086 << UPD->isCXXClassMember() << UPD; 14087 return QualType(); 14088 } 14089 14090 // We might still have some unresolved types. Try to pick a resolved type 14091 // if we can. The final instantiation will check that the remaining 14092 // unresolved types instantiate to the type we pick. 14093 QualType FallbackT; 14094 QualType T; 14095 for (auto *E : UPD->expansions()) { 14096 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14097 if (ThisT.isNull()) 14098 continue; 14099 else if (ThisT->getAs<UnresolvedUsingType>()) 14100 FallbackT = ThisT; 14101 else if (T.isNull()) 14102 T = ThisT; 14103 else 14104 assert(getSema().Context.hasSameType(ThisT, T) && 14105 "mismatched resolved types in using pack expansion"); 14106 } 14107 return T.isNull() ? FallbackT : T; 14108 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14109 assert(Using->hasTypename() && 14110 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14111 14112 // A valid resolved using typename decl points to exactly one type decl. 14113 assert(++Using->shadow_begin() == Using->shadow_end()); 14114 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 14115 } else { 14116 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14117 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14118 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14119 } 14120 14121 return SemaRef.Context.getTypeDeclType(Ty); 14122 } 14123 14124 template<typename Derived> 14125 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14126 SourceLocation Loc) { 14127 return SemaRef.BuildTypeofExprType(E, Loc); 14128 } 14129 14130 template<typename Derived> 14131 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14132 return SemaRef.Context.getTypeOfType(Underlying); 14133 } 14134 14135 template<typename Derived> 14136 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14137 SourceLocation Loc) { 14138 return SemaRef.BuildDecltypeType(E, Loc); 14139 } 14140 14141 template<typename Derived> 14142 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14143 UnaryTransformType::UTTKind UKind, 14144 SourceLocation Loc) { 14145 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14146 } 14147 14148 template<typename Derived> 14149 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14150 TemplateName Template, 14151 SourceLocation TemplateNameLoc, 14152 TemplateArgumentListInfo &TemplateArgs) { 14153 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14154 } 14155 14156 template<typename Derived> 14157 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14158 SourceLocation KWLoc) { 14159 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14160 } 14161 14162 template<typename Derived> 14163 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14164 SourceLocation KWLoc, 14165 bool isReadPipe) { 14166 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14167 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14168 } 14169 14170 template <typename Derived> 14171 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14172 unsigned NumBits, 14173 SourceLocation Loc) { 14174 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14175 NumBits, true); 14176 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14177 SemaRef.Context.IntTy, Loc); 14178 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14179 } 14180 14181 template <typename Derived> 14182 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14183 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14184 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14185 } 14186 14187 template<typename Derived> 14188 TemplateName 14189 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14190 bool TemplateKW, 14191 TemplateDecl *Template) { 14192 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14193 Template); 14194 } 14195 14196 template<typename Derived> 14197 TemplateName 14198 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14199 SourceLocation TemplateKWLoc, 14200 const IdentifierInfo &Name, 14201 SourceLocation NameLoc, 14202 QualType ObjectType, 14203 NamedDecl *FirstQualifierInScope, 14204 bool AllowInjectedClassName) { 14205 UnqualifiedId TemplateName; 14206 TemplateName.setIdentifier(&Name, NameLoc); 14207 Sema::TemplateTy Template; 14208 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14209 TemplateName, ParsedType::make(ObjectType), 14210 /*EnteringContext=*/false, Template, 14211 AllowInjectedClassName); 14212 return Template.get(); 14213 } 14214 14215 template<typename Derived> 14216 TemplateName 14217 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14218 SourceLocation TemplateKWLoc, 14219 OverloadedOperatorKind Operator, 14220 SourceLocation NameLoc, 14221 QualType ObjectType, 14222 bool AllowInjectedClassName) { 14223 UnqualifiedId Name; 14224 // FIXME: Bogus location information. 14225 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14226 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14227 Sema::TemplateTy Template; 14228 getSema().ActOnTemplateName( 14229 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14230 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14231 return Template.get(); 14232 } 14233 14234 template<typename Derived> 14235 ExprResult 14236 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14237 SourceLocation OpLoc, 14238 Expr *OrigCallee, 14239 Expr *First, 14240 Expr *Second) { 14241 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14242 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14243 14244 if (First->getObjectKind() == OK_ObjCProperty) { 14245 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14246 if (BinaryOperator::isAssignmentOp(Opc)) 14247 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14248 First, Second); 14249 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14250 if (Result.isInvalid()) 14251 return ExprError(); 14252 First = Result.get(); 14253 } 14254 14255 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14256 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14257 if (Result.isInvalid()) 14258 return ExprError(); 14259 Second = Result.get(); 14260 } 14261 14262 // Determine whether this should be a builtin operation. 14263 if (Op == OO_Subscript) { 14264 if (!First->getType()->isOverloadableType() && 14265 !Second->getType()->isOverloadableType()) 14266 return getSema().CreateBuiltinArraySubscriptExpr( 14267 First, Callee->getBeginLoc(), Second, OpLoc); 14268 } else if (Op == OO_Arrow) { 14269 // -> is never a builtin operation. 14270 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14271 } else if (Second == nullptr || isPostIncDec) { 14272 if (!First->getType()->isOverloadableType() || 14273 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14274 // The argument is not of overloadable type, or this is an expression 14275 // of the form &Class::member, so try to create a built-in unary 14276 // operation. 14277 UnaryOperatorKind Opc 14278 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14279 14280 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14281 } 14282 } else { 14283 if (!First->getType()->isOverloadableType() && 14284 !Second->getType()->isOverloadableType()) { 14285 // Neither of the arguments is an overloadable type, so try to 14286 // create a built-in binary operation. 14287 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14288 ExprResult Result 14289 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14290 if (Result.isInvalid()) 14291 return ExprError(); 14292 14293 return Result; 14294 } 14295 } 14296 14297 // Compute the transformed set of functions (and function templates) to be 14298 // used during overload resolution. 14299 UnresolvedSet<16> Functions; 14300 bool RequiresADL; 14301 14302 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14303 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14304 // If the overload could not be resolved in the template definition 14305 // (because we had a dependent argument), ADL is performed as part of 14306 // template instantiation. 14307 RequiresADL = ULE->requiresADL(); 14308 } else { 14309 // If we've resolved this to a particular non-member function, just call 14310 // that function. If we resolved it to a member function, 14311 // CreateOverloaded* will find that function for us. 14312 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14313 if (!isa<CXXMethodDecl>(ND)) 14314 Functions.addDecl(ND); 14315 RequiresADL = false; 14316 } 14317 14318 // Add any functions found via argument-dependent lookup. 14319 Expr *Args[2] = { First, Second }; 14320 unsigned NumArgs = 1 + (Second != nullptr); 14321 14322 // Create the overloaded operator invocation for unary operators. 14323 if (NumArgs == 1 || isPostIncDec) { 14324 UnaryOperatorKind Opc 14325 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14326 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14327 RequiresADL); 14328 } 14329 14330 if (Op == OO_Subscript) { 14331 SourceLocation LBrace; 14332 SourceLocation RBrace; 14333 14334 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14335 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14336 LBrace = SourceLocation::getFromRawEncoding( 14337 NameLoc.CXXOperatorName.BeginOpNameLoc); 14338 RBrace = SourceLocation::getFromRawEncoding( 14339 NameLoc.CXXOperatorName.EndOpNameLoc); 14340 } else { 14341 LBrace = Callee->getBeginLoc(); 14342 RBrace = OpLoc; 14343 } 14344 14345 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14346 First, Second); 14347 } 14348 14349 // Create the overloaded operator invocation for binary operators. 14350 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14351 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14352 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14353 if (Result.isInvalid()) 14354 return ExprError(); 14355 14356 return Result; 14357 } 14358 14359 template<typename Derived> 14360 ExprResult 14361 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14362 SourceLocation OperatorLoc, 14363 bool isArrow, 14364 CXXScopeSpec &SS, 14365 TypeSourceInfo *ScopeType, 14366 SourceLocation CCLoc, 14367 SourceLocation TildeLoc, 14368 PseudoDestructorTypeStorage Destroyed) { 14369 QualType BaseType = Base->getType(); 14370 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14371 (!isArrow && !BaseType->getAs<RecordType>()) || 14372 (isArrow && BaseType->getAs<PointerType>() && 14373 !BaseType->castAs<PointerType>()->getPointeeType() 14374 ->template getAs<RecordType>())){ 14375 // This pseudo-destructor expression is still a pseudo-destructor. 14376 return SemaRef.BuildPseudoDestructorExpr( 14377 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14378 CCLoc, TildeLoc, Destroyed); 14379 } 14380 14381 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14382 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14383 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14384 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14385 NameInfo.setNamedTypeInfo(DestroyedType); 14386 14387 // The scope type is now known to be a valid nested name specifier 14388 // component. Tack it on to the end of the nested name specifier. 14389 if (ScopeType) { 14390 if (!ScopeType->getType()->getAs<TagType>()) { 14391 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14392 diag::err_expected_class_or_namespace) 14393 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14394 return ExprError(); 14395 } 14396 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14397 CCLoc); 14398 } 14399 14400 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14401 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14402 OperatorLoc, isArrow, 14403 SS, TemplateKWLoc, 14404 /*FIXME: FirstQualifier*/ nullptr, 14405 NameInfo, 14406 /*TemplateArgs*/ nullptr, 14407 /*S*/nullptr); 14408 } 14409 14410 template<typename Derived> 14411 StmtResult 14412 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14413 SourceLocation Loc = S->getBeginLoc(); 14414 CapturedDecl *CD = S->getCapturedDecl(); 14415 unsigned NumParams = CD->getNumParams(); 14416 unsigned ContextParamPos = CD->getContextParamPosition(); 14417 SmallVector<Sema::CapturedParamNameType, 4> Params; 14418 for (unsigned I = 0; I < NumParams; ++I) { 14419 if (I != ContextParamPos) { 14420 Params.push_back( 14421 std::make_pair( 14422 CD->getParam(I)->getName(), 14423 getDerived().TransformType(CD->getParam(I)->getType()))); 14424 } else { 14425 Params.push_back(std::make_pair(StringRef(), QualType())); 14426 } 14427 } 14428 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14429 S->getCapturedRegionKind(), Params); 14430 StmtResult Body; 14431 { 14432 Sema::CompoundScopeRAII CompoundScope(getSema()); 14433 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14434 } 14435 14436 if (Body.isInvalid()) { 14437 getSema().ActOnCapturedRegionError(); 14438 return StmtError(); 14439 } 14440 14441 return getSema().ActOnCapturedRegionEnd(Body.get()); 14442 } 14443 14444 } // end namespace clang 14445 14446 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14447