1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 17 #include "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprConcepts.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/OpenMPClause.h" 27 #include "clang/AST/Stmt.h" 28 #include "clang/AST/StmtCXX.h" 29 #include "clang/AST/StmtObjC.h" 30 #include "clang/AST/StmtOpenMP.h" 31 #include "clang/Basic/DiagnosticParse.h" 32 #include "clang/Basic/OpenMPKinds.h" 33 #include "clang/Sema/Designator.h" 34 #include "clang/Sema/Lookup.h" 35 #include "clang/Sema/Ownership.h" 36 #include "clang/Sema/ParsedTemplate.h" 37 #include "clang/Sema/ScopeInfo.h" 38 #include "clang/Sema/SemaDiagnostic.h" 39 #include "clang/Sema/SemaInternal.h" 40 #include "llvm/ADT/ArrayRef.h" 41 #include "llvm/Support/ErrorHandling.h" 42 #include <algorithm> 43 44 using namespace llvm::omp; 45 46 namespace clang { 47 using namespace sema; 48 49 /// A semantic tree transformation that allows one to transform one 50 /// abstract syntax tree into another. 51 /// 52 /// A new tree transformation is defined by creating a new subclass \c X of 53 /// \c TreeTransform<X> and then overriding certain operations to provide 54 /// behavior specific to that transformation. For example, template 55 /// instantiation is implemented as a tree transformation where the 56 /// transformation of TemplateTypeParmType nodes involves substituting the 57 /// template arguments for their corresponding template parameters; a similar 58 /// transformation is performed for non-type template parameters and 59 /// template template parameters. 60 /// 61 /// This tree-transformation template uses static polymorphism to allow 62 /// subclasses to customize any of its operations. Thus, a subclass can 63 /// override any of the transformation or rebuild operators by providing an 64 /// operation with the same signature as the default implementation. The 65 /// overriding function should not be virtual. 66 /// 67 /// Semantic tree transformations are split into two stages, either of which 68 /// can be replaced by a subclass. The "transform" step transforms an AST node 69 /// or the parts of an AST node using the various transformation functions, 70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 71 /// node of the appropriate kind from the pieces. The default transformation 72 /// routines recursively transform the operands to composite AST nodes (e.g., 73 /// the pointee type of a PointerType node) and, if any of those operand nodes 74 /// were changed by the transformation, invokes the rebuild operation to create 75 /// a new AST node. 76 /// 77 /// Subclasses can customize the transformation at various levels. The 78 /// most coarse-grained transformations involve replacing TransformType(), 79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 81 /// new implementations. 82 /// 83 /// For more fine-grained transformations, subclasses can replace any of the 84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 86 /// replacing TransformTemplateTypeParmType() allows template instantiation 87 /// to substitute template arguments for their corresponding template 88 /// parameters. Additionally, subclasses can override the \c RebuildXXX 89 /// functions to control how AST nodes are rebuilt when their operands change. 90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 92 /// be able to use more efficient rebuild steps. 93 /// 94 /// There are a handful of other functions that can be overridden, allowing one 95 /// to avoid traversing nodes that don't need any transformation 96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 97 /// operands have not changed (\c AlwaysRebuild()), and customize the 98 /// default locations and entity names used for type-checking 99 /// (\c getBaseLocation(), \c getBaseEntity()). 100 template<typename Derived> 101 class TreeTransform { 102 /// Private RAII object that helps us forget and then re-remember 103 /// the template argument corresponding to a partially-substituted parameter 104 /// pack. 105 class ForgetPartiallySubstitutedPackRAII { 106 Derived &Self; 107 TemplateArgument Old; 108 109 public: 110 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 111 Old = Self.ForgetPartiallySubstitutedPack(); 112 } 113 114 ~ForgetPartiallySubstitutedPackRAII() { 115 Self.RememberPartiallySubstitutedPack(Old); 116 } 117 }; 118 119 protected: 120 Sema &SemaRef; 121 122 /// The set of local declarations that have been transformed, for 123 /// cases where we are forced to build new declarations within the transformer 124 /// rather than in the subclass (e.g., lambda closure types). 125 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 126 127 public: 128 /// Initializes a new tree transformer. 129 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 130 131 /// Retrieves a reference to the derived class. 132 Derived &getDerived() { return static_cast<Derived&>(*this); } 133 134 /// Retrieves a reference to the derived class. 135 const Derived &getDerived() const { 136 return static_cast<const Derived&>(*this); 137 } 138 139 static inline ExprResult Owned(Expr *E) { return E; } 140 static inline StmtResult Owned(Stmt *S) { return S; } 141 142 /// Retrieves a reference to the semantic analysis object used for 143 /// this tree transform. 144 Sema &getSema() const { return SemaRef; } 145 146 /// Whether the transformation should always rebuild AST nodes, even 147 /// if none of the children have changed. 148 /// 149 /// Subclasses may override this function to specify when the transformation 150 /// should rebuild all AST nodes. 151 /// 152 /// We must always rebuild all AST nodes when performing variadic template 153 /// pack expansion, in order to avoid violating the AST invariant that each 154 /// statement node appears at most once in its containing declaration. 155 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 156 157 /// Whether the transformation is forming an expression or statement that 158 /// replaces the original. In this case, we'll reuse mangling numbers from 159 /// existing lambdas. 160 bool ReplacingOriginal() { return false; } 161 162 /// Wether CXXConstructExpr can be skipped when they are implicit. 163 /// They will be reconstructed when used if needed. 164 /// This is usefull when the user that cause rebuilding of the 165 /// CXXConstructExpr is outside of the expression at which the TreeTransform 166 /// started. 167 bool AllowSkippingCXXConstructExpr() { return true; } 168 169 /// Returns the location of the entity being transformed, if that 170 /// information was not available elsewhere in the AST. 171 /// 172 /// By default, returns no source-location information. Subclasses can 173 /// provide an alternative implementation that provides better location 174 /// information. 175 SourceLocation getBaseLocation() { return SourceLocation(); } 176 177 /// Returns the name of the entity being transformed, if that 178 /// information was not available elsewhere in the AST. 179 /// 180 /// By default, returns an empty name. Subclasses can provide an alternative 181 /// implementation with a more precise name. 182 DeclarationName getBaseEntity() { return DeclarationName(); } 183 184 /// Sets the "base" location and entity when that 185 /// information is known based on another transformation. 186 /// 187 /// By default, the source location and entity are ignored. Subclasses can 188 /// override this function to provide a customized implementation. 189 void setBase(SourceLocation Loc, DeclarationName Entity) { } 190 191 /// RAII object that temporarily sets the base location and entity 192 /// used for reporting diagnostics in types. 193 class TemporaryBase { 194 TreeTransform &Self; 195 SourceLocation OldLocation; 196 DeclarationName OldEntity; 197 198 public: 199 TemporaryBase(TreeTransform &Self, SourceLocation Location, 200 DeclarationName Entity) : Self(Self) { 201 OldLocation = Self.getDerived().getBaseLocation(); 202 OldEntity = Self.getDerived().getBaseEntity(); 203 204 if (Location.isValid()) 205 Self.getDerived().setBase(Location, Entity); 206 } 207 208 ~TemporaryBase() { 209 Self.getDerived().setBase(OldLocation, OldEntity); 210 } 211 }; 212 213 /// Determine whether the given type \p T has already been 214 /// transformed. 215 /// 216 /// Subclasses can provide an alternative implementation of this routine 217 /// to short-circuit evaluation when it is known that a given type will 218 /// not change. For example, template instantiation need not traverse 219 /// non-dependent types. 220 bool AlreadyTransformed(QualType T) { 221 return T.isNull(); 222 } 223 224 /// Transform a template parameter depth level. 225 /// 226 /// During a transformation that transforms template parameters, this maps 227 /// an old template parameter depth to a new depth. 228 unsigned TransformTemplateDepth(unsigned Depth) { 229 return Depth; 230 } 231 232 /// Determine whether the given call argument should be dropped, e.g., 233 /// because it is a default argument. 234 /// 235 /// Subclasses can provide an alternative implementation of this routine to 236 /// determine which kinds of call arguments get dropped. By default, 237 /// CXXDefaultArgument nodes are dropped (prior to transformation). 238 bool DropCallArgument(Expr *E) { 239 return E->isDefaultArgument(); 240 } 241 242 /// Determine whether we should expand a pack expansion with the 243 /// given set of parameter packs into separate arguments by repeatedly 244 /// transforming the pattern. 245 /// 246 /// By default, the transformer never tries to expand pack expansions. 247 /// Subclasses can override this routine to provide different behavior. 248 /// 249 /// \param EllipsisLoc The location of the ellipsis that identifies the 250 /// pack expansion. 251 /// 252 /// \param PatternRange The source range that covers the entire pattern of 253 /// the pack expansion. 254 /// 255 /// \param Unexpanded The set of unexpanded parameter packs within the 256 /// pattern. 257 /// 258 /// \param ShouldExpand Will be set to \c true if the transformer should 259 /// expand the corresponding pack expansions into separate arguments. When 260 /// set, \c NumExpansions must also be set. 261 /// 262 /// \param RetainExpansion Whether the caller should add an unexpanded 263 /// pack expansion after all of the expanded arguments. This is used 264 /// when extending explicitly-specified template argument packs per 265 /// C++0x [temp.arg.explicit]p9. 266 /// 267 /// \param NumExpansions The number of separate arguments that will be in 268 /// the expanded form of the corresponding pack expansion. This is both an 269 /// input and an output parameter, which can be set by the caller if the 270 /// number of expansions is known a priori (e.g., due to a prior substitution) 271 /// and will be set by the callee when the number of expansions is known. 272 /// The callee must set this value when \c ShouldExpand is \c true; it may 273 /// set this value in other cases. 274 /// 275 /// \returns true if an error occurred (e.g., because the parameter packs 276 /// are to be instantiated with arguments of different lengths), false 277 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 278 /// must be set. 279 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 280 SourceRange PatternRange, 281 ArrayRef<UnexpandedParameterPack> Unexpanded, 282 bool &ShouldExpand, 283 bool &RetainExpansion, 284 Optional<unsigned> &NumExpansions) { 285 ShouldExpand = false; 286 return false; 287 } 288 289 /// "Forget" about the partially-substituted pack template argument, 290 /// when performing an instantiation that must preserve the parameter pack 291 /// use. 292 /// 293 /// This routine is meant to be overridden by the template instantiator. 294 TemplateArgument ForgetPartiallySubstitutedPack() { 295 return TemplateArgument(); 296 } 297 298 /// "Remember" the partially-substituted pack template argument 299 /// after performing an instantiation that must preserve the parameter pack 300 /// use. 301 /// 302 /// This routine is meant to be overridden by the template instantiator. 303 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 304 305 /// Note to the derived class when a function parameter pack is 306 /// being expanded. 307 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 308 309 /// Transforms the given type into another type. 310 /// 311 /// By default, this routine transforms a type by creating a 312 /// TypeSourceInfo for it and delegating to the appropriate 313 /// function. This is expensive, but we don't mind, because 314 /// this method is deprecated anyway; all users should be 315 /// switched to storing TypeSourceInfos. 316 /// 317 /// \returns the transformed type. 318 QualType TransformType(QualType T); 319 320 /// Transforms the given type-with-location into a new 321 /// type-with-location. 322 /// 323 /// By default, this routine transforms a type by delegating to the 324 /// appropriate TransformXXXType to build a new type. Subclasses 325 /// may override this function (to take over all type 326 /// transformations) or some set of the TransformXXXType functions 327 /// to alter the transformation. 328 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 329 330 /// Transform the given type-with-location into a new 331 /// type, collecting location information in the given builder 332 /// as necessary. 333 /// 334 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 335 336 /// Transform a type that is permitted to produce a 337 /// DeducedTemplateSpecializationType. 338 /// 339 /// This is used in the (relatively rare) contexts where it is acceptable 340 /// for transformation to produce a class template type with deduced 341 /// template arguments. 342 /// @{ 343 QualType TransformTypeWithDeducedTST(QualType T); 344 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 345 /// @} 346 347 /// The reason why the value of a statement is not discarded, if any. 348 enum StmtDiscardKind { 349 SDK_Discarded, 350 SDK_NotDiscarded, 351 SDK_StmtExprResult, 352 }; 353 354 /// Transform the given statement. 355 /// 356 /// By default, this routine transforms a statement by delegating to the 357 /// appropriate TransformXXXStmt function to transform a specific kind of 358 /// statement or the TransformExpr() function to transform an expression. 359 /// Subclasses may override this function to transform statements using some 360 /// other mechanism. 361 /// 362 /// \returns the transformed statement. 363 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 364 365 /// Transform the given statement. 366 /// 367 /// By default, this routine transforms a statement by delegating to the 368 /// appropriate TransformOMPXXXClause function to transform a specific kind 369 /// of clause. Subclasses may override this function to transform statements 370 /// using some other mechanism. 371 /// 372 /// \returns the transformed OpenMP clause. 373 OMPClause *TransformOMPClause(OMPClause *S); 374 375 /// Transform the given attribute. 376 /// 377 /// By default, this routine transforms a statement by delegating to the 378 /// appropriate TransformXXXAttr function to transform a specific kind 379 /// of attribute. Subclasses may override this function to transform 380 /// attributed statements using some other mechanism. 381 /// 382 /// \returns the transformed attribute 383 const Attr *TransformAttr(const Attr *S); 384 385 /// Transform the specified attribute. 386 /// 387 /// Subclasses should override the transformation of attributes with a pragma 388 /// spelling to transform expressions stored within the attribute. 389 /// 390 /// \returns the transformed attribute. 391 #define ATTR(X) 392 #define PRAGMA_SPELLING_ATTR(X) \ 393 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 394 #include "clang/Basic/AttrList.inc" 395 396 /// Transform the given expression. 397 /// 398 /// By default, this routine transforms an expression by delegating to the 399 /// appropriate TransformXXXExpr function to build a new expression. 400 /// Subclasses may override this function to transform expressions using some 401 /// other mechanism. 402 /// 403 /// \returns the transformed expression. 404 ExprResult TransformExpr(Expr *E); 405 406 /// Transform the given initializer. 407 /// 408 /// By default, this routine transforms an initializer by stripping off the 409 /// semantic nodes added by initialization, then passing the result to 410 /// TransformExpr or TransformExprs. 411 /// 412 /// \returns the transformed initializer. 413 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 414 415 /// Transform the given list of expressions. 416 /// 417 /// This routine transforms a list of expressions by invoking 418 /// \c TransformExpr() for each subexpression. However, it also provides 419 /// support for variadic templates by expanding any pack expansions (if the 420 /// derived class permits such expansion) along the way. When pack expansions 421 /// are present, the number of outputs may not equal the number of inputs. 422 /// 423 /// \param Inputs The set of expressions to be transformed. 424 /// 425 /// \param NumInputs The number of expressions in \c Inputs. 426 /// 427 /// \param IsCall If \c true, then this transform is being performed on 428 /// function-call arguments, and any arguments that should be dropped, will 429 /// be. 430 /// 431 /// \param Outputs The transformed input expressions will be added to this 432 /// vector. 433 /// 434 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 435 /// due to transformation. 436 /// 437 /// \returns true if an error occurred, false otherwise. 438 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 439 SmallVectorImpl<Expr *> &Outputs, 440 bool *ArgChanged = nullptr); 441 442 /// Transform the given declaration, which is referenced from a type 443 /// or expression. 444 /// 445 /// By default, acts as the identity function on declarations, unless the 446 /// transformer has had to transform the declaration itself. Subclasses 447 /// may override this function to provide alternate behavior. 448 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 449 llvm::DenseMap<Decl *, Decl *>::iterator Known 450 = TransformedLocalDecls.find(D); 451 if (Known != TransformedLocalDecls.end()) 452 return Known->second; 453 454 return D; 455 } 456 457 /// Transform the specified condition. 458 /// 459 /// By default, this transforms the variable and expression and rebuilds 460 /// the condition. 461 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 462 Expr *Expr, 463 Sema::ConditionKind Kind); 464 465 /// Transform the attributes associated with the given declaration and 466 /// place them on the new declaration. 467 /// 468 /// By default, this operation does nothing. Subclasses may override this 469 /// behavior to transform attributes. 470 void transformAttrs(Decl *Old, Decl *New) { } 471 472 /// Note that a local declaration has been transformed by this 473 /// transformer. 474 /// 475 /// Local declarations are typically transformed via a call to 476 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 477 /// the transformer itself has to transform the declarations. This routine 478 /// can be overridden by a subclass that keeps track of such mappings. 479 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 480 assert(New.size() == 1 && 481 "must override transformedLocalDecl if performing pack expansion"); 482 TransformedLocalDecls[Old] = New.front(); 483 } 484 485 /// Transform the definition of the given declaration. 486 /// 487 /// By default, invokes TransformDecl() to transform the declaration. 488 /// Subclasses may override this function to provide alternate behavior. 489 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 490 return getDerived().TransformDecl(Loc, D); 491 } 492 493 /// Transform the given declaration, which was the first part of a 494 /// nested-name-specifier in a member access expression. 495 /// 496 /// This specific declaration transformation only applies to the first 497 /// identifier in a nested-name-specifier of a member access expression, e.g., 498 /// the \c T in \c x->T::member 499 /// 500 /// By default, invokes TransformDecl() to transform the declaration. 501 /// Subclasses may override this function to provide alternate behavior. 502 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 503 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 504 } 505 506 /// Transform the set of declarations in an OverloadExpr. 507 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 508 LookupResult &R); 509 510 /// Transform the given nested-name-specifier with source-location 511 /// information. 512 /// 513 /// By default, transforms all of the types and declarations within the 514 /// nested-name-specifier. Subclasses may override this function to provide 515 /// alternate behavior. 516 NestedNameSpecifierLoc 517 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 518 QualType ObjectType = QualType(), 519 NamedDecl *FirstQualifierInScope = nullptr); 520 521 /// Transform the given declaration name. 522 /// 523 /// By default, transforms the types of conversion function, constructor, 524 /// and destructor names and then (if needed) rebuilds the declaration name. 525 /// Identifiers and selectors are returned unmodified. Sublcasses may 526 /// override this function to provide alternate behavior. 527 DeclarationNameInfo 528 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 529 530 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 531 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 532 concepts::TypeRequirement * 533 TransformTypeRequirement(concepts::TypeRequirement *Req); 534 concepts::ExprRequirement * 535 TransformExprRequirement(concepts::ExprRequirement *Req); 536 concepts::NestedRequirement * 537 TransformNestedRequirement(concepts::NestedRequirement *Req); 538 539 /// Transform the given template name. 540 /// 541 /// \param SS The nested-name-specifier that qualifies the template 542 /// name. This nested-name-specifier must already have been transformed. 543 /// 544 /// \param Name The template name to transform. 545 /// 546 /// \param NameLoc The source location of the template name. 547 /// 548 /// \param ObjectType If we're translating a template name within a member 549 /// access expression, this is the type of the object whose member template 550 /// is being referenced. 551 /// 552 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 553 /// also refers to a name within the current (lexical) scope, this is the 554 /// declaration it refers to. 555 /// 556 /// By default, transforms the template name by transforming the declarations 557 /// and nested-name-specifiers that occur within the template name. 558 /// Subclasses may override this function to provide alternate behavior. 559 TemplateName 560 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 561 SourceLocation NameLoc, 562 QualType ObjectType = QualType(), 563 NamedDecl *FirstQualifierInScope = nullptr, 564 bool AllowInjectedClassName = false); 565 566 /// Transform the given template argument. 567 /// 568 /// By default, this operation transforms the type, expression, or 569 /// declaration stored within the template argument and constructs a 570 /// new template argument from the transformed result. Subclasses may 571 /// override this function to provide alternate behavior. 572 /// 573 /// Returns true if there was an error. 574 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 575 TemplateArgumentLoc &Output, 576 bool Uneval = false); 577 578 /// Transform the given set of template arguments. 579 /// 580 /// By default, this operation transforms all of the template arguments 581 /// in the input set using \c TransformTemplateArgument(), and appends 582 /// the transformed arguments to the output list. 583 /// 584 /// Note that this overload of \c TransformTemplateArguments() is merely 585 /// a convenience function. Subclasses that wish to override this behavior 586 /// should override the iterator-based member template version. 587 /// 588 /// \param Inputs The set of template arguments to be transformed. 589 /// 590 /// \param NumInputs The number of template arguments in \p Inputs. 591 /// 592 /// \param Outputs The set of transformed template arguments output by this 593 /// routine. 594 /// 595 /// Returns true if an error occurred. 596 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 597 unsigned NumInputs, 598 TemplateArgumentListInfo &Outputs, 599 bool Uneval = false) { 600 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 601 Uneval); 602 } 603 604 /// Transform the given set of template arguments. 605 /// 606 /// By default, this operation transforms all of the template arguments 607 /// in the input set using \c TransformTemplateArgument(), and appends 608 /// the transformed arguments to the output list. 609 /// 610 /// \param First An iterator to the first template argument. 611 /// 612 /// \param Last An iterator one step past the last template argument. 613 /// 614 /// \param Outputs The set of transformed template arguments output by this 615 /// routine. 616 /// 617 /// Returns true if an error occurred. 618 template<typename InputIterator> 619 bool TransformTemplateArguments(InputIterator First, 620 InputIterator Last, 621 TemplateArgumentListInfo &Outputs, 622 bool Uneval = false); 623 624 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 625 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 626 TemplateArgumentLoc &ArgLoc); 627 628 /// Fakes up a TypeSourceInfo for a type. 629 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 630 return SemaRef.Context.getTrivialTypeSourceInfo(T, 631 getDerived().getBaseLocation()); 632 } 633 634 #define ABSTRACT_TYPELOC(CLASS, PARENT) 635 #define TYPELOC(CLASS, PARENT) \ 636 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 637 #include "clang/AST/TypeLocNodes.def" 638 639 template<typename Fn> 640 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 641 FunctionProtoTypeLoc TL, 642 CXXRecordDecl *ThisContext, 643 Qualifiers ThisTypeQuals, 644 Fn TransformExceptionSpec); 645 646 bool TransformExceptionSpec(SourceLocation Loc, 647 FunctionProtoType::ExceptionSpecInfo &ESI, 648 SmallVectorImpl<QualType> &Exceptions, 649 bool &Changed); 650 651 StmtResult TransformSEHHandler(Stmt *Handler); 652 653 QualType 654 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 655 TemplateSpecializationTypeLoc TL, 656 TemplateName Template); 657 658 QualType 659 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 660 DependentTemplateSpecializationTypeLoc TL, 661 TemplateName Template, 662 CXXScopeSpec &SS); 663 664 QualType TransformDependentTemplateSpecializationType( 665 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 666 NestedNameSpecifierLoc QualifierLoc); 667 668 /// Transforms the parameters of a function type into the 669 /// given vectors. 670 /// 671 /// The result vectors should be kept in sync; null entries in the 672 /// variables vector are acceptable. 673 /// 674 /// Return true on error. 675 bool TransformFunctionTypeParams( 676 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 677 const QualType *ParamTypes, 678 const FunctionProtoType::ExtParameterInfo *ParamInfos, 679 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 680 Sema::ExtParameterInfoBuilder &PInfos); 681 682 /// Transforms a single function-type parameter. Return null 683 /// on error. 684 /// 685 /// \param indexAdjustment - A number to add to the parameter's 686 /// scope index; can be negative 687 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 688 int indexAdjustment, 689 Optional<unsigned> NumExpansions, 690 bool ExpectParameterPack); 691 692 /// Transform the body of a lambda-expression. 693 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 694 /// Alternative implementation of TransformLambdaBody that skips transforming 695 /// the body. 696 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 697 698 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 699 700 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 701 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 702 703 TemplateParameterList *TransformTemplateParameterList( 704 TemplateParameterList *TPL) { 705 return TPL; 706 } 707 708 ExprResult TransformAddressOfOperand(Expr *E); 709 710 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 711 bool IsAddressOfOperand, 712 TypeSourceInfo **RecoveryTSI); 713 714 ExprResult TransformParenDependentScopeDeclRefExpr( 715 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 716 TypeSourceInfo **RecoveryTSI); 717 718 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 719 720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 721 // amount of stack usage with clang. 722 #define STMT(Node, Parent) \ 723 LLVM_ATTRIBUTE_NOINLINE \ 724 StmtResult Transform##Node(Node *S); 725 #define VALUESTMT(Node, Parent) \ 726 LLVM_ATTRIBUTE_NOINLINE \ 727 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 728 #define EXPR(Node, Parent) \ 729 LLVM_ATTRIBUTE_NOINLINE \ 730 ExprResult Transform##Node(Node *E); 731 #define ABSTRACT_STMT(Stmt) 732 #include "clang/AST/StmtNodes.inc" 733 734 #define GEN_CLANG_CLAUSE_CLASS 735 #define CLAUSE_CLASS(Enum, Str, Class) \ 736 LLVM_ATTRIBUTE_NOINLINE \ 737 OMPClause *Transform##Class(Class *S); 738 #include "llvm/Frontend/OpenMP/OMP.inc" 739 740 /// Build a new qualified type given its unqualified type and type location. 741 /// 742 /// By default, this routine adds type qualifiers only to types that can 743 /// have qualifiers, and silently suppresses those qualifiers that are not 744 /// permitted. Subclasses may override this routine to provide different 745 /// behavior. 746 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 747 748 /// Build a new pointer type given its pointee type. 749 /// 750 /// By default, performs semantic analysis when building the pointer type. 751 /// Subclasses may override this routine to provide different behavior. 752 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 753 754 /// Build a new block pointer type given its pointee type. 755 /// 756 /// By default, performs semantic analysis when building the block pointer 757 /// type. Subclasses may override this routine to provide different behavior. 758 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 759 760 /// Build a new reference type given the type it references. 761 /// 762 /// By default, performs semantic analysis when building the 763 /// reference type. Subclasses may override this routine to provide 764 /// different behavior. 765 /// 766 /// \param LValue whether the type was written with an lvalue sigil 767 /// or an rvalue sigil. 768 QualType RebuildReferenceType(QualType ReferentType, 769 bool LValue, 770 SourceLocation Sigil); 771 772 /// Build a new member pointer type given the pointee type and the 773 /// class type it refers into. 774 /// 775 /// By default, performs semantic analysis when building the member pointer 776 /// type. Subclasses may override this routine to provide different behavior. 777 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 778 SourceLocation Sigil); 779 780 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 781 SourceLocation ProtocolLAngleLoc, 782 ArrayRef<ObjCProtocolDecl *> Protocols, 783 ArrayRef<SourceLocation> ProtocolLocs, 784 SourceLocation ProtocolRAngleLoc); 785 786 /// Build an Objective-C object type. 787 /// 788 /// By default, performs semantic analysis when building the object type. 789 /// Subclasses may override this routine to provide different behavior. 790 QualType RebuildObjCObjectType(QualType BaseType, 791 SourceLocation Loc, 792 SourceLocation TypeArgsLAngleLoc, 793 ArrayRef<TypeSourceInfo *> TypeArgs, 794 SourceLocation TypeArgsRAngleLoc, 795 SourceLocation ProtocolLAngleLoc, 796 ArrayRef<ObjCProtocolDecl *> Protocols, 797 ArrayRef<SourceLocation> ProtocolLocs, 798 SourceLocation ProtocolRAngleLoc); 799 800 /// Build a new Objective-C object pointer type given the pointee type. 801 /// 802 /// By default, directly builds the pointer type, with no additional semantic 803 /// analysis. 804 QualType RebuildObjCObjectPointerType(QualType PointeeType, 805 SourceLocation Star); 806 807 /// Build a new array type given the element type, size 808 /// modifier, size of the array (if known), size expression, and index type 809 /// qualifiers. 810 /// 811 /// By default, performs semantic analysis when building the array type. 812 /// Subclasses may override this routine to provide different behavior. 813 /// Also by default, all of the other Rebuild*Array 814 QualType RebuildArrayType(QualType ElementType, 815 ArrayType::ArraySizeModifier SizeMod, 816 const llvm::APInt *Size, 817 Expr *SizeExpr, 818 unsigned IndexTypeQuals, 819 SourceRange BracketsRange); 820 821 /// Build a new constant array type given the element type, size 822 /// modifier, (known) size of the array, and index type qualifiers. 823 /// 824 /// By default, performs semantic analysis when building the array type. 825 /// Subclasses may override this routine to provide different behavior. 826 QualType RebuildConstantArrayType(QualType ElementType, 827 ArrayType::ArraySizeModifier SizeMod, 828 const llvm::APInt &Size, 829 Expr *SizeExpr, 830 unsigned IndexTypeQuals, 831 SourceRange BracketsRange); 832 833 /// Build a new incomplete array type given the element type, size 834 /// modifier, and index type qualifiers. 835 /// 836 /// By default, performs semantic analysis when building the array type. 837 /// Subclasses may override this routine to provide different behavior. 838 QualType RebuildIncompleteArrayType(QualType ElementType, 839 ArrayType::ArraySizeModifier SizeMod, 840 unsigned IndexTypeQuals, 841 SourceRange BracketsRange); 842 843 /// Build a new variable-length array type given the element type, 844 /// size modifier, size expression, and index type qualifiers. 845 /// 846 /// By default, performs semantic analysis when building the array type. 847 /// Subclasses may override this routine to provide different behavior. 848 QualType RebuildVariableArrayType(QualType ElementType, 849 ArrayType::ArraySizeModifier SizeMod, 850 Expr *SizeExpr, 851 unsigned IndexTypeQuals, 852 SourceRange BracketsRange); 853 854 /// Build a new dependent-sized array type given the element type, 855 /// size modifier, size expression, and index type qualifiers. 856 /// 857 /// By default, performs semantic analysis when building the array type. 858 /// Subclasses may override this routine to provide different behavior. 859 QualType RebuildDependentSizedArrayType(QualType ElementType, 860 ArrayType::ArraySizeModifier SizeMod, 861 Expr *SizeExpr, 862 unsigned IndexTypeQuals, 863 SourceRange BracketsRange); 864 865 /// Build a new vector type given the element type and 866 /// number of elements. 867 /// 868 /// By default, performs semantic analysis when building the vector type. 869 /// Subclasses may override this routine to provide different behavior. 870 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 871 VectorType::VectorKind VecKind); 872 873 /// Build a new potentially dependently-sized extended vector type 874 /// given the element type and number of elements. 875 /// 876 /// By default, performs semantic analysis when building the vector type. 877 /// Subclasses may override this routine to provide different behavior. 878 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 879 SourceLocation AttributeLoc, 880 VectorType::VectorKind); 881 882 /// Build a new extended vector type given the element type and 883 /// number of elements. 884 /// 885 /// By default, performs semantic analysis when building the vector type. 886 /// Subclasses may override this routine to provide different behavior. 887 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 888 SourceLocation AttributeLoc); 889 890 /// Build a new potentially dependently-sized extended vector type 891 /// given the element type and number of elements. 892 /// 893 /// By default, performs semantic analysis when building the vector type. 894 /// Subclasses may override this routine to provide different behavior. 895 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 896 Expr *SizeExpr, 897 SourceLocation AttributeLoc); 898 899 /// Build a new matrix type given the element type and dimensions. 900 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 901 unsigned NumColumns); 902 903 /// Build a new matrix type given the type and dependently-defined 904 /// dimensions. 905 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 906 Expr *ColumnExpr, 907 SourceLocation AttributeLoc); 908 909 /// Build a new DependentAddressSpaceType or return the pointee 910 /// type variable with the correct address space (retrieved from 911 /// AddrSpaceExpr) applied to it. The former will be returned in cases 912 /// where the address space remains dependent. 913 /// 914 /// By default, performs semantic analysis when building the type with address 915 /// space applied. Subclasses may override this routine to provide different 916 /// behavior. 917 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 918 Expr *AddrSpaceExpr, 919 SourceLocation AttributeLoc); 920 921 /// Build a new function type. 922 /// 923 /// By default, performs semantic analysis when building the function type. 924 /// Subclasses may override this routine to provide different behavior. 925 QualType RebuildFunctionProtoType(QualType T, 926 MutableArrayRef<QualType> ParamTypes, 927 const FunctionProtoType::ExtProtoInfo &EPI); 928 929 /// Build a new unprototyped function type. 930 QualType RebuildFunctionNoProtoType(QualType ResultType); 931 932 /// Rebuild an unresolved typename type, given the decl that 933 /// the UnresolvedUsingTypenameDecl was transformed to. 934 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 935 936 /// Build a new typedef type. 937 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 938 return SemaRef.Context.getTypeDeclType(Typedef); 939 } 940 941 /// Build a new MacroDefined type. 942 QualType RebuildMacroQualifiedType(QualType T, 943 const IdentifierInfo *MacroII) { 944 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 945 } 946 947 /// Build a new class/struct/union type. 948 QualType RebuildRecordType(RecordDecl *Record) { 949 return SemaRef.Context.getTypeDeclType(Record); 950 } 951 952 /// Build a new Enum type. 953 QualType RebuildEnumType(EnumDecl *Enum) { 954 return SemaRef.Context.getTypeDeclType(Enum); 955 } 956 957 /// Build a new typeof(expr) type. 958 /// 959 /// By default, performs semantic analysis when building the typeof type. 960 /// Subclasses may override this routine to provide different behavior. 961 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 962 963 /// Build a new typeof(type) type. 964 /// 965 /// By default, builds a new TypeOfType with the given underlying type. 966 QualType RebuildTypeOfType(QualType Underlying); 967 968 /// Build a new unary transform type. 969 QualType RebuildUnaryTransformType(QualType BaseType, 970 UnaryTransformType::UTTKind UKind, 971 SourceLocation Loc); 972 973 /// Build a new C++11 decltype type. 974 /// 975 /// By default, performs semantic analysis when building the decltype type. 976 /// Subclasses may override this routine to provide different behavior. 977 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 978 979 /// Build a new C++11 auto type. 980 /// 981 /// By default, builds a new AutoType with the given deduced type. 982 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 983 ConceptDecl *TypeConstraintConcept, 984 ArrayRef<TemplateArgument> TypeConstraintArgs) { 985 // Note, IsDependent is always false here: we implicitly convert an 'auto' 986 // which has been deduced to a dependent type into an undeduced 'auto', so 987 // that we'll retry deduction after the transformation. 988 return SemaRef.Context.getAutoType(Deduced, Keyword, 989 /*IsDependent*/ false, /*IsPack=*/false, 990 TypeConstraintConcept, 991 TypeConstraintArgs); 992 } 993 994 /// By default, builds a new DeducedTemplateSpecializationType with the given 995 /// deduced type. 996 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 997 QualType Deduced) { 998 return SemaRef.Context.getDeducedTemplateSpecializationType( 999 Template, Deduced, /*IsDependent*/ false); 1000 } 1001 1002 /// Build a new template specialization type. 1003 /// 1004 /// By default, performs semantic analysis when building the template 1005 /// specialization type. Subclasses may override this routine to provide 1006 /// different behavior. 1007 QualType RebuildTemplateSpecializationType(TemplateName Template, 1008 SourceLocation TemplateLoc, 1009 TemplateArgumentListInfo &Args); 1010 1011 /// Build a new parenthesized type. 1012 /// 1013 /// By default, builds a new ParenType type from the inner type. 1014 /// Subclasses may override this routine to provide different behavior. 1015 QualType RebuildParenType(QualType InnerType) { 1016 return SemaRef.BuildParenType(InnerType); 1017 } 1018 1019 /// Build a new qualified name type. 1020 /// 1021 /// By default, builds a new ElaboratedType type from the keyword, 1022 /// the nested-name-specifier and the named type. 1023 /// Subclasses may override this routine to provide different behavior. 1024 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1025 ElaboratedTypeKeyword Keyword, 1026 NestedNameSpecifierLoc QualifierLoc, 1027 QualType Named) { 1028 return SemaRef.Context.getElaboratedType(Keyword, 1029 QualifierLoc.getNestedNameSpecifier(), 1030 Named); 1031 } 1032 1033 /// Build a new typename type that refers to a template-id. 1034 /// 1035 /// By default, builds a new DependentNameType type from the 1036 /// nested-name-specifier and the given type. Subclasses may override 1037 /// this routine to provide different behavior. 1038 QualType RebuildDependentTemplateSpecializationType( 1039 ElaboratedTypeKeyword Keyword, 1040 NestedNameSpecifierLoc QualifierLoc, 1041 SourceLocation TemplateKWLoc, 1042 const IdentifierInfo *Name, 1043 SourceLocation NameLoc, 1044 TemplateArgumentListInfo &Args, 1045 bool AllowInjectedClassName) { 1046 // Rebuild the template name. 1047 // TODO: avoid TemplateName abstraction 1048 CXXScopeSpec SS; 1049 SS.Adopt(QualifierLoc); 1050 TemplateName InstName = getDerived().RebuildTemplateName( 1051 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1052 AllowInjectedClassName); 1053 1054 if (InstName.isNull()) 1055 return QualType(); 1056 1057 // If it's still dependent, make a dependent specialization. 1058 if (InstName.getAsDependentTemplateName()) 1059 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1060 QualifierLoc.getNestedNameSpecifier(), 1061 Name, 1062 Args); 1063 1064 // Otherwise, make an elaborated type wrapping a non-dependent 1065 // specialization. 1066 QualType T = 1067 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1068 if (T.isNull()) return QualType(); 1069 1070 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1071 return T; 1072 1073 return SemaRef.Context.getElaboratedType(Keyword, 1074 QualifierLoc.getNestedNameSpecifier(), 1075 T); 1076 } 1077 1078 /// Build a new typename type that refers to an identifier. 1079 /// 1080 /// By default, performs semantic analysis when building the typename type 1081 /// (or elaborated type). Subclasses may override this routine to provide 1082 /// different behavior. 1083 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1084 SourceLocation KeywordLoc, 1085 NestedNameSpecifierLoc QualifierLoc, 1086 const IdentifierInfo *Id, 1087 SourceLocation IdLoc, 1088 bool DeducedTSTContext) { 1089 CXXScopeSpec SS; 1090 SS.Adopt(QualifierLoc); 1091 1092 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1093 // If the name is still dependent, just build a new dependent name type. 1094 if (!SemaRef.computeDeclContext(SS)) 1095 return SemaRef.Context.getDependentNameType(Keyword, 1096 QualifierLoc.getNestedNameSpecifier(), 1097 Id); 1098 } 1099 1100 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1101 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1102 *Id, IdLoc, DeducedTSTContext); 1103 } 1104 1105 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1106 1107 // We had a dependent elaborated-type-specifier that has been transformed 1108 // into a non-dependent elaborated-type-specifier. Find the tag we're 1109 // referring to. 1110 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1111 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1112 if (!DC) 1113 return QualType(); 1114 1115 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1116 return QualType(); 1117 1118 TagDecl *Tag = nullptr; 1119 SemaRef.LookupQualifiedName(Result, DC); 1120 switch (Result.getResultKind()) { 1121 case LookupResult::NotFound: 1122 case LookupResult::NotFoundInCurrentInstantiation: 1123 break; 1124 1125 case LookupResult::Found: 1126 Tag = Result.getAsSingle<TagDecl>(); 1127 break; 1128 1129 case LookupResult::FoundOverloaded: 1130 case LookupResult::FoundUnresolvedValue: 1131 llvm_unreachable("Tag lookup cannot find non-tags"); 1132 1133 case LookupResult::Ambiguous: 1134 // Let the LookupResult structure handle ambiguities. 1135 return QualType(); 1136 } 1137 1138 if (!Tag) { 1139 // Check where the name exists but isn't a tag type and use that to emit 1140 // better diagnostics. 1141 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1142 SemaRef.LookupQualifiedName(Result, DC); 1143 switch (Result.getResultKind()) { 1144 case LookupResult::Found: 1145 case LookupResult::FoundOverloaded: 1146 case LookupResult::FoundUnresolvedValue: { 1147 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1148 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1149 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1150 << NTK << Kind; 1151 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1152 break; 1153 } 1154 default: 1155 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1156 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1157 break; 1158 } 1159 return QualType(); 1160 } 1161 1162 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1163 IdLoc, Id)) { 1164 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1165 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1166 return QualType(); 1167 } 1168 1169 // Build the elaborated-type-specifier type. 1170 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1171 return SemaRef.Context.getElaboratedType(Keyword, 1172 QualifierLoc.getNestedNameSpecifier(), 1173 T); 1174 } 1175 1176 /// Build a new pack expansion type. 1177 /// 1178 /// By default, builds a new PackExpansionType type from the given pattern. 1179 /// Subclasses may override this routine to provide different behavior. 1180 QualType RebuildPackExpansionType(QualType Pattern, 1181 SourceRange PatternRange, 1182 SourceLocation EllipsisLoc, 1183 Optional<unsigned> NumExpansions) { 1184 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1185 NumExpansions); 1186 } 1187 1188 /// Build a new atomic type given its value type. 1189 /// 1190 /// By default, performs semantic analysis when building the atomic type. 1191 /// Subclasses may override this routine to provide different behavior. 1192 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1193 1194 /// Build a new pipe type given its value type. 1195 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1196 bool isReadPipe); 1197 1198 /// Build an extended int given its value type. 1199 QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits, 1200 SourceLocation Loc); 1201 1202 /// Build a dependent extended int given its value type. 1203 QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr, 1204 SourceLocation Loc); 1205 1206 /// Build a new template name given a nested name specifier, a flag 1207 /// indicating whether the "template" keyword was provided, and the template 1208 /// that the template name refers to. 1209 /// 1210 /// By default, builds the new template name directly. Subclasses may override 1211 /// this routine to provide different behavior. 1212 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1213 bool TemplateKW, 1214 TemplateDecl *Template); 1215 1216 /// Build a new template name given a nested name specifier and the 1217 /// name that is referred to as a template. 1218 /// 1219 /// By default, performs semantic analysis to determine whether the name can 1220 /// be resolved to a specific template, then builds the appropriate kind of 1221 /// template name. Subclasses may override this routine to provide different 1222 /// behavior. 1223 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1224 SourceLocation TemplateKWLoc, 1225 const IdentifierInfo &Name, 1226 SourceLocation NameLoc, QualType ObjectType, 1227 NamedDecl *FirstQualifierInScope, 1228 bool AllowInjectedClassName); 1229 1230 /// Build a new template name given a nested name specifier and the 1231 /// overloaded operator name that is referred to as a template. 1232 /// 1233 /// By default, performs semantic analysis to determine whether the name can 1234 /// be resolved to a specific template, then builds the appropriate kind of 1235 /// template name. Subclasses may override this routine to provide different 1236 /// behavior. 1237 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1238 SourceLocation TemplateKWLoc, 1239 OverloadedOperatorKind Operator, 1240 SourceLocation NameLoc, QualType ObjectType, 1241 bool AllowInjectedClassName); 1242 1243 /// Build a new template name given a template template parameter pack 1244 /// and the 1245 /// 1246 /// By default, performs semantic analysis to determine whether the name can 1247 /// be resolved to a specific template, then builds the appropriate kind of 1248 /// template name. Subclasses may override this routine to provide different 1249 /// behavior. 1250 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1251 const TemplateArgument &ArgPack) { 1252 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1253 } 1254 1255 /// Build a new compound statement. 1256 /// 1257 /// By default, performs semantic analysis to build the new statement. 1258 /// Subclasses may override this routine to provide different behavior. 1259 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1260 MultiStmtArg Statements, 1261 SourceLocation RBraceLoc, 1262 bool IsStmtExpr) { 1263 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1264 IsStmtExpr); 1265 } 1266 1267 /// Build a new case statement. 1268 /// 1269 /// By default, performs semantic analysis to build the new statement. 1270 /// Subclasses may override this routine to provide different behavior. 1271 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1272 Expr *LHS, 1273 SourceLocation EllipsisLoc, 1274 Expr *RHS, 1275 SourceLocation ColonLoc) { 1276 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1277 ColonLoc); 1278 } 1279 1280 /// Attach the body to a new case statement. 1281 /// 1282 /// By default, performs semantic analysis to build the new statement. 1283 /// Subclasses may override this routine to provide different behavior. 1284 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1285 getSema().ActOnCaseStmtBody(S, Body); 1286 return S; 1287 } 1288 1289 /// Build a new default statement. 1290 /// 1291 /// By default, performs semantic analysis to build the new statement. 1292 /// Subclasses may override this routine to provide different behavior. 1293 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1294 SourceLocation ColonLoc, 1295 Stmt *SubStmt) { 1296 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1297 /*CurScope=*/nullptr); 1298 } 1299 1300 /// Build a new label statement. 1301 /// 1302 /// By default, performs semantic analysis to build the new statement. 1303 /// Subclasses may override this routine to provide different behavior. 1304 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1305 SourceLocation ColonLoc, Stmt *SubStmt) { 1306 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1307 } 1308 1309 /// Build a new attributed statement. 1310 /// 1311 /// By default, performs semantic analysis to build the new statement. 1312 /// Subclasses may override this routine to provide different behavior. 1313 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1314 ArrayRef<const Attr*> Attrs, 1315 Stmt *SubStmt) { 1316 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1317 } 1318 1319 /// Build a new "if" statement. 1320 /// 1321 /// By default, performs semantic analysis to build the new statement. 1322 /// Subclasses may override this routine to provide different behavior. 1323 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1324 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1325 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1326 SourceLocation ElseLoc, Stmt *Else) { 1327 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond, 1328 RParenLoc, Then, ElseLoc, Else); 1329 } 1330 1331 /// Start building a new switch statement. 1332 /// 1333 /// By default, performs semantic analysis to build the new statement. 1334 /// Subclasses may override this routine to provide different behavior. 1335 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1336 SourceLocation LParenLoc, Stmt *Init, 1337 Sema::ConditionResult Cond, 1338 SourceLocation RParenLoc) { 1339 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1340 RParenLoc); 1341 } 1342 1343 /// Attach the body to the switch statement. 1344 /// 1345 /// By default, performs semantic analysis to build the new statement. 1346 /// Subclasses may override this routine to provide different behavior. 1347 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1348 Stmt *Switch, Stmt *Body) { 1349 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1350 } 1351 1352 /// Build a new while statement. 1353 /// 1354 /// By default, performs semantic analysis to build the new statement. 1355 /// Subclasses may override this routine to provide different behavior. 1356 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1357 Sema::ConditionResult Cond, 1358 SourceLocation RParenLoc, Stmt *Body) { 1359 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1360 } 1361 1362 /// Build a new do-while statement. 1363 /// 1364 /// By default, performs semantic analysis to build the new statement. 1365 /// Subclasses may override this routine to provide different behavior. 1366 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1367 SourceLocation WhileLoc, SourceLocation LParenLoc, 1368 Expr *Cond, SourceLocation RParenLoc) { 1369 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1370 Cond, RParenLoc); 1371 } 1372 1373 /// Build a new for statement. 1374 /// 1375 /// By default, performs semantic analysis to build the new statement. 1376 /// Subclasses may override this routine to provide different behavior. 1377 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1378 Stmt *Init, Sema::ConditionResult Cond, 1379 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1380 Stmt *Body) { 1381 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1382 Inc, RParenLoc, Body); 1383 } 1384 1385 /// Build a new goto statement. 1386 /// 1387 /// By default, performs semantic analysis to build the new statement. 1388 /// Subclasses may override this routine to provide different behavior. 1389 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1390 LabelDecl *Label) { 1391 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1392 } 1393 1394 /// Build a new indirect goto statement. 1395 /// 1396 /// By default, performs semantic analysis to build the new statement. 1397 /// Subclasses may override this routine to provide different behavior. 1398 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1399 SourceLocation StarLoc, 1400 Expr *Target) { 1401 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1402 } 1403 1404 /// Build a new return statement. 1405 /// 1406 /// By default, performs semantic analysis to build the new statement. 1407 /// Subclasses may override this routine to provide different behavior. 1408 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1409 return getSema().BuildReturnStmt(ReturnLoc, Result); 1410 } 1411 1412 /// Build a new declaration statement. 1413 /// 1414 /// By default, performs semantic analysis to build the new statement. 1415 /// Subclasses may override this routine to provide different behavior. 1416 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1417 SourceLocation StartLoc, SourceLocation EndLoc) { 1418 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1419 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1420 } 1421 1422 /// Build a new inline asm statement. 1423 /// 1424 /// By default, performs semantic analysis to build the new statement. 1425 /// Subclasses may override this routine to provide different behavior. 1426 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1427 bool IsVolatile, unsigned NumOutputs, 1428 unsigned NumInputs, IdentifierInfo **Names, 1429 MultiExprArg Constraints, MultiExprArg Exprs, 1430 Expr *AsmString, MultiExprArg Clobbers, 1431 unsigned NumLabels, 1432 SourceLocation RParenLoc) { 1433 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1434 NumInputs, Names, Constraints, Exprs, 1435 AsmString, Clobbers, NumLabels, RParenLoc); 1436 } 1437 1438 /// Build a new MS style inline asm statement. 1439 /// 1440 /// By default, performs semantic analysis to build the new statement. 1441 /// Subclasses may override this routine to provide different behavior. 1442 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1443 ArrayRef<Token> AsmToks, 1444 StringRef AsmString, 1445 unsigned NumOutputs, unsigned NumInputs, 1446 ArrayRef<StringRef> Constraints, 1447 ArrayRef<StringRef> Clobbers, 1448 ArrayRef<Expr*> Exprs, 1449 SourceLocation EndLoc) { 1450 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1451 NumOutputs, NumInputs, 1452 Constraints, Clobbers, Exprs, EndLoc); 1453 } 1454 1455 /// Build a new co_return statement. 1456 /// 1457 /// By default, performs semantic analysis to build the new statement. 1458 /// Subclasses may override this routine to provide different behavior. 1459 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1460 bool IsImplicit) { 1461 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1462 } 1463 1464 /// Build a new co_await expression. 1465 /// 1466 /// By default, performs semantic analysis to build the new expression. 1467 /// Subclasses may override this routine to provide different behavior. 1468 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1469 bool IsImplicit) { 1470 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1471 } 1472 1473 /// Build a new co_await expression. 1474 /// 1475 /// By default, performs semantic analysis to build the new expression. 1476 /// Subclasses may override this routine to provide different behavior. 1477 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1478 Expr *Result, 1479 UnresolvedLookupExpr *Lookup) { 1480 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1481 } 1482 1483 /// Build a new co_yield expression. 1484 /// 1485 /// By default, performs semantic analysis to build the new expression. 1486 /// Subclasses may override this routine to provide different behavior. 1487 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1488 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1489 } 1490 1491 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1492 return getSema().BuildCoroutineBodyStmt(Args); 1493 } 1494 1495 /// Build a new Objective-C \@try statement. 1496 /// 1497 /// By default, performs semantic analysis to build the new statement. 1498 /// Subclasses may override this routine to provide different behavior. 1499 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1500 Stmt *TryBody, 1501 MultiStmtArg CatchStmts, 1502 Stmt *Finally) { 1503 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1504 Finally); 1505 } 1506 1507 /// Rebuild an Objective-C exception declaration. 1508 /// 1509 /// By default, performs semantic analysis to build the new declaration. 1510 /// Subclasses may override this routine to provide different behavior. 1511 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1512 TypeSourceInfo *TInfo, QualType T) { 1513 return getSema().BuildObjCExceptionDecl(TInfo, T, 1514 ExceptionDecl->getInnerLocStart(), 1515 ExceptionDecl->getLocation(), 1516 ExceptionDecl->getIdentifier()); 1517 } 1518 1519 /// Build a new Objective-C \@catch statement. 1520 /// 1521 /// By default, performs semantic analysis to build the new statement. 1522 /// Subclasses may override this routine to provide different behavior. 1523 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1524 SourceLocation RParenLoc, 1525 VarDecl *Var, 1526 Stmt *Body) { 1527 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1528 Var, Body); 1529 } 1530 1531 /// Build a new Objective-C \@finally statement. 1532 /// 1533 /// By default, performs semantic analysis to build the new statement. 1534 /// Subclasses may override this routine to provide different behavior. 1535 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1536 Stmt *Body) { 1537 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1538 } 1539 1540 /// Build a new Objective-C \@throw statement. 1541 /// 1542 /// By default, performs semantic analysis to build the new statement. 1543 /// Subclasses may override this routine to provide different behavior. 1544 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1545 Expr *Operand) { 1546 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1547 } 1548 1549 /// Build a new OpenMP Canonical loop. 1550 /// 1551 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1552 /// OMPCanonicalLoop. 1553 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1554 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1555 } 1556 1557 /// Build a new OpenMP executable directive. 1558 /// 1559 /// By default, performs semantic analysis to build the new statement. 1560 /// Subclasses may override this routine to provide different behavior. 1561 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1562 DeclarationNameInfo DirName, 1563 OpenMPDirectiveKind CancelRegion, 1564 ArrayRef<OMPClause *> Clauses, 1565 Stmt *AStmt, SourceLocation StartLoc, 1566 SourceLocation EndLoc) { 1567 return getSema().ActOnOpenMPExecutableDirective( 1568 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1569 } 1570 1571 /// Build a new OpenMP 'if' clause. 1572 /// 1573 /// By default, performs semantic analysis to build the new OpenMP clause. 1574 /// Subclasses may override this routine to provide different behavior. 1575 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1576 Expr *Condition, SourceLocation StartLoc, 1577 SourceLocation LParenLoc, 1578 SourceLocation NameModifierLoc, 1579 SourceLocation ColonLoc, 1580 SourceLocation EndLoc) { 1581 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1582 LParenLoc, NameModifierLoc, ColonLoc, 1583 EndLoc); 1584 } 1585 1586 /// Build a new OpenMP 'final' clause. 1587 /// 1588 /// By default, performs semantic analysis to build the new OpenMP clause. 1589 /// Subclasses may override this routine to provide different behavior. 1590 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1591 SourceLocation LParenLoc, 1592 SourceLocation EndLoc) { 1593 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1594 EndLoc); 1595 } 1596 1597 /// Build a new OpenMP 'num_threads' clause. 1598 /// 1599 /// By default, performs semantic analysis to build the new OpenMP clause. 1600 /// Subclasses may override this routine to provide different behavior. 1601 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1602 SourceLocation StartLoc, 1603 SourceLocation LParenLoc, 1604 SourceLocation EndLoc) { 1605 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1606 LParenLoc, EndLoc); 1607 } 1608 1609 /// Build a new OpenMP 'safelen' clause. 1610 /// 1611 /// By default, performs semantic analysis to build the new OpenMP clause. 1612 /// Subclasses may override this routine to provide different behavior. 1613 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1614 SourceLocation LParenLoc, 1615 SourceLocation EndLoc) { 1616 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1617 } 1618 1619 /// Build a new OpenMP 'simdlen' clause. 1620 /// 1621 /// By default, performs semantic analysis to build the new OpenMP clause. 1622 /// Subclasses may override this routine to provide different behavior. 1623 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1624 SourceLocation LParenLoc, 1625 SourceLocation EndLoc) { 1626 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1627 } 1628 1629 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1630 SourceLocation StartLoc, 1631 SourceLocation LParenLoc, 1632 SourceLocation EndLoc) { 1633 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1634 } 1635 1636 /// Build a new OpenMP 'allocator' clause. 1637 /// 1638 /// By default, performs semantic analysis to build the new OpenMP clause. 1639 /// Subclasses may override this routine to provide different behavior. 1640 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1641 SourceLocation LParenLoc, 1642 SourceLocation EndLoc) { 1643 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1644 } 1645 1646 /// Build a new OpenMP 'collapse' clause. 1647 /// 1648 /// By default, performs semantic analysis to build the new OpenMP clause. 1649 /// Subclasses may override this routine to provide different behavior. 1650 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1651 SourceLocation LParenLoc, 1652 SourceLocation EndLoc) { 1653 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1654 EndLoc); 1655 } 1656 1657 /// Build a new OpenMP 'default' clause. 1658 /// 1659 /// By default, performs semantic analysis to build the new OpenMP clause. 1660 /// Subclasses may override this routine to provide different behavior. 1661 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1662 SourceLocation StartLoc, 1663 SourceLocation LParenLoc, 1664 SourceLocation EndLoc) { 1665 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1666 StartLoc, LParenLoc, EndLoc); 1667 } 1668 1669 /// Build a new OpenMP 'proc_bind' clause. 1670 /// 1671 /// By default, performs semantic analysis to build the new OpenMP clause. 1672 /// Subclasses may override this routine to provide different behavior. 1673 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1674 SourceLocation KindKwLoc, 1675 SourceLocation StartLoc, 1676 SourceLocation LParenLoc, 1677 SourceLocation EndLoc) { 1678 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1679 StartLoc, LParenLoc, EndLoc); 1680 } 1681 1682 /// Build a new OpenMP 'schedule' clause. 1683 /// 1684 /// By default, performs semantic analysis to build the new OpenMP clause. 1685 /// Subclasses may override this routine to provide different behavior. 1686 OMPClause *RebuildOMPScheduleClause( 1687 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1688 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1689 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1690 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1691 return getSema().ActOnOpenMPScheduleClause( 1692 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1693 CommaLoc, EndLoc); 1694 } 1695 1696 /// Build a new OpenMP 'ordered' clause. 1697 /// 1698 /// By default, performs semantic analysis to build the new OpenMP clause. 1699 /// Subclasses may override this routine to provide different behavior. 1700 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1701 SourceLocation EndLoc, 1702 SourceLocation LParenLoc, Expr *Num) { 1703 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1704 } 1705 1706 /// Build a new OpenMP 'private' clause. 1707 /// 1708 /// By default, performs semantic analysis to build the new OpenMP clause. 1709 /// Subclasses may override this routine to provide different behavior. 1710 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1711 SourceLocation StartLoc, 1712 SourceLocation LParenLoc, 1713 SourceLocation EndLoc) { 1714 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1715 EndLoc); 1716 } 1717 1718 /// Build a new OpenMP 'firstprivate' clause. 1719 /// 1720 /// By default, performs semantic analysis to build the new OpenMP clause. 1721 /// Subclasses may override this routine to provide different behavior. 1722 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1723 SourceLocation StartLoc, 1724 SourceLocation LParenLoc, 1725 SourceLocation EndLoc) { 1726 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1727 EndLoc); 1728 } 1729 1730 /// Build a new OpenMP 'lastprivate' clause. 1731 /// 1732 /// By default, performs semantic analysis to build the new OpenMP clause. 1733 /// Subclasses may override this routine to provide different behavior. 1734 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1735 OpenMPLastprivateModifier LPKind, 1736 SourceLocation LPKindLoc, 1737 SourceLocation ColonLoc, 1738 SourceLocation StartLoc, 1739 SourceLocation LParenLoc, 1740 SourceLocation EndLoc) { 1741 return getSema().ActOnOpenMPLastprivateClause( 1742 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1743 } 1744 1745 /// Build a new OpenMP 'shared' clause. 1746 /// 1747 /// By default, performs semantic analysis to build the new OpenMP clause. 1748 /// Subclasses may override this routine to provide different behavior. 1749 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1750 SourceLocation StartLoc, 1751 SourceLocation LParenLoc, 1752 SourceLocation EndLoc) { 1753 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1754 EndLoc); 1755 } 1756 1757 /// Build a new OpenMP 'reduction' clause. 1758 /// 1759 /// By default, performs semantic analysis to build the new statement. 1760 /// Subclasses may override this routine to provide different behavior. 1761 OMPClause *RebuildOMPReductionClause( 1762 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1763 SourceLocation StartLoc, SourceLocation LParenLoc, 1764 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1765 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1766 const DeclarationNameInfo &ReductionId, 1767 ArrayRef<Expr *> UnresolvedReductions) { 1768 return getSema().ActOnOpenMPReductionClause( 1769 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1770 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1771 } 1772 1773 /// Build a new OpenMP 'task_reduction' clause. 1774 /// 1775 /// By default, performs semantic analysis to build the new statement. 1776 /// Subclasses may override this routine to provide different behavior. 1777 OMPClause *RebuildOMPTaskReductionClause( 1778 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1779 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1780 CXXScopeSpec &ReductionIdScopeSpec, 1781 const DeclarationNameInfo &ReductionId, 1782 ArrayRef<Expr *> UnresolvedReductions) { 1783 return getSema().ActOnOpenMPTaskReductionClause( 1784 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1785 ReductionId, UnresolvedReductions); 1786 } 1787 1788 /// Build a new OpenMP 'in_reduction' clause. 1789 /// 1790 /// By default, performs semantic analysis to build the new statement. 1791 /// Subclasses may override this routine to provide different behavior. 1792 OMPClause * 1793 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1794 SourceLocation LParenLoc, SourceLocation ColonLoc, 1795 SourceLocation EndLoc, 1796 CXXScopeSpec &ReductionIdScopeSpec, 1797 const DeclarationNameInfo &ReductionId, 1798 ArrayRef<Expr *> UnresolvedReductions) { 1799 return getSema().ActOnOpenMPInReductionClause( 1800 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1801 ReductionId, UnresolvedReductions); 1802 } 1803 1804 /// Build a new OpenMP 'linear' clause. 1805 /// 1806 /// By default, performs semantic analysis to build the new OpenMP clause. 1807 /// Subclasses may override this routine to provide different behavior. 1808 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1809 SourceLocation StartLoc, 1810 SourceLocation LParenLoc, 1811 OpenMPLinearClauseKind Modifier, 1812 SourceLocation ModifierLoc, 1813 SourceLocation ColonLoc, 1814 SourceLocation EndLoc) { 1815 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1816 Modifier, ModifierLoc, ColonLoc, 1817 EndLoc); 1818 } 1819 1820 /// Build a new OpenMP 'aligned' clause. 1821 /// 1822 /// By default, performs semantic analysis to build the new OpenMP clause. 1823 /// Subclasses may override this routine to provide different behavior. 1824 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1825 SourceLocation StartLoc, 1826 SourceLocation LParenLoc, 1827 SourceLocation ColonLoc, 1828 SourceLocation EndLoc) { 1829 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1830 LParenLoc, ColonLoc, EndLoc); 1831 } 1832 1833 /// Build a new OpenMP 'copyin' clause. 1834 /// 1835 /// By default, performs semantic analysis to build the new OpenMP clause. 1836 /// Subclasses may override this routine to provide different behavior. 1837 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1838 SourceLocation StartLoc, 1839 SourceLocation LParenLoc, 1840 SourceLocation EndLoc) { 1841 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1842 EndLoc); 1843 } 1844 1845 /// Build a new OpenMP 'copyprivate' clause. 1846 /// 1847 /// By default, performs semantic analysis to build the new OpenMP clause. 1848 /// Subclasses may override this routine to provide different behavior. 1849 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1850 SourceLocation StartLoc, 1851 SourceLocation LParenLoc, 1852 SourceLocation EndLoc) { 1853 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1854 EndLoc); 1855 } 1856 1857 /// Build a new OpenMP 'flush' pseudo clause. 1858 /// 1859 /// By default, performs semantic analysis to build the new OpenMP clause. 1860 /// Subclasses may override this routine to provide different behavior. 1861 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1862 SourceLocation StartLoc, 1863 SourceLocation LParenLoc, 1864 SourceLocation EndLoc) { 1865 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1866 EndLoc); 1867 } 1868 1869 /// Build a new OpenMP 'depobj' pseudo clause. 1870 /// 1871 /// By default, performs semantic analysis to build the new OpenMP clause. 1872 /// Subclasses may override this routine to provide different behavior. 1873 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1874 SourceLocation LParenLoc, 1875 SourceLocation EndLoc) { 1876 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1877 EndLoc); 1878 } 1879 1880 /// Build a new OpenMP 'depend' pseudo clause. 1881 /// 1882 /// By default, performs semantic analysis to build the new OpenMP clause. 1883 /// Subclasses may override this routine to provide different behavior. 1884 OMPClause * 1885 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1886 SourceLocation DepLoc, SourceLocation ColonLoc, 1887 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1888 SourceLocation LParenLoc, SourceLocation EndLoc) { 1889 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1890 ColonLoc, VarList, StartLoc, 1891 LParenLoc, EndLoc); 1892 } 1893 1894 /// Build a new OpenMP 'device' clause. 1895 /// 1896 /// By default, performs semantic analysis to build the new statement. 1897 /// Subclasses may override this routine to provide different behavior. 1898 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1899 Expr *Device, SourceLocation StartLoc, 1900 SourceLocation LParenLoc, 1901 SourceLocation ModifierLoc, 1902 SourceLocation EndLoc) { 1903 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1904 LParenLoc, ModifierLoc, EndLoc); 1905 } 1906 1907 /// Build a new OpenMP 'map' clause. 1908 /// 1909 /// By default, performs semantic analysis to build the new OpenMP clause. 1910 /// Subclasses may override this routine to provide different behavior. 1911 OMPClause *RebuildOMPMapClause( 1912 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1913 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1914 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1915 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1916 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1917 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1918 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1919 MapperIdScopeSpec, MapperId, MapType, 1920 IsMapTypeImplicit, MapLoc, ColonLoc, 1921 VarList, Locs, UnresolvedMappers); 1922 } 1923 1924 /// Build a new OpenMP 'allocate' clause. 1925 /// 1926 /// By default, performs semantic analysis to build the new OpenMP clause. 1927 /// Subclasses may override this routine to provide different behavior. 1928 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1929 SourceLocation StartLoc, 1930 SourceLocation LParenLoc, 1931 SourceLocation ColonLoc, 1932 SourceLocation EndLoc) { 1933 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1934 LParenLoc, ColonLoc, EndLoc); 1935 } 1936 1937 /// Build a new OpenMP 'num_teams' clause. 1938 /// 1939 /// By default, performs semantic analysis to build the new statement. 1940 /// Subclasses may override this routine to provide different behavior. 1941 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1942 SourceLocation LParenLoc, 1943 SourceLocation EndLoc) { 1944 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1945 EndLoc); 1946 } 1947 1948 /// Build a new OpenMP 'thread_limit' clause. 1949 /// 1950 /// By default, performs semantic analysis to build the new statement. 1951 /// Subclasses may override this routine to provide different behavior. 1952 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1953 SourceLocation StartLoc, 1954 SourceLocation LParenLoc, 1955 SourceLocation EndLoc) { 1956 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1957 LParenLoc, EndLoc); 1958 } 1959 1960 /// Build a new OpenMP 'priority' clause. 1961 /// 1962 /// By default, performs semantic analysis to build the new statement. 1963 /// Subclasses may override this routine to provide different behavior. 1964 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1965 SourceLocation LParenLoc, 1966 SourceLocation EndLoc) { 1967 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1968 EndLoc); 1969 } 1970 1971 /// Build a new OpenMP 'grainsize' clause. 1972 /// 1973 /// By default, performs semantic analysis to build the new statement. 1974 /// Subclasses may override this routine to provide different behavior. 1975 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1976 SourceLocation LParenLoc, 1977 SourceLocation EndLoc) { 1978 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1979 EndLoc); 1980 } 1981 1982 /// Build a new OpenMP 'num_tasks' clause. 1983 /// 1984 /// By default, performs semantic analysis to build the new statement. 1985 /// Subclasses may override this routine to provide different behavior. 1986 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1987 SourceLocation LParenLoc, 1988 SourceLocation EndLoc) { 1989 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1990 EndLoc); 1991 } 1992 1993 /// Build a new OpenMP 'hint' clause. 1994 /// 1995 /// By default, performs semantic analysis to build the new statement. 1996 /// Subclasses may override this routine to provide different behavior. 1997 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1998 SourceLocation LParenLoc, 1999 SourceLocation EndLoc) { 2000 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2001 } 2002 2003 /// Build a new OpenMP 'detach' clause. 2004 /// 2005 /// By default, performs semantic analysis to build the new statement. 2006 /// Subclasses may override this routine to provide different behavior. 2007 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2008 SourceLocation LParenLoc, 2009 SourceLocation EndLoc) { 2010 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2011 } 2012 2013 /// Build a new OpenMP 'dist_schedule' clause. 2014 /// 2015 /// By default, performs semantic analysis to build the new OpenMP clause. 2016 /// Subclasses may override this routine to provide different behavior. 2017 OMPClause * 2018 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2019 Expr *ChunkSize, SourceLocation StartLoc, 2020 SourceLocation LParenLoc, SourceLocation KindLoc, 2021 SourceLocation CommaLoc, SourceLocation EndLoc) { 2022 return getSema().ActOnOpenMPDistScheduleClause( 2023 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2024 } 2025 2026 /// Build a new OpenMP 'to' clause. 2027 /// 2028 /// By default, performs semantic analysis to build the new statement. 2029 /// Subclasses may override this routine to provide different behavior. 2030 OMPClause * 2031 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2032 ArrayRef<SourceLocation> MotionModifiersLoc, 2033 CXXScopeSpec &MapperIdScopeSpec, 2034 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2035 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2036 ArrayRef<Expr *> UnresolvedMappers) { 2037 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2038 MapperIdScopeSpec, MapperId, ColonLoc, 2039 VarList, Locs, UnresolvedMappers); 2040 } 2041 2042 /// Build a new OpenMP 'from' clause. 2043 /// 2044 /// By default, performs semantic analysis to build the new statement. 2045 /// Subclasses may override this routine to provide different behavior. 2046 OMPClause * 2047 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2048 ArrayRef<SourceLocation> MotionModifiersLoc, 2049 CXXScopeSpec &MapperIdScopeSpec, 2050 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2051 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2052 ArrayRef<Expr *> UnresolvedMappers) { 2053 return getSema().ActOnOpenMPFromClause( 2054 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2055 ColonLoc, VarList, Locs, UnresolvedMappers); 2056 } 2057 2058 /// Build a new OpenMP 'use_device_ptr' clause. 2059 /// 2060 /// By default, performs semantic analysis to build the new OpenMP clause. 2061 /// Subclasses may override this routine to provide different behavior. 2062 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2063 const OMPVarListLocTy &Locs) { 2064 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2065 } 2066 2067 /// Build a new OpenMP 'use_device_addr' clause. 2068 /// 2069 /// By default, performs semantic analysis to build the new OpenMP clause. 2070 /// Subclasses may override this routine to provide different behavior. 2071 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2072 const OMPVarListLocTy &Locs) { 2073 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2074 } 2075 2076 /// Build a new OpenMP 'is_device_ptr' clause. 2077 /// 2078 /// By default, performs semantic analysis to build the new OpenMP clause. 2079 /// Subclasses may override this routine to provide different behavior. 2080 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2081 const OMPVarListLocTy &Locs) { 2082 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2083 } 2084 2085 /// Build a new OpenMP 'defaultmap' clause. 2086 /// 2087 /// By default, performs semantic analysis to build the new OpenMP clause. 2088 /// Subclasses may override this routine to provide different behavior. 2089 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2090 OpenMPDefaultmapClauseKind Kind, 2091 SourceLocation StartLoc, 2092 SourceLocation LParenLoc, 2093 SourceLocation MLoc, 2094 SourceLocation KindLoc, 2095 SourceLocation EndLoc) { 2096 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2097 MLoc, KindLoc, EndLoc); 2098 } 2099 2100 /// Build a new OpenMP 'nontemporal' clause. 2101 /// 2102 /// By default, performs semantic analysis to build the new OpenMP clause. 2103 /// Subclasses may override this routine to provide different behavior. 2104 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2105 SourceLocation StartLoc, 2106 SourceLocation LParenLoc, 2107 SourceLocation EndLoc) { 2108 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2109 EndLoc); 2110 } 2111 2112 /// Build a new OpenMP 'inclusive' clause. 2113 /// 2114 /// By default, performs semantic analysis to build the new OpenMP clause. 2115 /// Subclasses may override this routine to provide different behavior. 2116 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2117 SourceLocation StartLoc, 2118 SourceLocation LParenLoc, 2119 SourceLocation EndLoc) { 2120 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2121 EndLoc); 2122 } 2123 2124 /// Build a new OpenMP 'exclusive' clause. 2125 /// 2126 /// By default, performs semantic analysis to build the new OpenMP clause. 2127 /// Subclasses may override this routine to provide different behavior. 2128 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2129 SourceLocation StartLoc, 2130 SourceLocation LParenLoc, 2131 SourceLocation EndLoc) { 2132 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2133 EndLoc); 2134 } 2135 2136 /// Build a new OpenMP 'uses_allocators' clause. 2137 /// 2138 /// By default, performs semantic analysis to build the new OpenMP clause. 2139 /// Subclasses may override this routine to provide different behavior. 2140 OMPClause *RebuildOMPUsesAllocatorsClause( 2141 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2142 SourceLocation LParenLoc, SourceLocation EndLoc) { 2143 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2144 Data); 2145 } 2146 2147 /// Build a new OpenMP 'affinity' clause. 2148 /// 2149 /// By default, performs semantic analysis to build the new OpenMP clause. 2150 /// Subclasses may override this routine to provide different behavior. 2151 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2152 SourceLocation LParenLoc, 2153 SourceLocation ColonLoc, 2154 SourceLocation EndLoc, Expr *Modifier, 2155 ArrayRef<Expr *> Locators) { 2156 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2157 EndLoc, Modifier, Locators); 2158 } 2159 2160 /// Build a new OpenMP 'order' clause. 2161 /// 2162 /// By default, performs semantic analysis to build the new OpenMP clause. 2163 /// Subclasses may override this routine to provide different behavior. 2164 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2165 SourceLocation KindKwLoc, 2166 SourceLocation StartLoc, 2167 SourceLocation LParenLoc, 2168 SourceLocation EndLoc) { 2169 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2170 LParenLoc, EndLoc); 2171 } 2172 2173 /// Build a new OpenMP 'init' clause. 2174 /// 2175 /// By default, performs semantic analysis to build the new OpenMP clause. 2176 /// Subclasses may override this routine to provide different behavior. 2177 OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2178 bool IsTarget, bool IsTargetSync, 2179 SourceLocation StartLoc, 2180 SourceLocation LParenLoc, 2181 SourceLocation VarLoc, 2182 SourceLocation EndLoc) { 2183 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2184 IsTargetSync, StartLoc, LParenLoc, 2185 VarLoc, EndLoc); 2186 } 2187 2188 /// Build a new OpenMP 'use' clause. 2189 /// 2190 /// By default, performs semantic analysis to build the new OpenMP clause. 2191 /// Subclasses may override this routine to provide different behavior. 2192 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2193 SourceLocation LParenLoc, 2194 SourceLocation VarLoc, SourceLocation EndLoc) { 2195 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2196 VarLoc, EndLoc); 2197 } 2198 2199 /// Build a new OpenMP 'destroy' clause. 2200 /// 2201 /// By default, performs semantic analysis to build the new OpenMP clause. 2202 /// Subclasses may override this routine to provide different behavior. 2203 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2204 SourceLocation LParenLoc, 2205 SourceLocation VarLoc, 2206 SourceLocation EndLoc) { 2207 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2208 VarLoc, EndLoc); 2209 } 2210 2211 /// Rebuild the operand to an Objective-C \@synchronized statement. 2212 /// 2213 /// By default, performs semantic analysis to build the new statement. 2214 /// Subclasses may override this routine to provide different behavior. 2215 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2216 Expr *object) { 2217 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2218 } 2219 2220 /// Build a new Objective-C \@synchronized statement. 2221 /// 2222 /// By default, performs semantic analysis to build the new statement. 2223 /// Subclasses may override this routine to provide different behavior. 2224 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2225 Expr *Object, Stmt *Body) { 2226 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2227 } 2228 2229 /// Build a new Objective-C \@autoreleasepool statement. 2230 /// 2231 /// By default, performs semantic analysis to build the new statement. 2232 /// Subclasses may override this routine to provide different behavior. 2233 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2234 Stmt *Body) { 2235 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2236 } 2237 2238 /// Build a new Objective-C fast enumeration statement. 2239 /// 2240 /// By default, performs semantic analysis to build the new statement. 2241 /// Subclasses may override this routine to provide different behavior. 2242 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2243 Stmt *Element, 2244 Expr *Collection, 2245 SourceLocation RParenLoc, 2246 Stmt *Body) { 2247 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2248 Element, 2249 Collection, 2250 RParenLoc); 2251 if (ForEachStmt.isInvalid()) 2252 return StmtError(); 2253 2254 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2255 } 2256 2257 /// Build a new C++ exception declaration. 2258 /// 2259 /// By default, performs semantic analysis to build the new decaration. 2260 /// Subclasses may override this routine to provide different behavior. 2261 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2262 TypeSourceInfo *Declarator, 2263 SourceLocation StartLoc, 2264 SourceLocation IdLoc, 2265 IdentifierInfo *Id) { 2266 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2267 StartLoc, IdLoc, Id); 2268 if (Var) 2269 getSema().CurContext->addDecl(Var); 2270 return Var; 2271 } 2272 2273 /// Build a new C++ catch statement. 2274 /// 2275 /// By default, performs semantic analysis to build the new statement. 2276 /// Subclasses may override this routine to provide different behavior. 2277 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2278 VarDecl *ExceptionDecl, 2279 Stmt *Handler) { 2280 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2281 Handler)); 2282 } 2283 2284 /// Build a new C++ try statement. 2285 /// 2286 /// By default, performs semantic analysis to build the new statement. 2287 /// Subclasses may override this routine to provide different behavior. 2288 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2289 ArrayRef<Stmt *> Handlers) { 2290 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2291 } 2292 2293 /// Build a new C++0x range-based for statement. 2294 /// 2295 /// By default, performs semantic analysis to build the new statement. 2296 /// Subclasses may override this routine to provide different behavior. 2297 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2298 SourceLocation CoawaitLoc, Stmt *Init, 2299 SourceLocation ColonLoc, Stmt *Range, 2300 Stmt *Begin, Stmt *End, Expr *Cond, 2301 Expr *Inc, Stmt *LoopVar, 2302 SourceLocation RParenLoc) { 2303 // If we've just learned that the range is actually an Objective-C 2304 // collection, treat this as an Objective-C fast enumeration loop. 2305 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2306 if (RangeStmt->isSingleDecl()) { 2307 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2308 if (RangeVar->isInvalidDecl()) 2309 return StmtError(); 2310 2311 Expr *RangeExpr = RangeVar->getInit(); 2312 if (!RangeExpr->isTypeDependent() && 2313 RangeExpr->getType()->isObjCObjectPointerType()) { 2314 // FIXME: Support init-statements in Objective-C++20 ranged for 2315 // statement. 2316 if (Init) { 2317 return SemaRef.Diag(Init->getBeginLoc(), 2318 diag::err_objc_for_range_init_stmt) 2319 << Init->getSourceRange(); 2320 } 2321 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2322 RangeExpr, RParenLoc); 2323 } 2324 } 2325 } 2326 } 2327 2328 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2329 Range, Begin, End, Cond, Inc, LoopVar, 2330 RParenLoc, Sema::BFRK_Rebuild); 2331 } 2332 2333 /// Build a new C++0x range-based for statement. 2334 /// 2335 /// By default, performs semantic analysis to build the new statement. 2336 /// Subclasses may override this routine to provide different behavior. 2337 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2338 bool IsIfExists, 2339 NestedNameSpecifierLoc QualifierLoc, 2340 DeclarationNameInfo NameInfo, 2341 Stmt *Nested) { 2342 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2343 QualifierLoc, NameInfo, Nested); 2344 } 2345 2346 /// Attach body to a C++0x range-based for statement. 2347 /// 2348 /// By default, performs semantic analysis to finish the new statement. 2349 /// Subclasses may override this routine to provide different behavior. 2350 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2351 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2352 } 2353 2354 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2355 Stmt *TryBlock, Stmt *Handler) { 2356 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2357 } 2358 2359 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2360 Stmt *Block) { 2361 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2362 } 2363 2364 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2365 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2366 } 2367 2368 /// Build a new predefined expression. 2369 /// 2370 /// By default, performs semantic analysis to build the new expression. 2371 /// Subclasses may override this routine to provide different behavior. 2372 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2373 PredefinedExpr::IdentKind IK) { 2374 return getSema().BuildPredefinedExpr(Loc, IK); 2375 } 2376 2377 /// Build a new expression that references a declaration. 2378 /// 2379 /// By default, performs semantic analysis to build the new expression. 2380 /// Subclasses may override this routine to provide different behavior. 2381 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2382 LookupResult &R, 2383 bool RequiresADL) { 2384 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2385 } 2386 2387 2388 /// Build a new expression that references a declaration. 2389 /// 2390 /// By default, performs semantic analysis to build the new expression. 2391 /// Subclasses may override this routine to provide different behavior. 2392 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2393 ValueDecl *VD, 2394 const DeclarationNameInfo &NameInfo, 2395 NamedDecl *Found, 2396 TemplateArgumentListInfo *TemplateArgs) { 2397 CXXScopeSpec SS; 2398 SS.Adopt(QualifierLoc); 2399 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2400 TemplateArgs); 2401 } 2402 2403 /// Build a new expression in parentheses. 2404 /// 2405 /// By default, performs semantic analysis to build the new expression. 2406 /// Subclasses may override this routine to provide different behavior. 2407 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2408 SourceLocation RParen) { 2409 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2410 } 2411 2412 /// Build a new pseudo-destructor expression. 2413 /// 2414 /// By default, performs semantic analysis to build the new expression. 2415 /// Subclasses may override this routine to provide different behavior. 2416 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2417 SourceLocation OperatorLoc, 2418 bool isArrow, 2419 CXXScopeSpec &SS, 2420 TypeSourceInfo *ScopeType, 2421 SourceLocation CCLoc, 2422 SourceLocation TildeLoc, 2423 PseudoDestructorTypeStorage Destroyed); 2424 2425 /// Build a new unary operator expression. 2426 /// 2427 /// By default, performs semantic analysis to build the new expression. 2428 /// Subclasses may override this routine to provide different behavior. 2429 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2430 UnaryOperatorKind Opc, 2431 Expr *SubExpr) { 2432 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2433 } 2434 2435 /// Build a new builtin offsetof expression. 2436 /// 2437 /// By default, performs semantic analysis to build the new expression. 2438 /// Subclasses may override this routine to provide different behavior. 2439 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2440 TypeSourceInfo *Type, 2441 ArrayRef<Sema::OffsetOfComponent> Components, 2442 SourceLocation RParenLoc) { 2443 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2444 RParenLoc); 2445 } 2446 2447 /// Build a new sizeof, alignof or vec_step expression with a 2448 /// type argument. 2449 /// 2450 /// By default, performs semantic analysis to build the new expression. 2451 /// Subclasses may override this routine to provide different behavior. 2452 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2453 SourceLocation OpLoc, 2454 UnaryExprOrTypeTrait ExprKind, 2455 SourceRange R) { 2456 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2457 } 2458 2459 /// Build a new sizeof, alignof or vec step expression with an 2460 /// expression argument. 2461 /// 2462 /// By default, performs semantic analysis to build the new expression. 2463 /// Subclasses may override this routine to provide different behavior. 2464 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2465 UnaryExprOrTypeTrait ExprKind, 2466 SourceRange R) { 2467 ExprResult Result 2468 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2469 if (Result.isInvalid()) 2470 return ExprError(); 2471 2472 return Result; 2473 } 2474 2475 /// Build a new array subscript expression. 2476 /// 2477 /// By default, performs semantic analysis to build the new expression. 2478 /// Subclasses may override this routine to provide different behavior. 2479 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2480 SourceLocation LBracketLoc, 2481 Expr *RHS, 2482 SourceLocation RBracketLoc) { 2483 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2484 LBracketLoc, RHS, 2485 RBracketLoc); 2486 } 2487 2488 /// Build a new matrix subscript expression. 2489 /// 2490 /// By default, performs semantic analysis to build the new expression. 2491 /// Subclasses may override this routine to provide different behavior. 2492 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2493 Expr *ColumnIdx, 2494 SourceLocation RBracketLoc) { 2495 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2496 RBracketLoc); 2497 } 2498 2499 /// Build a new array section expression. 2500 /// 2501 /// By default, performs semantic analysis to build the new expression. 2502 /// Subclasses may override this routine to provide different behavior. 2503 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2504 Expr *LowerBound, 2505 SourceLocation ColonLocFirst, 2506 SourceLocation ColonLocSecond, 2507 Expr *Length, Expr *Stride, 2508 SourceLocation RBracketLoc) { 2509 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2510 ColonLocFirst, ColonLocSecond, 2511 Length, Stride, RBracketLoc); 2512 } 2513 2514 /// Build a new array shaping expression. 2515 /// 2516 /// By default, performs semantic analysis to build the new expression. 2517 /// Subclasses may override this routine to provide different behavior. 2518 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2519 SourceLocation RParenLoc, 2520 ArrayRef<Expr *> Dims, 2521 ArrayRef<SourceRange> BracketsRanges) { 2522 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2523 BracketsRanges); 2524 } 2525 2526 /// Build a new iterator expression. 2527 /// 2528 /// By default, performs semantic analysis to build the new expression. 2529 /// Subclasses may override this routine to provide different behavior. 2530 ExprResult RebuildOMPIteratorExpr( 2531 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2532 ArrayRef<Sema::OMPIteratorData> Data) { 2533 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2534 LLoc, RLoc, Data); 2535 } 2536 2537 /// Build a new call expression. 2538 /// 2539 /// By default, performs semantic analysis to build the new expression. 2540 /// Subclasses may override this routine to provide different behavior. 2541 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2542 MultiExprArg Args, 2543 SourceLocation RParenLoc, 2544 Expr *ExecConfig = nullptr) { 2545 return getSema().ActOnCallExpr( 2546 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2547 } 2548 2549 /// Build a new member access expression. 2550 /// 2551 /// By default, performs semantic analysis to build the new expression. 2552 /// Subclasses may override this routine to provide different behavior. 2553 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2554 bool isArrow, 2555 NestedNameSpecifierLoc QualifierLoc, 2556 SourceLocation TemplateKWLoc, 2557 const DeclarationNameInfo &MemberNameInfo, 2558 ValueDecl *Member, 2559 NamedDecl *FoundDecl, 2560 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2561 NamedDecl *FirstQualifierInScope) { 2562 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2563 isArrow); 2564 if (!Member->getDeclName()) { 2565 // We have a reference to an unnamed field. This is always the 2566 // base of an anonymous struct/union member access, i.e. the 2567 // field is always of record type. 2568 assert(Member->getType()->isRecordType() && 2569 "unnamed member not of record type?"); 2570 2571 BaseResult = 2572 getSema().PerformObjectMemberConversion(BaseResult.get(), 2573 QualifierLoc.getNestedNameSpecifier(), 2574 FoundDecl, Member); 2575 if (BaseResult.isInvalid()) 2576 return ExprError(); 2577 Base = BaseResult.get(); 2578 2579 CXXScopeSpec EmptySS; 2580 return getSema().BuildFieldReferenceExpr( 2581 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2582 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2583 } 2584 2585 CXXScopeSpec SS; 2586 SS.Adopt(QualifierLoc); 2587 2588 Base = BaseResult.get(); 2589 QualType BaseType = Base->getType(); 2590 2591 if (isArrow && !BaseType->isPointerType()) 2592 return ExprError(); 2593 2594 // FIXME: this involves duplicating earlier analysis in a lot of 2595 // cases; we should avoid this when possible. 2596 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2597 R.addDecl(FoundDecl); 2598 R.resolveKind(); 2599 2600 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2601 SS, TemplateKWLoc, 2602 FirstQualifierInScope, 2603 R, ExplicitTemplateArgs, 2604 /*S*/nullptr); 2605 } 2606 2607 /// Build a new binary operator expression. 2608 /// 2609 /// By default, performs semantic analysis to build the new expression. 2610 /// Subclasses may override this routine to provide different behavior. 2611 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2612 BinaryOperatorKind Opc, 2613 Expr *LHS, Expr *RHS) { 2614 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2615 } 2616 2617 /// Build a new rewritten operator expression. 2618 /// 2619 /// By default, performs semantic analysis to build the new expression. 2620 /// Subclasses may override this routine to provide different behavior. 2621 ExprResult RebuildCXXRewrittenBinaryOperator( 2622 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2623 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2624 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2625 RHS, /*RequiresADL*/false); 2626 } 2627 2628 /// Build a new conditional operator expression. 2629 /// 2630 /// By default, performs semantic analysis to build the new expression. 2631 /// Subclasses may override this routine to provide different behavior. 2632 ExprResult RebuildConditionalOperator(Expr *Cond, 2633 SourceLocation QuestionLoc, 2634 Expr *LHS, 2635 SourceLocation ColonLoc, 2636 Expr *RHS) { 2637 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2638 LHS, RHS); 2639 } 2640 2641 /// Build a new C-style cast 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 RebuildCStyleCastExpr(SourceLocation LParenLoc, 2646 TypeSourceInfo *TInfo, 2647 SourceLocation RParenLoc, 2648 Expr *SubExpr) { 2649 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2650 SubExpr); 2651 } 2652 2653 /// Build a new compound literal expression. 2654 /// 2655 /// By default, performs semantic analysis to build the new expression. 2656 /// Subclasses may override this routine to provide different behavior. 2657 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2658 TypeSourceInfo *TInfo, 2659 SourceLocation RParenLoc, 2660 Expr *Init) { 2661 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2662 Init); 2663 } 2664 2665 /// Build a new extended vector element access expression. 2666 /// 2667 /// By default, performs semantic analysis to build the new expression. 2668 /// Subclasses may override this routine to provide different behavior. 2669 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2670 SourceLocation OpLoc, 2671 SourceLocation AccessorLoc, 2672 IdentifierInfo &Accessor) { 2673 2674 CXXScopeSpec SS; 2675 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2676 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2677 OpLoc, /*IsArrow*/ false, 2678 SS, SourceLocation(), 2679 /*FirstQualifierInScope*/ nullptr, 2680 NameInfo, 2681 /* TemplateArgs */ nullptr, 2682 /*S*/ nullptr); 2683 } 2684 2685 /// Build a new initializer list expression. 2686 /// 2687 /// By default, performs semantic analysis to build the new expression. 2688 /// Subclasses may override this routine to provide different behavior. 2689 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2690 MultiExprArg Inits, 2691 SourceLocation RBraceLoc) { 2692 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2693 } 2694 2695 /// Build a new designated initializer expression. 2696 /// 2697 /// By default, performs semantic analysis to build the new expression. 2698 /// Subclasses may override this routine to provide different behavior. 2699 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2700 MultiExprArg ArrayExprs, 2701 SourceLocation EqualOrColonLoc, 2702 bool GNUSyntax, 2703 Expr *Init) { 2704 ExprResult Result 2705 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2706 Init); 2707 if (Result.isInvalid()) 2708 return ExprError(); 2709 2710 return Result; 2711 } 2712 2713 /// Build a new value-initialized expression. 2714 /// 2715 /// By default, builds the implicit value initialization without performing 2716 /// any semantic analysis. Subclasses may override this routine to provide 2717 /// different behavior. 2718 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2719 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2720 } 2721 2722 /// Build a new \c va_arg 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 RebuildVAArgExpr(SourceLocation BuiltinLoc, 2727 Expr *SubExpr, TypeSourceInfo *TInfo, 2728 SourceLocation RParenLoc) { 2729 return getSema().BuildVAArgExpr(BuiltinLoc, 2730 SubExpr, TInfo, 2731 RParenLoc); 2732 } 2733 2734 /// Build a new expression list in parentheses. 2735 /// 2736 /// By default, performs semantic analysis to build the new expression. 2737 /// Subclasses may override this routine to provide different behavior. 2738 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2739 MultiExprArg SubExprs, 2740 SourceLocation RParenLoc) { 2741 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2742 } 2743 2744 /// Build a new address-of-label expression. 2745 /// 2746 /// By default, performs semantic analysis, using the name of the label 2747 /// rather than attempting to map the label statement itself. 2748 /// Subclasses may override this routine to provide different behavior. 2749 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2750 SourceLocation LabelLoc, LabelDecl *Label) { 2751 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2752 } 2753 2754 /// Build a new GNU statement expression. 2755 /// 2756 /// By default, performs semantic analysis to build the new expression. 2757 /// Subclasses may override this routine to provide different behavior. 2758 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2759 SourceLocation RParenLoc, unsigned TemplateDepth) { 2760 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2761 TemplateDepth); 2762 } 2763 2764 /// Build a new __builtin_choose_expr expression. 2765 /// 2766 /// By default, performs semantic analysis to build the new expression. 2767 /// Subclasses may override this routine to provide different behavior. 2768 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2769 Expr *Cond, Expr *LHS, Expr *RHS, 2770 SourceLocation RParenLoc) { 2771 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2772 Cond, LHS, RHS, 2773 RParenLoc); 2774 } 2775 2776 /// Build a new generic selection expression. 2777 /// 2778 /// By default, performs semantic analysis to build the new expression. 2779 /// Subclasses may override this routine to provide different behavior. 2780 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2781 SourceLocation DefaultLoc, 2782 SourceLocation RParenLoc, 2783 Expr *ControllingExpr, 2784 ArrayRef<TypeSourceInfo *> Types, 2785 ArrayRef<Expr *> Exprs) { 2786 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2787 ControllingExpr, Types, Exprs); 2788 } 2789 2790 /// Build a new overloaded operator call expression. 2791 /// 2792 /// By default, performs semantic analysis to build the new expression. 2793 /// The semantic analysis provides the behavior of template instantiation, 2794 /// copying with transformations that turn what looks like an overloaded 2795 /// operator call into a use of a builtin operator, performing 2796 /// argument-dependent lookup, etc. Subclasses may override this routine to 2797 /// provide different behavior. 2798 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2799 SourceLocation OpLoc, 2800 Expr *Callee, 2801 Expr *First, 2802 Expr *Second); 2803 2804 /// Build a new C++ "named" cast expression, such as static_cast or 2805 /// reinterpret_cast. 2806 /// 2807 /// By default, this routine dispatches to one of the more-specific routines 2808 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2809 /// Subclasses may override this routine to provide different behavior. 2810 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2811 Stmt::StmtClass Class, 2812 SourceLocation LAngleLoc, 2813 TypeSourceInfo *TInfo, 2814 SourceLocation RAngleLoc, 2815 SourceLocation LParenLoc, 2816 Expr *SubExpr, 2817 SourceLocation RParenLoc) { 2818 switch (Class) { 2819 case Stmt::CXXStaticCastExprClass: 2820 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2821 RAngleLoc, LParenLoc, 2822 SubExpr, RParenLoc); 2823 2824 case Stmt::CXXDynamicCastExprClass: 2825 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2826 RAngleLoc, LParenLoc, 2827 SubExpr, RParenLoc); 2828 2829 case Stmt::CXXReinterpretCastExprClass: 2830 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2831 RAngleLoc, LParenLoc, 2832 SubExpr, 2833 RParenLoc); 2834 2835 case Stmt::CXXConstCastExprClass: 2836 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2837 RAngleLoc, LParenLoc, 2838 SubExpr, RParenLoc); 2839 2840 case Stmt::CXXAddrspaceCastExprClass: 2841 return getDerived().RebuildCXXAddrspaceCastExpr( 2842 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2843 2844 default: 2845 llvm_unreachable("Invalid C++ named cast"); 2846 } 2847 } 2848 2849 /// Build a new C++ static_cast expression. 2850 /// 2851 /// By default, performs semantic analysis to build the new expression. 2852 /// Subclasses may override this routine to provide different behavior. 2853 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2854 SourceLocation LAngleLoc, 2855 TypeSourceInfo *TInfo, 2856 SourceLocation RAngleLoc, 2857 SourceLocation LParenLoc, 2858 Expr *SubExpr, 2859 SourceLocation RParenLoc) { 2860 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2861 TInfo, SubExpr, 2862 SourceRange(LAngleLoc, RAngleLoc), 2863 SourceRange(LParenLoc, RParenLoc)); 2864 } 2865 2866 /// Build a new C++ dynamic_cast expression. 2867 /// 2868 /// By default, performs semantic analysis to build the new expression. 2869 /// Subclasses may override this routine to provide different behavior. 2870 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2871 SourceLocation LAngleLoc, 2872 TypeSourceInfo *TInfo, 2873 SourceLocation RAngleLoc, 2874 SourceLocation LParenLoc, 2875 Expr *SubExpr, 2876 SourceLocation RParenLoc) { 2877 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2878 TInfo, SubExpr, 2879 SourceRange(LAngleLoc, RAngleLoc), 2880 SourceRange(LParenLoc, RParenLoc)); 2881 } 2882 2883 /// Build a new C++ reinterpret_cast expression. 2884 /// 2885 /// By default, performs semantic analysis to build the new expression. 2886 /// Subclasses may override this routine to provide different behavior. 2887 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2888 SourceLocation LAngleLoc, 2889 TypeSourceInfo *TInfo, 2890 SourceLocation RAngleLoc, 2891 SourceLocation LParenLoc, 2892 Expr *SubExpr, 2893 SourceLocation RParenLoc) { 2894 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2895 TInfo, SubExpr, 2896 SourceRange(LAngleLoc, RAngleLoc), 2897 SourceRange(LParenLoc, RParenLoc)); 2898 } 2899 2900 /// Build a new C++ const_cast expression. 2901 /// 2902 /// By default, performs semantic analysis to build the new expression. 2903 /// Subclasses may override this routine to provide different behavior. 2904 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2905 SourceLocation LAngleLoc, 2906 TypeSourceInfo *TInfo, 2907 SourceLocation RAngleLoc, 2908 SourceLocation LParenLoc, 2909 Expr *SubExpr, 2910 SourceLocation RParenLoc) { 2911 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2912 TInfo, SubExpr, 2913 SourceRange(LAngleLoc, RAngleLoc), 2914 SourceRange(LParenLoc, RParenLoc)); 2915 } 2916 2917 ExprResult 2918 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2919 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2920 SourceLocation LParenLoc, Expr *SubExpr, 2921 SourceLocation RParenLoc) { 2922 return getSema().BuildCXXNamedCast( 2923 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2924 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2925 } 2926 2927 /// Build a new C++ functional-style cast expression. 2928 /// 2929 /// By default, performs semantic analysis to build the new expression. 2930 /// Subclasses may override this routine to provide different behavior. 2931 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2932 SourceLocation LParenLoc, 2933 Expr *Sub, 2934 SourceLocation RParenLoc, 2935 bool ListInitialization) { 2936 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2937 MultiExprArg(&Sub, 1), RParenLoc, 2938 ListInitialization); 2939 } 2940 2941 /// Build a new C++ __builtin_bit_cast expression. 2942 /// 2943 /// By default, performs semantic analysis to build the new expression. 2944 /// Subclasses may override this routine to provide different behavior. 2945 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2946 TypeSourceInfo *TSI, Expr *Sub, 2947 SourceLocation RParenLoc) { 2948 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2949 } 2950 2951 /// Build a new C++ typeid(type) expression. 2952 /// 2953 /// By default, performs semantic analysis to build the new expression. 2954 /// Subclasses may override this routine to provide different behavior. 2955 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2956 SourceLocation TypeidLoc, 2957 TypeSourceInfo *Operand, 2958 SourceLocation RParenLoc) { 2959 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2960 RParenLoc); 2961 } 2962 2963 2964 /// Build a new C++ typeid(expr) expression. 2965 /// 2966 /// By default, performs semantic analysis to build the new expression. 2967 /// Subclasses may override this routine to provide different behavior. 2968 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2969 SourceLocation TypeidLoc, 2970 Expr *Operand, 2971 SourceLocation RParenLoc) { 2972 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2973 RParenLoc); 2974 } 2975 2976 /// Build a new C++ __uuidof(type) expression. 2977 /// 2978 /// By default, performs semantic analysis to build the new expression. 2979 /// Subclasses may override this routine to provide different behavior. 2980 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2981 TypeSourceInfo *Operand, 2982 SourceLocation RParenLoc) { 2983 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2984 } 2985 2986 /// Build a new C++ __uuidof(expr) expression. 2987 /// 2988 /// By default, performs semantic analysis to build the new expression. 2989 /// Subclasses may override this routine to provide different behavior. 2990 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2991 Expr *Operand, SourceLocation RParenLoc) { 2992 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2993 } 2994 2995 /// Build a new C++ "this" expression. 2996 /// 2997 /// By default, builds a new "this" expression without performing any 2998 /// semantic analysis. Subclasses may override this routine to provide 2999 /// different behavior. 3000 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3001 QualType ThisType, 3002 bool isImplicit) { 3003 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3004 } 3005 3006 /// Build a new C++ throw expression. 3007 /// 3008 /// By default, performs semantic analysis to build the new expression. 3009 /// Subclasses may override this routine to provide different behavior. 3010 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3011 bool IsThrownVariableInScope) { 3012 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3013 } 3014 3015 /// Build a new C++ default-argument expression. 3016 /// 3017 /// By default, builds a new default-argument expression, which does not 3018 /// require any semantic analysis. Subclasses may override this routine to 3019 /// provide different behavior. 3020 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3021 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3022 getSema().CurContext); 3023 } 3024 3025 /// Build a new C++11 default-initialization expression. 3026 /// 3027 /// By default, builds a new default field initialization expression, which 3028 /// does not require any semantic analysis. Subclasses may override this 3029 /// routine to provide different behavior. 3030 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3031 FieldDecl *Field) { 3032 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3033 getSema().CurContext); 3034 } 3035 3036 /// Build a new C++ zero-initialization expression. 3037 /// 3038 /// By default, performs semantic analysis to build the new expression. 3039 /// Subclasses may override this routine to provide different behavior. 3040 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3041 SourceLocation LParenLoc, 3042 SourceLocation RParenLoc) { 3043 return getSema().BuildCXXTypeConstructExpr( 3044 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3045 } 3046 3047 /// Build a new C++ "new" expression. 3048 /// 3049 /// By default, performs semantic analysis to build the new expression. 3050 /// Subclasses may override this routine to provide different behavior. 3051 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3052 bool UseGlobal, 3053 SourceLocation PlacementLParen, 3054 MultiExprArg PlacementArgs, 3055 SourceLocation PlacementRParen, 3056 SourceRange TypeIdParens, 3057 QualType AllocatedType, 3058 TypeSourceInfo *AllocatedTypeInfo, 3059 Optional<Expr *> ArraySize, 3060 SourceRange DirectInitRange, 3061 Expr *Initializer) { 3062 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3063 PlacementLParen, 3064 PlacementArgs, 3065 PlacementRParen, 3066 TypeIdParens, 3067 AllocatedType, 3068 AllocatedTypeInfo, 3069 ArraySize, 3070 DirectInitRange, 3071 Initializer); 3072 } 3073 3074 /// Build a new C++ "delete" expression. 3075 /// 3076 /// By default, performs semantic analysis to build the new expression. 3077 /// Subclasses may override this routine to provide different behavior. 3078 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3079 bool IsGlobalDelete, 3080 bool IsArrayForm, 3081 Expr *Operand) { 3082 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3083 Operand); 3084 } 3085 3086 /// Build a new type trait expression. 3087 /// 3088 /// By default, performs semantic analysis to build the new expression. 3089 /// Subclasses may override this routine to provide different behavior. 3090 ExprResult RebuildTypeTrait(TypeTrait Trait, 3091 SourceLocation StartLoc, 3092 ArrayRef<TypeSourceInfo *> Args, 3093 SourceLocation RParenLoc) { 3094 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3095 } 3096 3097 /// Build a new array type trait expression. 3098 /// 3099 /// By default, performs semantic analysis to build the new expression. 3100 /// Subclasses may override this routine to provide different behavior. 3101 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3102 SourceLocation StartLoc, 3103 TypeSourceInfo *TSInfo, 3104 Expr *DimExpr, 3105 SourceLocation RParenLoc) { 3106 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3107 } 3108 3109 /// Build a new expression trait expression. 3110 /// 3111 /// By default, performs semantic analysis to build the new expression. 3112 /// Subclasses may override this routine to provide different behavior. 3113 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3114 SourceLocation StartLoc, 3115 Expr *Queried, 3116 SourceLocation RParenLoc) { 3117 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3118 } 3119 3120 /// Build a new (previously unresolved) declaration reference 3121 /// expression. 3122 /// 3123 /// By default, performs semantic analysis to build the new expression. 3124 /// Subclasses may override this routine to provide different behavior. 3125 ExprResult RebuildDependentScopeDeclRefExpr( 3126 NestedNameSpecifierLoc QualifierLoc, 3127 SourceLocation TemplateKWLoc, 3128 const DeclarationNameInfo &NameInfo, 3129 const TemplateArgumentListInfo *TemplateArgs, 3130 bool IsAddressOfOperand, 3131 TypeSourceInfo **RecoveryTSI) { 3132 CXXScopeSpec SS; 3133 SS.Adopt(QualifierLoc); 3134 3135 if (TemplateArgs || TemplateKWLoc.isValid()) 3136 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3137 TemplateArgs); 3138 3139 return getSema().BuildQualifiedDeclarationNameExpr( 3140 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3141 } 3142 3143 /// Build a new template-id expression. 3144 /// 3145 /// By default, performs semantic analysis to build the new expression. 3146 /// Subclasses may override this routine to provide different behavior. 3147 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3148 SourceLocation TemplateKWLoc, 3149 LookupResult &R, 3150 bool RequiresADL, 3151 const TemplateArgumentListInfo *TemplateArgs) { 3152 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3153 TemplateArgs); 3154 } 3155 3156 /// Build a new object-construction expression. 3157 /// 3158 /// By default, performs semantic analysis to build the new expression. 3159 /// Subclasses may override this routine to provide different behavior. 3160 ExprResult RebuildCXXConstructExpr(QualType T, 3161 SourceLocation Loc, 3162 CXXConstructorDecl *Constructor, 3163 bool IsElidable, 3164 MultiExprArg Args, 3165 bool HadMultipleCandidates, 3166 bool ListInitialization, 3167 bool StdInitListInitialization, 3168 bool RequiresZeroInit, 3169 CXXConstructExpr::ConstructionKind ConstructKind, 3170 SourceRange ParenRange) { 3171 // Reconstruct the constructor we originally found, which might be 3172 // different if this is a call to an inherited constructor. 3173 CXXConstructorDecl *FoundCtor = Constructor; 3174 if (Constructor->isInheritingConstructor()) 3175 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3176 3177 SmallVector<Expr *, 8> ConvertedArgs; 3178 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3179 ConvertedArgs)) 3180 return ExprError(); 3181 3182 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3183 IsElidable, 3184 ConvertedArgs, 3185 HadMultipleCandidates, 3186 ListInitialization, 3187 StdInitListInitialization, 3188 RequiresZeroInit, ConstructKind, 3189 ParenRange); 3190 } 3191 3192 /// Build a new implicit construction via inherited constructor 3193 /// expression. 3194 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3195 CXXConstructorDecl *Constructor, 3196 bool ConstructsVBase, 3197 bool InheritedFromVBase) { 3198 return new (getSema().Context) CXXInheritedCtorInitExpr( 3199 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3200 } 3201 3202 /// Build a new object-construction expression. 3203 /// 3204 /// By default, performs semantic analysis to build the new expression. 3205 /// Subclasses may override this routine to provide different behavior. 3206 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3207 SourceLocation LParenOrBraceLoc, 3208 MultiExprArg Args, 3209 SourceLocation RParenOrBraceLoc, 3210 bool ListInitialization) { 3211 return getSema().BuildCXXTypeConstructExpr( 3212 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3213 } 3214 3215 /// Build a new object-construction expression. 3216 /// 3217 /// By default, performs semantic analysis to build the new expression. 3218 /// Subclasses may override this routine to provide different behavior. 3219 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3220 SourceLocation LParenLoc, 3221 MultiExprArg Args, 3222 SourceLocation RParenLoc, 3223 bool ListInitialization) { 3224 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3225 RParenLoc, ListInitialization); 3226 } 3227 3228 /// Build a new member reference expression. 3229 /// 3230 /// By default, performs semantic analysis to build the new expression. 3231 /// Subclasses may override this routine to provide different behavior. 3232 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3233 QualType BaseType, 3234 bool IsArrow, 3235 SourceLocation OperatorLoc, 3236 NestedNameSpecifierLoc QualifierLoc, 3237 SourceLocation TemplateKWLoc, 3238 NamedDecl *FirstQualifierInScope, 3239 const DeclarationNameInfo &MemberNameInfo, 3240 const TemplateArgumentListInfo *TemplateArgs) { 3241 CXXScopeSpec SS; 3242 SS.Adopt(QualifierLoc); 3243 3244 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3245 OperatorLoc, IsArrow, 3246 SS, TemplateKWLoc, 3247 FirstQualifierInScope, 3248 MemberNameInfo, 3249 TemplateArgs, /*S*/nullptr); 3250 } 3251 3252 /// Build a new member reference expression. 3253 /// 3254 /// By default, performs semantic analysis to build the new expression. 3255 /// Subclasses may override this routine to provide different behavior. 3256 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3257 SourceLocation OperatorLoc, 3258 bool IsArrow, 3259 NestedNameSpecifierLoc QualifierLoc, 3260 SourceLocation TemplateKWLoc, 3261 NamedDecl *FirstQualifierInScope, 3262 LookupResult &R, 3263 const TemplateArgumentListInfo *TemplateArgs) { 3264 CXXScopeSpec SS; 3265 SS.Adopt(QualifierLoc); 3266 3267 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3268 OperatorLoc, IsArrow, 3269 SS, TemplateKWLoc, 3270 FirstQualifierInScope, 3271 R, TemplateArgs, /*S*/nullptr); 3272 } 3273 3274 /// Build a new noexcept expression. 3275 /// 3276 /// By default, performs semantic analysis to build the new expression. 3277 /// Subclasses may override this routine to provide different behavior. 3278 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3279 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3280 } 3281 3282 /// Build a new expression to compute the length of a parameter pack. 3283 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3284 NamedDecl *Pack, 3285 SourceLocation PackLoc, 3286 SourceLocation RParenLoc, 3287 Optional<unsigned> Length, 3288 ArrayRef<TemplateArgument> PartialArgs) { 3289 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3290 RParenLoc, Length, PartialArgs); 3291 } 3292 3293 /// Build a new expression representing a call to a source location 3294 /// builtin. 3295 /// 3296 /// By default, performs semantic analysis to build the new expression. 3297 /// Subclasses may override this routine to provide different behavior. 3298 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3299 SourceLocation BuiltinLoc, 3300 SourceLocation RPLoc, 3301 DeclContext *ParentContext) { 3302 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3303 } 3304 3305 /// Build a new Objective-C boxed expression. 3306 /// 3307 /// By default, performs semantic analysis to build the new expression. 3308 /// Subclasses may override this routine to provide different behavior. 3309 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3310 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3311 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3312 TemplateArgumentListInfo *TALI) { 3313 CXXScopeSpec SS; 3314 SS.Adopt(NNS); 3315 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3316 ConceptNameInfo, 3317 FoundDecl, 3318 NamedConcept, TALI); 3319 if (Result.isInvalid()) 3320 return ExprError(); 3321 return Result; 3322 } 3323 3324 /// \brief Build a new requires expression. 3325 /// 3326 /// By default, performs semantic analysis to build the new expression. 3327 /// Subclasses may override this routine to provide different behavior. 3328 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3329 RequiresExprBodyDecl *Body, 3330 ArrayRef<ParmVarDecl *> LocalParameters, 3331 ArrayRef<concepts::Requirement *> Requirements, 3332 SourceLocation ClosingBraceLoc) { 3333 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3334 LocalParameters, Requirements, ClosingBraceLoc); 3335 } 3336 3337 concepts::TypeRequirement * 3338 RebuildTypeRequirement( 3339 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3340 return SemaRef.BuildTypeRequirement(SubstDiag); 3341 } 3342 3343 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3344 return SemaRef.BuildTypeRequirement(T); 3345 } 3346 3347 concepts::ExprRequirement * 3348 RebuildExprRequirement( 3349 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3350 SourceLocation NoexceptLoc, 3351 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3352 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3353 std::move(Ret)); 3354 } 3355 3356 concepts::ExprRequirement * 3357 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3358 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3359 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3360 std::move(Ret)); 3361 } 3362 3363 concepts::NestedRequirement * 3364 RebuildNestedRequirement( 3365 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3366 return SemaRef.BuildNestedRequirement(SubstDiag); 3367 } 3368 3369 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3370 return SemaRef.BuildNestedRequirement(Constraint); 3371 } 3372 3373 /// \brief Build a new Objective-C boxed expression. 3374 /// 3375 /// By default, performs semantic analysis to build the new expression. 3376 /// Subclasses may override this routine to provide different behavior. 3377 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3378 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3379 } 3380 3381 /// Build a new Objective-C array literal. 3382 /// 3383 /// By default, performs semantic analysis to build the new expression. 3384 /// Subclasses may override this routine to provide different behavior. 3385 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3386 Expr **Elements, unsigned NumElements) { 3387 return getSema().BuildObjCArrayLiteral(Range, 3388 MultiExprArg(Elements, NumElements)); 3389 } 3390 3391 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3392 Expr *Base, Expr *Key, 3393 ObjCMethodDecl *getterMethod, 3394 ObjCMethodDecl *setterMethod) { 3395 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3396 getterMethod, setterMethod); 3397 } 3398 3399 /// Build a new Objective-C dictionary literal. 3400 /// 3401 /// By default, performs semantic analysis to build the new expression. 3402 /// Subclasses may override this routine to provide different behavior. 3403 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3404 MutableArrayRef<ObjCDictionaryElement> Elements) { 3405 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3406 } 3407 3408 /// Build a new Objective-C \@encode expression. 3409 /// 3410 /// By default, performs semantic analysis to build the new expression. 3411 /// Subclasses may override this routine to provide different behavior. 3412 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3413 TypeSourceInfo *EncodeTypeInfo, 3414 SourceLocation RParenLoc) { 3415 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3416 } 3417 3418 /// Build a new Objective-C class message. 3419 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3420 Selector Sel, 3421 ArrayRef<SourceLocation> SelectorLocs, 3422 ObjCMethodDecl *Method, 3423 SourceLocation LBracLoc, 3424 MultiExprArg Args, 3425 SourceLocation RBracLoc) { 3426 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3427 ReceiverTypeInfo->getType(), 3428 /*SuperLoc=*/SourceLocation(), 3429 Sel, Method, LBracLoc, SelectorLocs, 3430 RBracLoc, Args); 3431 } 3432 3433 /// Build a new Objective-C instance message. 3434 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3435 Selector Sel, 3436 ArrayRef<SourceLocation> SelectorLocs, 3437 ObjCMethodDecl *Method, 3438 SourceLocation LBracLoc, 3439 MultiExprArg Args, 3440 SourceLocation RBracLoc) { 3441 return SemaRef.BuildInstanceMessage(Receiver, 3442 Receiver->getType(), 3443 /*SuperLoc=*/SourceLocation(), 3444 Sel, Method, LBracLoc, SelectorLocs, 3445 RBracLoc, Args); 3446 } 3447 3448 /// Build a new Objective-C instance/class message to 'super'. 3449 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3450 Selector Sel, 3451 ArrayRef<SourceLocation> SelectorLocs, 3452 QualType SuperType, 3453 ObjCMethodDecl *Method, 3454 SourceLocation LBracLoc, 3455 MultiExprArg Args, 3456 SourceLocation RBracLoc) { 3457 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3458 SuperType, 3459 SuperLoc, 3460 Sel, Method, LBracLoc, SelectorLocs, 3461 RBracLoc, Args) 3462 : SemaRef.BuildClassMessage(nullptr, 3463 SuperType, 3464 SuperLoc, 3465 Sel, Method, LBracLoc, SelectorLocs, 3466 RBracLoc, Args); 3467 3468 3469 } 3470 3471 /// Build a new Objective-C ivar reference 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 RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3476 SourceLocation IvarLoc, 3477 bool IsArrow, bool IsFreeIvar) { 3478 CXXScopeSpec SS; 3479 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3480 ExprResult Result = getSema().BuildMemberReferenceExpr( 3481 BaseArg, BaseArg->getType(), 3482 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3483 /*FirstQualifierInScope=*/nullptr, NameInfo, 3484 /*TemplateArgs=*/nullptr, 3485 /*S=*/nullptr); 3486 if (IsFreeIvar && Result.isUsable()) 3487 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3488 return Result; 3489 } 3490 3491 /// Build a new Objective-C property reference expression. 3492 /// 3493 /// By default, performs semantic analysis to build the new expression. 3494 /// Subclasses may override this routine to provide different behavior. 3495 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3496 ObjCPropertyDecl *Property, 3497 SourceLocation PropertyLoc) { 3498 CXXScopeSpec SS; 3499 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3500 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3501 /*FIXME:*/PropertyLoc, 3502 /*IsArrow=*/false, 3503 SS, SourceLocation(), 3504 /*FirstQualifierInScope=*/nullptr, 3505 NameInfo, 3506 /*TemplateArgs=*/nullptr, 3507 /*S=*/nullptr); 3508 } 3509 3510 /// Build a new Objective-C property reference expression. 3511 /// 3512 /// By default, performs semantic analysis to build the new expression. 3513 /// Subclasses may override this routine to provide different behavior. 3514 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3515 ObjCMethodDecl *Getter, 3516 ObjCMethodDecl *Setter, 3517 SourceLocation PropertyLoc) { 3518 // Since these expressions can only be value-dependent, we do not 3519 // need to perform semantic analysis again. 3520 return Owned( 3521 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3522 VK_LValue, OK_ObjCProperty, 3523 PropertyLoc, Base)); 3524 } 3525 3526 /// Build a new Objective-C "isa" expression. 3527 /// 3528 /// By default, performs semantic analysis to build the new expression. 3529 /// Subclasses may override this routine to provide different behavior. 3530 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3531 SourceLocation OpLoc, bool IsArrow) { 3532 CXXScopeSpec SS; 3533 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3534 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3535 OpLoc, IsArrow, 3536 SS, SourceLocation(), 3537 /*FirstQualifierInScope=*/nullptr, 3538 NameInfo, 3539 /*TemplateArgs=*/nullptr, 3540 /*S=*/nullptr); 3541 } 3542 3543 /// Build a new shuffle vector expression. 3544 /// 3545 /// By default, performs semantic analysis to build the new expression. 3546 /// Subclasses may override this routine to provide different behavior. 3547 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3548 MultiExprArg SubExprs, 3549 SourceLocation RParenLoc) { 3550 // Find the declaration for __builtin_shufflevector 3551 const IdentifierInfo &Name 3552 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3553 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3554 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3555 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3556 3557 // Build a reference to the __builtin_shufflevector builtin 3558 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3559 Expr *Callee = new (SemaRef.Context) 3560 DeclRefExpr(SemaRef.Context, Builtin, false, 3561 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3562 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3563 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3564 CK_BuiltinFnToFnPtr).get(); 3565 3566 // Build the CallExpr 3567 ExprResult TheCall = CallExpr::Create( 3568 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3569 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3570 FPOptionsOverride()); 3571 3572 // Type-check the __builtin_shufflevector expression. 3573 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3574 } 3575 3576 /// Build a new convert vector expression. 3577 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3578 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3579 SourceLocation RParenLoc) { 3580 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3581 BuiltinLoc, RParenLoc); 3582 } 3583 3584 /// Build a new template argument pack expansion. 3585 /// 3586 /// By default, performs semantic analysis to build a new pack expansion 3587 /// for a template argument. Subclasses may override this routine to provide 3588 /// different behavior. 3589 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3590 SourceLocation EllipsisLoc, 3591 Optional<unsigned> NumExpansions) { 3592 switch (Pattern.getArgument().getKind()) { 3593 case TemplateArgument::Expression: { 3594 ExprResult Result 3595 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3596 EllipsisLoc, NumExpansions); 3597 if (Result.isInvalid()) 3598 return TemplateArgumentLoc(); 3599 3600 return TemplateArgumentLoc(Result.get(), Result.get()); 3601 } 3602 3603 case TemplateArgument::Template: 3604 return TemplateArgumentLoc( 3605 SemaRef.Context, 3606 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3607 NumExpansions), 3608 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3609 EllipsisLoc); 3610 3611 case TemplateArgument::Null: 3612 case TemplateArgument::Integral: 3613 case TemplateArgument::Declaration: 3614 case TemplateArgument::Pack: 3615 case TemplateArgument::TemplateExpansion: 3616 case TemplateArgument::NullPtr: 3617 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3618 3619 case TemplateArgument::Type: 3620 if (TypeSourceInfo *Expansion 3621 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3622 EllipsisLoc, 3623 NumExpansions)) 3624 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3625 Expansion); 3626 break; 3627 } 3628 3629 return TemplateArgumentLoc(); 3630 } 3631 3632 /// Build a new expression pack expansion. 3633 /// 3634 /// By default, performs semantic analysis to build a new pack expansion 3635 /// for an expression. Subclasses may override this routine to provide 3636 /// different behavior. 3637 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3638 Optional<unsigned> NumExpansions) { 3639 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3640 } 3641 3642 /// Build a new C++1z fold-expression. 3643 /// 3644 /// By default, performs semantic analysis in order to build a new fold 3645 /// expression. 3646 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3647 SourceLocation LParenLoc, Expr *LHS, 3648 BinaryOperatorKind Operator, 3649 SourceLocation EllipsisLoc, Expr *RHS, 3650 SourceLocation RParenLoc, 3651 Optional<unsigned> NumExpansions) { 3652 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3653 EllipsisLoc, RHS, RParenLoc, 3654 NumExpansions); 3655 } 3656 3657 /// Build an empty C++1z fold-expression with the given operator. 3658 /// 3659 /// By default, produces the fallback value for the fold-expression, or 3660 /// produce an error if there is no fallback value. 3661 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3662 BinaryOperatorKind Operator) { 3663 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3664 } 3665 3666 /// Build a new atomic operation expression. 3667 /// 3668 /// By default, performs semantic analysis to build the new expression. 3669 /// Subclasses may override this routine to provide different behavior. 3670 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3671 AtomicExpr::AtomicOp Op, 3672 SourceLocation RParenLoc) { 3673 // Use this for all of the locations, since we don't know the difference 3674 // between the call and the expr at this point. 3675 SourceRange Range{BuiltinLoc, RParenLoc}; 3676 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3677 Sema::AtomicArgumentOrder::AST); 3678 } 3679 3680 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3681 ArrayRef<Expr *> SubExprs, QualType Type) { 3682 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3683 } 3684 3685 private: 3686 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3687 QualType ObjectType, 3688 NamedDecl *FirstQualifierInScope, 3689 CXXScopeSpec &SS); 3690 3691 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3692 QualType ObjectType, 3693 NamedDecl *FirstQualifierInScope, 3694 CXXScopeSpec &SS); 3695 3696 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3697 NamedDecl *FirstQualifierInScope, 3698 CXXScopeSpec &SS); 3699 3700 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3701 DependentNameTypeLoc TL, 3702 bool DeducibleTSTContext); 3703 }; 3704 3705 template <typename Derived> 3706 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3707 if (!S) 3708 return S; 3709 3710 switch (S->getStmtClass()) { 3711 case Stmt::NoStmtClass: break; 3712 3713 // Transform individual statement nodes 3714 // Pass SDK into statements that can produce a value 3715 #define STMT(Node, Parent) \ 3716 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3717 #define VALUESTMT(Node, Parent) \ 3718 case Stmt::Node##Class: \ 3719 return getDerived().Transform##Node(cast<Node>(S), SDK); 3720 #define ABSTRACT_STMT(Node) 3721 #define EXPR(Node, Parent) 3722 #include "clang/AST/StmtNodes.inc" 3723 3724 // Transform expressions by calling TransformExpr. 3725 #define STMT(Node, Parent) 3726 #define ABSTRACT_STMT(Stmt) 3727 #define EXPR(Node, Parent) case Stmt::Node##Class: 3728 #include "clang/AST/StmtNodes.inc" 3729 { 3730 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3731 3732 if (SDK == SDK_StmtExprResult) 3733 E = getSema().ActOnStmtExprResult(E); 3734 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3735 } 3736 } 3737 3738 return S; 3739 } 3740 3741 template<typename Derived> 3742 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3743 if (!S) 3744 return S; 3745 3746 switch (S->getClauseKind()) { 3747 default: break; 3748 // Transform individual clause nodes 3749 #define GEN_CLANG_CLAUSE_CLASS 3750 #define CLAUSE_CLASS(Enum, Str, Class) \ 3751 case Enum: \ 3752 return getDerived().Transform##Class(cast<Class>(S)); 3753 #include "llvm/Frontend/OpenMP/OMP.inc" 3754 } 3755 3756 return S; 3757 } 3758 3759 3760 template<typename Derived> 3761 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3762 if (!E) 3763 return E; 3764 3765 switch (E->getStmtClass()) { 3766 case Stmt::NoStmtClass: break; 3767 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3768 #define ABSTRACT_STMT(Stmt) 3769 #define EXPR(Node, Parent) \ 3770 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3771 #include "clang/AST/StmtNodes.inc" 3772 } 3773 3774 return E; 3775 } 3776 3777 template<typename Derived> 3778 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3779 bool NotCopyInit) { 3780 // Initializers are instantiated like expressions, except that various outer 3781 // layers are stripped. 3782 if (!Init) 3783 return Init; 3784 3785 if (auto *FE = dyn_cast<FullExpr>(Init)) 3786 Init = FE->getSubExpr(); 3787 3788 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3789 Init = AIL->getCommonExpr(); 3790 3791 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3792 Init = MTE->getSubExpr(); 3793 3794 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3795 Init = Binder->getSubExpr(); 3796 3797 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3798 Init = ICE->getSubExprAsWritten(); 3799 3800 if (CXXStdInitializerListExpr *ILE = 3801 dyn_cast<CXXStdInitializerListExpr>(Init)) 3802 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3803 3804 // If this is copy-initialization, we only need to reconstruct 3805 // InitListExprs. Other forms of copy-initialization will be a no-op if 3806 // the initializer is already the right type. 3807 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3808 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3809 return getDerived().TransformExpr(Init); 3810 3811 // Revert value-initialization back to empty parens. 3812 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3813 SourceRange Parens = VIE->getSourceRange(); 3814 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3815 Parens.getEnd()); 3816 } 3817 3818 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3819 if (isa<ImplicitValueInitExpr>(Init)) 3820 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3821 SourceLocation()); 3822 3823 // Revert initialization by constructor back to a parenthesized or braced list 3824 // of expressions. Any other form of initializer can just be reused directly. 3825 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3826 return getDerived().TransformExpr(Init); 3827 3828 // If the initialization implicitly converted an initializer list to a 3829 // std::initializer_list object, unwrap the std::initializer_list too. 3830 if (Construct && Construct->isStdInitListInitialization()) 3831 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3832 3833 // Enter a list-init context if this was list initialization. 3834 EnterExpressionEvaluationContext Context( 3835 getSema(), EnterExpressionEvaluationContext::InitList, 3836 Construct->isListInitialization()); 3837 3838 SmallVector<Expr*, 8> NewArgs; 3839 bool ArgChanged = false; 3840 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3841 /*IsCall*/true, NewArgs, &ArgChanged)) 3842 return ExprError(); 3843 3844 // If this was list initialization, revert to syntactic list form. 3845 if (Construct->isListInitialization()) 3846 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3847 Construct->getEndLoc()); 3848 3849 // Build a ParenListExpr to represent anything else. 3850 SourceRange Parens = Construct->getParenOrBraceRange(); 3851 if (Parens.isInvalid()) { 3852 // This was a variable declaration's initialization for which no initializer 3853 // was specified. 3854 assert(NewArgs.empty() && 3855 "no parens or braces but have direct init with arguments?"); 3856 return ExprEmpty(); 3857 } 3858 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3859 Parens.getEnd()); 3860 } 3861 3862 template<typename Derived> 3863 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3864 unsigned NumInputs, 3865 bool IsCall, 3866 SmallVectorImpl<Expr *> &Outputs, 3867 bool *ArgChanged) { 3868 for (unsigned I = 0; I != NumInputs; ++I) { 3869 // If requested, drop call arguments that need to be dropped. 3870 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3871 if (ArgChanged) 3872 *ArgChanged = true; 3873 3874 break; 3875 } 3876 3877 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3878 Expr *Pattern = Expansion->getPattern(); 3879 3880 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3881 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3882 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3883 3884 // Determine whether the set of unexpanded parameter packs can and should 3885 // be expanded. 3886 bool Expand = true; 3887 bool RetainExpansion = false; 3888 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3889 Optional<unsigned> NumExpansions = OrigNumExpansions; 3890 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3891 Pattern->getSourceRange(), 3892 Unexpanded, 3893 Expand, RetainExpansion, 3894 NumExpansions)) 3895 return true; 3896 3897 if (!Expand) { 3898 // The transform has determined that we should perform a simple 3899 // transformation on the pack expansion, producing another pack 3900 // expansion. 3901 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3902 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3903 if (OutPattern.isInvalid()) 3904 return true; 3905 3906 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3907 Expansion->getEllipsisLoc(), 3908 NumExpansions); 3909 if (Out.isInvalid()) 3910 return true; 3911 3912 if (ArgChanged) 3913 *ArgChanged = true; 3914 Outputs.push_back(Out.get()); 3915 continue; 3916 } 3917 3918 // Record right away that the argument was changed. This needs 3919 // to happen even if the array expands to nothing. 3920 if (ArgChanged) *ArgChanged = true; 3921 3922 // The transform has determined that we should perform an elementwise 3923 // expansion of the pattern. Do so. 3924 for (unsigned I = 0; I != *NumExpansions; ++I) { 3925 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3926 ExprResult Out = getDerived().TransformExpr(Pattern); 3927 if (Out.isInvalid()) 3928 return true; 3929 3930 if (Out.get()->containsUnexpandedParameterPack()) { 3931 Out = getDerived().RebuildPackExpansion( 3932 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3933 if (Out.isInvalid()) 3934 return true; 3935 } 3936 3937 Outputs.push_back(Out.get()); 3938 } 3939 3940 // If we're supposed to retain a pack expansion, do so by temporarily 3941 // forgetting the partially-substituted parameter pack. 3942 if (RetainExpansion) { 3943 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3944 3945 ExprResult Out = getDerived().TransformExpr(Pattern); 3946 if (Out.isInvalid()) 3947 return true; 3948 3949 Out = getDerived().RebuildPackExpansion( 3950 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3951 if (Out.isInvalid()) 3952 return true; 3953 3954 Outputs.push_back(Out.get()); 3955 } 3956 3957 continue; 3958 } 3959 3960 ExprResult Result = 3961 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3962 : getDerived().TransformExpr(Inputs[I]); 3963 if (Result.isInvalid()) 3964 return true; 3965 3966 if (Result.get() != Inputs[I] && ArgChanged) 3967 *ArgChanged = true; 3968 3969 Outputs.push_back(Result.get()); 3970 } 3971 3972 return false; 3973 } 3974 3975 template <typename Derived> 3976 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3977 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3978 if (Var) { 3979 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3980 getDerived().TransformDefinition(Var->getLocation(), Var)); 3981 3982 if (!ConditionVar) 3983 return Sema::ConditionError(); 3984 3985 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3986 } 3987 3988 if (Expr) { 3989 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3990 3991 if (CondExpr.isInvalid()) 3992 return Sema::ConditionError(); 3993 3994 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3995 } 3996 3997 return Sema::ConditionResult(); 3998 } 3999 4000 template<typename Derived> 4001 NestedNameSpecifierLoc 4002 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4003 NestedNameSpecifierLoc NNS, 4004 QualType ObjectType, 4005 NamedDecl *FirstQualifierInScope) { 4006 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4007 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4008 Qualifier = Qualifier.getPrefix()) 4009 Qualifiers.push_back(Qualifier); 4010 4011 CXXScopeSpec SS; 4012 while (!Qualifiers.empty()) { 4013 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4014 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4015 4016 switch (QNNS->getKind()) { 4017 case NestedNameSpecifier::Identifier: { 4018 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4019 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 4020 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4021 SS, FirstQualifierInScope, false)) 4022 return NestedNameSpecifierLoc(); 4023 } 4024 break; 4025 4026 case NestedNameSpecifier::Namespace: { 4027 NamespaceDecl *NS 4028 = cast_or_null<NamespaceDecl>( 4029 getDerived().TransformDecl( 4030 Q.getLocalBeginLoc(), 4031 QNNS->getAsNamespace())); 4032 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4033 break; 4034 } 4035 4036 case NestedNameSpecifier::NamespaceAlias: { 4037 NamespaceAliasDecl *Alias 4038 = cast_or_null<NamespaceAliasDecl>( 4039 getDerived().TransformDecl(Q.getLocalBeginLoc(), 4040 QNNS->getAsNamespaceAlias())); 4041 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4042 Q.getLocalEndLoc()); 4043 break; 4044 } 4045 4046 case NestedNameSpecifier::Global: 4047 // There is no meaningful transformation that one could perform on the 4048 // global scope. 4049 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4050 break; 4051 4052 case NestedNameSpecifier::Super: { 4053 CXXRecordDecl *RD = 4054 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4055 SourceLocation(), QNNS->getAsRecordDecl())); 4056 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4057 break; 4058 } 4059 4060 case NestedNameSpecifier::TypeSpecWithTemplate: 4061 case NestedNameSpecifier::TypeSpec: { 4062 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4063 FirstQualifierInScope, SS); 4064 4065 if (!TL) 4066 return NestedNameSpecifierLoc(); 4067 4068 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4069 (SemaRef.getLangOpts().CPlusPlus11 && 4070 TL.getType()->isEnumeralType())) { 4071 assert(!TL.getType().hasLocalQualifiers() && 4072 "Can't get cv-qualifiers here"); 4073 if (TL.getType()->isEnumeralType()) 4074 SemaRef.Diag(TL.getBeginLoc(), 4075 diag::warn_cxx98_compat_enum_nested_name_spec); 4076 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 4077 Q.getLocalEndLoc()); 4078 break; 4079 } 4080 // If the nested-name-specifier is an invalid type def, don't emit an 4081 // error because a previous error should have already been emitted. 4082 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4083 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4084 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4085 << TL.getType() << SS.getRange(); 4086 } 4087 return NestedNameSpecifierLoc(); 4088 } 4089 } 4090 4091 // The qualifier-in-scope and object type only apply to the leftmost entity. 4092 FirstQualifierInScope = nullptr; 4093 ObjectType = QualType(); 4094 } 4095 4096 // Don't rebuild the nested-name-specifier if we don't have to. 4097 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4098 !getDerived().AlwaysRebuild()) 4099 return NNS; 4100 4101 // If we can re-use the source-location data from the original 4102 // nested-name-specifier, do so. 4103 if (SS.location_size() == NNS.getDataLength() && 4104 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4105 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4106 4107 // Allocate new nested-name-specifier location information. 4108 return SS.getWithLocInContext(SemaRef.Context); 4109 } 4110 4111 template<typename Derived> 4112 DeclarationNameInfo 4113 TreeTransform<Derived> 4114 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4115 DeclarationName Name = NameInfo.getName(); 4116 if (!Name) 4117 return DeclarationNameInfo(); 4118 4119 switch (Name.getNameKind()) { 4120 case DeclarationName::Identifier: 4121 case DeclarationName::ObjCZeroArgSelector: 4122 case DeclarationName::ObjCOneArgSelector: 4123 case DeclarationName::ObjCMultiArgSelector: 4124 case DeclarationName::CXXOperatorName: 4125 case DeclarationName::CXXLiteralOperatorName: 4126 case DeclarationName::CXXUsingDirective: 4127 return NameInfo; 4128 4129 case DeclarationName::CXXDeductionGuideName: { 4130 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4131 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4132 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4133 if (!NewTemplate) 4134 return DeclarationNameInfo(); 4135 4136 DeclarationNameInfo NewNameInfo(NameInfo); 4137 NewNameInfo.setName( 4138 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4139 return NewNameInfo; 4140 } 4141 4142 case DeclarationName::CXXConstructorName: 4143 case DeclarationName::CXXDestructorName: 4144 case DeclarationName::CXXConversionFunctionName: { 4145 TypeSourceInfo *NewTInfo; 4146 CanQualType NewCanTy; 4147 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4148 NewTInfo = getDerived().TransformType(OldTInfo); 4149 if (!NewTInfo) 4150 return DeclarationNameInfo(); 4151 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4152 } 4153 else { 4154 NewTInfo = nullptr; 4155 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4156 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4157 if (NewT.isNull()) 4158 return DeclarationNameInfo(); 4159 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4160 } 4161 4162 DeclarationName NewName 4163 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4164 NewCanTy); 4165 DeclarationNameInfo NewNameInfo(NameInfo); 4166 NewNameInfo.setName(NewName); 4167 NewNameInfo.setNamedTypeInfo(NewTInfo); 4168 return NewNameInfo; 4169 } 4170 } 4171 4172 llvm_unreachable("Unknown name kind."); 4173 } 4174 4175 template<typename Derived> 4176 TemplateName 4177 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4178 TemplateName Name, 4179 SourceLocation NameLoc, 4180 QualType ObjectType, 4181 NamedDecl *FirstQualifierInScope, 4182 bool AllowInjectedClassName) { 4183 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4184 TemplateDecl *Template = QTN->getTemplateDecl(); 4185 assert(Template && "qualified template name must refer to a template"); 4186 4187 TemplateDecl *TransTemplate 4188 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4189 Template)); 4190 if (!TransTemplate) 4191 return TemplateName(); 4192 4193 if (!getDerived().AlwaysRebuild() && 4194 SS.getScopeRep() == QTN->getQualifier() && 4195 TransTemplate == Template) 4196 return Name; 4197 4198 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4199 TransTemplate); 4200 } 4201 4202 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4203 if (SS.getScopeRep()) { 4204 // These apply to the scope specifier, not the template. 4205 ObjectType = QualType(); 4206 FirstQualifierInScope = nullptr; 4207 } 4208 4209 if (!getDerived().AlwaysRebuild() && 4210 SS.getScopeRep() == DTN->getQualifier() && 4211 ObjectType.isNull()) 4212 return Name; 4213 4214 // FIXME: Preserve the location of the "template" keyword. 4215 SourceLocation TemplateKWLoc = NameLoc; 4216 4217 if (DTN->isIdentifier()) { 4218 return getDerived().RebuildTemplateName(SS, 4219 TemplateKWLoc, 4220 *DTN->getIdentifier(), 4221 NameLoc, 4222 ObjectType, 4223 FirstQualifierInScope, 4224 AllowInjectedClassName); 4225 } 4226 4227 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4228 DTN->getOperator(), NameLoc, 4229 ObjectType, AllowInjectedClassName); 4230 } 4231 4232 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4233 TemplateDecl *TransTemplate 4234 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4235 Template)); 4236 if (!TransTemplate) 4237 return TemplateName(); 4238 4239 if (!getDerived().AlwaysRebuild() && 4240 TransTemplate == Template) 4241 return Name; 4242 4243 return TemplateName(TransTemplate); 4244 } 4245 4246 if (SubstTemplateTemplateParmPackStorage *SubstPack 4247 = Name.getAsSubstTemplateTemplateParmPack()) { 4248 TemplateTemplateParmDecl *TransParam 4249 = cast_or_null<TemplateTemplateParmDecl>( 4250 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4251 if (!TransParam) 4252 return TemplateName(); 4253 4254 if (!getDerived().AlwaysRebuild() && 4255 TransParam == SubstPack->getParameterPack()) 4256 return Name; 4257 4258 return getDerived().RebuildTemplateName(TransParam, 4259 SubstPack->getArgumentPack()); 4260 } 4261 4262 // These should be getting filtered out before they reach the AST. 4263 llvm_unreachable("overloaded function decl survived to here"); 4264 } 4265 4266 template<typename Derived> 4267 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4268 const TemplateArgument &Arg, 4269 TemplateArgumentLoc &Output) { 4270 Output = getSema().getTrivialTemplateArgumentLoc( 4271 Arg, QualType(), getDerived().getBaseLocation()); 4272 } 4273 4274 template<typename Derived> 4275 bool TreeTransform<Derived>::TransformTemplateArgument( 4276 const TemplateArgumentLoc &Input, 4277 TemplateArgumentLoc &Output, bool Uneval) { 4278 const TemplateArgument &Arg = Input.getArgument(); 4279 switch (Arg.getKind()) { 4280 case TemplateArgument::Null: 4281 case TemplateArgument::Pack: 4282 llvm_unreachable("Unexpected TemplateArgument"); 4283 4284 case TemplateArgument::Integral: 4285 case TemplateArgument::NullPtr: 4286 case TemplateArgument::Declaration: { 4287 // Transform a resolved template argument straight to a resolved template 4288 // argument. We get here when substituting into an already-substituted 4289 // template type argument during concept satisfaction checking. 4290 QualType T = Arg.getNonTypeTemplateArgumentType(); 4291 QualType NewT = getDerived().TransformType(T); 4292 if (NewT.isNull()) 4293 return true; 4294 4295 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4296 ? Arg.getAsDecl() 4297 : nullptr; 4298 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4299 getDerived().getBaseLocation(), D)) 4300 : nullptr; 4301 if (D && !NewD) 4302 return true; 4303 4304 if (NewT == T && D == NewD) 4305 Output = Input; 4306 else if (Arg.getKind() == TemplateArgument::Integral) 4307 Output = TemplateArgumentLoc( 4308 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4309 TemplateArgumentLocInfo()); 4310 else if (Arg.getKind() == TemplateArgument::NullPtr) 4311 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4312 TemplateArgumentLocInfo()); 4313 else 4314 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4315 TemplateArgumentLocInfo()); 4316 4317 return false; 4318 } 4319 4320 case TemplateArgument::Type: { 4321 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4322 if (!DI) 4323 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4324 4325 DI = getDerived().TransformType(DI); 4326 if (!DI) return true; 4327 4328 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4329 return false; 4330 } 4331 4332 case TemplateArgument::Template: { 4333 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4334 if (QualifierLoc) { 4335 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4336 if (!QualifierLoc) 4337 return true; 4338 } 4339 4340 CXXScopeSpec SS; 4341 SS.Adopt(QualifierLoc); 4342 TemplateName Template 4343 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4344 Input.getTemplateNameLoc()); 4345 if (Template.isNull()) 4346 return true; 4347 4348 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4349 QualifierLoc, Input.getTemplateNameLoc()); 4350 return false; 4351 } 4352 4353 case TemplateArgument::TemplateExpansion: 4354 llvm_unreachable("Caller should expand pack expansions"); 4355 4356 case TemplateArgument::Expression: { 4357 // Template argument expressions are constant expressions. 4358 EnterExpressionEvaluationContext Unevaluated( 4359 getSema(), 4360 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4361 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4362 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4363 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4364 4365 Expr *InputExpr = Input.getSourceExpression(); 4366 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4367 4368 ExprResult E = getDerived().TransformExpr(InputExpr); 4369 E = SemaRef.ActOnConstantExpression(E); 4370 if (E.isInvalid()) return true; 4371 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4372 return false; 4373 } 4374 } 4375 4376 // Work around bogus GCC warning 4377 return true; 4378 } 4379 4380 /// Iterator adaptor that invents template argument location information 4381 /// for each of the template arguments in its underlying iterator. 4382 template<typename Derived, typename InputIterator> 4383 class TemplateArgumentLocInventIterator { 4384 TreeTransform<Derived> &Self; 4385 InputIterator Iter; 4386 4387 public: 4388 typedef TemplateArgumentLoc value_type; 4389 typedef TemplateArgumentLoc reference; 4390 typedef typename std::iterator_traits<InputIterator>::difference_type 4391 difference_type; 4392 typedef std::input_iterator_tag iterator_category; 4393 4394 class pointer { 4395 TemplateArgumentLoc Arg; 4396 4397 public: 4398 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4399 4400 const TemplateArgumentLoc *operator->() const { return &Arg; } 4401 }; 4402 4403 TemplateArgumentLocInventIterator() { } 4404 4405 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4406 InputIterator Iter) 4407 : Self(Self), Iter(Iter) { } 4408 4409 TemplateArgumentLocInventIterator &operator++() { 4410 ++Iter; 4411 return *this; 4412 } 4413 4414 TemplateArgumentLocInventIterator operator++(int) { 4415 TemplateArgumentLocInventIterator Old(*this); 4416 ++(*this); 4417 return Old; 4418 } 4419 4420 reference operator*() const { 4421 TemplateArgumentLoc Result; 4422 Self.InventTemplateArgumentLoc(*Iter, Result); 4423 return Result; 4424 } 4425 4426 pointer operator->() const { return pointer(**this); } 4427 4428 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4429 const TemplateArgumentLocInventIterator &Y) { 4430 return X.Iter == Y.Iter; 4431 } 4432 4433 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4434 const TemplateArgumentLocInventIterator &Y) { 4435 return X.Iter != Y.Iter; 4436 } 4437 }; 4438 4439 template<typename Derived> 4440 template<typename InputIterator> 4441 bool TreeTransform<Derived>::TransformTemplateArguments( 4442 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4443 bool Uneval) { 4444 for (; First != Last; ++First) { 4445 TemplateArgumentLoc Out; 4446 TemplateArgumentLoc In = *First; 4447 4448 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4449 // Unpack argument packs, which we translate them into separate 4450 // arguments. 4451 // FIXME: We could do much better if we could guarantee that the 4452 // TemplateArgumentLocInfo for the pack expansion would be usable for 4453 // all of the template arguments in the argument pack. 4454 typedef TemplateArgumentLocInventIterator<Derived, 4455 TemplateArgument::pack_iterator> 4456 PackLocIterator; 4457 if (TransformTemplateArguments(PackLocIterator(*this, 4458 In.getArgument().pack_begin()), 4459 PackLocIterator(*this, 4460 In.getArgument().pack_end()), 4461 Outputs, Uneval)) 4462 return true; 4463 4464 continue; 4465 } 4466 4467 if (In.getArgument().isPackExpansion()) { 4468 // We have a pack expansion, for which we will be substituting into 4469 // the pattern. 4470 SourceLocation Ellipsis; 4471 Optional<unsigned> OrigNumExpansions; 4472 TemplateArgumentLoc Pattern 4473 = getSema().getTemplateArgumentPackExpansionPattern( 4474 In, Ellipsis, OrigNumExpansions); 4475 4476 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4477 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4478 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4479 4480 // Determine whether the set of unexpanded parameter packs can and should 4481 // be expanded. 4482 bool Expand = true; 4483 bool RetainExpansion = false; 4484 Optional<unsigned> NumExpansions = OrigNumExpansions; 4485 if (getDerived().TryExpandParameterPacks(Ellipsis, 4486 Pattern.getSourceRange(), 4487 Unexpanded, 4488 Expand, 4489 RetainExpansion, 4490 NumExpansions)) 4491 return true; 4492 4493 if (!Expand) { 4494 // The transform has determined that we should perform a simple 4495 // transformation on the pack expansion, producing another pack 4496 // expansion. 4497 TemplateArgumentLoc OutPattern; 4498 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4499 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4500 return true; 4501 4502 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4503 NumExpansions); 4504 if (Out.getArgument().isNull()) 4505 return true; 4506 4507 Outputs.addArgument(Out); 4508 continue; 4509 } 4510 4511 // The transform has determined that we should perform an elementwise 4512 // expansion of the pattern. Do so. 4513 for (unsigned I = 0; I != *NumExpansions; ++I) { 4514 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4515 4516 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4517 return true; 4518 4519 if (Out.getArgument().containsUnexpandedParameterPack()) { 4520 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4521 OrigNumExpansions); 4522 if (Out.getArgument().isNull()) 4523 return true; 4524 } 4525 4526 Outputs.addArgument(Out); 4527 } 4528 4529 // If we're supposed to retain a pack expansion, do so by temporarily 4530 // forgetting the partially-substituted parameter pack. 4531 if (RetainExpansion) { 4532 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4533 4534 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4535 return true; 4536 4537 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4538 OrigNumExpansions); 4539 if (Out.getArgument().isNull()) 4540 return true; 4541 4542 Outputs.addArgument(Out); 4543 } 4544 4545 continue; 4546 } 4547 4548 // The simple case: 4549 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4550 return true; 4551 4552 Outputs.addArgument(Out); 4553 } 4554 4555 return false; 4556 4557 } 4558 4559 //===----------------------------------------------------------------------===// 4560 // Type transformation 4561 //===----------------------------------------------------------------------===// 4562 4563 template<typename Derived> 4564 QualType TreeTransform<Derived>::TransformType(QualType T) { 4565 if (getDerived().AlreadyTransformed(T)) 4566 return T; 4567 4568 // Temporary workaround. All of these transformations should 4569 // eventually turn into transformations on TypeLocs. 4570 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4571 getDerived().getBaseLocation()); 4572 4573 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4574 4575 if (!NewDI) 4576 return QualType(); 4577 4578 return NewDI->getType(); 4579 } 4580 4581 template<typename Derived> 4582 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4583 // Refine the base location to the type's location. 4584 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4585 getDerived().getBaseEntity()); 4586 if (getDerived().AlreadyTransformed(DI->getType())) 4587 return DI; 4588 4589 TypeLocBuilder TLB; 4590 4591 TypeLoc TL = DI->getTypeLoc(); 4592 TLB.reserve(TL.getFullDataSize()); 4593 4594 QualType Result = getDerived().TransformType(TLB, TL); 4595 if (Result.isNull()) 4596 return nullptr; 4597 4598 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4599 } 4600 4601 template<typename Derived> 4602 QualType 4603 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4604 switch (T.getTypeLocClass()) { 4605 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4606 #define TYPELOC(CLASS, PARENT) \ 4607 case TypeLoc::CLASS: \ 4608 return getDerived().Transform##CLASS##Type(TLB, \ 4609 T.castAs<CLASS##TypeLoc>()); 4610 #include "clang/AST/TypeLocNodes.def" 4611 } 4612 4613 llvm_unreachable("unhandled type loc!"); 4614 } 4615 4616 template<typename Derived> 4617 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4618 if (!isa<DependentNameType>(T)) 4619 return TransformType(T); 4620 4621 if (getDerived().AlreadyTransformed(T)) 4622 return T; 4623 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4624 getDerived().getBaseLocation()); 4625 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4626 return NewDI ? NewDI->getType() : QualType(); 4627 } 4628 4629 template<typename Derived> 4630 TypeSourceInfo * 4631 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4632 if (!isa<DependentNameType>(DI->getType())) 4633 return TransformType(DI); 4634 4635 // Refine the base location to the type's location. 4636 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4637 getDerived().getBaseEntity()); 4638 if (getDerived().AlreadyTransformed(DI->getType())) 4639 return DI; 4640 4641 TypeLocBuilder TLB; 4642 4643 TypeLoc TL = DI->getTypeLoc(); 4644 TLB.reserve(TL.getFullDataSize()); 4645 4646 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4647 if (QTL) 4648 TL = QTL.getUnqualifiedLoc(); 4649 4650 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4651 4652 QualType Result = getDerived().TransformDependentNameType( 4653 TLB, DNTL, /*DeducedTSTContext*/true); 4654 if (Result.isNull()) 4655 return nullptr; 4656 4657 if (QTL) { 4658 Result = getDerived().RebuildQualifiedType(Result, QTL); 4659 if (Result.isNull()) 4660 return nullptr; 4661 TLB.TypeWasModifiedSafely(Result); 4662 } 4663 4664 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4665 } 4666 4667 template<typename Derived> 4668 QualType 4669 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4670 QualifiedTypeLoc T) { 4671 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4672 if (Result.isNull()) 4673 return QualType(); 4674 4675 Result = getDerived().RebuildQualifiedType(Result, T); 4676 4677 if (Result.isNull()) 4678 return QualType(); 4679 4680 // RebuildQualifiedType might have updated the type, but not in a way 4681 // that invalidates the TypeLoc. (There's no location information for 4682 // qualifiers.) 4683 TLB.TypeWasModifiedSafely(Result); 4684 4685 return Result; 4686 } 4687 4688 template <typename Derived> 4689 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4690 QualifiedTypeLoc TL) { 4691 4692 SourceLocation Loc = TL.getBeginLoc(); 4693 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4694 4695 if (((T.getAddressSpace() != LangAS::Default && 4696 Quals.getAddressSpace() != LangAS::Default)) && 4697 T.getAddressSpace() != Quals.getAddressSpace()) { 4698 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4699 << TL.getType() << T; 4700 return QualType(); 4701 } 4702 4703 // C++ [dcl.fct]p7: 4704 // [When] adding cv-qualifications on top of the function type [...] the 4705 // cv-qualifiers are ignored. 4706 if (T->isFunctionType()) { 4707 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4708 Quals.getAddressSpace()); 4709 return T; 4710 } 4711 4712 // C++ [dcl.ref]p1: 4713 // when the cv-qualifiers are introduced through the use of a typedef-name 4714 // or decltype-specifier [...] the cv-qualifiers are ignored. 4715 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4716 // applied to a reference type. 4717 if (T->isReferenceType()) { 4718 // The only qualifier that applies to a reference type is restrict. 4719 if (!Quals.hasRestrict()) 4720 return T; 4721 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4722 } 4723 4724 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4725 // resulting type. 4726 if (Quals.hasObjCLifetime()) { 4727 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4728 Quals.removeObjCLifetime(); 4729 else if (T.getObjCLifetime()) { 4730 // Objective-C ARC: 4731 // A lifetime qualifier applied to a substituted template parameter 4732 // overrides the lifetime qualifier from the template argument. 4733 const AutoType *AutoTy; 4734 if (const SubstTemplateTypeParmType *SubstTypeParam 4735 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4736 QualType Replacement = SubstTypeParam->getReplacementType(); 4737 Qualifiers Qs = Replacement.getQualifiers(); 4738 Qs.removeObjCLifetime(); 4739 Replacement = SemaRef.Context.getQualifiedType( 4740 Replacement.getUnqualifiedType(), Qs); 4741 T = SemaRef.Context.getSubstTemplateTypeParmType( 4742 SubstTypeParam->getReplacedParameter(), Replacement); 4743 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4744 // 'auto' types behave the same way as template parameters. 4745 QualType Deduced = AutoTy->getDeducedType(); 4746 Qualifiers Qs = Deduced.getQualifiers(); 4747 Qs.removeObjCLifetime(); 4748 Deduced = 4749 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4750 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4751 AutoTy->isDependentType(), 4752 /*isPack=*/false, 4753 AutoTy->getTypeConstraintConcept(), 4754 AutoTy->getTypeConstraintArguments()); 4755 } else { 4756 // Otherwise, complain about the addition of a qualifier to an 4757 // already-qualified type. 4758 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4759 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4760 Quals.removeObjCLifetime(); 4761 } 4762 } 4763 } 4764 4765 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4766 } 4767 4768 template<typename Derived> 4769 TypeLoc 4770 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4771 QualType ObjectType, 4772 NamedDecl *UnqualLookup, 4773 CXXScopeSpec &SS) { 4774 if (getDerived().AlreadyTransformed(TL.getType())) 4775 return TL; 4776 4777 TypeSourceInfo *TSI = 4778 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4779 if (TSI) 4780 return TSI->getTypeLoc(); 4781 return TypeLoc(); 4782 } 4783 4784 template<typename Derived> 4785 TypeSourceInfo * 4786 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4787 QualType ObjectType, 4788 NamedDecl *UnqualLookup, 4789 CXXScopeSpec &SS) { 4790 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4791 return TSInfo; 4792 4793 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4794 UnqualLookup, SS); 4795 } 4796 4797 template <typename Derived> 4798 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4799 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4800 CXXScopeSpec &SS) { 4801 QualType T = TL.getType(); 4802 assert(!getDerived().AlreadyTransformed(T)); 4803 4804 TypeLocBuilder TLB; 4805 QualType Result; 4806 4807 if (isa<TemplateSpecializationType>(T)) { 4808 TemplateSpecializationTypeLoc SpecTL = 4809 TL.castAs<TemplateSpecializationTypeLoc>(); 4810 4811 TemplateName Template = getDerived().TransformTemplateName( 4812 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4813 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4814 if (Template.isNull()) 4815 return nullptr; 4816 4817 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4818 Template); 4819 } else if (isa<DependentTemplateSpecializationType>(T)) { 4820 DependentTemplateSpecializationTypeLoc SpecTL = 4821 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4822 4823 TemplateName Template 4824 = getDerived().RebuildTemplateName(SS, 4825 SpecTL.getTemplateKeywordLoc(), 4826 *SpecTL.getTypePtr()->getIdentifier(), 4827 SpecTL.getTemplateNameLoc(), 4828 ObjectType, UnqualLookup, 4829 /*AllowInjectedClassName*/true); 4830 if (Template.isNull()) 4831 return nullptr; 4832 4833 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4834 SpecTL, 4835 Template, 4836 SS); 4837 } else { 4838 // Nothing special needs to be done for these. 4839 Result = getDerived().TransformType(TLB, TL); 4840 } 4841 4842 if (Result.isNull()) 4843 return nullptr; 4844 4845 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4846 } 4847 4848 template <class TyLoc> static inline 4849 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4850 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4851 NewT.setNameLoc(T.getNameLoc()); 4852 return T.getType(); 4853 } 4854 4855 template<typename Derived> 4856 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4857 BuiltinTypeLoc T) { 4858 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4859 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4860 if (T.needsExtraLocalData()) 4861 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4862 return T.getType(); 4863 } 4864 4865 template<typename Derived> 4866 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4867 ComplexTypeLoc T) { 4868 // FIXME: recurse? 4869 return TransformTypeSpecType(TLB, T); 4870 } 4871 4872 template <typename Derived> 4873 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4874 AdjustedTypeLoc TL) { 4875 // Adjustments applied during transformation are handled elsewhere. 4876 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4877 } 4878 4879 template<typename Derived> 4880 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4881 DecayedTypeLoc TL) { 4882 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4883 if (OriginalType.isNull()) 4884 return QualType(); 4885 4886 QualType Result = TL.getType(); 4887 if (getDerived().AlwaysRebuild() || 4888 OriginalType != TL.getOriginalLoc().getType()) 4889 Result = SemaRef.Context.getDecayedType(OriginalType); 4890 TLB.push<DecayedTypeLoc>(Result); 4891 // Nothing to set for DecayedTypeLoc. 4892 return Result; 4893 } 4894 4895 template<typename Derived> 4896 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4897 PointerTypeLoc TL) { 4898 QualType PointeeType 4899 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4900 if (PointeeType.isNull()) 4901 return QualType(); 4902 4903 QualType Result = TL.getType(); 4904 if (PointeeType->getAs<ObjCObjectType>()) { 4905 // A dependent pointer type 'T *' has is being transformed such 4906 // that an Objective-C class type is being replaced for 'T'. The 4907 // resulting pointer type is an ObjCObjectPointerType, not a 4908 // PointerType. 4909 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4910 4911 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4912 NewT.setStarLoc(TL.getStarLoc()); 4913 return Result; 4914 } 4915 4916 if (getDerived().AlwaysRebuild() || 4917 PointeeType != TL.getPointeeLoc().getType()) { 4918 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4919 if (Result.isNull()) 4920 return QualType(); 4921 } 4922 4923 // Objective-C ARC can add lifetime qualifiers to the type that we're 4924 // pointing to. 4925 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4926 4927 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4928 NewT.setSigilLoc(TL.getSigilLoc()); 4929 return Result; 4930 } 4931 4932 template<typename Derived> 4933 QualType 4934 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4935 BlockPointerTypeLoc TL) { 4936 QualType PointeeType 4937 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4938 if (PointeeType.isNull()) 4939 return QualType(); 4940 4941 QualType Result = TL.getType(); 4942 if (getDerived().AlwaysRebuild() || 4943 PointeeType != TL.getPointeeLoc().getType()) { 4944 Result = getDerived().RebuildBlockPointerType(PointeeType, 4945 TL.getSigilLoc()); 4946 if (Result.isNull()) 4947 return QualType(); 4948 } 4949 4950 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4951 NewT.setSigilLoc(TL.getSigilLoc()); 4952 return Result; 4953 } 4954 4955 /// Transforms a reference type. Note that somewhat paradoxically we 4956 /// don't care whether the type itself is an l-value type or an r-value 4957 /// type; we only care if the type was *written* as an l-value type 4958 /// or an r-value type. 4959 template<typename Derived> 4960 QualType 4961 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4962 ReferenceTypeLoc TL) { 4963 const ReferenceType *T = TL.getTypePtr(); 4964 4965 // Note that this works with the pointee-as-written. 4966 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4967 if (PointeeType.isNull()) 4968 return QualType(); 4969 4970 QualType Result = TL.getType(); 4971 if (getDerived().AlwaysRebuild() || 4972 PointeeType != T->getPointeeTypeAsWritten()) { 4973 Result = getDerived().RebuildReferenceType(PointeeType, 4974 T->isSpelledAsLValue(), 4975 TL.getSigilLoc()); 4976 if (Result.isNull()) 4977 return QualType(); 4978 } 4979 4980 // Objective-C ARC can add lifetime qualifiers to the type that we're 4981 // referring to. 4982 TLB.TypeWasModifiedSafely( 4983 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4984 4985 // r-value references can be rebuilt as l-value references. 4986 ReferenceTypeLoc NewTL; 4987 if (isa<LValueReferenceType>(Result)) 4988 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4989 else 4990 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4991 NewTL.setSigilLoc(TL.getSigilLoc()); 4992 4993 return Result; 4994 } 4995 4996 template<typename Derived> 4997 QualType 4998 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4999 LValueReferenceTypeLoc TL) { 5000 return TransformReferenceType(TLB, TL); 5001 } 5002 5003 template<typename Derived> 5004 QualType 5005 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5006 RValueReferenceTypeLoc TL) { 5007 return TransformReferenceType(TLB, TL); 5008 } 5009 5010 template<typename Derived> 5011 QualType 5012 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5013 MemberPointerTypeLoc TL) { 5014 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5015 if (PointeeType.isNull()) 5016 return QualType(); 5017 5018 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5019 TypeSourceInfo *NewClsTInfo = nullptr; 5020 if (OldClsTInfo) { 5021 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5022 if (!NewClsTInfo) 5023 return QualType(); 5024 } 5025 5026 const MemberPointerType *T = TL.getTypePtr(); 5027 QualType OldClsType = QualType(T->getClass(), 0); 5028 QualType NewClsType; 5029 if (NewClsTInfo) 5030 NewClsType = NewClsTInfo->getType(); 5031 else { 5032 NewClsType = getDerived().TransformType(OldClsType); 5033 if (NewClsType.isNull()) 5034 return QualType(); 5035 } 5036 5037 QualType Result = TL.getType(); 5038 if (getDerived().AlwaysRebuild() || 5039 PointeeType != T->getPointeeType() || 5040 NewClsType != OldClsType) { 5041 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5042 TL.getStarLoc()); 5043 if (Result.isNull()) 5044 return QualType(); 5045 } 5046 5047 // If we had to adjust the pointee type when building a member pointer, make 5048 // sure to push TypeLoc info for it. 5049 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5050 if (MPT && PointeeType != MPT->getPointeeType()) { 5051 assert(isa<AdjustedType>(MPT->getPointeeType())); 5052 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5053 } 5054 5055 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5056 NewTL.setSigilLoc(TL.getSigilLoc()); 5057 NewTL.setClassTInfo(NewClsTInfo); 5058 5059 return Result; 5060 } 5061 5062 template<typename Derived> 5063 QualType 5064 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5065 ConstantArrayTypeLoc TL) { 5066 const ConstantArrayType *T = TL.getTypePtr(); 5067 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5068 if (ElementType.isNull()) 5069 return QualType(); 5070 5071 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5072 Expr *OldSize = TL.getSizeExpr(); 5073 if (!OldSize) 5074 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5075 Expr *NewSize = nullptr; 5076 if (OldSize) { 5077 EnterExpressionEvaluationContext Unevaluated( 5078 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5079 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5080 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5081 } 5082 5083 QualType Result = TL.getType(); 5084 if (getDerived().AlwaysRebuild() || 5085 ElementType != T->getElementType() || 5086 (T->getSizeExpr() && NewSize != OldSize)) { 5087 Result = getDerived().RebuildConstantArrayType(ElementType, 5088 T->getSizeModifier(), 5089 T->getSize(), NewSize, 5090 T->getIndexTypeCVRQualifiers(), 5091 TL.getBracketsRange()); 5092 if (Result.isNull()) 5093 return QualType(); 5094 } 5095 5096 // We might have either a ConstantArrayType or a VariableArrayType now: 5097 // a ConstantArrayType is allowed to have an element type which is a 5098 // VariableArrayType if the type is dependent. Fortunately, all array 5099 // types have the same location layout. 5100 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5101 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5102 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5103 NewTL.setSizeExpr(NewSize); 5104 5105 return Result; 5106 } 5107 5108 template<typename Derived> 5109 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5110 TypeLocBuilder &TLB, 5111 IncompleteArrayTypeLoc TL) { 5112 const IncompleteArrayType *T = TL.getTypePtr(); 5113 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5114 if (ElementType.isNull()) 5115 return QualType(); 5116 5117 QualType Result = TL.getType(); 5118 if (getDerived().AlwaysRebuild() || 5119 ElementType != T->getElementType()) { 5120 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5121 T->getSizeModifier(), 5122 T->getIndexTypeCVRQualifiers(), 5123 TL.getBracketsRange()); 5124 if (Result.isNull()) 5125 return QualType(); 5126 } 5127 5128 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5129 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5130 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5131 NewTL.setSizeExpr(nullptr); 5132 5133 return Result; 5134 } 5135 5136 template<typename Derived> 5137 QualType 5138 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5139 VariableArrayTypeLoc TL) { 5140 const VariableArrayType *T = TL.getTypePtr(); 5141 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5142 if (ElementType.isNull()) 5143 return QualType(); 5144 5145 ExprResult SizeResult; 5146 { 5147 EnterExpressionEvaluationContext Context( 5148 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5149 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5150 } 5151 if (SizeResult.isInvalid()) 5152 return QualType(); 5153 SizeResult = 5154 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5155 if (SizeResult.isInvalid()) 5156 return QualType(); 5157 5158 Expr *Size = SizeResult.get(); 5159 5160 QualType Result = TL.getType(); 5161 if (getDerived().AlwaysRebuild() || 5162 ElementType != T->getElementType() || 5163 Size != T->getSizeExpr()) { 5164 Result = getDerived().RebuildVariableArrayType(ElementType, 5165 T->getSizeModifier(), 5166 Size, 5167 T->getIndexTypeCVRQualifiers(), 5168 TL.getBracketsRange()); 5169 if (Result.isNull()) 5170 return QualType(); 5171 } 5172 5173 // We might have constant size array now, but fortunately it has the same 5174 // location layout. 5175 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5176 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5177 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5178 NewTL.setSizeExpr(Size); 5179 5180 return Result; 5181 } 5182 5183 template<typename Derived> 5184 QualType 5185 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5186 DependentSizedArrayTypeLoc TL) { 5187 const DependentSizedArrayType *T = TL.getTypePtr(); 5188 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5189 if (ElementType.isNull()) 5190 return QualType(); 5191 5192 // Array bounds are constant expressions. 5193 EnterExpressionEvaluationContext Unevaluated( 5194 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5195 5196 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5197 Expr *origSize = TL.getSizeExpr(); 5198 if (!origSize) origSize = T->getSizeExpr(); 5199 5200 ExprResult sizeResult 5201 = getDerived().TransformExpr(origSize); 5202 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5203 if (sizeResult.isInvalid()) 5204 return QualType(); 5205 5206 Expr *size = sizeResult.get(); 5207 5208 QualType Result = TL.getType(); 5209 if (getDerived().AlwaysRebuild() || 5210 ElementType != T->getElementType() || 5211 size != origSize) { 5212 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5213 T->getSizeModifier(), 5214 size, 5215 T->getIndexTypeCVRQualifiers(), 5216 TL.getBracketsRange()); 5217 if (Result.isNull()) 5218 return QualType(); 5219 } 5220 5221 // We might have any sort of array type now, but fortunately they 5222 // all have the same location layout. 5223 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5224 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5225 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5226 NewTL.setSizeExpr(size); 5227 5228 return Result; 5229 } 5230 5231 template <typename Derived> 5232 QualType TreeTransform<Derived>::TransformDependentVectorType( 5233 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5234 const DependentVectorType *T = TL.getTypePtr(); 5235 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5236 if (ElementType.isNull()) 5237 return QualType(); 5238 5239 EnterExpressionEvaluationContext Unevaluated( 5240 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5241 5242 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5243 Size = SemaRef.ActOnConstantExpression(Size); 5244 if (Size.isInvalid()) 5245 return QualType(); 5246 5247 QualType Result = TL.getType(); 5248 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5249 Size.get() != T->getSizeExpr()) { 5250 Result = getDerived().RebuildDependentVectorType( 5251 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5252 if (Result.isNull()) 5253 return QualType(); 5254 } 5255 5256 // Result might be dependent or not. 5257 if (isa<DependentVectorType>(Result)) { 5258 DependentVectorTypeLoc NewTL = 5259 TLB.push<DependentVectorTypeLoc>(Result); 5260 NewTL.setNameLoc(TL.getNameLoc()); 5261 } else { 5262 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5263 NewTL.setNameLoc(TL.getNameLoc()); 5264 } 5265 5266 return Result; 5267 } 5268 5269 template<typename Derived> 5270 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5271 TypeLocBuilder &TLB, 5272 DependentSizedExtVectorTypeLoc TL) { 5273 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5274 5275 // FIXME: ext vector locs should be nested 5276 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5277 if (ElementType.isNull()) 5278 return QualType(); 5279 5280 // Vector sizes are constant expressions. 5281 EnterExpressionEvaluationContext Unevaluated( 5282 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5283 5284 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5285 Size = SemaRef.ActOnConstantExpression(Size); 5286 if (Size.isInvalid()) 5287 return QualType(); 5288 5289 QualType Result = TL.getType(); 5290 if (getDerived().AlwaysRebuild() || 5291 ElementType != T->getElementType() || 5292 Size.get() != T->getSizeExpr()) { 5293 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5294 Size.get(), 5295 T->getAttributeLoc()); 5296 if (Result.isNull()) 5297 return QualType(); 5298 } 5299 5300 // Result might be dependent or not. 5301 if (isa<DependentSizedExtVectorType>(Result)) { 5302 DependentSizedExtVectorTypeLoc NewTL 5303 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5304 NewTL.setNameLoc(TL.getNameLoc()); 5305 } else { 5306 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5307 NewTL.setNameLoc(TL.getNameLoc()); 5308 } 5309 5310 return Result; 5311 } 5312 5313 template <typename Derived> 5314 QualType 5315 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5316 ConstantMatrixTypeLoc TL) { 5317 const ConstantMatrixType *T = TL.getTypePtr(); 5318 QualType ElementType = getDerived().TransformType(T->getElementType()); 5319 if (ElementType.isNull()) 5320 return QualType(); 5321 5322 QualType Result = TL.getType(); 5323 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5324 Result = getDerived().RebuildConstantMatrixType( 5325 ElementType, T->getNumRows(), T->getNumColumns()); 5326 if (Result.isNull()) 5327 return QualType(); 5328 } 5329 5330 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5331 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5332 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5333 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5334 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5335 5336 return Result; 5337 } 5338 5339 template <typename Derived> 5340 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5341 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5342 const DependentSizedMatrixType *T = TL.getTypePtr(); 5343 5344 QualType ElementType = getDerived().TransformType(T->getElementType()); 5345 if (ElementType.isNull()) { 5346 return QualType(); 5347 } 5348 5349 // Matrix dimensions are constant expressions. 5350 EnterExpressionEvaluationContext Unevaluated( 5351 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5352 5353 Expr *origRows = TL.getAttrRowOperand(); 5354 if (!origRows) 5355 origRows = T->getRowExpr(); 5356 Expr *origColumns = TL.getAttrColumnOperand(); 5357 if (!origColumns) 5358 origColumns = T->getColumnExpr(); 5359 5360 ExprResult rowResult = getDerived().TransformExpr(origRows); 5361 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5362 if (rowResult.isInvalid()) 5363 return QualType(); 5364 5365 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5366 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5367 if (columnResult.isInvalid()) 5368 return QualType(); 5369 5370 Expr *rows = rowResult.get(); 5371 Expr *columns = columnResult.get(); 5372 5373 QualType Result = TL.getType(); 5374 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5375 rows != origRows || columns != origColumns) { 5376 Result = getDerived().RebuildDependentSizedMatrixType( 5377 ElementType, rows, columns, T->getAttributeLoc()); 5378 5379 if (Result.isNull()) 5380 return QualType(); 5381 } 5382 5383 // We might have any sort of matrix type now, but fortunately they 5384 // all have the same location layout. 5385 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5386 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5387 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5388 NewTL.setAttrRowOperand(rows); 5389 NewTL.setAttrColumnOperand(columns); 5390 return Result; 5391 } 5392 5393 template <typename Derived> 5394 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5395 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5396 const DependentAddressSpaceType *T = TL.getTypePtr(); 5397 5398 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5399 5400 if (pointeeType.isNull()) 5401 return QualType(); 5402 5403 // Address spaces are constant expressions. 5404 EnterExpressionEvaluationContext Unevaluated( 5405 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5406 5407 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5408 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5409 if (AddrSpace.isInvalid()) 5410 return QualType(); 5411 5412 QualType Result = TL.getType(); 5413 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5414 AddrSpace.get() != T->getAddrSpaceExpr()) { 5415 Result = getDerived().RebuildDependentAddressSpaceType( 5416 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5417 if (Result.isNull()) 5418 return QualType(); 5419 } 5420 5421 // Result might be dependent or not. 5422 if (isa<DependentAddressSpaceType>(Result)) { 5423 DependentAddressSpaceTypeLoc NewTL = 5424 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5425 5426 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5427 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5428 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5429 5430 } else { 5431 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5432 Result, getDerived().getBaseLocation()); 5433 TransformType(TLB, DI->getTypeLoc()); 5434 } 5435 5436 return Result; 5437 } 5438 5439 template <typename Derived> 5440 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5441 VectorTypeLoc TL) { 5442 const VectorType *T = TL.getTypePtr(); 5443 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5444 if (ElementType.isNull()) 5445 return QualType(); 5446 5447 QualType Result = TL.getType(); 5448 if (getDerived().AlwaysRebuild() || 5449 ElementType != T->getElementType()) { 5450 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5451 T->getVectorKind()); 5452 if (Result.isNull()) 5453 return QualType(); 5454 } 5455 5456 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5457 NewTL.setNameLoc(TL.getNameLoc()); 5458 5459 return Result; 5460 } 5461 5462 template<typename Derived> 5463 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5464 ExtVectorTypeLoc TL) { 5465 const VectorType *T = TL.getTypePtr(); 5466 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5467 if (ElementType.isNull()) 5468 return QualType(); 5469 5470 QualType Result = TL.getType(); 5471 if (getDerived().AlwaysRebuild() || 5472 ElementType != T->getElementType()) { 5473 Result = getDerived().RebuildExtVectorType(ElementType, 5474 T->getNumElements(), 5475 /*FIXME*/ SourceLocation()); 5476 if (Result.isNull()) 5477 return QualType(); 5478 } 5479 5480 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5481 NewTL.setNameLoc(TL.getNameLoc()); 5482 5483 return Result; 5484 } 5485 5486 template <typename Derived> 5487 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5488 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5489 bool ExpectParameterPack) { 5490 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5491 TypeSourceInfo *NewDI = nullptr; 5492 5493 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5494 // If we're substituting into a pack expansion type and we know the 5495 // length we want to expand to, just substitute for the pattern. 5496 TypeLoc OldTL = OldDI->getTypeLoc(); 5497 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5498 5499 TypeLocBuilder TLB; 5500 TypeLoc NewTL = OldDI->getTypeLoc(); 5501 TLB.reserve(NewTL.getFullDataSize()); 5502 5503 QualType Result = getDerived().TransformType(TLB, 5504 OldExpansionTL.getPatternLoc()); 5505 if (Result.isNull()) 5506 return nullptr; 5507 5508 Result = RebuildPackExpansionType(Result, 5509 OldExpansionTL.getPatternLoc().getSourceRange(), 5510 OldExpansionTL.getEllipsisLoc(), 5511 NumExpansions); 5512 if (Result.isNull()) 5513 return nullptr; 5514 5515 PackExpansionTypeLoc NewExpansionTL 5516 = TLB.push<PackExpansionTypeLoc>(Result); 5517 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5518 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5519 } else 5520 NewDI = getDerived().TransformType(OldDI); 5521 if (!NewDI) 5522 return nullptr; 5523 5524 if (NewDI == OldDI && indexAdjustment == 0) 5525 return OldParm; 5526 5527 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5528 OldParm->getDeclContext(), 5529 OldParm->getInnerLocStart(), 5530 OldParm->getLocation(), 5531 OldParm->getIdentifier(), 5532 NewDI->getType(), 5533 NewDI, 5534 OldParm->getStorageClass(), 5535 /* DefArg */ nullptr); 5536 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5537 OldParm->getFunctionScopeIndex() + indexAdjustment); 5538 transformedLocalDecl(OldParm, {newParm}); 5539 return newParm; 5540 } 5541 5542 template <typename Derived> 5543 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5544 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5545 const QualType *ParamTypes, 5546 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5547 SmallVectorImpl<QualType> &OutParamTypes, 5548 SmallVectorImpl<ParmVarDecl *> *PVars, 5549 Sema::ExtParameterInfoBuilder &PInfos) { 5550 int indexAdjustment = 0; 5551 5552 unsigned NumParams = Params.size(); 5553 for (unsigned i = 0; i != NumParams; ++i) { 5554 if (ParmVarDecl *OldParm = Params[i]) { 5555 assert(OldParm->getFunctionScopeIndex() == i); 5556 5557 Optional<unsigned> NumExpansions; 5558 ParmVarDecl *NewParm = nullptr; 5559 if (OldParm->isParameterPack()) { 5560 // We have a function parameter pack that may need to be expanded. 5561 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5562 5563 // Find the parameter packs that could be expanded. 5564 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5565 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5566 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5567 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5568 5569 // Determine whether we should expand the parameter packs. 5570 bool ShouldExpand = false; 5571 bool RetainExpansion = false; 5572 Optional<unsigned> OrigNumExpansions; 5573 if (Unexpanded.size() > 0) { 5574 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5575 NumExpansions = OrigNumExpansions; 5576 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5577 Pattern.getSourceRange(), 5578 Unexpanded, 5579 ShouldExpand, 5580 RetainExpansion, 5581 NumExpansions)) { 5582 return true; 5583 } 5584 } else { 5585 #ifndef NDEBUG 5586 const AutoType *AT = 5587 Pattern.getType().getTypePtr()->getContainedAutoType(); 5588 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5589 "Could not find parameter packs or undeduced auto type!"); 5590 #endif 5591 } 5592 5593 if (ShouldExpand) { 5594 // Expand the function parameter pack into multiple, separate 5595 // parameters. 5596 getDerived().ExpandingFunctionParameterPack(OldParm); 5597 for (unsigned I = 0; I != *NumExpansions; ++I) { 5598 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5599 ParmVarDecl *NewParm 5600 = getDerived().TransformFunctionTypeParam(OldParm, 5601 indexAdjustment++, 5602 OrigNumExpansions, 5603 /*ExpectParameterPack=*/false); 5604 if (!NewParm) 5605 return true; 5606 5607 if (ParamInfos) 5608 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5609 OutParamTypes.push_back(NewParm->getType()); 5610 if (PVars) 5611 PVars->push_back(NewParm); 5612 } 5613 5614 // If we're supposed to retain a pack expansion, do so by temporarily 5615 // forgetting the partially-substituted parameter pack. 5616 if (RetainExpansion) { 5617 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5618 ParmVarDecl *NewParm 5619 = getDerived().TransformFunctionTypeParam(OldParm, 5620 indexAdjustment++, 5621 OrigNumExpansions, 5622 /*ExpectParameterPack=*/false); 5623 if (!NewParm) 5624 return true; 5625 5626 if (ParamInfos) 5627 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5628 OutParamTypes.push_back(NewParm->getType()); 5629 if (PVars) 5630 PVars->push_back(NewParm); 5631 } 5632 5633 // The next parameter should have the same adjustment as the 5634 // last thing we pushed, but we post-incremented indexAdjustment 5635 // on every push. Also, if we push nothing, the adjustment should 5636 // go down by one. 5637 indexAdjustment--; 5638 5639 // We're done with the pack expansion. 5640 continue; 5641 } 5642 5643 // We'll substitute the parameter now without expanding the pack 5644 // expansion. 5645 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5646 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5647 indexAdjustment, 5648 NumExpansions, 5649 /*ExpectParameterPack=*/true); 5650 assert(NewParm->isParameterPack() && 5651 "Parameter pack no longer a parameter pack after " 5652 "transformation."); 5653 } else { 5654 NewParm = getDerived().TransformFunctionTypeParam( 5655 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5656 } 5657 5658 if (!NewParm) 5659 return true; 5660 5661 if (ParamInfos) 5662 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5663 OutParamTypes.push_back(NewParm->getType()); 5664 if (PVars) 5665 PVars->push_back(NewParm); 5666 continue; 5667 } 5668 5669 // Deal with the possibility that we don't have a parameter 5670 // declaration for this parameter. 5671 QualType OldType = ParamTypes[i]; 5672 bool IsPackExpansion = false; 5673 Optional<unsigned> NumExpansions; 5674 QualType NewType; 5675 if (const PackExpansionType *Expansion 5676 = dyn_cast<PackExpansionType>(OldType)) { 5677 // We have a function parameter pack that may need to be expanded. 5678 QualType Pattern = Expansion->getPattern(); 5679 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5680 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5681 5682 // Determine whether we should expand the parameter packs. 5683 bool ShouldExpand = false; 5684 bool RetainExpansion = false; 5685 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5686 Unexpanded, 5687 ShouldExpand, 5688 RetainExpansion, 5689 NumExpansions)) { 5690 return true; 5691 } 5692 5693 if (ShouldExpand) { 5694 // Expand the function parameter pack into multiple, separate 5695 // parameters. 5696 for (unsigned I = 0; I != *NumExpansions; ++I) { 5697 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5698 QualType NewType = getDerived().TransformType(Pattern); 5699 if (NewType.isNull()) 5700 return true; 5701 5702 if (NewType->containsUnexpandedParameterPack()) { 5703 NewType = 5704 getSema().getASTContext().getPackExpansionType(NewType, None); 5705 5706 if (NewType.isNull()) 5707 return true; 5708 } 5709 5710 if (ParamInfos) 5711 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5712 OutParamTypes.push_back(NewType); 5713 if (PVars) 5714 PVars->push_back(nullptr); 5715 } 5716 5717 // We're done with the pack expansion. 5718 continue; 5719 } 5720 5721 // If we're supposed to retain a pack expansion, do so by temporarily 5722 // forgetting the partially-substituted parameter pack. 5723 if (RetainExpansion) { 5724 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5725 QualType NewType = getDerived().TransformType(Pattern); 5726 if (NewType.isNull()) 5727 return true; 5728 5729 if (ParamInfos) 5730 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5731 OutParamTypes.push_back(NewType); 5732 if (PVars) 5733 PVars->push_back(nullptr); 5734 } 5735 5736 // We'll substitute the parameter now without expanding the pack 5737 // expansion. 5738 OldType = Expansion->getPattern(); 5739 IsPackExpansion = true; 5740 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5741 NewType = getDerived().TransformType(OldType); 5742 } else { 5743 NewType = getDerived().TransformType(OldType); 5744 } 5745 5746 if (NewType.isNull()) 5747 return true; 5748 5749 if (IsPackExpansion) 5750 NewType = getSema().Context.getPackExpansionType(NewType, 5751 NumExpansions); 5752 5753 if (ParamInfos) 5754 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5755 OutParamTypes.push_back(NewType); 5756 if (PVars) 5757 PVars->push_back(nullptr); 5758 } 5759 5760 #ifndef NDEBUG 5761 if (PVars) { 5762 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5763 if (ParmVarDecl *parm = (*PVars)[i]) 5764 assert(parm->getFunctionScopeIndex() == i); 5765 } 5766 #endif 5767 5768 return false; 5769 } 5770 5771 template<typename Derived> 5772 QualType 5773 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5774 FunctionProtoTypeLoc TL) { 5775 SmallVector<QualType, 4> ExceptionStorage; 5776 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5777 return getDerived().TransformFunctionProtoType( 5778 TLB, TL, nullptr, Qualifiers(), 5779 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5780 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5781 ExceptionStorage, Changed); 5782 }); 5783 } 5784 5785 template<typename Derived> template<typename Fn> 5786 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5787 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5788 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5789 5790 // Transform the parameters and return type. 5791 // 5792 // We are required to instantiate the params and return type in source order. 5793 // When the function has a trailing return type, we instantiate the 5794 // parameters before the return type, since the return type can then refer 5795 // to the parameters themselves (via decltype, sizeof, etc.). 5796 // 5797 SmallVector<QualType, 4> ParamTypes; 5798 SmallVector<ParmVarDecl*, 4> ParamDecls; 5799 Sema::ExtParameterInfoBuilder ExtParamInfos; 5800 const FunctionProtoType *T = TL.getTypePtr(); 5801 5802 QualType ResultType; 5803 5804 if (T->hasTrailingReturn()) { 5805 if (getDerived().TransformFunctionTypeParams( 5806 TL.getBeginLoc(), TL.getParams(), 5807 TL.getTypePtr()->param_type_begin(), 5808 T->getExtParameterInfosOrNull(), 5809 ParamTypes, &ParamDecls, ExtParamInfos)) 5810 return QualType(); 5811 5812 { 5813 // C++11 [expr.prim.general]p3: 5814 // If a declaration declares a member function or member function 5815 // template of a class X, the expression this is a prvalue of type 5816 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5817 // and the end of the function-definition, member-declarator, or 5818 // declarator. 5819 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5820 5821 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5822 if (ResultType.isNull()) 5823 return QualType(); 5824 } 5825 } 5826 else { 5827 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5828 if (ResultType.isNull()) 5829 return QualType(); 5830 5831 if (getDerived().TransformFunctionTypeParams( 5832 TL.getBeginLoc(), TL.getParams(), 5833 TL.getTypePtr()->param_type_begin(), 5834 T->getExtParameterInfosOrNull(), 5835 ParamTypes, &ParamDecls, ExtParamInfos)) 5836 return QualType(); 5837 } 5838 5839 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5840 5841 bool EPIChanged = false; 5842 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5843 return QualType(); 5844 5845 // Handle extended parameter information. 5846 if (auto NewExtParamInfos = 5847 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5848 if (!EPI.ExtParameterInfos || 5849 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5850 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5851 EPIChanged = true; 5852 } 5853 EPI.ExtParameterInfos = NewExtParamInfos; 5854 } else if (EPI.ExtParameterInfos) { 5855 EPIChanged = true; 5856 EPI.ExtParameterInfos = nullptr; 5857 } 5858 5859 QualType Result = TL.getType(); 5860 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5861 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5862 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5863 if (Result.isNull()) 5864 return QualType(); 5865 } 5866 5867 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5868 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5869 NewTL.setLParenLoc(TL.getLParenLoc()); 5870 NewTL.setRParenLoc(TL.getRParenLoc()); 5871 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5872 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5873 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5874 NewTL.setParam(i, ParamDecls[i]); 5875 5876 return Result; 5877 } 5878 5879 template<typename Derived> 5880 bool TreeTransform<Derived>::TransformExceptionSpec( 5881 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5882 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5883 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5884 5885 // Instantiate a dynamic noexcept expression, if any. 5886 if (isComputedNoexcept(ESI.Type)) { 5887 EnterExpressionEvaluationContext Unevaluated( 5888 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5889 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5890 if (NoexceptExpr.isInvalid()) 5891 return true; 5892 5893 ExceptionSpecificationType EST = ESI.Type; 5894 NoexceptExpr = 5895 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5896 if (NoexceptExpr.isInvalid()) 5897 return true; 5898 5899 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5900 Changed = true; 5901 ESI.NoexceptExpr = NoexceptExpr.get(); 5902 ESI.Type = EST; 5903 } 5904 5905 if (ESI.Type != EST_Dynamic) 5906 return false; 5907 5908 // Instantiate a dynamic exception specification's type. 5909 for (QualType T : ESI.Exceptions) { 5910 if (const PackExpansionType *PackExpansion = 5911 T->getAs<PackExpansionType>()) { 5912 Changed = true; 5913 5914 // We have a pack expansion. Instantiate it. 5915 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5916 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5917 Unexpanded); 5918 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5919 5920 // Determine whether the set of unexpanded parameter packs can and 5921 // should 5922 // be expanded. 5923 bool Expand = false; 5924 bool RetainExpansion = false; 5925 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5926 // FIXME: Track the location of the ellipsis (and track source location 5927 // information for the types in the exception specification in general). 5928 if (getDerived().TryExpandParameterPacks( 5929 Loc, SourceRange(), Unexpanded, Expand, 5930 RetainExpansion, NumExpansions)) 5931 return true; 5932 5933 if (!Expand) { 5934 // We can't expand this pack expansion into separate arguments yet; 5935 // just substitute into the pattern and create a new pack expansion 5936 // type. 5937 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5938 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5939 if (U.isNull()) 5940 return true; 5941 5942 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5943 Exceptions.push_back(U); 5944 continue; 5945 } 5946 5947 // Substitute into the pack expansion pattern for each slice of the 5948 // pack. 5949 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5950 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5951 5952 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5953 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5954 return true; 5955 5956 Exceptions.push_back(U); 5957 } 5958 } else { 5959 QualType U = getDerived().TransformType(T); 5960 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5961 return true; 5962 if (T != U) 5963 Changed = true; 5964 5965 Exceptions.push_back(U); 5966 } 5967 } 5968 5969 ESI.Exceptions = Exceptions; 5970 if (ESI.Exceptions.empty()) 5971 ESI.Type = EST_DynamicNone; 5972 return false; 5973 } 5974 5975 template<typename Derived> 5976 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5977 TypeLocBuilder &TLB, 5978 FunctionNoProtoTypeLoc TL) { 5979 const FunctionNoProtoType *T = TL.getTypePtr(); 5980 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5981 if (ResultType.isNull()) 5982 return QualType(); 5983 5984 QualType Result = TL.getType(); 5985 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5986 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5987 5988 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5989 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5990 NewTL.setLParenLoc(TL.getLParenLoc()); 5991 NewTL.setRParenLoc(TL.getRParenLoc()); 5992 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5993 5994 return Result; 5995 } 5996 5997 template<typename Derived> QualType 5998 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5999 UnresolvedUsingTypeLoc TL) { 6000 const UnresolvedUsingType *T = TL.getTypePtr(); 6001 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6002 if (!D) 6003 return QualType(); 6004 6005 QualType Result = TL.getType(); 6006 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6007 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6008 if (Result.isNull()) 6009 return QualType(); 6010 } 6011 6012 // We might get an arbitrary type spec type back. We should at 6013 // least always get a type spec type, though. 6014 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6015 NewTL.setNameLoc(TL.getNameLoc()); 6016 6017 return Result; 6018 } 6019 6020 template<typename Derived> 6021 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6022 TypedefTypeLoc TL) { 6023 const TypedefType *T = TL.getTypePtr(); 6024 TypedefNameDecl *Typedef 6025 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6026 T->getDecl())); 6027 if (!Typedef) 6028 return QualType(); 6029 6030 QualType Result = TL.getType(); 6031 if (getDerived().AlwaysRebuild() || 6032 Typedef != T->getDecl()) { 6033 Result = getDerived().RebuildTypedefType(Typedef); 6034 if (Result.isNull()) 6035 return QualType(); 6036 } 6037 6038 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6039 NewTL.setNameLoc(TL.getNameLoc()); 6040 6041 return Result; 6042 } 6043 6044 template<typename Derived> 6045 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6046 TypeOfExprTypeLoc TL) { 6047 // typeof expressions are not potentially evaluated contexts 6048 EnterExpressionEvaluationContext Unevaluated( 6049 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6050 Sema::ReuseLambdaContextDecl); 6051 6052 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6053 if (E.isInvalid()) 6054 return QualType(); 6055 6056 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6057 if (E.isInvalid()) 6058 return QualType(); 6059 6060 QualType Result = TL.getType(); 6061 if (getDerived().AlwaysRebuild() || 6062 E.get() != TL.getUnderlyingExpr()) { 6063 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6064 if (Result.isNull()) 6065 return QualType(); 6066 } 6067 else E.get(); 6068 6069 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6070 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6071 NewTL.setLParenLoc(TL.getLParenLoc()); 6072 NewTL.setRParenLoc(TL.getRParenLoc()); 6073 6074 return Result; 6075 } 6076 6077 template<typename Derived> 6078 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6079 TypeOfTypeLoc TL) { 6080 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6081 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6082 if (!New_Under_TI) 6083 return QualType(); 6084 6085 QualType Result = TL.getType(); 6086 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6087 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6088 if (Result.isNull()) 6089 return QualType(); 6090 } 6091 6092 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6093 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6094 NewTL.setLParenLoc(TL.getLParenLoc()); 6095 NewTL.setRParenLoc(TL.getRParenLoc()); 6096 NewTL.setUnderlyingTInfo(New_Under_TI); 6097 6098 return Result; 6099 } 6100 6101 template<typename Derived> 6102 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6103 DecltypeTypeLoc TL) { 6104 const DecltypeType *T = TL.getTypePtr(); 6105 6106 // decltype expressions are not potentially evaluated contexts 6107 EnterExpressionEvaluationContext Unevaluated( 6108 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6109 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6110 6111 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6112 if (E.isInvalid()) 6113 return QualType(); 6114 6115 E = getSema().ActOnDecltypeExpression(E.get()); 6116 if (E.isInvalid()) 6117 return QualType(); 6118 6119 QualType Result = TL.getType(); 6120 if (getDerived().AlwaysRebuild() || 6121 E.get() != T->getUnderlyingExpr()) { 6122 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6123 if (Result.isNull()) 6124 return QualType(); 6125 } 6126 else E.get(); 6127 6128 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6129 NewTL.setNameLoc(TL.getNameLoc()); 6130 6131 return Result; 6132 } 6133 6134 template<typename Derived> 6135 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6136 TypeLocBuilder &TLB, 6137 UnaryTransformTypeLoc TL) { 6138 QualType Result = TL.getType(); 6139 if (Result->isDependentType()) { 6140 const UnaryTransformType *T = TL.getTypePtr(); 6141 QualType NewBase = 6142 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6143 Result = getDerived().RebuildUnaryTransformType(NewBase, 6144 T->getUTTKind(), 6145 TL.getKWLoc()); 6146 if (Result.isNull()) 6147 return QualType(); 6148 } 6149 6150 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6151 NewTL.setKWLoc(TL.getKWLoc()); 6152 NewTL.setParensRange(TL.getParensRange()); 6153 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6154 return Result; 6155 } 6156 6157 template<typename Derived> 6158 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6159 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6160 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6161 6162 CXXScopeSpec SS; 6163 TemplateName TemplateName = getDerived().TransformTemplateName( 6164 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6165 if (TemplateName.isNull()) 6166 return QualType(); 6167 6168 QualType OldDeduced = T->getDeducedType(); 6169 QualType NewDeduced; 6170 if (!OldDeduced.isNull()) { 6171 NewDeduced = getDerived().TransformType(OldDeduced); 6172 if (NewDeduced.isNull()) 6173 return QualType(); 6174 } 6175 6176 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6177 TemplateName, NewDeduced); 6178 if (Result.isNull()) 6179 return QualType(); 6180 6181 DeducedTemplateSpecializationTypeLoc NewTL = 6182 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6183 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6184 6185 return Result; 6186 } 6187 6188 template<typename Derived> 6189 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6190 RecordTypeLoc TL) { 6191 const RecordType *T = TL.getTypePtr(); 6192 RecordDecl *Record 6193 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6194 T->getDecl())); 6195 if (!Record) 6196 return QualType(); 6197 6198 QualType Result = TL.getType(); 6199 if (getDerived().AlwaysRebuild() || 6200 Record != T->getDecl()) { 6201 Result = getDerived().RebuildRecordType(Record); 6202 if (Result.isNull()) 6203 return QualType(); 6204 } 6205 6206 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6207 NewTL.setNameLoc(TL.getNameLoc()); 6208 6209 return Result; 6210 } 6211 6212 template<typename Derived> 6213 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6214 EnumTypeLoc TL) { 6215 const EnumType *T = TL.getTypePtr(); 6216 EnumDecl *Enum 6217 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6218 T->getDecl())); 6219 if (!Enum) 6220 return QualType(); 6221 6222 QualType Result = TL.getType(); 6223 if (getDerived().AlwaysRebuild() || 6224 Enum != T->getDecl()) { 6225 Result = getDerived().RebuildEnumType(Enum); 6226 if (Result.isNull()) 6227 return QualType(); 6228 } 6229 6230 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6231 NewTL.setNameLoc(TL.getNameLoc()); 6232 6233 return Result; 6234 } 6235 6236 template<typename Derived> 6237 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6238 TypeLocBuilder &TLB, 6239 InjectedClassNameTypeLoc TL) { 6240 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6241 TL.getTypePtr()->getDecl()); 6242 if (!D) return QualType(); 6243 6244 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6245 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6246 return T; 6247 } 6248 6249 template<typename Derived> 6250 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6251 TypeLocBuilder &TLB, 6252 TemplateTypeParmTypeLoc TL) { 6253 return TransformTypeSpecType(TLB, TL); 6254 } 6255 6256 template<typename Derived> 6257 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6258 TypeLocBuilder &TLB, 6259 SubstTemplateTypeParmTypeLoc TL) { 6260 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6261 6262 // Substitute into the replacement type, which itself might involve something 6263 // that needs to be transformed. This only tends to occur with default 6264 // template arguments of template template parameters. 6265 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6266 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6267 if (Replacement.isNull()) 6268 return QualType(); 6269 6270 // Always canonicalize the replacement type. 6271 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6272 QualType Result 6273 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6274 Replacement); 6275 6276 // Propagate type-source information. 6277 SubstTemplateTypeParmTypeLoc NewTL 6278 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6279 NewTL.setNameLoc(TL.getNameLoc()); 6280 return Result; 6281 6282 } 6283 6284 template<typename Derived> 6285 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6286 TypeLocBuilder &TLB, 6287 SubstTemplateTypeParmPackTypeLoc TL) { 6288 return TransformTypeSpecType(TLB, TL); 6289 } 6290 6291 template<typename Derived> 6292 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6293 TypeLocBuilder &TLB, 6294 TemplateSpecializationTypeLoc TL) { 6295 const TemplateSpecializationType *T = TL.getTypePtr(); 6296 6297 // The nested-name-specifier never matters in a TemplateSpecializationType, 6298 // because we can't have a dependent nested-name-specifier anyway. 6299 CXXScopeSpec SS; 6300 TemplateName Template 6301 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6302 TL.getTemplateNameLoc()); 6303 if (Template.isNull()) 6304 return QualType(); 6305 6306 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6307 } 6308 6309 template<typename Derived> 6310 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6311 AtomicTypeLoc TL) { 6312 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6313 if (ValueType.isNull()) 6314 return QualType(); 6315 6316 QualType Result = TL.getType(); 6317 if (getDerived().AlwaysRebuild() || 6318 ValueType != TL.getValueLoc().getType()) { 6319 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6320 if (Result.isNull()) 6321 return QualType(); 6322 } 6323 6324 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6325 NewTL.setKWLoc(TL.getKWLoc()); 6326 NewTL.setLParenLoc(TL.getLParenLoc()); 6327 NewTL.setRParenLoc(TL.getRParenLoc()); 6328 6329 return Result; 6330 } 6331 6332 template <typename Derived> 6333 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6334 PipeTypeLoc TL) { 6335 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6336 if (ValueType.isNull()) 6337 return QualType(); 6338 6339 QualType Result = TL.getType(); 6340 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6341 const PipeType *PT = Result->castAs<PipeType>(); 6342 bool isReadPipe = PT->isReadOnly(); 6343 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6344 if (Result.isNull()) 6345 return QualType(); 6346 } 6347 6348 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6349 NewTL.setKWLoc(TL.getKWLoc()); 6350 6351 return Result; 6352 } 6353 6354 template <typename Derived> 6355 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6356 ExtIntTypeLoc TL) { 6357 const ExtIntType *EIT = TL.getTypePtr(); 6358 QualType Result = TL.getType(); 6359 6360 if (getDerived().AlwaysRebuild()) { 6361 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6362 EIT->getNumBits(), TL.getNameLoc()); 6363 if (Result.isNull()) 6364 return QualType(); 6365 } 6366 6367 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6368 NewTL.setNameLoc(TL.getNameLoc()); 6369 return Result; 6370 } 6371 6372 template <typename Derived> 6373 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6374 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6375 const DependentExtIntType *EIT = TL.getTypePtr(); 6376 6377 EnterExpressionEvaluationContext Unevaluated( 6378 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6379 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6380 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6381 6382 if (BitsExpr.isInvalid()) 6383 return QualType(); 6384 6385 QualType Result = TL.getType(); 6386 6387 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6388 Result = getDerived().RebuildDependentExtIntType( 6389 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6390 6391 if (Result.isNull()) 6392 return QualType(); 6393 } 6394 6395 if (isa<DependentExtIntType>(Result)) { 6396 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6397 NewTL.setNameLoc(TL.getNameLoc()); 6398 } else { 6399 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6400 NewTL.setNameLoc(TL.getNameLoc()); 6401 } 6402 return Result; 6403 } 6404 6405 /// Simple iterator that traverses the template arguments in a 6406 /// container that provides a \c getArgLoc() member function. 6407 /// 6408 /// This iterator is intended to be used with the iterator form of 6409 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6410 template<typename ArgLocContainer> 6411 class TemplateArgumentLocContainerIterator { 6412 ArgLocContainer *Container; 6413 unsigned Index; 6414 6415 public: 6416 typedef TemplateArgumentLoc value_type; 6417 typedef TemplateArgumentLoc reference; 6418 typedef int difference_type; 6419 typedef std::input_iterator_tag iterator_category; 6420 6421 class pointer { 6422 TemplateArgumentLoc Arg; 6423 6424 public: 6425 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6426 6427 const TemplateArgumentLoc *operator->() const { 6428 return &Arg; 6429 } 6430 }; 6431 6432 6433 TemplateArgumentLocContainerIterator() {} 6434 6435 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6436 unsigned Index) 6437 : Container(&Container), Index(Index) { } 6438 6439 TemplateArgumentLocContainerIterator &operator++() { 6440 ++Index; 6441 return *this; 6442 } 6443 6444 TemplateArgumentLocContainerIterator operator++(int) { 6445 TemplateArgumentLocContainerIterator Old(*this); 6446 ++(*this); 6447 return Old; 6448 } 6449 6450 TemplateArgumentLoc operator*() const { 6451 return Container->getArgLoc(Index); 6452 } 6453 6454 pointer operator->() const { 6455 return pointer(Container->getArgLoc(Index)); 6456 } 6457 6458 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6459 const TemplateArgumentLocContainerIterator &Y) { 6460 return X.Container == Y.Container && X.Index == Y.Index; 6461 } 6462 6463 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6464 const TemplateArgumentLocContainerIterator &Y) { 6465 return !(X == Y); 6466 } 6467 }; 6468 6469 template<typename Derived> 6470 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6471 AutoTypeLoc TL) { 6472 const AutoType *T = TL.getTypePtr(); 6473 QualType OldDeduced = T->getDeducedType(); 6474 QualType NewDeduced; 6475 if (!OldDeduced.isNull()) { 6476 NewDeduced = getDerived().TransformType(OldDeduced); 6477 if (NewDeduced.isNull()) 6478 return QualType(); 6479 } 6480 6481 ConceptDecl *NewCD = nullptr; 6482 TemplateArgumentListInfo NewTemplateArgs; 6483 NestedNameSpecifierLoc NewNestedNameSpec; 6484 if (TL.getTypePtr()->isConstrained()) { 6485 NewCD = cast_or_null<ConceptDecl>( 6486 getDerived().TransformDecl( 6487 TL.getConceptNameLoc(), 6488 TL.getTypePtr()->getTypeConstraintConcept())); 6489 6490 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6491 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6492 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6493 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6494 ArgIterator(TL, 6495 TL.getNumArgs()), 6496 NewTemplateArgs)) 6497 return QualType(); 6498 6499 if (TL.getNestedNameSpecifierLoc()) { 6500 NewNestedNameSpec 6501 = getDerived().TransformNestedNameSpecifierLoc( 6502 TL.getNestedNameSpecifierLoc()); 6503 if (!NewNestedNameSpec) 6504 return QualType(); 6505 } 6506 } 6507 6508 QualType Result = TL.getType(); 6509 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6510 T->isDependentType()) { 6511 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6512 NewArgList.reserve(NewArgList.size()); 6513 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6514 NewArgList.push_back(ArgLoc.getArgument()); 6515 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6516 NewArgList); 6517 if (Result.isNull()) 6518 return QualType(); 6519 } 6520 6521 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6522 NewTL.setNameLoc(TL.getNameLoc()); 6523 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6524 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6525 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6526 NewTL.setFoundDecl(TL.getFoundDecl()); 6527 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6528 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6529 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6530 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6531 6532 return Result; 6533 } 6534 6535 template <typename Derived> 6536 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6537 TypeLocBuilder &TLB, 6538 TemplateSpecializationTypeLoc TL, 6539 TemplateName Template) { 6540 TemplateArgumentListInfo NewTemplateArgs; 6541 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6542 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6543 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6544 ArgIterator; 6545 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6546 ArgIterator(TL, TL.getNumArgs()), 6547 NewTemplateArgs)) 6548 return QualType(); 6549 6550 // FIXME: maybe don't rebuild if all the template arguments are the same. 6551 6552 QualType Result = 6553 getDerived().RebuildTemplateSpecializationType(Template, 6554 TL.getTemplateNameLoc(), 6555 NewTemplateArgs); 6556 6557 if (!Result.isNull()) { 6558 // Specializations of template template parameters are represented as 6559 // TemplateSpecializationTypes, and substitution of type alias templates 6560 // within a dependent context can transform them into 6561 // DependentTemplateSpecializationTypes. 6562 if (isa<DependentTemplateSpecializationType>(Result)) { 6563 DependentTemplateSpecializationTypeLoc NewTL 6564 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6565 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6566 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6567 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6568 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6569 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6570 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6571 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6572 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6573 return Result; 6574 } 6575 6576 TemplateSpecializationTypeLoc NewTL 6577 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6578 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6579 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6580 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6581 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6582 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6583 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6584 } 6585 6586 return Result; 6587 } 6588 6589 template <typename Derived> 6590 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6591 TypeLocBuilder &TLB, 6592 DependentTemplateSpecializationTypeLoc TL, 6593 TemplateName Template, 6594 CXXScopeSpec &SS) { 6595 TemplateArgumentListInfo NewTemplateArgs; 6596 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6597 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6598 typedef TemplateArgumentLocContainerIterator< 6599 DependentTemplateSpecializationTypeLoc> ArgIterator; 6600 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6601 ArgIterator(TL, TL.getNumArgs()), 6602 NewTemplateArgs)) 6603 return QualType(); 6604 6605 // FIXME: maybe don't rebuild if all the template arguments are the same. 6606 6607 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6608 QualType Result 6609 = getSema().Context.getDependentTemplateSpecializationType( 6610 TL.getTypePtr()->getKeyword(), 6611 DTN->getQualifier(), 6612 DTN->getIdentifier(), 6613 NewTemplateArgs); 6614 6615 DependentTemplateSpecializationTypeLoc NewTL 6616 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6617 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6618 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6619 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6620 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6621 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6622 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6623 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6624 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6625 return Result; 6626 } 6627 6628 QualType Result 6629 = getDerived().RebuildTemplateSpecializationType(Template, 6630 TL.getTemplateNameLoc(), 6631 NewTemplateArgs); 6632 6633 if (!Result.isNull()) { 6634 /// FIXME: Wrap this in an elaborated-type-specifier? 6635 TemplateSpecializationTypeLoc NewTL 6636 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6637 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6638 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6639 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6640 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6641 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6642 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6643 } 6644 6645 return Result; 6646 } 6647 6648 template<typename Derived> 6649 QualType 6650 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6651 ElaboratedTypeLoc TL) { 6652 const ElaboratedType *T = TL.getTypePtr(); 6653 6654 NestedNameSpecifierLoc QualifierLoc; 6655 // NOTE: the qualifier in an ElaboratedType is optional. 6656 if (TL.getQualifierLoc()) { 6657 QualifierLoc 6658 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6659 if (!QualifierLoc) 6660 return QualType(); 6661 } 6662 6663 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6664 if (NamedT.isNull()) 6665 return QualType(); 6666 6667 // C++0x [dcl.type.elab]p2: 6668 // If the identifier resolves to a typedef-name or the simple-template-id 6669 // resolves to an alias template specialization, the 6670 // elaborated-type-specifier is ill-formed. 6671 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6672 if (const TemplateSpecializationType *TST = 6673 NamedT->getAs<TemplateSpecializationType>()) { 6674 TemplateName Template = TST->getTemplateName(); 6675 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6676 Template.getAsTemplateDecl())) { 6677 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6678 diag::err_tag_reference_non_tag) 6679 << TAT << Sema::NTK_TypeAliasTemplate 6680 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6681 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6682 } 6683 } 6684 } 6685 6686 QualType Result = TL.getType(); 6687 if (getDerived().AlwaysRebuild() || 6688 QualifierLoc != TL.getQualifierLoc() || 6689 NamedT != T->getNamedType()) { 6690 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6691 T->getKeyword(), 6692 QualifierLoc, NamedT); 6693 if (Result.isNull()) 6694 return QualType(); 6695 } 6696 6697 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6698 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6699 NewTL.setQualifierLoc(QualifierLoc); 6700 return Result; 6701 } 6702 6703 template<typename Derived> 6704 QualType TreeTransform<Derived>::TransformAttributedType( 6705 TypeLocBuilder &TLB, 6706 AttributedTypeLoc TL) { 6707 const AttributedType *oldType = TL.getTypePtr(); 6708 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6709 if (modifiedType.isNull()) 6710 return QualType(); 6711 6712 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6713 const Attr *oldAttr = TL.getAttr(); 6714 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6715 if (oldAttr && !newAttr) 6716 return QualType(); 6717 6718 QualType result = TL.getType(); 6719 6720 // FIXME: dependent operand expressions? 6721 if (getDerived().AlwaysRebuild() || 6722 modifiedType != oldType->getModifiedType()) { 6723 // TODO: this is really lame; we should really be rebuilding the 6724 // equivalent type from first principles. 6725 QualType equivalentType 6726 = getDerived().TransformType(oldType->getEquivalentType()); 6727 if (equivalentType.isNull()) 6728 return QualType(); 6729 6730 // Check whether we can add nullability; it is only represented as 6731 // type sugar, and therefore cannot be diagnosed in any other way. 6732 if (auto nullability = oldType->getImmediateNullability()) { 6733 if (!modifiedType->canHaveNullability()) { 6734 SemaRef.Diag(TL.getAttr()->getLocation(), 6735 diag::err_nullability_nonpointer) 6736 << DiagNullabilityKind(*nullability, false) << modifiedType; 6737 return QualType(); 6738 } 6739 } 6740 6741 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6742 modifiedType, 6743 equivalentType); 6744 } 6745 6746 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6747 newTL.setAttr(newAttr); 6748 return result; 6749 } 6750 6751 template<typename Derived> 6752 QualType 6753 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6754 ParenTypeLoc TL) { 6755 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6756 if (Inner.isNull()) 6757 return QualType(); 6758 6759 QualType Result = TL.getType(); 6760 if (getDerived().AlwaysRebuild() || 6761 Inner != TL.getInnerLoc().getType()) { 6762 Result = getDerived().RebuildParenType(Inner); 6763 if (Result.isNull()) 6764 return QualType(); 6765 } 6766 6767 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6768 NewTL.setLParenLoc(TL.getLParenLoc()); 6769 NewTL.setRParenLoc(TL.getRParenLoc()); 6770 return Result; 6771 } 6772 6773 template <typename Derived> 6774 QualType 6775 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6776 MacroQualifiedTypeLoc TL) { 6777 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6778 if (Inner.isNull()) 6779 return QualType(); 6780 6781 QualType Result = TL.getType(); 6782 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6783 Result = 6784 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6785 if (Result.isNull()) 6786 return QualType(); 6787 } 6788 6789 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6790 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6791 return Result; 6792 } 6793 6794 template<typename Derived> 6795 QualType TreeTransform<Derived>::TransformDependentNameType( 6796 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6797 return TransformDependentNameType(TLB, TL, false); 6798 } 6799 6800 template<typename Derived> 6801 QualType TreeTransform<Derived>::TransformDependentNameType( 6802 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6803 const DependentNameType *T = TL.getTypePtr(); 6804 6805 NestedNameSpecifierLoc QualifierLoc 6806 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6807 if (!QualifierLoc) 6808 return QualType(); 6809 6810 QualType Result 6811 = getDerived().RebuildDependentNameType(T->getKeyword(), 6812 TL.getElaboratedKeywordLoc(), 6813 QualifierLoc, 6814 T->getIdentifier(), 6815 TL.getNameLoc(), 6816 DeducedTSTContext); 6817 if (Result.isNull()) 6818 return QualType(); 6819 6820 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6821 QualType NamedT = ElabT->getNamedType(); 6822 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6823 6824 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6825 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6826 NewTL.setQualifierLoc(QualifierLoc); 6827 } else { 6828 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6829 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6830 NewTL.setQualifierLoc(QualifierLoc); 6831 NewTL.setNameLoc(TL.getNameLoc()); 6832 } 6833 return Result; 6834 } 6835 6836 template<typename Derived> 6837 QualType TreeTransform<Derived>:: 6838 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6839 DependentTemplateSpecializationTypeLoc TL) { 6840 NestedNameSpecifierLoc QualifierLoc; 6841 if (TL.getQualifierLoc()) { 6842 QualifierLoc 6843 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6844 if (!QualifierLoc) 6845 return QualType(); 6846 } 6847 6848 return getDerived() 6849 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6850 } 6851 6852 template<typename Derived> 6853 QualType TreeTransform<Derived>:: 6854 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6855 DependentTemplateSpecializationTypeLoc TL, 6856 NestedNameSpecifierLoc QualifierLoc) { 6857 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6858 6859 TemplateArgumentListInfo NewTemplateArgs; 6860 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6861 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6862 6863 typedef TemplateArgumentLocContainerIterator< 6864 DependentTemplateSpecializationTypeLoc> ArgIterator; 6865 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6866 ArgIterator(TL, TL.getNumArgs()), 6867 NewTemplateArgs)) 6868 return QualType(); 6869 6870 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6871 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6872 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6873 /*AllowInjectedClassName*/ false); 6874 if (Result.isNull()) 6875 return QualType(); 6876 6877 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6878 QualType NamedT = ElabT->getNamedType(); 6879 6880 // Copy information relevant to the template specialization. 6881 TemplateSpecializationTypeLoc NamedTL 6882 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6883 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6884 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6885 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6886 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6887 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6888 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6889 6890 // Copy information relevant to the elaborated type. 6891 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6892 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6893 NewTL.setQualifierLoc(QualifierLoc); 6894 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6895 DependentTemplateSpecializationTypeLoc SpecTL 6896 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6897 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6898 SpecTL.setQualifierLoc(QualifierLoc); 6899 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6900 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6901 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6902 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6903 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6904 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6905 } else { 6906 TemplateSpecializationTypeLoc SpecTL 6907 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6908 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6909 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6910 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6911 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6912 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6913 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6914 } 6915 return Result; 6916 } 6917 6918 template<typename Derived> 6919 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6920 PackExpansionTypeLoc TL) { 6921 QualType Pattern 6922 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6923 if (Pattern.isNull()) 6924 return QualType(); 6925 6926 QualType Result = TL.getType(); 6927 if (getDerived().AlwaysRebuild() || 6928 Pattern != TL.getPatternLoc().getType()) { 6929 Result = getDerived().RebuildPackExpansionType(Pattern, 6930 TL.getPatternLoc().getSourceRange(), 6931 TL.getEllipsisLoc(), 6932 TL.getTypePtr()->getNumExpansions()); 6933 if (Result.isNull()) 6934 return QualType(); 6935 } 6936 6937 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6938 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6939 return Result; 6940 } 6941 6942 template<typename Derived> 6943 QualType 6944 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6945 ObjCInterfaceTypeLoc TL) { 6946 // ObjCInterfaceType is never dependent. 6947 TLB.pushFullCopy(TL); 6948 return TL.getType(); 6949 } 6950 6951 template<typename Derived> 6952 QualType 6953 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6954 ObjCTypeParamTypeLoc TL) { 6955 const ObjCTypeParamType *T = TL.getTypePtr(); 6956 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6957 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6958 if (!OTP) 6959 return QualType(); 6960 6961 QualType Result = TL.getType(); 6962 if (getDerived().AlwaysRebuild() || 6963 OTP != T->getDecl()) { 6964 Result = getDerived().RebuildObjCTypeParamType(OTP, 6965 TL.getProtocolLAngleLoc(), 6966 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6967 TL.getNumProtocols()), 6968 TL.getProtocolLocs(), 6969 TL.getProtocolRAngleLoc()); 6970 if (Result.isNull()) 6971 return QualType(); 6972 } 6973 6974 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6975 if (TL.getNumProtocols()) { 6976 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6977 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6978 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6979 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6980 } 6981 return Result; 6982 } 6983 6984 template<typename Derived> 6985 QualType 6986 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6987 ObjCObjectTypeLoc TL) { 6988 // Transform base type. 6989 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6990 if (BaseType.isNull()) 6991 return QualType(); 6992 6993 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6994 6995 // Transform type arguments. 6996 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6997 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6998 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6999 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7000 QualType TypeArg = TypeArgInfo->getType(); 7001 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7002 AnyChanged = true; 7003 7004 // We have a pack expansion. Instantiate it. 7005 const auto *PackExpansion = PackExpansionLoc.getType() 7006 ->castAs<PackExpansionType>(); 7007 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7008 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7009 Unexpanded); 7010 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7011 7012 // Determine whether the set of unexpanded parameter packs can 7013 // and should be expanded. 7014 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7015 bool Expand = false; 7016 bool RetainExpansion = false; 7017 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7018 if (getDerived().TryExpandParameterPacks( 7019 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7020 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7021 return QualType(); 7022 7023 if (!Expand) { 7024 // We can't expand this pack expansion into separate arguments yet; 7025 // just substitute into the pattern and create a new pack expansion 7026 // type. 7027 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7028 7029 TypeLocBuilder TypeArgBuilder; 7030 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7031 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7032 PatternLoc); 7033 if (NewPatternType.isNull()) 7034 return QualType(); 7035 7036 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7037 NewPatternType, NumExpansions); 7038 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7039 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7040 NewTypeArgInfos.push_back( 7041 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7042 continue; 7043 } 7044 7045 // Substitute into the pack expansion pattern for each slice of the 7046 // pack. 7047 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7048 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7049 7050 TypeLocBuilder TypeArgBuilder; 7051 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7052 7053 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7054 PatternLoc); 7055 if (NewTypeArg.isNull()) 7056 return QualType(); 7057 7058 NewTypeArgInfos.push_back( 7059 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7060 } 7061 7062 continue; 7063 } 7064 7065 TypeLocBuilder TypeArgBuilder; 7066 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7067 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7068 if (NewTypeArg.isNull()) 7069 return QualType(); 7070 7071 // If nothing changed, just keep the old TypeSourceInfo. 7072 if (NewTypeArg == TypeArg) { 7073 NewTypeArgInfos.push_back(TypeArgInfo); 7074 continue; 7075 } 7076 7077 NewTypeArgInfos.push_back( 7078 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7079 AnyChanged = true; 7080 } 7081 7082 QualType Result = TL.getType(); 7083 if (getDerived().AlwaysRebuild() || AnyChanged) { 7084 // Rebuild the type. 7085 Result = getDerived().RebuildObjCObjectType( 7086 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7087 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7088 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7089 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7090 7091 if (Result.isNull()) 7092 return QualType(); 7093 } 7094 7095 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7096 NewT.setHasBaseTypeAsWritten(true); 7097 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7098 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7099 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7100 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7101 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7102 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7103 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7104 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7105 return Result; 7106 } 7107 7108 template<typename Derived> 7109 QualType 7110 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7111 ObjCObjectPointerTypeLoc TL) { 7112 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7113 if (PointeeType.isNull()) 7114 return QualType(); 7115 7116 QualType Result = TL.getType(); 7117 if (getDerived().AlwaysRebuild() || 7118 PointeeType != TL.getPointeeLoc().getType()) { 7119 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7120 TL.getStarLoc()); 7121 if (Result.isNull()) 7122 return QualType(); 7123 } 7124 7125 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7126 NewT.setStarLoc(TL.getStarLoc()); 7127 return Result; 7128 } 7129 7130 //===----------------------------------------------------------------------===// 7131 // Statement transformation 7132 //===----------------------------------------------------------------------===// 7133 template<typename Derived> 7134 StmtResult 7135 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7136 return S; 7137 } 7138 7139 template<typename Derived> 7140 StmtResult 7141 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7142 return getDerived().TransformCompoundStmt(S, false); 7143 } 7144 7145 template<typename Derived> 7146 StmtResult 7147 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7148 bool IsStmtExpr) { 7149 Sema::CompoundScopeRAII CompoundScope(getSema()); 7150 7151 const Stmt *ExprResult = S->getStmtExprResult(); 7152 bool SubStmtInvalid = false; 7153 bool SubStmtChanged = false; 7154 SmallVector<Stmt*, 8> Statements; 7155 for (auto *B : S->body()) { 7156 StmtResult Result = getDerived().TransformStmt( 7157 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7158 7159 if (Result.isInvalid()) { 7160 // Immediately fail if this was a DeclStmt, since it's very 7161 // likely that this will cause problems for future statements. 7162 if (isa<DeclStmt>(B)) 7163 return StmtError(); 7164 7165 // Otherwise, just keep processing substatements and fail later. 7166 SubStmtInvalid = true; 7167 continue; 7168 } 7169 7170 SubStmtChanged = SubStmtChanged || Result.get() != B; 7171 Statements.push_back(Result.getAs<Stmt>()); 7172 } 7173 7174 if (SubStmtInvalid) 7175 return StmtError(); 7176 7177 if (!getDerived().AlwaysRebuild() && 7178 !SubStmtChanged) 7179 return S; 7180 7181 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7182 Statements, 7183 S->getRBracLoc(), 7184 IsStmtExpr); 7185 } 7186 7187 template<typename Derived> 7188 StmtResult 7189 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7190 ExprResult LHS, RHS; 7191 { 7192 EnterExpressionEvaluationContext Unevaluated( 7193 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7194 7195 // Transform the left-hand case value. 7196 LHS = getDerived().TransformExpr(S->getLHS()); 7197 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7198 if (LHS.isInvalid()) 7199 return StmtError(); 7200 7201 // Transform the right-hand case value (for the GNU case-range extension). 7202 RHS = getDerived().TransformExpr(S->getRHS()); 7203 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7204 if (RHS.isInvalid()) 7205 return StmtError(); 7206 } 7207 7208 // Build the case statement. 7209 // Case statements are always rebuilt so that they will attached to their 7210 // transformed switch statement. 7211 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7212 LHS.get(), 7213 S->getEllipsisLoc(), 7214 RHS.get(), 7215 S->getColonLoc()); 7216 if (Case.isInvalid()) 7217 return StmtError(); 7218 7219 // Transform the statement following the case 7220 StmtResult SubStmt = 7221 getDerived().TransformStmt(S->getSubStmt()); 7222 if (SubStmt.isInvalid()) 7223 return StmtError(); 7224 7225 // Attach the body to the case statement 7226 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7227 } 7228 7229 template <typename Derived> 7230 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7231 // Transform the statement following the default case 7232 StmtResult SubStmt = 7233 getDerived().TransformStmt(S->getSubStmt()); 7234 if (SubStmt.isInvalid()) 7235 return StmtError(); 7236 7237 // Default statements are always rebuilt 7238 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7239 SubStmt.get()); 7240 } 7241 7242 template<typename Derived> 7243 StmtResult 7244 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7245 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7246 if (SubStmt.isInvalid()) 7247 return StmtError(); 7248 7249 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7250 S->getDecl()); 7251 if (!LD) 7252 return StmtError(); 7253 7254 // If we're transforming "in-place" (we're not creating new local 7255 // declarations), assume we're replacing the old label statement 7256 // and clear out the reference to it. 7257 if (LD == S->getDecl()) 7258 S->getDecl()->setStmt(nullptr); 7259 7260 // FIXME: Pass the real colon location in. 7261 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7262 cast<LabelDecl>(LD), SourceLocation(), 7263 SubStmt.get()); 7264 } 7265 7266 template <typename Derived> 7267 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7268 if (!R) 7269 return R; 7270 7271 switch (R->getKind()) { 7272 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7273 #define ATTR(X) 7274 #define PRAGMA_SPELLING_ATTR(X) \ 7275 case attr::X: \ 7276 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7277 #include "clang/Basic/AttrList.inc" 7278 default: 7279 return R; 7280 } 7281 } 7282 7283 template <typename Derived> 7284 StmtResult 7285 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7286 StmtDiscardKind SDK) { 7287 bool AttrsChanged = false; 7288 SmallVector<const Attr *, 1> Attrs; 7289 7290 // Visit attributes and keep track if any are transformed. 7291 for (const auto *I : S->getAttrs()) { 7292 const Attr *R = getDerived().TransformAttr(I); 7293 AttrsChanged |= (I != R); 7294 Attrs.push_back(R); 7295 } 7296 7297 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7298 if (SubStmt.isInvalid()) 7299 return StmtError(); 7300 7301 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7302 return S; 7303 7304 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7305 SubStmt.get()); 7306 } 7307 7308 template<typename Derived> 7309 StmtResult 7310 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7311 // Transform the initialization statement 7312 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7313 if (Init.isInvalid()) 7314 return StmtError(); 7315 7316 // Transform the condition 7317 Sema::ConditionResult Cond = getDerived().TransformCondition( 7318 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7319 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7320 : Sema::ConditionKind::Boolean); 7321 if (Cond.isInvalid()) 7322 return StmtError(); 7323 7324 // If this is a constexpr if, determine which arm we should instantiate. 7325 llvm::Optional<bool> ConstexprConditionValue; 7326 if (S->isConstexpr()) 7327 ConstexprConditionValue = Cond.getKnownValue(); 7328 7329 // Transform the "then" branch. 7330 StmtResult Then; 7331 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7332 Then = getDerived().TransformStmt(S->getThen()); 7333 if (Then.isInvalid()) 7334 return StmtError(); 7335 } else { 7336 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7337 } 7338 7339 // Transform the "else" branch. 7340 StmtResult Else; 7341 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7342 Else = getDerived().TransformStmt(S->getElse()); 7343 if (Else.isInvalid()) 7344 return StmtError(); 7345 } 7346 7347 if (!getDerived().AlwaysRebuild() && 7348 Init.get() == S->getInit() && 7349 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7350 Then.get() == S->getThen() && 7351 Else.get() == S->getElse()) 7352 return S; 7353 7354 return getDerived().RebuildIfStmt( 7355 S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, 7356 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7357 } 7358 7359 template<typename Derived> 7360 StmtResult 7361 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7362 // Transform the initialization statement 7363 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7364 if (Init.isInvalid()) 7365 return StmtError(); 7366 7367 // Transform the condition. 7368 Sema::ConditionResult Cond = getDerived().TransformCondition( 7369 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7370 Sema::ConditionKind::Switch); 7371 if (Cond.isInvalid()) 7372 return StmtError(); 7373 7374 // Rebuild the switch statement. 7375 StmtResult Switch = 7376 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7377 Init.get(), Cond, S->getRParenLoc()); 7378 if (Switch.isInvalid()) 7379 return StmtError(); 7380 7381 // Transform the body of the switch statement. 7382 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7383 if (Body.isInvalid()) 7384 return StmtError(); 7385 7386 // Complete the switch statement. 7387 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7388 Body.get()); 7389 } 7390 7391 template<typename Derived> 7392 StmtResult 7393 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7394 // Transform the condition 7395 Sema::ConditionResult Cond = getDerived().TransformCondition( 7396 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7397 Sema::ConditionKind::Boolean); 7398 if (Cond.isInvalid()) 7399 return StmtError(); 7400 7401 // Transform the body 7402 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7403 if (Body.isInvalid()) 7404 return StmtError(); 7405 7406 if (!getDerived().AlwaysRebuild() && 7407 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7408 Body.get() == S->getBody()) 7409 return Owned(S); 7410 7411 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7412 Cond, S->getRParenLoc(), Body.get()); 7413 } 7414 7415 template<typename Derived> 7416 StmtResult 7417 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7418 // Transform the body 7419 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7420 if (Body.isInvalid()) 7421 return StmtError(); 7422 7423 // Transform the condition 7424 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7425 if (Cond.isInvalid()) 7426 return StmtError(); 7427 7428 if (!getDerived().AlwaysRebuild() && 7429 Cond.get() == S->getCond() && 7430 Body.get() == S->getBody()) 7431 return S; 7432 7433 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7434 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7435 S->getRParenLoc()); 7436 } 7437 7438 template<typename Derived> 7439 StmtResult 7440 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7441 if (getSema().getLangOpts().OpenMP) 7442 getSema().startOpenMPLoop(); 7443 7444 // Transform the initialization statement 7445 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7446 if (Init.isInvalid()) 7447 return StmtError(); 7448 7449 // In OpenMP loop region loop control variable must be captured and be 7450 // private. Perform analysis of first part (if any). 7451 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7452 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7453 7454 // Transform the condition 7455 Sema::ConditionResult Cond = getDerived().TransformCondition( 7456 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7457 Sema::ConditionKind::Boolean); 7458 if (Cond.isInvalid()) 7459 return StmtError(); 7460 7461 // Transform the increment 7462 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7463 if (Inc.isInvalid()) 7464 return StmtError(); 7465 7466 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7467 if (S->getInc() && !FullInc.get()) 7468 return StmtError(); 7469 7470 // Transform the body 7471 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7472 if (Body.isInvalid()) 7473 return StmtError(); 7474 7475 if (!getDerived().AlwaysRebuild() && 7476 Init.get() == S->getInit() && 7477 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7478 Inc.get() == S->getInc() && 7479 Body.get() == S->getBody()) 7480 return S; 7481 7482 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7483 Init.get(), Cond, FullInc, 7484 S->getRParenLoc(), Body.get()); 7485 } 7486 7487 template<typename Derived> 7488 StmtResult 7489 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7490 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7491 S->getLabel()); 7492 if (!LD) 7493 return StmtError(); 7494 7495 // Goto statements must always be rebuilt, to resolve the label. 7496 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7497 cast<LabelDecl>(LD)); 7498 } 7499 7500 template<typename Derived> 7501 StmtResult 7502 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7503 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7504 if (Target.isInvalid()) 7505 return StmtError(); 7506 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7507 7508 if (!getDerived().AlwaysRebuild() && 7509 Target.get() == S->getTarget()) 7510 return S; 7511 7512 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7513 Target.get()); 7514 } 7515 7516 template<typename Derived> 7517 StmtResult 7518 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7519 return S; 7520 } 7521 7522 template<typename Derived> 7523 StmtResult 7524 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7525 return S; 7526 } 7527 7528 template<typename Derived> 7529 StmtResult 7530 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7531 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7532 /*NotCopyInit*/false); 7533 if (Result.isInvalid()) 7534 return StmtError(); 7535 7536 // FIXME: We always rebuild the return statement because there is no way 7537 // to tell whether the return type of the function has changed. 7538 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7539 } 7540 7541 template<typename Derived> 7542 StmtResult 7543 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7544 bool DeclChanged = false; 7545 SmallVector<Decl *, 4> Decls; 7546 for (auto *D : S->decls()) { 7547 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7548 if (!Transformed) 7549 return StmtError(); 7550 7551 if (Transformed != D) 7552 DeclChanged = true; 7553 7554 Decls.push_back(Transformed); 7555 } 7556 7557 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7558 return S; 7559 7560 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7561 } 7562 7563 template<typename Derived> 7564 StmtResult 7565 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7566 7567 SmallVector<Expr*, 8> Constraints; 7568 SmallVector<Expr*, 8> Exprs; 7569 SmallVector<IdentifierInfo *, 4> Names; 7570 7571 ExprResult AsmString; 7572 SmallVector<Expr*, 8> Clobbers; 7573 7574 bool ExprsChanged = false; 7575 7576 // Go through the outputs. 7577 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7578 Names.push_back(S->getOutputIdentifier(I)); 7579 7580 // No need to transform the constraint literal. 7581 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7582 7583 // Transform the output expr. 7584 Expr *OutputExpr = S->getOutputExpr(I); 7585 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7586 if (Result.isInvalid()) 7587 return StmtError(); 7588 7589 ExprsChanged |= Result.get() != OutputExpr; 7590 7591 Exprs.push_back(Result.get()); 7592 } 7593 7594 // Go through the inputs. 7595 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7596 Names.push_back(S->getInputIdentifier(I)); 7597 7598 // No need to transform the constraint literal. 7599 Constraints.push_back(S->getInputConstraintLiteral(I)); 7600 7601 // Transform the input expr. 7602 Expr *InputExpr = S->getInputExpr(I); 7603 ExprResult Result = getDerived().TransformExpr(InputExpr); 7604 if (Result.isInvalid()) 7605 return StmtError(); 7606 7607 ExprsChanged |= Result.get() != InputExpr; 7608 7609 Exprs.push_back(Result.get()); 7610 } 7611 7612 // Go through the Labels. 7613 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7614 Names.push_back(S->getLabelIdentifier(I)); 7615 7616 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7617 if (Result.isInvalid()) 7618 return StmtError(); 7619 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7620 Exprs.push_back(Result.get()); 7621 } 7622 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7623 return S; 7624 7625 // Go through the clobbers. 7626 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7627 Clobbers.push_back(S->getClobberStringLiteral(I)); 7628 7629 // No need to transform the asm string literal. 7630 AsmString = S->getAsmString(); 7631 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7632 S->isVolatile(), S->getNumOutputs(), 7633 S->getNumInputs(), Names.data(), 7634 Constraints, Exprs, AsmString.get(), 7635 Clobbers, S->getNumLabels(), 7636 S->getRParenLoc()); 7637 } 7638 7639 template<typename Derived> 7640 StmtResult 7641 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7642 ArrayRef<Token> AsmToks = 7643 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7644 7645 bool HadError = false, HadChange = false; 7646 7647 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7648 SmallVector<Expr*, 8> TransformedExprs; 7649 TransformedExprs.reserve(SrcExprs.size()); 7650 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7651 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7652 if (!Result.isUsable()) { 7653 HadError = true; 7654 } else { 7655 HadChange |= (Result.get() != SrcExprs[i]); 7656 TransformedExprs.push_back(Result.get()); 7657 } 7658 } 7659 7660 if (HadError) return StmtError(); 7661 if (!HadChange && !getDerived().AlwaysRebuild()) 7662 return Owned(S); 7663 7664 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7665 AsmToks, S->getAsmString(), 7666 S->getNumOutputs(), S->getNumInputs(), 7667 S->getAllConstraints(), S->getClobbers(), 7668 TransformedExprs, S->getEndLoc()); 7669 } 7670 7671 // C++ Coroutines TS 7672 7673 template<typename Derived> 7674 StmtResult 7675 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7676 auto *ScopeInfo = SemaRef.getCurFunction(); 7677 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7678 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7679 ScopeInfo->NeedsCoroutineSuspends && 7680 ScopeInfo->CoroutineSuspends.first == nullptr && 7681 ScopeInfo->CoroutineSuspends.second == nullptr && 7682 "expected clean scope info"); 7683 7684 // Set that we have (possibly-invalid) suspend points before we do anything 7685 // that may fail. 7686 ScopeInfo->setNeedsCoroutineSuspends(false); 7687 7688 // We re-build the coroutine promise object (and the coroutine parameters its 7689 // type and constructor depend on) based on the types used in our current 7690 // function. We must do so, and set it on the current FunctionScopeInfo, 7691 // before attempting to transform the other parts of the coroutine body 7692 // statement, such as the implicit suspend statements (because those 7693 // statements reference the FunctionScopeInfo::CoroutinePromise). 7694 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7695 return StmtError(); 7696 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7697 if (!Promise) 7698 return StmtError(); 7699 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7700 ScopeInfo->CoroutinePromise = Promise; 7701 7702 // Transform the implicit coroutine statements constructed using dependent 7703 // types during the previous parse: initial and final suspensions, the return 7704 // object, and others. We also transform the coroutine function's body. 7705 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7706 if (InitSuspend.isInvalid()) 7707 return StmtError(); 7708 StmtResult FinalSuspend = 7709 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7710 if (FinalSuspend.isInvalid() || 7711 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7712 return StmtError(); 7713 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7714 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7715 7716 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7717 if (BodyRes.isInvalid()) 7718 return StmtError(); 7719 7720 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7721 if (Builder.isInvalid()) 7722 return StmtError(); 7723 7724 Expr *ReturnObject = S->getReturnValueInit(); 7725 assert(ReturnObject && "the return object is expected to be valid"); 7726 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7727 /*NoCopyInit*/ false); 7728 if (Res.isInvalid()) 7729 return StmtError(); 7730 Builder.ReturnValue = Res.get(); 7731 7732 // If during the previous parse the coroutine still had a dependent promise 7733 // statement, we may need to build some implicit coroutine statements 7734 // (such as exception and fallthrough handlers) for the first time. 7735 if (S->hasDependentPromiseType()) { 7736 // We can only build these statements, however, if the current promise type 7737 // is not dependent. 7738 if (!Promise->getType()->isDependentType()) { 7739 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7740 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7741 "these nodes should not have been built yet"); 7742 if (!Builder.buildDependentStatements()) 7743 return StmtError(); 7744 } 7745 } else { 7746 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7747 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7748 if (Res.isInvalid()) 7749 return StmtError(); 7750 Builder.OnFallthrough = Res.get(); 7751 } 7752 7753 if (auto *OnException = S->getExceptionHandler()) { 7754 StmtResult Res = getDerived().TransformStmt(OnException); 7755 if (Res.isInvalid()) 7756 return StmtError(); 7757 Builder.OnException = Res.get(); 7758 } 7759 7760 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7761 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7762 if (Res.isInvalid()) 7763 return StmtError(); 7764 Builder.ReturnStmtOnAllocFailure = Res.get(); 7765 } 7766 7767 // Transform any additional statements we may have already built 7768 assert(S->getAllocate() && S->getDeallocate() && 7769 "allocation and deallocation calls must already be built"); 7770 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7771 if (AllocRes.isInvalid()) 7772 return StmtError(); 7773 Builder.Allocate = AllocRes.get(); 7774 7775 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7776 if (DeallocRes.isInvalid()) 7777 return StmtError(); 7778 Builder.Deallocate = DeallocRes.get(); 7779 7780 assert(S->getResultDecl() && "ResultDecl must already be built"); 7781 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7782 if (ResultDecl.isInvalid()) 7783 return StmtError(); 7784 Builder.ResultDecl = ResultDecl.get(); 7785 7786 if (auto *ReturnStmt = S->getReturnStmt()) { 7787 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7788 if (Res.isInvalid()) 7789 return StmtError(); 7790 Builder.ReturnStmt = Res.get(); 7791 } 7792 } 7793 7794 return getDerived().RebuildCoroutineBodyStmt(Builder); 7795 } 7796 7797 template<typename Derived> 7798 StmtResult 7799 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7800 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7801 /*NotCopyInit*/false); 7802 if (Result.isInvalid()) 7803 return StmtError(); 7804 7805 // Always rebuild; we don't know if this needs to be injected into a new 7806 // context or if the promise type has changed. 7807 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7808 S->isImplicit()); 7809 } 7810 7811 template<typename Derived> 7812 ExprResult 7813 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7814 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7815 /*NotCopyInit*/false); 7816 if (Result.isInvalid()) 7817 return ExprError(); 7818 7819 // Always rebuild; we don't know if this needs to be injected into a new 7820 // context or if the promise type has changed. 7821 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7822 E->isImplicit()); 7823 } 7824 7825 template <typename Derived> 7826 ExprResult 7827 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7828 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7829 /*NotCopyInit*/ false); 7830 if (OperandResult.isInvalid()) 7831 return ExprError(); 7832 7833 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7834 E->getOperatorCoawaitLookup()); 7835 7836 if (LookupResult.isInvalid()) 7837 return ExprError(); 7838 7839 // Always rebuild; we don't know if this needs to be injected into a new 7840 // context or if the promise type has changed. 7841 return getDerived().RebuildDependentCoawaitExpr( 7842 E->getKeywordLoc(), OperandResult.get(), 7843 cast<UnresolvedLookupExpr>(LookupResult.get())); 7844 } 7845 7846 template<typename Derived> 7847 ExprResult 7848 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7849 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7850 /*NotCopyInit*/false); 7851 if (Result.isInvalid()) 7852 return ExprError(); 7853 7854 // Always rebuild; we don't know if this needs to be injected into a new 7855 // context or if the promise type has changed. 7856 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7857 } 7858 7859 // Objective-C Statements. 7860 7861 template<typename Derived> 7862 StmtResult 7863 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7864 // Transform the body of the @try. 7865 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7866 if (TryBody.isInvalid()) 7867 return StmtError(); 7868 7869 // Transform the @catch statements (if present). 7870 bool AnyCatchChanged = false; 7871 SmallVector<Stmt*, 8> CatchStmts; 7872 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7873 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7874 if (Catch.isInvalid()) 7875 return StmtError(); 7876 if (Catch.get() != S->getCatchStmt(I)) 7877 AnyCatchChanged = true; 7878 CatchStmts.push_back(Catch.get()); 7879 } 7880 7881 // Transform the @finally statement (if present). 7882 StmtResult Finally; 7883 if (S->getFinallyStmt()) { 7884 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7885 if (Finally.isInvalid()) 7886 return StmtError(); 7887 } 7888 7889 // If nothing changed, just retain this statement. 7890 if (!getDerived().AlwaysRebuild() && 7891 TryBody.get() == S->getTryBody() && 7892 !AnyCatchChanged && 7893 Finally.get() == S->getFinallyStmt()) 7894 return S; 7895 7896 // Build a new statement. 7897 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7898 CatchStmts, Finally.get()); 7899 } 7900 7901 template<typename Derived> 7902 StmtResult 7903 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7904 // Transform the @catch parameter, if there is one. 7905 VarDecl *Var = nullptr; 7906 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7907 TypeSourceInfo *TSInfo = nullptr; 7908 if (FromVar->getTypeSourceInfo()) { 7909 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7910 if (!TSInfo) 7911 return StmtError(); 7912 } 7913 7914 QualType T; 7915 if (TSInfo) 7916 T = TSInfo->getType(); 7917 else { 7918 T = getDerived().TransformType(FromVar->getType()); 7919 if (T.isNull()) 7920 return StmtError(); 7921 } 7922 7923 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7924 if (!Var) 7925 return StmtError(); 7926 } 7927 7928 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7929 if (Body.isInvalid()) 7930 return StmtError(); 7931 7932 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7933 S->getRParenLoc(), 7934 Var, Body.get()); 7935 } 7936 7937 template<typename Derived> 7938 StmtResult 7939 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7940 // Transform the body. 7941 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7942 if (Body.isInvalid()) 7943 return StmtError(); 7944 7945 // If nothing changed, just retain this statement. 7946 if (!getDerived().AlwaysRebuild() && 7947 Body.get() == S->getFinallyBody()) 7948 return S; 7949 7950 // Build a new statement. 7951 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7952 Body.get()); 7953 } 7954 7955 template<typename Derived> 7956 StmtResult 7957 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7958 ExprResult Operand; 7959 if (S->getThrowExpr()) { 7960 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7961 if (Operand.isInvalid()) 7962 return StmtError(); 7963 } 7964 7965 if (!getDerived().AlwaysRebuild() && 7966 Operand.get() == S->getThrowExpr()) 7967 return S; 7968 7969 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7970 } 7971 7972 template<typename Derived> 7973 StmtResult 7974 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7975 ObjCAtSynchronizedStmt *S) { 7976 // Transform the object we are locking. 7977 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7978 if (Object.isInvalid()) 7979 return StmtError(); 7980 Object = 7981 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7982 Object.get()); 7983 if (Object.isInvalid()) 7984 return StmtError(); 7985 7986 // Transform the body. 7987 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7988 if (Body.isInvalid()) 7989 return StmtError(); 7990 7991 // If nothing change, just retain the current statement. 7992 if (!getDerived().AlwaysRebuild() && 7993 Object.get() == S->getSynchExpr() && 7994 Body.get() == S->getSynchBody()) 7995 return S; 7996 7997 // Build a new statement. 7998 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7999 Object.get(), Body.get()); 8000 } 8001 8002 template<typename Derived> 8003 StmtResult 8004 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8005 ObjCAutoreleasePoolStmt *S) { 8006 // Transform the body. 8007 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8008 if (Body.isInvalid()) 8009 return StmtError(); 8010 8011 // If nothing changed, just retain this statement. 8012 if (!getDerived().AlwaysRebuild() && 8013 Body.get() == S->getSubStmt()) 8014 return S; 8015 8016 // Build a new statement. 8017 return getDerived().RebuildObjCAutoreleasePoolStmt( 8018 S->getAtLoc(), Body.get()); 8019 } 8020 8021 template<typename Derived> 8022 StmtResult 8023 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8024 ObjCForCollectionStmt *S) { 8025 // Transform the element statement. 8026 StmtResult Element = 8027 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8028 if (Element.isInvalid()) 8029 return StmtError(); 8030 8031 // Transform the collection expression. 8032 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8033 if (Collection.isInvalid()) 8034 return StmtError(); 8035 8036 // Transform the body. 8037 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8038 if (Body.isInvalid()) 8039 return StmtError(); 8040 8041 // If nothing changed, just retain this statement. 8042 if (!getDerived().AlwaysRebuild() && 8043 Element.get() == S->getElement() && 8044 Collection.get() == S->getCollection() && 8045 Body.get() == S->getBody()) 8046 return S; 8047 8048 // Build a new statement. 8049 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8050 Element.get(), 8051 Collection.get(), 8052 S->getRParenLoc(), 8053 Body.get()); 8054 } 8055 8056 template <typename Derived> 8057 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8058 // Transform the exception declaration, if any. 8059 VarDecl *Var = nullptr; 8060 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8061 TypeSourceInfo *T = 8062 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8063 if (!T) 8064 return StmtError(); 8065 8066 Var = getDerived().RebuildExceptionDecl( 8067 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8068 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8069 if (!Var || Var->isInvalidDecl()) 8070 return StmtError(); 8071 } 8072 8073 // Transform the actual exception handler. 8074 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8075 if (Handler.isInvalid()) 8076 return StmtError(); 8077 8078 if (!getDerived().AlwaysRebuild() && !Var && 8079 Handler.get() == S->getHandlerBlock()) 8080 return S; 8081 8082 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8083 } 8084 8085 template <typename Derived> 8086 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8087 // Transform the try block itself. 8088 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8089 if (TryBlock.isInvalid()) 8090 return StmtError(); 8091 8092 // Transform the handlers. 8093 bool HandlerChanged = false; 8094 SmallVector<Stmt *, 8> Handlers; 8095 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8096 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8097 if (Handler.isInvalid()) 8098 return StmtError(); 8099 8100 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8101 Handlers.push_back(Handler.getAs<Stmt>()); 8102 } 8103 8104 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8105 !HandlerChanged) 8106 return S; 8107 8108 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8109 Handlers); 8110 } 8111 8112 template<typename Derived> 8113 StmtResult 8114 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8115 StmtResult Init = 8116 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8117 if (Init.isInvalid()) 8118 return StmtError(); 8119 8120 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8121 if (Range.isInvalid()) 8122 return StmtError(); 8123 8124 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8125 if (Begin.isInvalid()) 8126 return StmtError(); 8127 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8128 if (End.isInvalid()) 8129 return StmtError(); 8130 8131 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8132 if (Cond.isInvalid()) 8133 return StmtError(); 8134 if (Cond.get()) 8135 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8136 if (Cond.isInvalid()) 8137 return StmtError(); 8138 if (Cond.get()) 8139 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8140 8141 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8142 if (Inc.isInvalid()) 8143 return StmtError(); 8144 if (Inc.get()) 8145 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8146 8147 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8148 if (LoopVar.isInvalid()) 8149 return StmtError(); 8150 8151 StmtResult NewStmt = S; 8152 if (getDerived().AlwaysRebuild() || 8153 Init.get() != S->getInit() || 8154 Range.get() != S->getRangeStmt() || 8155 Begin.get() != S->getBeginStmt() || 8156 End.get() != S->getEndStmt() || 8157 Cond.get() != S->getCond() || 8158 Inc.get() != S->getInc() || 8159 LoopVar.get() != S->getLoopVarStmt()) { 8160 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8161 S->getCoawaitLoc(), Init.get(), 8162 S->getColonLoc(), Range.get(), 8163 Begin.get(), End.get(), 8164 Cond.get(), 8165 Inc.get(), LoopVar.get(), 8166 S->getRParenLoc()); 8167 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8168 // Might not have attached any initializer to the loop variable. 8169 getSema().ActOnInitializerError( 8170 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8171 return StmtError(); 8172 } 8173 } 8174 8175 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8176 if (Body.isInvalid()) 8177 return StmtError(); 8178 8179 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8180 // it now so we have a new statement to attach the body to. 8181 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8182 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8183 S->getCoawaitLoc(), Init.get(), 8184 S->getColonLoc(), Range.get(), 8185 Begin.get(), End.get(), 8186 Cond.get(), 8187 Inc.get(), LoopVar.get(), 8188 S->getRParenLoc()); 8189 if (NewStmt.isInvalid()) 8190 return StmtError(); 8191 } 8192 8193 if (NewStmt.get() == S) 8194 return S; 8195 8196 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8197 } 8198 8199 template<typename Derived> 8200 StmtResult 8201 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8202 MSDependentExistsStmt *S) { 8203 // Transform the nested-name-specifier, if any. 8204 NestedNameSpecifierLoc QualifierLoc; 8205 if (S->getQualifierLoc()) { 8206 QualifierLoc 8207 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8208 if (!QualifierLoc) 8209 return StmtError(); 8210 } 8211 8212 // Transform the declaration name. 8213 DeclarationNameInfo NameInfo = S->getNameInfo(); 8214 if (NameInfo.getName()) { 8215 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8216 if (!NameInfo.getName()) 8217 return StmtError(); 8218 } 8219 8220 // Check whether anything changed. 8221 if (!getDerived().AlwaysRebuild() && 8222 QualifierLoc == S->getQualifierLoc() && 8223 NameInfo.getName() == S->getNameInfo().getName()) 8224 return S; 8225 8226 // Determine whether this name exists, if we can. 8227 CXXScopeSpec SS; 8228 SS.Adopt(QualifierLoc); 8229 bool Dependent = false; 8230 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8231 case Sema::IER_Exists: 8232 if (S->isIfExists()) 8233 break; 8234 8235 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8236 8237 case Sema::IER_DoesNotExist: 8238 if (S->isIfNotExists()) 8239 break; 8240 8241 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8242 8243 case Sema::IER_Dependent: 8244 Dependent = true; 8245 break; 8246 8247 case Sema::IER_Error: 8248 return StmtError(); 8249 } 8250 8251 // We need to continue with the instantiation, so do so now. 8252 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8253 if (SubStmt.isInvalid()) 8254 return StmtError(); 8255 8256 // If we have resolved the name, just transform to the substatement. 8257 if (!Dependent) 8258 return SubStmt; 8259 8260 // The name is still dependent, so build a dependent expression again. 8261 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8262 S->isIfExists(), 8263 QualifierLoc, 8264 NameInfo, 8265 SubStmt.get()); 8266 } 8267 8268 template<typename Derived> 8269 ExprResult 8270 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8271 NestedNameSpecifierLoc QualifierLoc; 8272 if (E->getQualifierLoc()) { 8273 QualifierLoc 8274 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8275 if (!QualifierLoc) 8276 return ExprError(); 8277 } 8278 8279 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8280 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8281 if (!PD) 8282 return ExprError(); 8283 8284 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8285 if (Base.isInvalid()) 8286 return ExprError(); 8287 8288 return new (SemaRef.getASTContext()) 8289 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8290 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8291 QualifierLoc, E->getMemberLoc()); 8292 } 8293 8294 template <typename Derived> 8295 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8296 MSPropertySubscriptExpr *E) { 8297 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8298 if (BaseRes.isInvalid()) 8299 return ExprError(); 8300 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8301 if (IdxRes.isInvalid()) 8302 return ExprError(); 8303 8304 if (!getDerived().AlwaysRebuild() && 8305 BaseRes.get() == E->getBase() && 8306 IdxRes.get() == E->getIdx()) 8307 return E; 8308 8309 return getDerived().RebuildArraySubscriptExpr( 8310 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8311 } 8312 8313 template <typename Derived> 8314 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8315 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8316 if (TryBlock.isInvalid()) 8317 return StmtError(); 8318 8319 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8320 if (Handler.isInvalid()) 8321 return StmtError(); 8322 8323 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8324 Handler.get() == S->getHandler()) 8325 return S; 8326 8327 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8328 TryBlock.get(), Handler.get()); 8329 } 8330 8331 template <typename Derived> 8332 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8333 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8334 if (Block.isInvalid()) 8335 return StmtError(); 8336 8337 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8338 } 8339 8340 template <typename Derived> 8341 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8342 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8343 if (FilterExpr.isInvalid()) 8344 return StmtError(); 8345 8346 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8347 if (Block.isInvalid()) 8348 return StmtError(); 8349 8350 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8351 Block.get()); 8352 } 8353 8354 template <typename Derived> 8355 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8356 if (isa<SEHFinallyStmt>(Handler)) 8357 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8358 else 8359 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8360 } 8361 8362 template<typename Derived> 8363 StmtResult 8364 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8365 return S; 8366 } 8367 8368 //===----------------------------------------------------------------------===// 8369 // OpenMP directive transformation 8370 //===----------------------------------------------------------------------===// 8371 8372 template <typename Derived> 8373 StmtResult 8374 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8375 // OMPCanonicalLoops are eliminated during transformation, since they will be 8376 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8377 // after transformation. 8378 return getDerived().TransformStmt(L->getLoopStmt()); 8379 } 8380 8381 template <typename Derived> 8382 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8383 OMPExecutableDirective *D) { 8384 8385 // Transform the clauses 8386 llvm::SmallVector<OMPClause *, 16> TClauses; 8387 ArrayRef<OMPClause *> Clauses = D->clauses(); 8388 TClauses.reserve(Clauses.size()); 8389 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8390 I != E; ++I) { 8391 if (*I) { 8392 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8393 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8394 getDerived().getSema().EndOpenMPClause(); 8395 if (Clause) 8396 TClauses.push_back(Clause); 8397 } else { 8398 TClauses.push_back(nullptr); 8399 } 8400 } 8401 StmtResult AssociatedStmt; 8402 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8403 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8404 /*CurScope=*/nullptr); 8405 StmtResult Body; 8406 { 8407 Sema::CompoundScopeRAII CompoundScope(getSema()); 8408 Stmt *CS; 8409 if (D->getDirectiveKind() == OMPD_atomic || 8410 D->getDirectiveKind() == OMPD_critical || 8411 D->getDirectiveKind() == OMPD_section || 8412 D->getDirectiveKind() == OMPD_master) 8413 CS = D->getAssociatedStmt(); 8414 else 8415 CS = D->getRawStmt(); 8416 Body = getDerived().TransformStmt(CS); 8417 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8418 getSema().getLangOpts().OpenMPIRBuilder) 8419 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8420 } 8421 AssociatedStmt = 8422 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8423 if (AssociatedStmt.isInvalid()) { 8424 return StmtError(); 8425 } 8426 } 8427 if (TClauses.size() != Clauses.size()) { 8428 return StmtError(); 8429 } 8430 8431 // Transform directive name for 'omp critical' directive. 8432 DeclarationNameInfo DirName; 8433 if (D->getDirectiveKind() == OMPD_critical) { 8434 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8435 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8436 } 8437 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8438 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8439 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8440 } else if (D->getDirectiveKind() == OMPD_cancel) { 8441 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8442 } 8443 8444 return getDerived().RebuildOMPExecutableDirective( 8445 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8446 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8447 } 8448 8449 template <typename Derived> 8450 StmtResult 8451 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8452 DeclarationNameInfo DirName; 8453 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8454 D->getBeginLoc()); 8455 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8456 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8457 return Res; 8458 } 8459 8460 template <typename Derived> 8461 StmtResult 8462 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8463 DeclarationNameInfo DirName; 8464 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8465 D->getBeginLoc()); 8466 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8467 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8468 return Res; 8469 } 8470 8471 template <typename Derived> 8472 StmtResult 8473 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8474 DeclarationNameInfo DirName; 8475 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8476 nullptr, D->getBeginLoc()); 8477 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8478 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8479 return Res; 8480 } 8481 8482 template <typename Derived> 8483 StmtResult 8484 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8485 DeclarationNameInfo DirName; 8486 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8487 D->getBeginLoc()); 8488 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8489 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8490 return Res; 8491 } 8492 8493 template <typename Derived> 8494 StmtResult 8495 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8496 DeclarationNameInfo DirName; 8497 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8498 D->getBeginLoc()); 8499 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8500 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8501 return Res; 8502 } 8503 8504 template <typename Derived> 8505 StmtResult 8506 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8507 DeclarationNameInfo DirName; 8508 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8509 D->getBeginLoc()); 8510 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8511 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8512 return Res; 8513 } 8514 8515 template <typename Derived> 8516 StmtResult 8517 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8518 DeclarationNameInfo DirName; 8519 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8520 D->getBeginLoc()); 8521 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8522 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8523 return Res; 8524 } 8525 8526 template <typename Derived> 8527 StmtResult 8528 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8529 DeclarationNameInfo DirName; 8530 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8531 D->getBeginLoc()); 8532 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8533 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8534 return Res; 8535 } 8536 8537 template <typename Derived> 8538 StmtResult 8539 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8540 DeclarationNameInfo DirName; 8541 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8542 D->getBeginLoc()); 8543 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8544 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8545 return Res; 8546 } 8547 8548 template <typename Derived> 8549 StmtResult 8550 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8551 getDerived().getSema().StartOpenMPDSABlock( 8552 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8553 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8554 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8555 return Res; 8556 } 8557 8558 template <typename Derived> 8559 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8560 OMPParallelForDirective *D) { 8561 DeclarationNameInfo DirName; 8562 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8563 nullptr, D->getBeginLoc()); 8564 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8565 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8566 return Res; 8567 } 8568 8569 template <typename Derived> 8570 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8571 OMPParallelForSimdDirective *D) { 8572 DeclarationNameInfo DirName; 8573 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8574 nullptr, D->getBeginLoc()); 8575 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8576 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8577 return Res; 8578 } 8579 8580 template <typename Derived> 8581 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8582 OMPParallelMasterDirective *D) { 8583 DeclarationNameInfo DirName; 8584 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8585 nullptr, D->getBeginLoc()); 8586 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8587 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8588 return Res; 8589 } 8590 8591 template <typename Derived> 8592 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8593 OMPParallelSectionsDirective *D) { 8594 DeclarationNameInfo DirName; 8595 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8596 nullptr, D->getBeginLoc()); 8597 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8598 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8599 return Res; 8600 } 8601 8602 template <typename Derived> 8603 StmtResult 8604 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8605 DeclarationNameInfo DirName; 8606 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8607 D->getBeginLoc()); 8608 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8609 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8610 return Res; 8611 } 8612 8613 template <typename Derived> 8614 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8615 OMPTaskyieldDirective *D) { 8616 DeclarationNameInfo DirName; 8617 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8618 D->getBeginLoc()); 8619 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8620 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8621 return Res; 8622 } 8623 8624 template <typename Derived> 8625 StmtResult 8626 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8627 DeclarationNameInfo DirName; 8628 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8629 D->getBeginLoc()); 8630 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8631 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8632 return Res; 8633 } 8634 8635 template <typename Derived> 8636 StmtResult 8637 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8638 DeclarationNameInfo DirName; 8639 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8640 D->getBeginLoc()); 8641 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8642 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8643 return Res; 8644 } 8645 8646 template <typename Derived> 8647 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8648 OMPTaskgroupDirective *D) { 8649 DeclarationNameInfo DirName; 8650 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8651 D->getBeginLoc()); 8652 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8653 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8654 return Res; 8655 } 8656 8657 template <typename Derived> 8658 StmtResult 8659 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8660 DeclarationNameInfo DirName; 8661 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8662 D->getBeginLoc()); 8663 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8664 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8665 return Res; 8666 } 8667 8668 template <typename Derived> 8669 StmtResult 8670 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8671 DeclarationNameInfo DirName; 8672 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8673 D->getBeginLoc()); 8674 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8675 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8676 return Res; 8677 } 8678 8679 template <typename Derived> 8680 StmtResult 8681 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8682 DeclarationNameInfo DirName; 8683 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8684 D->getBeginLoc()); 8685 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8686 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8687 return Res; 8688 } 8689 8690 template <typename Derived> 8691 StmtResult 8692 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8693 DeclarationNameInfo DirName; 8694 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8695 D->getBeginLoc()); 8696 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8697 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8698 return Res; 8699 } 8700 8701 template <typename Derived> 8702 StmtResult 8703 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8704 DeclarationNameInfo DirName; 8705 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8706 D->getBeginLoc()); 8707 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8708 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8709 return Res; 8710 } 8711 8712 template <typename Derived> 8713 StmtResult 8714 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8715 DeclarationNameInfo DirName; 8716 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8717 D->getBeginLoc()); 8718 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8719 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8720 return Res; 8721 } 8722 8723 template <typename Derived> 8724 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8725 OMPTargetDataDirective *D) { 8726 DeclarationNameInfo DirName; 8727 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8728 D->getBeginLoc()); 8729 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8730 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8731 return Res; 8732 } 8733 8734 template <typename Derived> 8735 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8736 OMPTargetEnterDataDirective *D) { 8737 DeclarationNameInfo DirName; 8738 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8739 nullptr, D->getBeginLoc()); 8740 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8741 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8742 return Res; 8743 } 8744 8745 template <typename Derived> 8746 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8747 OMPTargetExitDataDirective *D) { 8748 DeclarationNameInfo DirName; 8749 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8750 nullptr, D->getBeginLoc()); 8751 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8752 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8753 return Res; 8754 } 8755 8756 template <typename Derived> 8757 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8758 OMPTargetParallelDirective *D) { 8759 DeclarationNameInfo DirName; 8760 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8761 nullptr, D->getBeginLoc()); 8762 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8763 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8764 return Res; 8765 } 8766 8767 template <typename Derived> 8768 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8769 OMPTargetParallelForDirective *D) { 8770 DeclarationNameInfo DirName; 8771 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8772 nullptr, D->getBeginLoc()); 8773 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8774 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8775 return Res; 8776 } 8777 8778 template <typename Derived> 8779 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8780 OMPTargetUpdateDirective *D) { 8781 DeclarationNameInfo DirName; 8782 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8783 nullptr, D->getBeginLoc()); 8784 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8785 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8786 return Res; 8787 } 8788 8789 template <typename Derived> 8790 StmtResult 8791 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8792 DeclarationNameInfo DirName; 8793 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8794 D->getBeginLoc()); 8795 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8796 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8797 return Res; 8798 } 8799 8800 template <typename Derived> 8801 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8802 OMPCancellationPointDirective *D) { 8803 DeclarationNameInfo DirName; 8804 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8805 nullptr, D->getBeginLoc()); 8806 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8807 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8808 return Res; 8809 } 8810 8811 template <typename Derived> 8812 StmtResult 8813 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8814 DeclarationNameInfo DirName; 8815 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8816 D->getBeginLoc()); 8817 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8818 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8819 return Res; 8820 } 8821 8822 template <typename Derived> 8823 StmtResult 8824 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8825 DeclarationNameInfo DirName; 8826 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8827 D->getBeginLoc()); 8828 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8829 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8830 return Res; 8831 } 8832 8833 template <typename Derived> 8834 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8835 OMPTaskLoopSimdDirective *D) { 8836 DeclarationNameInfo DirName; 8837 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8838 nullptr, D->getBeginLoc()); 8839 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8840 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8841 return Res; 8842 } 8843 8844 template <typename Derived> 8845 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8846 OMPMasterTaskLoopDirective *D) { 8847 DeclarationNameInfo DirName; 8848 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8849 nullptr, D->getBeginLoc()); 8850 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8851 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8852 return Res; 8853 } 8854 8855 template <typename Derived> 8856 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8857 OMPMasterTaskLoopSimdDirective *D) { 8858 DeclarationNameInfo DirName; 8859 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8860 nullptr, D->getBeginLoc()); 8861 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8862 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8863 return Res; 8864 } 8865 8866 template <typename Derived> 8867 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8868 OMPParallelMasterTaskLoopDirective *D) { 8869 DeclarationNameInfo DirName; 8870 getDerived().getSema().StartOpenMPDSABlock( 8871 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8872 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8873 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8874 return Res; 8875 } 8876 8877 template <typename Derived> 8878 StmtResult 8879 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8880 OMPParallelMasterTaskLoopSimdDirective *D) { 8881 DeclarationNameInfo DirName; 8882 getDerived().getSema().StartOpenMPDSABlock( 8883 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8884 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8885 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8886 return Res; 8887 } 8888 8889 template <typename Derived> 8890 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8891 OMPDistributeDirective *D) { 8892 DeclarationNameInfo DirName; 8893 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8894 D->getBeginLoc()); 8895 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8896 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8897 return Res; 8898 } 8899 8900 template <typename Derived> 8901 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8902 OMPDistributeParallelForDirective *D) { 8903 DeclarationNameInfo DirName; 8904 getDerived().getSema().StartOpenMPDSABlock( 8905 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8906 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8907 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8908 return Res; 8909 } 8910 8911 template <typename Derived> 8912 StmtResult 8913 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8914 OMPDistributeParallelForSimdDirective *D) { 8915 DeclarationNameInfo DirName; 8916 getDerived().getSema().StartOpenMPDSABlock( 8917 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8918 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8919 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8920 return Res; 8921 } 8922 8923 template <typename Derived> 8924 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8925 OMPDistributeSimdDirective *D) { 8926 DeclarationNameInfo DirName; 8927 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8928 nullptr, D->getBeginLoc()); 8929 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8930 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8931 return Res; 8932 } 8933 8934 template <typename Derived> 8935 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8936 OMPTargetParallelForSimdDirective *D) { 8937 DeclarationNameInfo DirName; 8938 getDerived().getSema().StartOpenMPDSABlock( 8939 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8940 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8941 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8942 return Res; 8943 } 8944 8945 template <typename Derived> 8946 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8947 OMPTargetSimdDirective *D) { 8948 DeclarationNameInfo DirName; 8949 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8950 D->getBeginLoc()); 8951 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8952 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8953 return Res; 8954 } 8955 8956 template <typename Derived> 8957 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8958 OMPTeamsDistributeDirective *D) { 8959 DeclarationNameInfo DirName; 8960 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8961 nullptr, D->getBeginLoc()); 8962 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8963 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8964 return Res; 8965 } 8966 8967 template <typename Derived> 8968 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8969 OMPTeamsDistributeSimdDirective *D) { 8970 DeclarationNameInfo DirName; 8971 getDerived().getSema().StartOpenMPDSABlock( 8972 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8973 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8974 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8975 return Res; 8976 } 8977 8978 template <typename Derived> 8979 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8980 OMPTeamsDistributeParallelForSimdDirective *D) { 8981 DeclarationNameInfo DirName; 8982 getDerived().getSema().StartOpenMPDSABlock( 8983 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8984 D->getBeginLoc()); 8985 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8986 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8987 return Res; 8988 } 8989 8990 template <typename Derived> 8991 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8992 OMPTeamsDistributeParallelForDirective *D) { 8993 DeclarationNameInfo DirName; 8994 getDerived().getSema().StartOpenMPDSABlock( 8995 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8996 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8997 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8998 return Res; 8999 } 9000 9001 template <typename Derived> 9002 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9003 OMPTargetTeamsDirective *D) { 9004 DeclarationNameInfo DirName; 9005 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9006 nullptr, D->getBeginLoc()); 9007 auto Res = getDerived().TransformOMPExecutableDirective(D); 9008 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9009 return Res; 9010 } 9011 9012 template <typename Derived> 9013 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9014 OMPTargetTeamsDistributeDirective *D) { 9015 DeclarationNameInfo DirName; 9016 getDerived().getSema().StartOpenMPDSABlock( 9017 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9018 auto Res = getDerived().TransformOMPExecutableDirective(D); 9019 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9020 return Res; 9021 } 9022 9023 template <typename Derived> 9024 StmtResult 9025 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9026 OMPTargetTeamsDistributeParallelForDirective *D) { 9027 DeclarationNameInfo DirName; 9028 getDerived().getSema().StartOpenMPDSABlock( 9029 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9030 D->getBeginLoc()); 9031 auto Res = getDerived().TransformOMPExecutableDirective(D); 9032 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9033 return Res; 9034 } 9035 9036 template <typename Derived> 9037 StmtResult TreeTransform<Derived>:: 9038 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9039 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9040 DeclarationNameInfo DirName; 9041 getDerived().getSema().StartOpenMPDSABlock( 9042 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9043 D->getBeginLoc()); 9044 auto Res = getDerived().TransformOMPExecutableDirective(D); 9045 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9046 return Res; 9047 } 9048 9049 template <typename Derived> 9050 StmtResult 9051 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9052 OMPTargetTeamsDistributeSimdDirective *D) { 9053 DeclarationNameInfo DirName; 9054 getDerived().getSema().StartOpenMPDSABlock( 9055 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9056 auto Res = getDerived().TransformOMPExecutableDirective(D); 9057 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9058 return Res; 9059 } 9060 9061 template <typename Derived> 9062 StmtResult 9063 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9064 DeclarationNameInfo DirName; 9065 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9066 D->getBeginLoc()); 9067 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9068 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9069 return Res; 9070 } 9071 9072 //===----------------------------------------------------------------------===// 9073 // OpenMP clause transformation 9074 //===----------------------------------------------------------------------===// 9075 template <typename Derived> 9076 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9077 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9078 if (Cond.isInvalid()) 9079 return nullptr; 9080 return getDerived().RebuildOMPIfClause( 9081 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9082 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9083 } 9084 9085 template <typename Derived> 9086 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9087 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9088 if (Cond.isInvalid()) 9089 return nullptr; 9090 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9091 C->getLParenLoc(), C->getEndLoc()); 9092 } 9093 9094 template <typename Derived> 9095 OMPClause * 9096 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9097 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9098 if (NumThreads.isInvalid()) 9099 return nullptr; 9100 return getDerived().RebuildOMPNumThreadsClause( 9101 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9102 } 9103 9104 template <typename Derived> 9105 OMPClause * 9106 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9107 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9108 if (E.isInvalid()) 9109 return nullptr; 9110 return getDerived().RebuildOMPSafelenClause( 9111 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9112 } 9113 9114 template <typename Derived> 9115 OMPClause * 9116 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9117 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9118 if (E.isInvalid()) 9119 return nullptr; 9120 return getDerived().RebuildOMPAllocatorClause( 9121 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9122 } 9123 9124 template <typename Derived> 9125 OMPClause * 9126 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9127 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9128 if (E.isInvalid()) 9129 return nullptr; 9130 return getDerived().RebuildOMPSimdlenClause( 9131 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9132 } 9133 9134 template <typename Derived> 9135 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9136 SmallVector<Expr *, 4> TransformedSizes; 9137 TransformedSizes.reserve(C->getNumSizes()); 9138 bool Changed = false; 9139 for (Expr *E : C->getSizesRefs()) { 9140 if (!E) { 9141 TransformedSizes.push_back(nullptr); 9142 continue; 9143 } 9144 9145 ExprResult T = getDerived().TransformExpr(E); 9146 if (T.isInvalid()) 9147 return nullptr; 9148 if (E != T.get()) 9149 Changed = true; 9150 TransformedSizes.push_back(T.get()); 9151 } 9152 9153 if (!Changed && !getDerived().AlwaysRebuild()) 9154 return C; 9155 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9156 C->getLParenLoc(), C->getEndLoc()); 9157 } 9158 9159 template <typename Derived> 9160 OMPClause * 9161 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9162 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9163 if (E.isInvalid()) 9164 return nullptr; 9165 return getDerived().RebuildOMPCollapseClause( 9166 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9167 } 9168 9169 template <typename Derived> 9170 OMPClause * 9171 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9172 return getDerived().RebuildOMPDefaultClause( 9173 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9174 C->getLParenLoc(), C->getEndLoc()); 9175 } 9176 9177 template <typename Derived> 9178 OMPClause * 9179 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9180 return getDerived().RebuildOMPProcBindClause( 9181 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9182 C->getLParenLoc(), C->getEndLoc()); 9183 } 9184 9185 template <typename Derived> 9186 OMPClause * 9187 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9188 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9189 if (E.isInvalid()) 9190 return nullptr; 9191 return getDerived().RebuildOMPScheduleClause( 9192 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9193 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9194 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9195 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9196 } 9197 9198 template <typename Derived> 9199 OMPClause * 9200 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9201 ExprResult E; 9202 if (auto *Num = C->getNumForLoops()) { 9203 E = getDerived().TransformExpr(Num); 9204 if (E.isInvalid()) 9205 return nullptr; 9206 } 9207 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9208 C->getLParenLoc(), E.get()); 9209 } 9210 9211 template <typename Derived> 9212 OMPClause * 9213 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9214 ExprResult E; 9215 if (Expr *Evt = C->getEventHandler()) { 9216 E = getDerived().TransformExpr(Evt); 9217 if (E.isInvalid()) 9218 return nullptr; 9219 } 9220 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9221 C->getLParenLoc(), C->getEndLoc()); 9222 } 9223 9224 template <typename Derived> 9225 OMPClause * 9226 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9227 // No need to rebuild this clause, no template-dependent parameters. 9228 return C; 9229 } 9230 9231 template <typename Derived> 9232 OMPClause * 9233 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9234 // No need to rebuild this clause, no template-dependent parameters. 9235 return C; 9236 } 9237 9238 template <typename Derived> 9239 OMPClause * 9240 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9241 // No need to rebuild this clause, no template-dependent parameters. 9242 return C; 9243 } 9244 9245 template <typename Derived> 9246 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9247 // No need to rebuild this clause, no template-dependent parameters. 9248 return C; 9249 } 9250 9251 template <typename Derived> 9252 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9253 // No need to rebuild this clause, no template-dependent parameters. 9254 return C; 9255 } 9256 9257 template <typename Derived> 9258 OMPClause * 9259 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9260 // No need to rebuild this clause, no template-dependent parameters. 9261 return C; 9262 } 9263 9264 template <typename Derived> 9265 OMPClause * 9266 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9267 // No need to rebuild this clause, no template-dependent parameters. 9268 return C; 9269 } 9270 9271 template <typename Derived> 9272 OMPClause * 9273 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9274 // No need to rebuild this clause, no template-dependent parameters. 9275 return C; 9276 } 9277 9278 template <typename Derived> 9279 OMPClause * 9280 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9281 // No need to rebuild this clause, no template-dependent parameters. 9282 return C; 9283 } 9284 9285 template <typename Derived> 9286 OMPClause * 9287 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9288 // No need to rebuild this clause, no template-dependent parameters. 9289 return C; 9290 } 9291 9292 template <typename Derived> 9293 OMPClause * 9294 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9295 // No need to rebuild this clause, no template-dependent parameters. 9296 return C; 9297 } 9298 9299 template <typename Derived> 9300 OMPClause * 9301 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9302 // No need to rebuild this clause, no template-dependent parameters. 9303 return C; 9304 } 9305 9306 template <typename Derived> 9307 OMPClause * 9308 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9309 // No need to rebuild this clause, no template-dependent parameters. 9310 return C; 9311 } 9312 9313 template <typename Derived> 9314 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9315 // No need to rebuild this clause, no template-dependent parameters. 9316 return C; 9317 } 9318 9319 template <typename Derived> 9320 OMPClause * 9321 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9322 // No need to rebuild this clause, no template-dependent parameters. 9323 return C; 9324 } 9325 9326 template <typename Derived> 9327 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9328 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9329 if (IVR.isInvalid()) 9330 return nullptr; 9331 9332 llvm::SmallVector<Expr *, 8> PrefExprs; 9333 PrefExprs.reserve(C->varlist_size() - 1); 9334 for (Expr *E : llvm::drop_begin(C->varlists())) { 9335 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9336 if (ER.isInvalid()) 9337 return nullptr; 9338 PrefExprs.push_back(ER.get()); 9339 } 9340 return getDerived().RebuildOMPInitClause( 9341 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9342 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9343 } 9344 9345 template <typename Derived> 9346 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9347 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9348 if (ER.isInvalid()) 9349 return nullptr; 9350 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9351 C->getLParenLoc(), C->getVarLoc(), 9352 C->getEndLoc()); 9353 } 9354 9355 template <typename Derived> 9356 OMPClause * 9357 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9358 ExprResult ER; 9359 if (Expr *IV = C->getInteropVar()) { 9360 ER = getDerived().TransformExpr(IV); 9361 if (ER.isInvalid()) 9362 return nullptr; 9363 } 9364 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9365 C->getLParenLoc(), C->getVarLoc(), 9366 C->getEndLoc()); 9367 } 9368 9369 template <typename Derived> 9370 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9371 OMPUnifiedAddressClause *C) { 9372 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9373 } 9374 9375 template <typename Derived> 9376 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9377 OMPUnifiedSharedMemoryClause *C) { 9378 llvm_unreachable( 9379 "unified_shared_memory clause cannot appear in dependent context"); 9380 } 9381 9382 template <typename Derived> 9383 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9384 OMPReverseOffloadClause *C) { 9385 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9386 } 9387 9388 template <typename Derived> 9389 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9390 OMPDynamicAllocatorsClause *C) { 9391 llvm_unreachable( 9392 "dynamic_allocators clause cannot appear in dependent context"); 9393 } 9394 9395 template <typename Derived> 9396 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9397 OMPAtomicDefaultMemOrderClause *C) { 9398 llvm_unreachable( 9399 "atomic_default_mem_order clause cannot appear in dependent context"); 9400 } 9401 9402 template <typename Derived> 9403 OMPClause * 9404 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9405 llvm::SmallVector<Expr *, 16> Vars; 9406 Vars.reserve(C->varlist_size()); 9407 for (auto *VE : C->varlists()) { 9408 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9409 if (EVar.isInvalid()) 9410 return nullptr; 9411 Vars.push_back(EVar.get()); 9412 } 9413 return getDerived().RebuildOMPPrivateClause( 9414 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9415 } 9416 9417 template <typename Derived> 9418 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9419 OMPFirstprivateClause *C) { 9420 llvm::SmallVector<Expr *, 16> Vars; 9421 Vars.reserve(C->varlist_size()); 9422 for (auto *VE : C->varlists()) { 9423 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9424 if (EVar.isInvalid()) 9425 return nullptr; 9426 Vars.push_back(EVar.get()); 9427 } 9428 return getDerived().RebuildOMPFirstprivateClause( 9429 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9430 } 9431 9432 template <typename Derived> 9433 OMPClause * 9434 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9435 llvm::SmallVector<Expr *, 16> Vars; 9436 Vars.reserve(C->varlist_size()); 9437 for (auto *VE : C->varlists()) { 9438 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9439 if (EVar.isInvalid()) 9440 return nullptr; 9441 Vars.push_back(EVar.get()); 9442 } 9443 return getDerived().RebuildOMPLastprivateClause( 9444 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9445 C->getLParenLoc(), C->getEndLoc()); 9446 } 9447 9448 template <typename Derived> 9449 OMPClause * 9450 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9451 llvm::SmallVector<Expr *, 16> Vars; 9452 Vars.reserve(C->varlist_size()); 9453 for (auto *VE : C->varlists()) { 9454 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9455 if (EVar.isInvalid()) 9456 return nullptr; 9457 Vars.push_back(EVar.get()); 9458 } 9459 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9460 C->getLParenLoc(), C->getEndLoc()); 9461 } 9462 9463 template <typename Derived> 9464 OMPClause * 9465 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9466 llvm::SmallVector<Expr *, 16> Vars; 9467 Vars.reserve(C->varlist_size()); 9468 for (auto *VE : C->varlists()) { 9469 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9470 if (EVar.isInvalid()) 9471 return nullptr; 9472 Vars.push_back(EVar.get()); 9473 } 9474 CXXScopeSpec ReductionIdScopeSpec; 9475 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9476 9477 DeclarationNameInfo NameInfo = C->getNameInfo(); 9478 if (NameInfo.getName()) { 9479 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9480 if (!NameInfo.getName()) 9481 return nullptr; 9482 } 9483 // Build a list of all UDR decls with the same names ranged by the Scopes. 9484 // The Scope boundary is a duplication of the previous decl. 9485 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9486 for (auto *E : C->reduction_ops()) { 9487 // Transform all the decls. 9488 if (E) { 9489 auto *ULE = cast<UnresolvedLookupExpr>(E); 9490 UnresolvedSet<8> Decls; 9491 for (auto *D : ULE->decls()) { 9492 NamedDecl *InstD = 9493 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9494 Decls.addDecl(InstD, InstD->getAccess()); 9495 } 9496 UnresolvedReductions.push_back( 9497 UnresolvedLookupExpr::Create( 9498 SemaRef.Context, /*NamingClass=*/nullptr, 9499 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9500 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9501 Decls.begin(), Decls.end())); 9502 } else 9503 UnresolvedReductions.push_back(nullptr); 9504 } 9505 return getDerived().RebuildOMPReductionClause( 9506 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9507 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9508 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9509 } 9510 9511 template <typename Derived> 9512 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9513 OMPTaskReductionClause *C) { 9514 llvm::SmallVector<Expr *, 16> Vars; 9515 Vars.reserve(C->varlist_size()); 9516 for (auto *VE : C->varlists()) { 9517 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9518 if (EVar.isInvalid()) 9519 return nullptr; 9520 Vars.push_back(EVar.get()); 9521 } 9522 CXXScopeSpec ReductionIdScopeSpec; 9523 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9524 9525 DeclarationNameInfo NameInfo = C->getNameInfo(); 9526 if (NameInfo.getName()) { 9527 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9528 if (!NameInfo.getName()) 9529 return nullptr; 9530 } 9531 // Build a list of all UDR decls with the same names ranged by the Scopes. 9532 // The Scope boundary is a duplication of the previous decl. 9533 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9534 for (auto *E : C->reduction_ops()) { 9535 // Transform all the decls. 9536 if (E) { 9537 auto *ULE = cast<UnresolvedLookupExpr>(E); 9538 UnresolvedSet<8> Decls; 9539 for (auto *D : ULE->decls()) { 9540 NamedDecl *InstD = 9541 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9542 Decls.addDecl(InstD, InstD->getAccess()); 9543 } 9544 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9545 SemaRef.Context, /*NamingClass=*/nullptr, 9546 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9547 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9548 } else 9549 UnresolvedReductions.push_back(nullptr); 9550 } 9551 return getDerived().RebuildOMPTaskReductionClause( 9552 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9553 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9554 } 9555 9556 template <typename Derived> 9557 OMPClause * 9558 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9559 llvm::SmallVector<Expr *, 16> Vars; 9560 Vars.reserve(C->varlist_size()); 9561 for (auto *VE : C->varlists()) { 9562 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9563 if (EVar.isInvalid()) 9564 return nullptr; 9565 Vars.push_back(EVar.get()); 9566 } 9567 CXXScopeSpec ReductionIdScopeSpec; 9568 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9569 9570 DeclarationNameInfo NameInfo = C->getNameInfo(); 9571 if (NameInfo.getName()) { 9572 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9573 if (!NameInfo.getName()) 9574 return nullptr; 9575 } 9576 // Build a list of all UDR decls with the same names ranged by the Scopes. 9577 // The Scope boundary is a duplication of the previous decl. 9578 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9579 for (auto *E : C->reduction_ops()) { 9580 // Transform all the decls. 9581 if (E) { 9582 auto *ULE = cast<UnresolvedLookupExpr>(E); 9583 UnresolvedSet<8> Decls; 9584 for (auto *D : ULE->decls()) { 9585 NamedDecl *InstD = 9586 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9587 Decls.addDecl(InstD, InstD->getAccess()); 9588 } 9589 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9590 SemaRef.Context, /*NamingClass=*/nullptr, 9591 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9592 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9593 } else 9594 UnresolvedReductions.push_back(nullptr); 9595 } 9596 return getDerived().RebuildOMPInReductionClause( 9597 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9598 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9599 } 9600 9601 template <typename Derived> 9602 OMPClause * 9603 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9604 llvm::SmallVector<Expr *, 16> Vars; 9605 Vars.reserve(C->varlist_size()); 9606 for (auto *VE : C->varlists()) { 9607 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9608 if (EVar.isInvalid()) 9609 return nullptr; 9610 Vars.push_back(EVar.get()); 9611 } 9612 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9613 if (Step.isInvalid()) 9614 return nullptr; 9615 return getDerived().RebuildOMPLinearClause( 9616 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9617 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9618 } 9619 9620 template <typename Derived> 9621 OMPClause * 9622 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9623 llvm::SmallVector<Expr *, 16> Vars; 9624 Vars.reserve(C->varlist_size()); 9625 for (auto *VE : C->varlists()) { 9626 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9627 if (EVar.isInvalid()) 9628 return nullptr; 9629 Vars.push_back(EVar.get()); 9630 } 9631 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9632 if (Alignment.isInvalid()) 9633 return nullptr; 9634 return getDerived().RebuildOMPAlignedClause( 9635 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9636 C->getColonLoc(), C->getEndLoc()); 9637 } 9638 9639 template <typename Derived> 9640 OMPClause * 9641 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9642 llvm::SmallVector<Expr *, 16> Vars; 9643 Vars.reserve(C->varlist_size()); 9644 for (auto *VE : C->varlists()) { 9645 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9646 if (EVar.isInvalid()) 9647 return nullptr; 9648 Vars.push_back(EVar.get()); 9649 } 9650 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9651 C->getLParenLoc(), C->getEndLoc()); 9652 } 9653 9654 template <typename Derived> 9655 OMPClause * 9656 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9657 llvm::SmallVector<Expr *, 16> Vars; 9658 Vars.reserve(C->varlist_size()); 9659 for (auto *VE : C->varlists()) { 9660 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9661 if (EVar.isInvalid()) 9662 return nullptr; 9663 Vars.push_back(EVar.get()); 9664 } 9665 return getDerived().RebuildOMPCopyprivateClause( 9666 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9667 } 9668 9669 template <typename Derived> 9670 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9671 llvm::SmallVector<Expr *, 16> Vars; 9672 Vars.reserve(C->varlist_size()); 9673 for (auto *VE : C->varlists()) { 9674 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9675 if (EVar.isInvalid()) 9676 return nullptr; 9677 Vars.push_back(EVar.get()); 9678 } 9679 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9680 C->getLParenLoc(), C->getEndLoc()); 9681 } 9682 9683 template <typename Derived> 9684 OMPClause * 9685 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9686 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9687 if (E.isInvalid()) 9688 return nullptr; 9689 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9690 C->getLParenLoc(), C->getEndLoc()); 9691 } 9692 9693 template <typename Derived> 9694 OMPClause * 9695 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9696 llvm::SmallVector<Expr *, 16> Vars; 9697 Expr *DepModifier = C->getModifier(); 9698 if (DepModifier) { 9699 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9700 if (DepModRes.isInvalid()) 9701 return nullptr; 9702 DepModifier = DepModRes.get(); 9703 } 9704 Vars.reserve(C->varlist_size()); 9705 for (auto *VE : C->varlists()) { 9706 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9707 if (EVar.isInvalid()) 9708 return nullptr; 9709 Vars.push_back(EVar.get()); 9710 } 9711 return getDerived().RebuildOMPDependClause( 9712 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9713 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9714 C->getEndLoc()); 9715 } 9716 9717 template <typename Derived> 9718 OMPClause * 9719 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9720 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9721 if (E.isInvalid()) 9722 return nullptr; 9723 return getDerived().RebuildOMPDeviceClause( 9724 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9725 C->getModifierLoc(), C->getEndLoc()); 9726 } 9727 9728 template <typename Derived, class T> 9729 bool transformOMPMappableExprListClause( 9730 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9731 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9732 DeclarationNameInfo &MapperIdInfo, 9733 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9734 // Transform expressions in the list. 9735 Vars.reserve(C->varlist_size()); 9736 for (auto *VE : C->varlists()) { 9737 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9738 if (EVar.isInvalid()) 9739 return true; 9740 Vars.push_back(EVar.get()); 9741 } 9742 // Transform mapper scope specifier and identifier. 9743 NestedNameSpecifierLoc QualifierLoc; 9744 if (C->getMapperQualifierLoc()) { 9745 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9746 C->getMapperQualifierLoc()); 9747 if (!QualifierLoc) 9748 return true; 9749 } 9750 MapperIdScopeSpec.Adopt(QualifierLoc); 9751 MapperIdInfo = C->getMapperIdInfo(); 9752 if (MapperIdInfo.getName()) { 9753 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9754 if (!MapperIdInfo.getName()) 9755 return true; 9756 } 9757 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9758 // the previous user-defined mapper lookup in dependent environment. 9759 for (auto *E : C->mapperlists()) { 9760 // Transform all the decls. 9761 if (E) { 9762 auto *ULE = cast<UnresolvedLookupExpr>(E); 9763 UnresolvedSet<8> Decls; 9764 for (auto *D : ULE->decls()) { 9765 NamedDecl *InstD = 9766 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9767 Decls.addDecl(InstD, InstD->getAccess()); 9768 } 9769 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9770 TT.getSema().Context, /*NamingClass=*/nullptr, 9771 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9772 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9773 Decls.end())); 9774 } else { 9775 UnresolvedMappers.push_back(nullptr); 9776 } 9777 } 9778 return false; 9779 } 9780 9781 template <typename Derived> 9782 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9783 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9784 llvm::SmallVector<Expr *, 16> Vars; 9785 CXXScopeSpec MapperIdScopeSpec; 9786 DeclarationNameInfo MapperIdInfo; 9787 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9788 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9789 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9790 return nullptr; 9791 return getDerived().RebuildOMPMapClause( 9792 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9793 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9794 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9795 } 9796 9797 template <typename Derived> 9798 OMPClause * 9799 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9800 Expr *Allocator = C->getAllocator(); 9801 if (Allocator) { 9802 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9803 if (AllocatorRes.isInvalid()) 9804 return nullptr; 9805 Allocator = AllocatorRes.get(); 9806 } 9807 llvm::SmallVector<Expr *, 16> Vars; 9808 Vars.reserve(C->varlist_size()); 9809 for (auto *VE : C->varlists()) { 9810 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9811 if (EVar.isInvalid()) 9812 return nullptr; 9813 Vars.push_back(EVar.get()); 9814 } 9815 return getDerived().RebuildOMPAllocateClause( 9816 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9817 C->getEndLoc()); 9818 } 9819 9820 template <typename Derived> 9821 OMPClause * 9822 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9823 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9824 if (E.isInvalid()) 9825 return nullptr; 9826 return getDerived().RebuildOMPNumTeamsClause( 9827 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9828 } 9829 9830 template <typename Derived> 9831 OMPClause * 9832 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9833 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9834 if (E.isInvalid()) 9835 return nullptr; 9836 return getDerived().RebuildOMPThreadLimitClause( 9837 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9838 } 9839 9840 template <typename Derived> 9841 OMPClause * 9842 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9843 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9844 if (E.isInvalid()) 9845 return nullptr; 9846 return getDerived().RebuildOMPPriorityClause( 9847 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9848 } 9849 9850 template <typename Derived> 9851 OMPClause * 9852 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9853 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9854 if (E.isInvalid()) 9855 return nullptr; 9856 return getDerived().RebuildOMPGrainsizeClause( 9857 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9858 } 9859 9860 template <typename Derived> 9861 OMPClause * 9862 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9863 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9864 if (E.isInvalid()) 9865 return nullptr; 9866 return getDerived().RebuildOMPNumTasksClause( 9867 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9868 } 9869 9870 template <typename Derived> 9871 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9872 ExprResult E = getDerived().TransformExpr(C->getHint()); 9873 if (E.isInvalid()) 9874 return nullptr; 9875 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9876 C->getLParenLoc(), C->getEndLoc()); 9877 } 9878 9879 template <typename Derived> 9880 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9881 OMPDistScheduleClause *C) { 9882 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9883 if (E.isInvalid()) 9884 return nullptr; 9885 return getDerived().RebuildOMPDistScheduleClause( 9886 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9887 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9888 } 9889 9890 template <typename Derived> 9891 OMPClause * 9892 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9893 // Rebuild Defaultmap Clause since we need to invoke the checking of 9894 // defaultmap(none:variable-category) after template initialization. 9895 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9896 C->getDefaultmapKind(), 9897 C->getBeginLoc(), 9898 C->getLParenLoc(), 9899 C->getDefaultmapModifierLoc(), 9900 C->getDefaultmapKindLoc(), 9901 C->getEndLoc()); 9902 } 9903 9904 template <typename Derived> 9905 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9906 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9907 llvm::SmallVector<Expr *, 16> Vars; 9908 CXXScopeSpec MapperIdScopeSpec; 9909 DeclarationNameInfo MapperIdInfo; 9910 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9911 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9912 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9913 return nullptr; 9914 return getDerived().RebuildOMPToClause( 9915 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9916 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9917 } 9918 9919 template <typename Derived> 9920 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9921 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9922 llvm::SmallVector<Expr *, 16> Vars; 9923 CXXScopeSpec MapperIdScopeSpec; 9924 DeclarationNameInfo MapperIdInfo; 9925 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9926 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9927 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9928 return nullptr; 9929 return getDerived().RebuildOMPFromClause( 9930 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9931 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9932 } 9933 9934 template <typename Derived> 9935 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9936 OMPUseDevicePtrClause *C) { 9937 llvm::SmallVector<Expr *, 16> Vars; 9938 Vars.reserve(C->varlist_size()); 9939 for (auto *VE : C->varlists()) { 9940 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9941 if (EVar.isInvalid()) 9942 return nullptr; 9943 Vars.push_back(EVar.get()); 9944 } 9945 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9946 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9947 } 9948 9949 template <typename Derived> 9950 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 9951 OMPUseDeviceAddrClause *C) { 9952 llvm::SmallVector<Expr *, 16> Vars; 9953 Vars.reserve(C->varlist_size()); 9954 for (auto *VE : C->varlists()) { 9955 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9956 if (EVar.isInvalid()) 9957 return nullptr; 9958 Vars.push_back(EVar.get()); 9959 } 9960 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9961 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 9962 } 9963 9964 template <typename Derived> 9965 OMPClause * 9966 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9967 llvm::SmallVector<Expr *, 16> Vars; 9968 Vars.reserve(C->varlist_size()); 9969 for (auto *VE : C->varlists()) { 9970 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9971 if (EVar.isInvalid()) 9972 return nullptr; 9973 Vars.push_back(EVar.get()); 9974 } 9975 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9976 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9977 } 9978 9979 template <typename Derived> 9980 OMPClause * 9981 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9982 llvm::SmallVector<Expr *, 16> Vars; 9983 Vars.reserve(C->varlist_size()); 9984 for (auto *VE : C->varlists()) { 9985 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9986 if (EVar.isInvalid()) 9987 return nullptr; 9988 Vars.push_back(EVar.get()); 9989 } 9990 return getDerived().RebuildOMPNontemporalClause( 9991 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9992 } 9993 9994 template <typename Derived> 9995 OMPClause * 9996 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 9997 llvm::SmallVector<Expr *, 16> Vars; 9998 Vars.reserve(C->varlist_size()); 9999 for (auto *VE : C->varlists()) { 10000 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10001 if (EVar.isInvalid()) 10002 return nullptr; 10003 Vars.push_back(EVar.get()); 10004 } 10005 return getDerived().RebuildOMPInclusiveClause( 10006 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10007 } 10008 10009 template <typename Derived> 10010 OMPClause * 10011 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10012 llvm::SmallVector<Expr *, 16> Vars; 10013 Vars.reserve(C->varlist_size()); 10014 for (auto *VE : C->varlists()) { 10015 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10016 if (EVar.isInvalid()) 10017 return nullptr; 10018 Vars.push_back(EVar.get()); 10019 } 10020 return getDerived().RebuildOMPExclusiveClause( 10021 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10022 } 10023 10024 template <typename Derived> 10025 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10026 OMPUsesAllocatorsClause *C) { 10027 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10028 Data.reserve(C->getNumberOfAllocators()); 10029 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10030 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10031 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10032 if (Allocator.isInvalid()) 10033 continue; 10034 ExprResult AllocatorTraits; 10035 if (Expr *AT = D.AllocatorTraits) { 10036 AllocatorTraits = getDerived().TransformExpr(AT); 10037 if (AllocatorTraits.isInvalid()) 10038 continue; 10039 } 10040 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10041 NewD.Allocator = Allocator.get(); 10042 NewD.AllocatorTraits = AllocatorTraits.get(); 10043 NewD.LParenLoc = D.LParenLoc; 10044 NewD.RParenLoc = D.RParenLoc; 10045 } 10046 return getDerived().RebuildOMPUsesAllocatorsClause( 10047 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10048 } 10049 10050 template <typename Derived> 10051 OMPClause * 10052 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10053 SmallVector<Expr *, 4> Locators; 10054 Locators.reserve(C->varlist_size()); 10055 ExprResult ModifierRes; 10056 if (Expr *Modifier = C->getModifier()) { 10057 ModifierRes = getDerived().TransformExpr(Modifier); 10058 if (ModifierRes.isInvalid()) 10059 return nullptr; 10060 } 10061 for (Expr *E : C->varlists()) { 10062 ExprResult Locator = getDerived().TransformExpr(E); 10063 if (Locator.isInvalid()) 10064 continue; 10065 Locators.push_back(Locator.get()); 10066 } 10067 return getDerived().RebuildOMPAffinityClause( 10068 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10069 ModifierRes.get(), Locators); 10070 } 10071 10072 template <typename Derived> 10073 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10074 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10075 C->getBeginLoc(), C->getLParenLoc(), 10076 C->getEndLoc()); 10077 } 10078 10079 //===----------------------------------------------------------------------===// 10080 // Expression transformation 10081 //===----------------------------------------------------------------------===// 10082 template<typename Derived> 10083 ExprResult 10084 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10085 return TransformExpr(E->getSubExpr()); 10086 } 10087 10088 template<typename Derived> 10089 ExprResult 10090 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10091 if (!E->isTypeDependent()) 10092 return E; 10093 10094 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10095 E->getIdentKind()); 10096 } 10097 10098 template<typename Derived> 10099 ExprResult 10100 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10101 NestedNameSpecifierLoc QualifierLoc; 10102 if (E->getQualifierLoc()) { 10103 QualifierLoc 10104 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10105 if (!QualifierLoc) 10106 return ExprError(); 10107 } 10108 10109 ValueDecl *ND 10110 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10111 E->getDecl())); 10112 if (!ND) 10113 return ExprError(); 10114 10115 NamedDecl *Found = ND; 10116 if (E->getFoundDecl() != E->getDecl()) { 10117 Found = cast_or_null<NamedDecl>( 10118 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10119 if (!Found) 10120 return ExprError(); 10121 } 10122 10123 DeclarationNameInfo NameInfo = E->getNameInfo(); 10124 if (NameInfo.getName()) { 10125 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10126 if (!NameInfo.getName()) 10127 return ExprError(); 10128 } 10129 10130 if (!getDerived().AlwaysRebuild() && 10131 QualifierLoc == E->getQualifierLoc() && 10132 ND == E->getDecl() && 10133 Found == E->getFoundDecl() && 10134 NameInfo.getName() == E->getDecl()->getDeclName() && 10135 !E->hasExplicitTemplateArgs()) { 10136 10137 // Mark it referenced in the new context regardless. 10138 // FIXME: this is a bit instantiation-specific. 10139 SemaRef.MarkDeclRefReferenced(E); 10140 10141 return E; 10142 } 10143 10144 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10145 if (E->hasExplicitTemplateArgs()) { 10146 TemplateArgs = &TransArgs; 10147 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10148 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10149 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10150 E->getNumTemplateArgs(), 10151 TransArgs)) 10152 return ExprError(); 10153 } 10154 10155 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10156 Found, TemplateArgs); 10157 } 10158 10159 template<typename Derived> 10160 ExprResult 10161 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10162 return E; 10163 } 10164 10165 template <typename Derived> 10166 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10167 FixedPointLiteral *E) { 10168 return E; 10169 } 10170 10171 template<typename Derived> 10172 ExprResult 10173 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10174 return E; 10175 } 10176 10177 template<typename Derived> 10178 ExprResult 10179 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10180 return E; 10181 } 10182 10183 template<typename Derived> 10184 ExprResult 10185 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10186 return E; 10187 } 10188 10189 template<typename Derived> 10190 ExprResult 10191 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10192 return E; 10193 } 10194 10195 template<typename Derived> 10196 ExprResult 10197 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10198 if (FunctionDecl *FD = E->getDirectCallee()) 10199 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10200 return SemaRef.MaybeBindToTemporary(E); 10201 } 10202 10203 template<typename Derived> 10204 ExprResult 10205 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10206 ExprResult ControllingExpr = 10207 getDerived().TransformExpr(E->getControllingExpr()); 10208 if (ControllingExpr.isInvalid()) 10209 return ExprError(); 10210 10211 SmallVector<Expr *, 4> AssocExprs; 10212 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10213 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10214 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10215 if (TSI) { 10216 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10217 if (!AssocType) 10218 return ExprError(); 10219 AssocTypes.push_back(AssocType); 10220 } else { 10221 AssocTypes.push_back(nullptr); 10222 } 10223 10224 ExprResult AssocExpr = 10225 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10226 if (AssocExpr.isInvalid()) 10227 return ExprError(); 10228 AssocExprs.push_back(AssocExpr.get()); 10229 } 10230 10231 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10232 E->getDefaultLoc(), 10233 E->getRParenLoc(), 10234 ControllingExpr.get(), 10235 AssocTypes, 10236 AssocExprs); 10237 } 10238 10239 template<typename Derived> 10240 ExprResult 10241 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10242 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10243 if (SubExpr.isInvalid()) 10244 return ExprError(); 10245 10246 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10247 return E; 10248 10249 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10250 E->getRParen()); 10251 } 10252 10253 /// The operand of a unary address-of operator has special rules: it's 10254 /// allowed to refer to a non-static member of a class even if there's no 'this' 10255 /// object available. 10256 template<typename Derived> 10257 ExprResult 10258 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10259 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10260 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10261 else 10262 return getDerived().TransformExpr(E); 10263 } 10264 10265 template<typename Derived> 10266 ExprResult 10267 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10268 ExprResult SubExpr; 10269 if (E->getOpcode() == UO_AddrOf) 10270 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10271 else 10272 SubExpr = TransformExpr(E->getSubExpr()); 10273 if (SubExpr.isInvalid()) 10274 return ExprError(); 10275 10276 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10277 return E; 10278 10279 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10280 E->getOpcode(), 10281 SubExpr.get()); 10282 } 10283 10284 template<typename Derived> 10285 ExprResult 10286 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10287 // Transform the type. 10288 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10289 if (!Type) 10290 return ExprError(); 10291 10292 // Transform all of the components into components similar to what the 10293 // parser uses. 10294 // FIXME: It would be slightly more efficient in the non-dependent case to 10295 // just map FieldDecls, rather than requiring the rebuilder to look for 10296 // the fields again. However, __builtin_offsetof is rare enough in 10297 // template code that we don't care. 10298 bool ExprChanged = false; 10299 typedef Sema::OffsetOfComponent Component; 10300 SmallVector<Component, 4> Components; 10301 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10302 const OffsetOfNode &ON = E->getComponent(I); 10303 Component Comp; 10304 Comp.isBrackets = true; 10305 Comp.LocStart = ON.getSourceRange().getBegin(); 10306 Comp.LocEnd = ON.getSourceRange().getEnd(); 10307 switch (ON.getKind()) { 10308 case OffsetOfNode::Array: { 10309 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10310 ExprResult Index = getDerived().TransformExpr(FromIndex); 10311 if (Index.isInvalid()) 10312 return ExprError(); 10313 10314 ExprChanged = ExprChanged || Index.get() != FromIndex; 10315 Comp.isBrackets = true; 10316 Comp.U.E = Index.get(); 10317 break; 10318 } 10319 10320 case OffsetOfNode::Field: 10321 case OffsetOfNode::Identifier: 10322 Comp.isBrackets = false; 10323 Comp.U.IdentInfo = ON.getFieldName(); 10324 if (!Comp.U.IdentInfo) 10325 continue; 10326 10327 break; 10328 10329 case OffsetOfNode::Base: 10330 // Will be recomputed during the rebuild. 10331 continue; 10332 } 10333 10334 Components.push_back(Comp); 10335 } 10336 10337 // If nothing changed, retain the existing expression. 10338 if (!getDerived().AlwaysRebuild() && 10339 Type == E->getTypeSourceInfo() && 10340 !ExprChanged) 10341 return E; 10342 10343 // Build a new offsetof expression. 10344 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10345 Components, E->getRParenLoc()); 10346 } 10347 10348 template<typename Derived> 10349 ExprResult 10350 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10351 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10352 "opaque value expression requires transformation"); 10353 return E; 10354 } 10355 10356 template<typename Derived> 10357 ExprResult 10358 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10359 return E; 10360 } 10361 10362 template <typename Derived> 10363 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10364 llvm::SmallVector<Expr *, 8> Children; 10365 bool Changed = false; 10366 for (Expr *C : E->subExpressions()) { 10367 ExprResult NewC = getDerived().TransformExpr(C); 10368 if (NewC.isInvalid()) 10369 return ExprError(); 10370 Children.push_back(NewC.get()); 10371 10372 Changed |= NewC.get() != C; 10373 } 10374 if (!getDerived().AlwaysRebuild() && !Changed) 10375 return E; 10376 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10377 Children, E->getType()); 10378 } 10379 10380 template<typename Derived> 10381 ExprResult 10382 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10383 // Rebuild the syntactic form. The original syntactic form has 10384 // opaque-value expressions in it, so strip those away and rebuild 10385 // the result. This is a really awful way of doing this, but the 10386 // better solution (rebuilding the semantic expressions and 10387 // rebinding OVEs as necessary) doesn't work; we'd need 10388 // TreeTransform to not strip away implicit conversions. 10389 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10390 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10391 if (result.isInvalid()) return ExprError(); 10392 10393 // If that gives us a pseudo-object result back, the pseudo-object 10394 // expression must have been an lvalue-to-rvalue conversion which we 10395 // should reapply. 10396 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10397 result = SemaRef.checkPseudoObjectRValue(result.get()); 10398 10399 return result; 10400 } 10401 10402 template<typename Derived> 10403 ExprResult 10404 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10405 UnaryExprOrTypeTraitExpr *E) { 10406 if (E->isArgumentType()) { 10407 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10408 10409 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10410 if (!NewT) 10411 return ExprError(); 10412 10413 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10414 return E; 10415 10416 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10417 E->getKind(), 10418 E->getSourceRange()); 10419 } 10420 10421 // C++0x [expr.sizeof]p1: 10422 // The operand is either an expression, which is an unevaluated operand 10423 // [...] 10424 EnterExpressionEvaluationContext Unevaluated( 10425 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10426 Sema::ReuseLambdaContextDecl); 10427 10428 // Try to recover if we have something like sizeof(T::X) where X is a type. 10429 // Notably, there must be *exactly* one set of parens if X is a type. 10430 TypeSourceInfo *RecoveryTSI = nullptr; 10431 ExprResult SubExpr; 10432 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10433 if (auto *DRE = 10434 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10435 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10436 PE, DRE, false, &RecoveryTSI); 10437 else 10438 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10439 10440 if (RecoveryTSI) { 10441 return getDerived().RebuildUnaryExprOrTypeTrait( 10442 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10443 } else if (SubExpr.isInvalid()) 10444 return ExprError(); 10445 10446 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10447 return E; 10448 10449 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10450 E->getOperatorLoc(), 10451 E->getKind(), 10452 E->getSourceRange()); 10453 } 10454 10455 template<typename Derived> 10456 ExprResult 10457 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10458 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10459 if (LHS.isInvalid()) 10460 return ExprError(); 10461 10462 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10463 if (RHS.isInvalid()) 10464 return ExprError(); 10465 10466 10467 if (!getDerived().AlwaysRebuild() && 10468 LHS.get() == E->getLHS() && 10469 RHS.get() == E->getRHS()) 10470 return E; 10471 10472 return getDerived().RebuildArraySubscriptExpr( 10473 LHS.get(), 10474 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10475 } 10476 10477 template <typename Derived> 10478 ExprResult 10479 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10480 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10481 if (Base.isInvalid()) 10482 return ExprError(); 10483 10484 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10485 if (RowIdx.isInvalid()) 10486 return ExprError(); 10487 10488 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10489 if (ColumnIdx.isInvalid()) 10490 return ExprError(); 10491 10492 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10493 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10494 return E; 10495 10496 return getDerived().RebuildMatrixSubscriptExpr( 10497 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10498 } 10499 10500 template <typename Derived> 10501 ExprResult 10502 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10503 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10504 if (Base.isInvalid()) 10505 return ExprError(); 10506 10507 ExprResult LowerBound; 10508 if (E->getLowerBound()) { 10509 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10510 if (LowerBound.isInvalid()) 10511 return ExprError(); 10512 } 10513 10514 ExprResult Length; 10515 if (E->getLength()) { 10516 Length = getDerived().TransformExpr(E->getLength()); 10517 if (Length.isInvalid()) 10518 return ExprError(); 10519 } 10520 10521 ExprResult Stride; 10522 if (Expr *Str = E->getStride()) { 10523 Stride = getDerived().TransformExpr(Str); 10524 if (Stride.isInvalid()) 10525 return ExprError(); 10526 } 10527 10528 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10529 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10530 return E; 10531 10532 return getDerived().RebuildOMPArraySectionExpr( 10533 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10534 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10535 E->getRBracketLoc()); 10536 } 10537 10538 template <typename Derived> 10539 ExprResult 10540 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10541 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10542 if (Base.isInvalid()) 10543 return ExprError(); 10544 10545 SmallVector<Expr *, 4> Dims; 10546 bool ErrorFound = false; 10547 for (Expr *Dim : E->getDimensions()) { 10548 ExprResult DimRes = getDerived().TransformExpr(Dim); 10549 if (DimRes.isInvalid()) { 10550 ErrorFound = true; 10551 continue; 10552 } 10553 Dims.push_back(DimRes.get()); 10554 } 10555 10556 if (ErrorFound) 10557 return ExprError(); 10558 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10559 E->getRParenLoc(), Dims, 10560 E->getBracketsRanges()); 10561 } 10562 10563 template <typename Derived> 10564 ExprResult 10565 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10566 unsigned NumIterators = E->numOfIterators(); 10567 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10568 10569 bool ErrorFound = false; 10570 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10571 for (unsigned I = 0; I < NumIterators; ++I) { 10572 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10573 Data[I].DeclIdent = D->getIdentifier(); 10574 Data[I].DeclIdentLoc = D->getLocation(); 10575 if (D->getLocation() == D->getBeginLoc()) { 10576 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10577 "Implicit type must be int."); 10578 } else { 10579 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10580 QualType DeclTy = getDerived().TransformType(D->getType()); 10581 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10582 } 10583 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10584 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10585 ExprResult End = getDerived().TransformExpr(Range.End); 10586 ExprResult Step = getDerived().TransformExpr(Range.Step); 10587 ErrorFound = ErrorFound || 10588 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10589 !Data[I].Type.get().isNull())) || 10590 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10591 if (ErrorFound) 10592 continue; 10593 Data[I].Range.Begin = Begin.get(); 10594 Data[I].Range.End = End.get(); 10595 Data[I].Range.Step = Step.get(); 10596 Data[I].AssignLoc = E->getAssignLoc(I); 10597 Data[I].ColonLoc = E->getColonLoc(I); 10598 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10599 NeedToRebuild = 10600 NeedToRebuild || 10601 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10602 D->getType().getTypePtrOrNull()) || 10603 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10604 Range.Step != Data[I].Range.Step; 10605 } 10606 if (ErrorFound) 10607 return ExprError(); 10608 if (!NeedToRebuild) 10609 return E; 10610 10611 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10612 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10613 if (!Res.isUsable()) 10614 return Res; 10615 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10616 for (unsigned I = 0; I < NumIterators; ++I) 10617 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10618 IE->getIteratorDecl(I)); 10619 return Res; 10620 } 10621 10622 template<typename Derived> 10623 ExprResult 10624 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10625 // Transform the callee. 10626 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10627 if (Callee.isInvalid()) 10628 return ExprError(); 10629 10630 // Transform arguments. 10631 bool ArgChanged = false; 10632 SmallVector<Expr*, 8> Args; 10633 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10634 &ArgChanged)) 10635 return ExprError(); 10636 10637 if (!getDerived().AlwaysRebuild() && 10638 Callee.get() == E->getCallee() && 10639 !ArgChanged) 10640 return SemaRef.MaybeBindToTemporary(E); 10641 10642 // FIXME: Wrong source location information for the '('. 10643 SourceLocation FakeLParenLoc 10644 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10645 10646 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10647 if (E->hasStoredFPFeatures()) { 10648 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10649 getSema().CurFPFeatures = 10650 NewOverrides.applyOverrides(getSema().getLangOpts()); 10651 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10652 } 10653 10654 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10655 Args, 10656 E->getRParenLoc()); 10657 } 10658 10659 template<typename Derived> 10660 ExprResult 10661 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10662 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10663 if (Base.isInvalid()) 10664 return ExprError(); 10665 10666 NestedNameSpecifierLoc QualifierLoc; 10667 if (E->hasQualifier()) { 10668 QualifierLoc 10669 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10670 10671 if (!QualifierLoc) 10672 return ExprError(); 10673 } 10674 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10675 10676 ValueDecl *Member 10677 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10678 E->getMemberDecl())); 10679 if (!Member) 10680 return ExprError(); 10681 10682 NamedDecl *FoundDecl = E->getFoundDecl(); 10683 if (FoundDecl == E->getMemberDecl()) { 10684 FoundDecl = Member; 10685 } else { 10686 FoundDecl = cast_or_null<NamedDecl>( 10687 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10688 if (!FoundDecl) 10689 return ExprError(); 10690 } 10691 10692 if (!getDerived().AlwaysRebuild() && 10693 Base.get() == E->getBase() && 10694 QualifierLoc == E->getQualifierLoc() && 10695 Member == E->getMemberDecl() && 10696 FoundDecl == E->getFoundDecl() && 10697 !E->hasExplicitTemplateArgs()) { 10698 10699 // Mark it referenced in the new context regardless. 10700 // FIXME: this is a bit instantiation-specific. 10701 SemaRef.MarkMemberReferenced(E); 10702 10703 return E; 10704 } 10705 10706 TemplateArgumentListInfo TransArgs; 10707 if (E->hasExplicitTemplateArgs()) { 10708 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10709 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10710 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10711 E->getNumTemplateArgs(), 10712 TransArgs)) 10713 return ExprError(); 10714 } 10715 10716 // FIXME: Bogus source location for the operator 10717 SourceLocation FakeOperatorLoc = 10718 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10719 10720 // FIXME: to do this check properly, we will need to preserve the 10721 // first-qualifier-in-scope here, just in case we had a dependent 10722 // base (and therefore couldn't do the check) and a 10723 // nested-name-qualifier (and therefore could do the lookup). 10724 NamedDecl *FirstQualifierInScope = nullptr; 10725 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10726 if (MemberNameInfo.getName()) { 10727 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10728 if (!MemberNameInfo.getName()) 10729 return ExprError(); 10730 } 10731 10732 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10733 E->isArrow(), 10734 QualifierLoc, 10735 TemplateKWLoc, 10736 MemberNameInfo, 10737 Member, 10738 FoundDecl, 10739 (E->hasExplicitTemplateArgs() 10740 ? &TransArgs : nullptr), 10741 FirstQualifierInScope); 10742 } 10743 10744 template<typename Derived> 10745 ExprResult 10746 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10747 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10748 if (LHS.isInvalid()) 10749 return ExprError(); 10750 10751 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10752 if (RHS.isInvalid()) 10753 return ExprError(); 10754 10755 if (!getDerived().AlwaysRebuild() && 10756 LHS.get() == E->getLHS() && 10757 RHS.get() == E->getRHS()) 10758 return E; 10759 10760 if (E->isCompoundAssignmentOp()) 10761 // FPFeatures has already been established from trailing storage 10762 return getDerived().RebuildBinaryOperator( 10763 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10764 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10765 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10766 getSema().CurFPFeatures = 10767 NewOverrides.applyOverrides(getSema().getLangOpts()); 10768 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10769 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10770 LHS.get(), RHS.get()); 10771 } 10772 10773 template <typename Derived> 10774 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10775 CXXRewrittenBinaryOperator *E) { 10776 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10777 10778 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10779 if (LHS.isInvalid()) 10780 return ExprError(); 10781 10782 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10783 if (RHS.isInvalid()) 10784 return ExprError(); 10785 10786 if (!getDerived().AlwaysRebuild() && 10787 LHS.get() == Decomp.LHS && 10788 RHS.get() == Decomp.RHS) 10789 return E; 10790 10791 // Extract the already-resolved callee declarations so that we can restrict 10792 // ourselves to using them as the unqualified lookup results when rebuilding. 10793 UnresolvedSet<2> UnqualLookups; 10794 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10795 const_cast<Expr *>(Decomp.InnerBinOp)}; 10796 for (Expr *PossibleBinOp : PossibleBinOps) { 10797 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10798 if (!Op) 10799 continue; 10800 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10801 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10802 continue; 10803 10804 // Transform the callee in case we built a call to a local extern 10805 // declaration. 10806 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10807 E->getOperatorLoc(), Callee->getFoundDecl())); 10808 if (!Found) 10809 return ExprError(); 10810 UnqualLookups.addDecl(Found); 10811 } 10812 10813 return getDerived().RebuildCXXRewrittenBinaryOperator( 10814 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10815 } 10816 10817 template<typename Derived> 10818 ExprResult 10819 TreeTransform<Derived>::TransformCompoundAssignOperator( 10820 CompoundAssignOperator *E) { 10821 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10822 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10823 getSema().CurFPFeatures = 10824 NewOverrides.applyOverrides(getSema().getLangOpts()); 10825 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10826 return getDerived().TransformBinaryOperator(E); 10827 } 10828 10829 template<typename Derived> 10830 ExprResult TreeTransform<Derived>:: 10831 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10832 // Just rebuild the common and RHS expressions and see whether we 10833 // get any changes. 10834 10835 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10836 if (commonExpr.isInvalid()) 10837 return ExprError(); 10838 10839 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10840 if (rhs.isInvalid()) 10841 return ExprError(); 10842 10843 if (!getDerived().AlwaysRebuild() && 10844 commonExpr.get() == e->getCommon() && 10845 rhs.get() == e->getFalseExpr()) 10846 return e; 10847 10848 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10849 e->getQuestionLoc(), 10850 nullptr, 10851 e->getColonLoc(), 10852 rhs.get()); 10853 } 10854 10855 template<typename Derived> 10856 ExprResult 10857 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10858 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10859 if (Cond.isInvalid()) 10860 return ExprError(); 10861 10862 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10863 if (LHS.isInvalid()) 10864 return ExprError(); 10865 10866 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10867 if (RHS.isInvalid()) 10868 return ExprError(); 10869 10870 if (!getDerived().AlwaysRebuild() && 10871 Cond.get() == E->getCond() && 10872 LHS.get() == E->getLHS() && 10873 RHS.get() == E->getRHS()) 10874 return E; 10875 10876 return getDerived().RebuildConditionalOperator(Cond.get(), 10877 E->getQuestionLoc(), 10878 LHS.get(), 10879 E->getColonLoc(), 10880 RHS.get()); 10881 } 10882 10883 template<typename Derived> 10884 ExprResult 10885 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10886 // Implicit casts are eliminated during transformation, since they 10887 // will be recomputed by semantic analysis after transformation. 10888 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10889 } 10890 10891 template<typename Derived> 10892 ExprResult 10893 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10894 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10895 if (!Type) 10896 return ExprError(); 10897 10898 ExprResult SubExpr 10899 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10900 if (SubExpr.isInvalid()) 10901 return ExprError(); 10902 10903 if (!getDerived().AlwaysRebuild() && 10904 Type == E->getTypeInfoAsWritten() && 10905 SubExpr.get() == E->getSubExpr()) 10906 return E; 10907 10908 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10909 Type, 10910 E->getRParenLoc(), 10911 SubExpr.get()); 10912 } 10913 10914 template<typename Derived> 10915 ExprResult 10916 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10917 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10918 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10919 if (!NewT) 10920 return ExprError(); 10921 10922 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10923 if (Init.isInvalid()) 10924 return ExprError(); 10925 10926 if (!getDerived().AlwaysRebuild() && 10927 OldT == NewT && 10928 Init.get() == E->getInitializer()) 10929 return SemaRef.MaybeBindToTemporary(E); 10930 10931 // Note: the expression type doesn't necessarily match the 10932 // type-as-written, but that's okay, because it should always be 10933 // derivable from the initializer. 10934 10935 return getDerived().RebuildCompoundLiteralExpr( 10936 E->getLParenLoc(), NewT, 10937 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10938 } 10939 10940 template<typename Derived> 10941 ExprResult 10942 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10943 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10944 if (Base.isInvalid()) 10945 return ExprError(); 10946 10947 if (!getDerived().AlwaysRebuild() && 10948 Base.get() == E->getBase()) 10949 return E; 10950 10951 // FIXME: Bad source location 10952 SourceLocation FakeOperatorLoc = 10953 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10954 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10955 E->getAccessorLoc(), 10956 E->getAccessor()); 10957 } 10958 10959 template<typename Derived> 10960 ExprResult 10961 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10962 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10963 E = Syntactic; 10964 10965 bool InitChanged = false; 10966 10967 EnterExpressionEvaluationContext Context( 10968 getSema(), EnterExpressionEvaluationContext::InitList); 10969 10970 SmallVector<Expr*, 4> Inits; 10971 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10972 Inits, &InitChanged)) 10973 return ExprError(); 10974 10975 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10976 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10977 // in some cases. We can't reuse it in general, because the syntactic and 10978 // semantic forms are linked, and we can't know that semantic form will 10979 // match even if the syntactic form does. 10980 } 10981 10982 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10983 E->getRBraceLoc()); 10984 } 10985 10986 template<typename Derived> 10987 ExprResult 10988 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10989 Designation Desig; 10990 10991 // transform the initializer value 10992 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10993 if (Init.isInvalid()) 10994 return ExprError(); 10995 10996 // transform the designators. 10997 SmallVector<Expr*, 4> ArrayExprs; 10998 bool ExprChanged = false; 10999 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11000 if (D.isFieldDesignator()) { 11001 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11002 D.getDotLoc(), 11003 D.getFieldLoc())); 11004 if (D.getField()) { 11005 FieldDecl *Field = cast_or_null<FieldDecl>( 11006 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11007 if (Field != D.getField()) 11008 // Rebuild the expression when the transformed FieldDecl is 11009 // different to the already assigned FieldDecl. 11010 ExprChanged = true; 11011 } else { 11012 // Ensure that the designator expression is rebuilt when there isn't 11013 // a resolved FieldDecl in the designator as we don't want to assign 11014 // a FieldDecl to a pattern designator that will be instantiated again. 11015 ExprChanged = true; 11016 } 11017 continue; 11018 } 11019 11020 if (D.isArrayDesignator()) { 11021 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11022 if (Index.isInvalid()) 11023 return ExprError(); 11024 11025 Desig.AddDesignator( 11026 Designator::getArray(Index.get(), D.getLBracketLoc())); 11027 11028 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11029 ArrayExprs.push_back(Index.get()); 11030 continue; 11031 } 11032 11033 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11034 ExprResult Start 11035 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11036 if (Start.isInvalid()) 11037 return ExprError(); 11038 11039 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11040 if (End.isInvalid()) 11041 return ExprError(); 11042 11043 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11044 End.get(), 11045 D.getLBracketLoc(), 11046 D.getEllipsisLoc())); 11047 11048 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11049 End.get() != E->getArrayRangeEnd(D); 11050 11051 ArrayExprs.push_back(Start.get()); 11052 ArrayExprs.push_back(End.get()); 11053 } 11054 11055 if (!getDerived().AlwaysRebuild() && 11056 Init.get() == E->getInit() && 11057 !ExprChanged) 11058 return E; 11059 11060 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11061 E->getEqualOrColonLoc(), 11062 E->usesGNUSyntax(), Init.get()); 11063 } 11064 11065 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11066 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11067 template<typename Derived> 11068 ExprResult 11069 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11070 DesignatedInitUpdateExpr *E) { 11071 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11072 "initializer"); 11073 return ExprError(); 11074 } 11075 11076 template<typename Derived> 11077 ExprResult 11078 TreeTransform<Derived>::TransformNoInitExpr( 11079 NoInitExpr *E) { 11080 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11081 return ExprError(); 11082 } 11083 11084 template<typename Derived> 11085 ExprResult 11086 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11087 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11088 return ExprError(); 11089 } 11090 11091 template<typename Derived> 11092 ExprResult 11093 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11094 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11095 return ExprError(); 11096 } 11097 11098 template<typename Derived> 11099 ExprResult 11100 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11101 ImplicitValueInitExpr *E) { 11102 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11103 11104 // FIXME: Will we ever have proper type location here? Will we actually 11105 // need to transform the type? 11106 QualType T = getDerived().TransformType(E->getType()); 11107 if (T.isNull()) 11108 return ExprError(); 11109 11110 if (!getDerived().AlwaysRebuild() && 11111 T == E->getType()) 11112 return E; 11113 11114 return getDerived().RebuildImplicitValueInitExpr(T); 11115 } 11116 11117 template<typename Derived> 11118 ExprResult 11119 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11120 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11121 if (!TInfo) 11122 return ExprError(); 11123 11124 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11125 if (SubExpr.isInvalid()) 11126 return ExprError(); 11127 11128 if (!getDerived().AlwaysRebuild() && 11129 TInfo == E->getWrittenTypeInfo() && 11130 SubExpr.get() == E->getSubExpr()) 11131 return E; 11132 11133 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11134 TInfo, E->getRParenLoc()); 11135 } 11136 11137 template<typename Derived> 11138 ExprResult 11139 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11140 bool ArgumentChanged = false; 11141 SmallVector<Expr*, 4> Inits; 11142 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11143 &ArgumentChanged)) 11144 return ExprError(); 11145 11146 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11147 Inits, 11148 E->getRParenLoc()); 11149 } 11150 11151 /// Transform an address-of-label expression. 11152 /// 11153 /// By default, the transformation of an address-of-label expression always 11154 /// rebuilds the expression, so that the label identifier can be resolved to 11155 /// the corresponding label statement by semantic analysis. 11156 template<typename Derived> 11157 ExprResult 11158 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11159 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11160 E->getLabel()); 11161 if (!LD) 11162 return ExprError(); 11163 11164 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11165 cast<LabelDecl>(LD)); 11166 } 11167 11168 template<typename Derived> 11169 ExprResult 11170 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11171 SemaRef.ActOnStartStmtExpr(); 11172 StmtResult SubStmt 11173 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11174 if (SubStmt.isInvalid()) { 11175 SemaRef.ActOnStmtExprError(); 11176 return ExprError(); 11177 } 11178 11179 unsigned OldDepth = E->getTemplateDepth(); 11180 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11181 11182 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11183 SubStmt.get() == E->getSubStmt()) { 11184 // Calling this an 'error' is unintuitive, but it does the right thing. 11185 SemaRef.ActOnStmtExprError(); 11186 return SemaRef.MaybeBindToTemporary(E); 11187 } 11188 11189 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11190 E->getRParenLoc(), NewDepth); 11191 } 11192 11193 template<typename Derived> 11194 ExprResult 11195 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11196 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11197 if (Cond.isInvalid()) 11198 return ExprError(); 11199 11200 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11201 if (LHS.isInvalid()) 11202 return ExprError(); 11203 11204 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11205 if (RHS.isInvalid()) 11206 return ExprError(); 11207 11208 if (!getDerived().AlwaysRebuild() && 11209 Cond.get() == E->getCond() && 11210 LHS.get() == E->getLHS() && 11211 RHS.get() == E->getRHS()) 11212 return E; 11213 11214 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11215 Cond.get(), LHS.get(), RHS.get(), 11216 E->getRParenLoc()); 11217 } 11218 11219 template<typename Derived> 11220 ExprResult 11221 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11222 return E; 11223 } 11224 11225 template<typename Derived> 11226 ExprResult 11227 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11228 switch (E->getOperator()) { 11229 case OO_New: 11230 case OO_Delete: 11231 case OO_Array_New: 11232 case OO_Array_Delete: 11233 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11234 11235 case OO_Call: { 11236 // This is a call to an object's operator(). 11237 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11238 11239 // Transform the object itself. 11240 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11241 if (Object.isInvalid()) 11242 return ExprError(); 11243 11244 // FIXME: Poor location information 11245 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11246 static_cast<Expr *>(Object.get())->getEndLoc()); 11247 11248 // Transform the call arguments. 11249 SmallVector<Expr*, 8> Args; 11250 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11251 Args)) 11252 return ExprError(); 11253 11254 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11255 E->getEndLoc()); 11256 } 11257 11258 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11259 case OO_##Name: 11260 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11261 #include "clang/Basic/OperatorKinds.def" 11262 case OO_Subscript: 11263 // Handled below. 11264 break; 11265 11266 case OO_Conditional: 11267 llvm_unreachable("conditional operator is not actually overloadable"); 11268 11269 case OO_None: 11270 case NUM_OVERLOADED_OPERATORS: 11271 llvm_unreachable("not an overloaded operator?"); 11272 } 11273 11274 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11275 if (Callee.isInvalid()) 11276 return ExprError(); 11277 11278 ExprResult First; 11279 if (E->getOperator() == OO_Amp) 11280 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11281 else 11282 First = getDerived().TransformExpr(E->getArg(0)); 11283 if (First.isInvalid()) 11284 return ExprError(); 11285 11286 ExprResult Second; 11287 if (E->getNumArgs() == 2) { 11288 Second = getDerived().TransformExpr(E->getArg(1)); 11289 if (Second.isInvalid()) 11290 return ExprError(); 11291 } 11292 11293 if (!getDerived().AlwaysRebuild() && 11294 Callee.get() == E->getCallee() && 11295 First.get() == E->getArg(0) && 11296 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11297 return SemaRef.MaybeBindToTemporary(E); 11298 11299 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11300 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11301 getSema().CurFPFeatures = 11302 NewOverrides.applyOverrides(getSema().getLangOpts()); 11303 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11304 11305 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11306 E->getOperatorLoc(), 11307 Callee.get(), 11308 First.get(), 11309 Second.get()); 11310 } 11311 11312 template<typename Derived> 11313 ExprResult 11314 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11315 return getDerived().TransformCallExpr(E); 11316 } 11317 11318 template <typename Derived> 11319 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11320 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11321 getSema().CurContext != E->getParentContext(); 11322 11323 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11324 return E; 11325 11326 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11327 E->getEndLoc(), 11328 getSema().CurContext); 11329 } 11330 11331 template<typename Derived> 11332 ExprResult 11333 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11334 // Transform the callee. 11335 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11336 if (Callee.isInvalid()) 11337 return ExprError(); 11338 11339 // Transform exec config. 11340 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11341 if (EC.isInvalid()) 11342 return ExprError(); 11343 11344 // Transform arguments. 11345 bool ArgChanged = false; 11346 SmallVector<Expr*, 8> Args; 11347 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11348 &ArgChanged)) 11349 return ExprError(); 11350 11351 if (!getDerived().AlwaysRebuild() && 11352 Callee.get() == E->getCallee() && 11353 !ArgChanged) 11354 return SemaRef.MaybeBindToTemporary(E); 11355 11356 // FIXME: Wrong source location information for the '('. 11357 SourceLocation FakeLParenLoc 11358 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11359 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11360 Args, 11361 E->getRParenLoc(), EC.get()); 11362 } 11363 11364 template<typename Derived> 11365 ExprResult 11366 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11367 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11368 if (!Type) 11369 return ExprError(); 11370 11371 ExprResult SubExpr 11372 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11373 if (SubExpr.isInvalid()) 11374 return ExprError(); 11375 11376 if (!getDerived().AlwaysRebuild() && 11377 Type == E->getTypeInfoAsWritten() && 11378 SubExpr.get() == E->getSubExpr()) 11379 return E; 11380 return getDerived().RebuildCXXNamedCastExpr( 11381 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11382 Type, E->getAngleBrackets().getEnd(), 11383 // FIXME. this should be '(' location 11384 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11385 } 11386 11387 template<typename Derived> 11388 ExprResult 11389 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11390 TypeSourceInfo *TSI = 11391 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11392 if (!TSI) 11393 return ExprError(); 11394 11395 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11396 if (Sub.isInvalid()) 11397 return ExprError(); 11398 11399 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11400 Sub.get(), BCE->getEndLoc()); 11401 } 11402 11403 template<typename Derived> 11404 ExprResult 11405 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11406 return getDerived().TransformCXXNamedCastExpr(E); 11407 } 11408 11409 template<typename Derived> 11410 ExprResult 11411 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11412 return getDerived().TransformCXXNamedCastExpr(E); 11413 } 11414 11415 template<typename Derived> 11416 ExprResult 11417 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11418 CXXReinterpretCastExpr *E) { 11419 return getDerived().TransformCXXNamedCastExpr(E); 11420 } 11421 11422 template<typename Derived> 11423 ExprResult 11424 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11425 return getDerived().TransformCXXNamedCastExpr(E); 11426 } 11427 11428 template<typename Derived> 11429 ExprResult 11430 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11431 return getDerived().TransformCXXNamedCastExpr(E); 11432 } 11433 11434 template<typename Derived> 11435 ExprResult 11436 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11437 CXXFunctionalCastExpr *E) { 11438 TypeSourceInfo *Type = 11439 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11440 if (!Type) 11441 return ExprError(); 11442 11443 ExprResult SubExpr 11444 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11445 if (SubExpr.isInvalid()) 11446 return ExprError(); 11447 11448 if (!getDerived().AlwaysRebuild() && 11449 Type == E->getTypeInfoAsWritten() && 11450 SubExpr.get() == E->getSubExpr()) 11451 return E; 11452 11453 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11454 E->getLParenLoc(), 11455 SubExpr.get(), 11456 E->getRParenLoc(), 11457 E->isListInitialization()); 11458 } 11459 11460 template<typename Derived> 11461 ExprResult 11462 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11463 if (E->isTypeOperand()) { 11464 TypeSourceInfo *TInfo 11465 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11466 if (!TInfo) 11467 return ExprError(); 11468 11469 if (!getDerived().AlwaysRebuild() && 11470 TInfo == E->getTypeOperandSourceInfo()) 11471 return E; 11472 11473 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11474 TInfo, E->getEndLoc()); 11475 } 11476 11477 // We don't know whether the subexpression is potentially evaluated until 11478 // after we perform semantic analysis. We speculatively assume it is 11479 // unevaluated; it will get fixed later if the subexpression is in fact 11480 // potentially evaluated. 11481 EnterExpressionEvaluationContext Unevaluated( 11482 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11483 Sema::ReuseLambdaContextDecl); 11484 11485 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11486 if (SubExpr.isInvalid()) 11487 return ExprError(); 11488 11489 if (!getDerived().AlwaysRebuild() && 11490 SubExpr.get() == E->getExprOperand()) 11491 return E; 11492 11493 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11494 SubExpr.get(), E->getEndLoc()); 11495 } 11496 11497 template<typename Derived> 11498 ExprResult 11499 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11500 if (E->isTypeOperand()) { 11501 TypeSourceInfo *TInfo 11502 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11503 if (!TInfo) 11504 return ExprError(); 11505 11506 if (!getDerived().AlwaysRebuild() && 11507 TInfo == E->getTypeOperandSourceInfo()) 11508 return E; 11509 11510 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11511 TInfo, E->getEndLoc()); 11512 } 11513 11514 EnterExpressionEvaluationContext Unevaluated( 11515 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11516 11517 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11518 if (SubExpr.isInvalid()) 11519 return ExprError(); 11520 11521 if (!getDerived().AlwaysRebuild() && 11522 SubExpr.get() == E->getExprOperand()) 11523 return E; 11524 11525 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11526 SubExpr.get(), E->getEndLoc()); 11527 } 11528 11529 template<typename Derived> 11530 ExprResult 11531 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11532 return E; 11533 } 11534 11535 template<typename Derived> 11536 ExprResult 11537 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11538 CXXNullPtrLiteralExpr *E) { 11539 return E; 11540 } 11541 11542 template<typename Derived> 11543 ExprResult 11544 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11545 QualType T = getSema().getCurrentThisType(); 11546 11547 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11548 // Mark it referenced in the new context regardless. 11549 // FIXME: this is a bit instantiation-specific. 11550 getSema().MarkThisReferenced(E); 11551 return E; 11552 } 11553 11554 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11555 } 11556 11557 template<typename Derived> 11558 ExprResult 11559 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11560 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11561 if (SubExpr.isInvalid()) 11562 return ExprError(); 11563 11564 if (!getDerived().AlwaysRebuild() && 11565 SubExpr.get() == E->getSubExpr()) 11566 return E; 11567 11568 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11569 E->isThrownVariableInScope()); 11570 } 11571 11572 template<typename Derived> 11573 ExprResult 11574 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11575 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11576 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11577 if (!Param) 11578 return ExprError(); 11579 11580 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11581 E->getUsedContext() == SemaRef.CurContext) 11582 return E; 11583 11584 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11585 } 11586 11587 template<typename Derived> 11588 ExprResult 11589 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11590 FieldDecl *Field = cast_or_null<FieldDecl>( 11591 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11592 if (!Field) 11593 return ExprError(); 11594 11595 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11596 E->getUsedContext() == SemaRef.CurContext) 11597 return E; 11598 11599 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11600 } 11601 11602 template<typename Derived> 11603 ExprResult 11604 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11605 CXXScalarValueInitExpr *E) { 11606 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11607 if (!T) 11608 return ExprError(); 11609 11610 if (!getDerived().AlwaysRebuild() && 11611 T == E->getTypeSourceInfo()) 11612 return E; 11613 11614 return getDerived().RebuildCXXScalarValueInitExpr(T, 11615 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11616 E->getRParenLoc()); 11617 } 11618 11619 template<typename Derived> 11620 ExprResult 11621 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11622 // Transform the type that we're allocating 11623 TypeSourceInfo *AllocTypeInfo = 11624 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11625 if (!AllocTypeInfo) 11626 return ExprError(); 11627 11628 // Transform the size of the array we're allocating (if any). 11629 Optional<Expr *> ArraySize; 11630 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11631 ExprResult NewArraySize; 11632 if (*OldArraySize) { 11633 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11634 if (NewArraySize.isInvalid()) 11635 return ExprError(); 11636 } 11637 ArraySize = NewArraySize.get(); 11638 } 11639 11640 // Transform the placement arguments (if any). 11641 bool ArgumentChanged = false; 11642 SmallVector<Expr*, 8> PlacementArgs; 11643 if (getDerived().TransformExprs(E->getPlacementArgs(), 11644 E->getNumPlacementArgs(), true, 11645 PlacementArgs, &ArgumentChanged)) 11646 return ExprError(); 11647 11648 // Transform the initializer (if any). 11649 Expr *OldInit = E->getInitializer(); 11650 ExprResult NewInit; 11651 if (OldInit) 11652 NewInit = getDerived().TransformInitializer(OldInit, true); 11653 if (NewInit.isInvalid()) 11654 return ExprError(); 11655 11656 // Transform new operator and delete operator. 11657 FunctionDecl *OperatorNew = nullptr; 11658 if (E->getOperatorNew()) { 11659 OperatorNew = cast_or_null<FunctionDecl>( 11660 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11661 if (!OperatorNew) 11662 return ExprError(); 11663 } 11664 11665 FunctionDecl *OperatorDelete = nullptr; 11666 if (E->getOperatorDelete()) { 11667 OperatorDelete = cast_or_null<FunctionDecl>( 11668 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11669 if (!OperatorDelete) 11670 return ExprError(); 11671 } 11672 11673 if (!getDerived().AlwaysRebuild() && 11674 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11675 ArraySize == E->getArraySize() && 11676 NewInit.get() == OldInit && 11677 OperatorNew == E->getOperatorNew() && 11678 OperatorDelete == E->getOperatorDelete() && 11679 !ArgumentChanged) { 11680 // Mark any declarations we need as referenced. 11681 // FIXME: instantiation-specific. 11682 if (OperatorNew) 11683 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11684 if (OperatorDelete) 11685 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11686 11687 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11688 QualType ElementType 11689 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11690 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11691 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11692 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11693 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11694 } 11695 } 11696 } 11697 11698 return E; 11699 } 11700 11701 QualType AllocType = AllocTypeInfo->getType(); 11702 if (!ArraySize) { 11703 // If no array size was specified, but the new expression was 11704 // instantiated with an array type (e.g., "new T" where T is 11705 // instantiated with "int[4]"), extract the outer bound from the 11706 // array type as our array size. We do this with constant and 11707 // dependently-sized array types. 11708 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11709 if (!ArrayT) { 11710 // Do nothing 11711 } else if (const ConstantArrayType *ConsArrayT 11712 = dyn_cast<ConstantArrayType>(ArrayT)) { 11713 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11714 SemaRef.Context.getSizeType(), 11715 /*FIXME:*/ E->getBeginLoc()); 11716 AllocType = ConsArrayT->getElementType(); 11717 } else if (const DependentSizedArrayType *DepArrayT 11718 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11719 if (DepArrayT->getSizeExpr()) { 11720 ArraySize = DepArrayT->getSizeExpr(); 11721 AllocType = DepArrayT->getElementType(); 11722 } 11723 } 11724 } 11725 11726 return getDerived().RebuildCXXNewExpr( 11727 E->getBeginLoc(), E->isGlobalNew(), 11728 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11729 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11730 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11731 } 11732 11733 template<typename Derived> 11734 ExprResult 11735 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11736 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11737 if (Operand.isInvalid()) 11738 return ExprError(); 11739 11740 // Transform the delete operator, if known. 11741 FunctionDecl *OperatorDelete = nullptr; 11742 if (E->getOperatorDelete()) { 11743 OperatorDelete = cast_or_null<FunctionDecl>( 11744 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11745 if (!OperatorDelete) 11746 return ExprError(); 11747 } 11748 11749 if (!getDerived().AlwaysRebuild() && 11750 Operand.get() == E->getArgument() && 11751 OperatorDelete == E->getOperatorDelete()) { 11752 // Mark any declarations we need as referenced. 11753 // FIXME: instantiation-specific. 11754 if (OperatorDelete) 11755 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11756 11757 if (!E->getArgument()->isTypeDependent()) { 11758 QualType Destroyed = SemaRef.Context.getBaseElementType( 11759 E->getDestroyedType()); 11760 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11761 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11762 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11763 SemaRef.LookupDestructor(Record)); 11764 } 11765 } 11766 11767 return E; 11768 } 11769 11770 return getDerived().RebuildCXXDeleteExpr( 11771 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11772 } 11773 11774 template<typename Derived> 11775 ExprResult 11776 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11777 CXXPseudoDestructorExpr *E) { 11778 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11779 if (Base.isInvalid()) 11780 return ExprError(); 11781 11782 ParsedType ObjectTypePtr; 11783 bool MayBePseudoDestructor = false; 11784 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11785 E->getOperatorLoc(), 11786 E->isArrow()? tok::arrow : tok::period, 11787 ObjectTypePtr, 11788 MayBePseudoDestructor); 11789 if (Base.isInvalid()) 11790 return ExprError(); 11791 11792 QualType ObjectType = ObjectTypePtr.get(); 11793 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11794 if (QualifierLoc) { 11795 QualifierLoc 11796 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11797 if (!QualifierLoc) 11798 return ExprError(); 11799 } 11800 CXXScopeSpec SS; 11801 SS.Adopt(QualifierLoc); 11802 11803 PseudoDestructorTypeStorage Destroyed; 11804 if (E->getDestroyedTypeInfo()) { 11805 TypeSourceInfo *DestroyedTypeInfo 11806 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11807 ObjectType, nullptr, SS); 11808 if (!DestroyedTypeInfo) 11809 return ExprError(); 11810 Destroyed = DestroyedTypeInfo; 11811 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11812 // We aren't likely to be able to resolve the identifier down to a type 11813 // now anyway, so just retain the identifier. 11814 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11815 E->getDestroyedTypeLoc()); 11816 } else { 11817 // Look for a destructor known with the given name. 11818 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11819 *E->getDestroyedTypeIdentifier(), 11820 E->getDestroyedTypeLoc(), 11821 /*Scope=*/nullptr, 11822 SS, ObjectTypePtr, 11823 false); 11824 if (!T) 11825 return ExprError(); 11826 11827 Destroyed 11828 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11829 E->getDestroyedTypeLoc()); 11830 } 11831 11832 TypeSourceInfo *ScopeTypeInfo = nullptr; 11833 if (E->getScopeTypeInfo()) { 11834 CXXScopeSpec EmptySS; 11835 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11836 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11837 if (!ScopeTypeInfo) 11838 return ExprError(); 11839 } 11840 11841 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11842 E->getOperatorLoc(), 11843 E->isArrow(), 11844 SS, 11845 ScopeTypeInfo, 11846 E->getColonColonLoc(), 11847 E->getTildeLoc(), 11848 Destroyed); 11849 } 11850 11851 template <typename Derived> 11852 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11853 bool RequiresADL, 11854 LookupResult &R) { 11855 // Transform all the decls. 11856 bool AllEmptyPacks = true; 11857 for (auto *OldD : Old->decls()) { 11858 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11859 if (!InstD) { 11860 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11861 // This can happen because of dependent hiding. 11862 if (isa<UsingShadowDecl>(OldD)) 11863 continue; 11864 else { 11865 R.clear(); 11866 return true; 11867 } 11868 } 11869 11870 // Expand using pack declarations. 11871 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11872 ArrayRef<NamedDecl*> Decls = SingleDecl; 11873 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11874 Decls = UPD->expansions(); 11875 11876 // Expand using declarations. 11877 for (auto *D : Decls) { 11878 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11879 for (auto *SD : UD->shadows()) 11880 R.addDecl(SD); 11881 } else { 11882 R.addDecl(D); 11883 } 11884 } 11885 11886 AllEmptyPacks &= Decls.empty(); 11887 }; 11888 11889 // C++ [temp.res]/8.4.2: 11890 // The program is ill-formed, no diagnostic required, if [...] lookup for 11891 // a name in the template definition found a using-declaration, but the 11892 // lookup in the corresponding scope in the instantiation odoes not find 11893 // any declarations because the using-declaration was a pack expansion and 11894 // the corresponding pack is empty 11895 if (AllEmptyPacks && !RequiresADL) { 11896 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11897 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11898 return true; 11899 } 11900 11901 // Resolve a kind, but don't do any further analysis. If it's 11902 // ambiguous, the callee needs to deal with it. 11903 R.resolveKind(); 11904 return false; 11905 } 11906 11907 template<typename Derived> 11908 ExprResult 11909 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11910 UnresolvedLookupExpr *Old) { 11911 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11912 Sema::LookupOrdinaryName); 11913 11914 // Transform the declaration set. 11915 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11916 return ExprError(); 11917 11918 // Rebuild the nested-name qualifier, if present. 11919 CXXScopeSpec SS; 11920 if (Old->getQualifierLoc()) { 11921 NestedNameSpecifierLoc QualifierLoc 11922 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11923 if (!QualifierLoc) 11924 return ExprError(); 11925 11926 SS.Adopt(QualifierLoc); 11927 } 11928 11929 if (Old->getNamingClass()) { 11930 CXXRecordDecl *NamingClass 11931 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11932 Old->getNameLoc(), 11933 Old->getNamingClass())); 11934 if (!NamingClass) { 11935 R.clear(); 11936 return ExprError(); 11937 } 11938 11939 R.setNamingClass(NamingClass); 11940 } 11941 11942 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11943 11944 // If we have neither explicit template arguments, nor the template keyword, 11945 // it's a normal declaration name or member reference. 11946 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11947 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11948 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11949 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11950 // give a good diagnostic. 11951 if (D && D->isCXXInstanceMember()) { 11952 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11953 /*TemplateArgs=*/nullptr, 11954 /*Scope=*/nullptr); 11955 } 11956 11957 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11958 } 11959 11960 // If we have template arguments, rebuild them, then rebuild the 11961 // templateid expression. 11962 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11963 if (Old->hasExplicitTemplateArgs() && 11964 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11965 Old->getNumTemplateArgs(), 11966 TransArgs)) { 11967 R.clear(); 11968 return ExprError(); 11969 } 11970 11971 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11972 Old->requiresADL(), &TransArgs); 11973 } 11974 11975 template<typename Derived> 11976 ExprResult 11977 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11978 bool ArgChanged = false; 11979 SmallVector<TypeSourceInfo *, 4> Args; 11980 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11981 TypeSourceInfo *From = E->getArg(I); 11982 TypeLoc FromTL = From->getTypeLoc(); 11983 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11984 TypeLocBuilder TLB; 11985 TLB.reserve(FromTL.getFullDataSize()); 11986 QualType To = getDerived().TransformType(TLB, FromTL); 11987 if (To.isNull()) 11988 return ExprError(); 11989 11990 if (To == From->getType()) 11991 Args.push_back(From); 11992 else { 11993 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11994 ArgChanged = true; 11995 } 11996 continue; 11997 } 11998 11999 ArgChanged = true; 12000 12001 // We have a pack expansion. Instantiate it. 12002 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12003 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12004 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12005 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12006 12007 // Determine whether the set of unexpanded parameter packs can and should 12008 // be expanded. 12009 bool Expand = true; 12010 bool RetainExpansion = false; 12011 Optional<unsigned> OrigNumExpansions = 12012 ExpansionTL.getTypePtr()->getNumExpansions(); 12013 Optional<unsigned> NumExpansions = OrigNumExpansions; 12014 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12015 PatternTL.getSourceRange(), 12016 Unexpanded, 12017 Expand, RetainExpansion, 12018 NumExpansions)) 12019 return ExprError(); 12020 12021 if (!Expand) { 12022 // The transform has determined that we should perform a simple 12023 // transformation on the pack expansion, producing another pack 12024 // expansion. 12025 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12026 12027 TypeLocBuilder TLB; 12028 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12029 12030 QualType To = getDerived().TransformType(TLB, PatternTL); 12031 if (To.isNull()) 12032 return ExprError(); 12033 12034 To = getDerived().RebuildPackExpansionType(To, 12035 PatternTL.getSourceRange(), 12036 ExpansionTL.getEllipsisLoc(), 12037 NumExpansions); 12038 if (To.isNull()) 12039 return ExprError(); 12040 12041 PackExpansionTypeLoc ToExpansionTL 12042 = TLB.push<PackExpansionTypeLoc>(To); 12043 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12044 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12045 continue; 12046 } 12047 12048 // Expand the pack expansion by substituting for each argument in the 12049 // pack(s). 12050 for (unsigned I = 0; I != *NumExpansions; ++I) { 12051 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12052 TypeLocBuilder TLB; 12053 TLB.reserve(PatternTL.getFullDataSize()); 12054 QualType To = getDerived().TransformType(TLB, PatternTL); 12055 if (To.isNull()) 12056 return ExprError(); 12057 12058 if (To->containsUnexpandedParameterPack()) { 12059 To = getDerived().RebuildPackExpansionType(To, 12060 PatternTL.getSourceRange(), 12061 ExpansionTL.getEllipsisLoc(), 12062 NumExpansions); 12063 if (To.isNull()) 12064 return ExprError(); 12065 12066 PackExpansionTypeLoc ToExpansionTL 12067 = TLB.push<PackExpansionTypeLoc>(To); 12068 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12069 } 12070 12071 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12072 } 12073 12074 if (!RetainExpansion) 12075 continue; 12076 12077 // If we're supposed to retain a pack expansion, do so by temporarily 12078 // forgetting the partially-substituted parameter pack. 12079 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12080 12081 TypeLocBuilder TLB; 12082 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12083 12084 QualType To = getDerived().TransformType(TLB, PatternTL); 12085 if (To.isNull()) 12086 return ExprError(); 12087 12088 To = getDerived().RebuildPackExpansionType(To, 12089 PatternTL.getSourceRange(), 12090 ExpansionTL.getEllipsisLoc(), 12091 NumExpansions); 12092 if (To.isNull()) 12093 return ExprError(); 12094 12095 PackExpansionTypeLoc ToExpansionTL 12096 = TLB.push<PackExpansionTypeLoc>(To); 12097 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12098 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12099 } 12100 12101 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12102 return E; 12103 12104 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12105 E->getEndLoc()); 12106 } 12107 12108 template<typename Derived> 12109 ExprResult 12110 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12111 ConceptSpecializationExpr *E) { 12112 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12113 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12114 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12115 Old->NumTemplateArgs, TransArgs)) 12116 return ExprError(); 12117 12118 return getDerived().RebuildConceptSpecializationExpr( 12119 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12120 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12121 &TransArgs); 12122 } 12123 12124 template<typename Derived> 12125 ExprResult 12126 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12127 SmallVector<ParmVarDecl*, 4> TransParams; 12128 SmallVector<QualType, 4> TransParamTypes; 12129 Sema::ExtParameterInfoBuilder ExtParamInfos; 12130 12131 // C++2a [expr.prim.req]p2 12132 // Expressions appearing within a requirement-body are unevaluated operands. 12133 EnterExpressionEvaluationContext Ctx( 12134 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12135 12136 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12137 getSema().Context, getSema().CurContext, 12138 E->getBody()->getBeginLoc()); 12139 12140 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12141 12142 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12143 E->getLocalParameters(), 12144 /*ParamTypes=*/nullptr, 12145 /*ParamInfos=*/nullptr, 12146 TransParamTypes, &TransParams, 12147 ExtParamInfos)) 12148 return ExprError(); 12149 12150 for (ParmVarDecl *Param : TransParams) 12151 Param->setDeclContext(Body); 12152 12153 SmallVector<concepts::Requirement *, 4> TransReqs; 12154 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12155 TransReqs)) 12156 return ExprError(); 12157 12158 for (concepts::Requirement *Req : TransReqs) { 12159 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12160 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12161 ER->getReturnTypeRequirement() 12162 .getTypeConstraintTemplateParameterList()->getParam(0) 12163 ->setDeclContext(Body); 12164 } 12165 } 12166 } 12167 12168 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12169 TransParams, TransReqs, 12170 E->getRBraceLoc()); 12171 } 12172 12173 template<typename Derived> 12174 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12175 ArrayRef<concepts::Requirement *> Reqs, 12176 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12177 for (concepts::Requirement *Req : Reqs) { 12178 concepts::Requirement *TransReq = nullptr; 12179 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12180 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12181 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12182 TransReq = getDerived().TransformExprRequirement(ExprReq); 12183 else 12184 TransReq = getDerived().TransformNestedRequirement( 12185 cast<concepts::NestedRequirement>(Req)); 12186 if (!TransReq) 12187 return true; 12188 Transformed.push_back(TransReq); 12189 } 12190 return false; 12191 } 12192 12193 template<typename Derived> 12194 concepts::TypeRequirement * 12195 TreeTransform<Derived>::TransformTypeRequirement( 12196 concepts::TypeRequirement *Req) { 12197 if (Req->isSubstitutionFailure()) { 12198 if (getDerived().AlwaysRebuild()) 12199 return getDerived().RebuildTypeRequirement( 12200 Req->getSubstitutionDiagnostic()); 12201 return Req; 12202 } 12203 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12204 if (!TransType) 12205 return nullptr; 12206 return getDerived().RebuildTypeRequirement(TransType); 12207 } 12208 12209 template<typename Derived> 12210 concepts::ExprRequirement * 12211 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12212 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12213 if (Req->isExprSubstitutionFailure()) 12214 TransExpr = Req->getExprSubstitutionDiagnostic(); 12215 else { 12216 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12217 if (TransExprRes.isInvalid()) 12218 return nullptr; 12219 TransExpr = TransExprRes.get(); 12220 } 12221 12222 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12223 const auto &RetReq = Req->getReturnTypeRequirement(); 12224 if (RetReq.isEmpty()) 12225 TransRetReq.emplace(); 12226 else if (RetReq.isSubstitutionFailure()) 12227 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12228 else if (RetReq.isTypeConstraint()) { 12229 TemplateParameterList *OrigTPL = 12230 RetReq.getTypeConstraintTemplateParameterList(); 12231 TemplateParameterList *TPL = 12232 getDerived().TransformTemplateParameterList(OrigTPL); 12233 if (!TPL) 12234 return nullptr; 12235 TransRetReq.emplace(TPL); 12236 } 12237 assert(TransRetReq.hasValue() && 12238 "All code paths leading here must set TransRetReq"); 12239 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12240 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12241 Req->getNoexceptLoc(), 12242 std::move(*TransRetReq)); 12243 return getDerived().RebuildExprRequirement( 12244 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12245 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12246 } 12247 12248 template<typename Derived> 12249 concepts::NestedRequirement * 12250 TreeTransform<Derived>::TransformNestedRequirement( 12251 concepts::NestedRequirement *Req) { 12252 if (Req->isSubstitutionFailure()) { 12253 if (getDerived().AlwaysRebuild()) 12254 return getDerived().RebuildNestedRequirement( 12255 Req->getSubstitutionDiagnostic()); 12256 return Req; 12257 } 12258 ExprResult TransConstraint = 12259 getDerived().TransformExpr(Req->getConstraintExpr()); 12260 if (TransConstraint.isInvalid()) 12261 return nullptr; 12262 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12263 } 12264 12265 template<typename Derived> 12266 ExprResult 12267 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12268 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12269 if (!T) 12270 return ExprError(); 12271 12272 if (!getDerived().AlwaysRebuild() && 12273 T == E->getQueriedTypeSourceInfo()) 12274 return E; 12275 12276 ExprResult SubExpr; 12277 { 12278 EnterExpressionEvaluationContext Unevaluated( 12279 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12280 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12281 if (SubExpr.isInvalid()) 12282 return ExprError(); 12283 12284 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12285 return E; 12286 } 12287 12288 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12289 SubExpr.get(), E->getEndLoc()); 12290 } 12291 12292 template<typename Derived> 12293 ExprResult 12294 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12295 ExprResult SubExpr; 12296 { 12297 EnterExpressionEvaluationContext Unevaluated( 12298 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12299 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12300 if (SubExpr.isInvalid()) 12301 return ExprError(); 12302 12303 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12304 return E; 12305 } 12306 12307 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12308 SubExpr.get(), E->getEndLoc()); 12309 } 12310 12311 template <typename Derived> 12312 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12313 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12314 TypeSourceInfo **RecoveryTSI) { 12315 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12316 DRE, AddrTaken, RecoveryTSI); 12317 12318 // Propagate both errors and recovered types, which return ExprEmpty. 12319 if (!NewDRE.isUsable()) 12320 return NewDRE; 12321 12322 // We got an expr, wrap it up in parens. 12323 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12324 return PE; 12325 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12326 PE->getRParen()); 12327 } 12328 12329 template <typename Derived> 12330 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12331 DependentScopeDeclRefExpr *E) { 12332 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12333 nullptr); 12334 } 12335 12336 template<typename Derived> 12337 ExprResult 12338 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12339 DependentScopeDeclRefExpr *E, 12340 bool IsAddressOfOperand, 12341 TypeSourceInfo **RecoveryTSI) { 12342 assert(E->getQualifierLoc()); 12343 NestedNameSpecifierLoc QualifierLoc 12344 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12345 if (!QualifierLoc) 12346 return ExprError(); 12347 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12348 12349 // TODO: If this is a conversion-function-id, verify that the 12350 // destination type name (if present) resolves the same way after 12351 // instantiation as it did in the local scope. 12352 12353 DeclarationNameInfo NameInfo 12354 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12355 if (!NameInfo.getName()) 12356 return ExprError(); 12357 12358 if (!E->hasExplicitTemplateArgs()) { 12359 if (!getDerived().AlwaysRebuild() && 12360 QualifierLoc == E->getQualifierLoc() && 12361 // Note: it is sufficient to compare the Name component of NameInfo: 12362 // if name has not changed, DNLoc has not changed either. 12363 NameInfo.getName() == E->getDeclName()) 12364 return E; 12365 12366 return getDerived().RebuildDependentScopeDeclRefExpr( 12367 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12368 IsAddressOfOperand, RecoveryTSI); 12369 } 12370 12371 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12372 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12373 E->getNumTemplateArgs(), 12374 TransArgs)) 12375 return ExprError(); 12376 12377 return getDerived().RebuildDependentScopeDeclRefExpr( 12378 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12379 RecoveryTSI); 12380 } 12381 12382 template<typename Derived> 12383 ExprResult 12384 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12385 // CXXConstructExprs other than for list-initialization and 12386 // CXXTemporaryObjectExpr are always implicit, so when we have 12387 // a 1-argument construction we just transform that argument. 12388 if (getDerived().AllowSkippingCXXConstructExpr() && 12389 ((E->getNumArgs() == 1 || 12390 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12391 (!getDerived().DropCallArgument(E->getArg(0))) && 12392 !E->isListInitialization())) 12393 return getDerived().TransformInitializer(E->getArg(0), 12394 /*DirectInit*/ false); 12395 12396 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12397 12398 QualType T = getDerived().TransformType(E->getType()); 12399 if (T.isNull()) 12400 return ExprError(); 12401 12402 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12403 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12404 if (!Constructor) 12405 return ExprError(); 12406 12407 bool ArgumentChanged = false; 12408 SmallVector<Expr*, 8> Args; 12409 { 12410 EnterExpressionEvaluationContext Context( 12411 getSema(), EnterExpressionEvaluationContext::InitList, 12412 E->isListInitialization()); 12413 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12414 &ArgumentChanged)) 12415 return ExprError(); 12416 } 12417 12418 if (!getDerived().AlwaysRebuild() && 12419 T == E->getType() && 12420 Constructor == E->getConstructor() && 12421 !ArgumentChanged) { 12422 // Mark the constructor as referenced. 12423 // FIXME: Instantiation-specific 12424 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12425 return E; 12426 } 12427 12428 return getDerived().RebuildCXXConstructExpr( 12429 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12430 E->hadMultipleCandidates(), E->isListInitialization(), 12431 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12432 E->getConstructionKind(), E->getParenOrBraceRange()); 12433 } 12434 12435 template<typename Derived> 12436 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12437 CXXInheritedCtorInitExpr *E) { 12438 QualType T = getDerived().TransformType(E->getType()); 12439 if (T.isNull()) 12440 return ExprError(); 12441 12442 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12443 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12444 if (!Constructor) 12445 return ExprError(); 12446 12447 if (!getDerived().AlwaysRebuild() && 12448 T == E->getType() && 12449 Constructor == E->getConstructor()) { 12450 // Mark the constructor as referenced. 12451 // FIXME: Instantiation-specific 12452 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12453 return E; 12454 } 12455 12456 return getDerived().RebuildCXXInheritedCtorInitExpr( 12457 T, E->getLocation(), Constructor, 12458 E->constructsVBase(), E->inheritedFromVBase()); 12459 } 12460 12461 /// Transform a C++ temporary-binding expression. 12462 /// 12463 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12464 /// transform the subexpression and return that. 12465 template<typename Derived> 12466 ExprResult 12467 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12468 return getDerived().TransformExpr(E->getSubExpr()); 12469 } 12470 12471 /// Transform a C++ expression that contains cleanups that should 12472 /// be run after the expression is evaluated. 12473 /// 12474 /// Since ExprWithCleanups nodes are implicitly generated, we 12475 /// just transform the subexpression and return that. 12476 template<typename Derived> 12477 ExprResult 12478 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12479 return getDerived().TransformExpr(E->getSubExpr()); 12480 } 12481 12482 template<typename Derived> 12483 ExprResult 12484 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12485 CXXTemporaryObjectExpr *E) { 12486 TypeSourceInfo *T = 12487 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12488 if (!T) 12489 return ExprError(); 12490 12491 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12492 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12493 if (!Constructor) 12494 return ExprError(); 12495 12496 bool ArgumentChanged = false; 12497 SmallVector<Expr*, 8> Args; 12498 Args.reserve(E->getNumArgs()); 12499 { 12500 EnterExpressionEvaluationContext Context( 12501 getSema(), EnterExpressionEvaluationContext::InitList, 12502 E->isListInitialization()); 12503 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12504 &ArgumentChanged)) 12505 return ExprError(); 12506 } 12507 12508 if (!getDerived().AlwaysRebuild() && 12509 T == E->getTypeSourceInfo() && 12510 Constructor == E->getConstructor() && 12511 !ArgumentChanged) { 12512 // FIXME: Instantiation-specific 12513 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12514 return SemaRef.MaybeBindToTemporary(E); 12515 } 12516 12517 // FIXME: We should just pass E->isListInitialization(), but we're not 12518 // prepared to handle list-initialization without a child InitListExpr. 12519 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12520 return getDerived().RebuildCXXTemporaryObjectExpr( 12521 T, LParenLoc, Args, E->getEndLoc(), 12522 /*ListInitialization=*/LParenLoc.isInvalid()); 12523 } 12524 12525 template<typename Derived> 12526 ExprResult 12527 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12528 // Transform any init-capture expressions before entering the scope of the 12529 // lambda body, because they are not semantically within that scope. 12530 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12531 struct TransformedInitCapture { 12532 // The location of the ... if the result is retaining a pack expansion. 12533 SourceLocation EllipsisLoc; 12534 // Zero or more expansions of the init-capture. 12535 SmallVector<InitCaptureInfoTy, 4> Expansions; 12536 }; 12537 SmallVector<TransformedInitCapture, 4> InitCaptures; 12538 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12539 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12540 CEnd = E->capture_end(); 12541 C != CEnd; ++C) { 12542 if (!E->isInitCapture(C)) 12543 continue; 12544 12545 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12546 VarDecl *OldVD = C->getCapturedVar(); 12547 12548 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12549 Optional<unsigned> NumExpansions) { 12550 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12551 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12552 12553 if (NewExprInitResult.isInvalid()) { 12554 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12555 return; 12556 } 12557 Expr *NewExprInit = NewExprInitResult.get(); 12558 12559 QualType NewInitCaptureType = 12560 getSema().buildLambdaInitCaptureInitialization( 12561 C->getLocation(), OldVD->getType()->isReferenceType(), 12562 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12563 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12564 NewExprInit); 12565 Result.Expansions.push_back( 12566 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12567 }; 12568 12569 // If this is an init-capture pack, consider expanding the pack now. 12570 if (OldVD->isParameterPack()) { 12571 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12572 ->getTypeLoc() 12573 .castAs<PackExpansionTypeLoc>(); 12574 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12575 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12576 12577 // Determine whether the set of unexpanded parameter packs can and should 12578 // be expanded. 12579 bool Expand = true; 12580 bool RetainExpansion = false; 12581 Optional<unsigned> OrigNumExpansions = 12582 ExpansionTL.getTypePtr()->getNumExpansions(); 12583 Optional<unsigned> NumExpansions = OrigNumExpansions; 12584 if (getDerived().TryExpandParameterPacks( 12585 ExpansionTL.getEllipsisLoc(), 12586 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12587 RetainExpansion, NumExpansions)) 12588 return ExprError(); 12589 if (Expand) { 12590 for (unsigned I = 0; I != *NumExpansions; ++I) { 12591 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12592 SubstInitCapture(SourceLocation(), None); 12593 } 12594 } 12595 if (!Expand || RetainExpansion) { 12596 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12597 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12598 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12599 } 12600 } else { 12601 SubstInitCapture(SourceLocation(), None); 12602 } 12603 } 12604 12605 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12606 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12607 12608 // Transform the template parameters, and add them to the current 12609 // instantiation scope. The null case is handled correctly. 12610 auto TPL = getDerived().TransformTemplateParameterList( 12611 E->getTemplateParameterList()); 12612 LSI->GLTemplateParameterList = TPL; 12613 12614 // Transform the type of the original lambda's call operator. 12615 // The transformation MUST be done in the CurrentInstantiationScope since 12616 // it introduces a mapping of the original to the newly created 12617 // transformed parameters. 12618 TypeSourceInfo *NewCallOpTSI = nullptr; 12619 { 12620 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12621 FunctionProtoTypeLoc OldCallOpFPTL = 12622 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12623 12624 TypeLocBuilder NewCallOpTLBuilder; 12625 SmallVector<QualType, 4> ExceptionStorage; 12626 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12627 QualType NewCallOpType = TransformFunctionProtoType( 12628 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12629 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12630 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12631 ExceptionStorage, Changed); 12632 }); 12633 if (NewCallOpType.isNull()) 12634 return ExprError(); 12635 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12636 NewCallOpType); 12637 } 12638 12639 // Transform the trailing requires clause 12640 ExprResult NewTrailingRequiresClause; 12641 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12642 // FIXME: Concepts: Substitution into requires clause should only happen 12643 // when checking satisfaction. 12644 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12645 12646 // Create the local class that will describe the lambda. 12647 // FIXME: KnownDependent below is wrong when substituting inside a templated 12648 // context that isn't a DeclContext (such as a variable template). 12649 CXXRecordDecl *OldClass = E->getLambdaClass(); 12650 CXXRecordDecl *Class 12651 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12652 NewCallOpTSI, 12653 /*KnownDependent=*/false, 12654 E->getCaptureDefault()); 12655 getDerived().transformedLocalDecl(OldClass, {Class}); 12656 12657 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12658 if (getDerived().ReplacingOriginal()) 12659 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12660 OldClass->getLambdaManglingNumber(), 12661 OldClass->getDeviceLambdaManglingNumber(), 12662 OldClass->getLambdaContextDecl()); 12663 12664 // Build the call operator. 12665 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12666 Class, E->getIntroducerRange(), NewCallOpTSI, 12667 E->getCallOperator()->getEndLoc(), 12668 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12669 E->getCallOperator()->getConstexprKind(), 12670 NewTrailingRequiresClause.get()); 12671 12672 LSI->CallOperator = NewCallOperator; 12673 12674 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12675 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12676 12677 // Number the lambda for linkage purposes if necessary. 12678 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12679 12680 // Introduce the context of the call operator. 12681 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12682 /*NewThisContext*/false); 12683 12684 // Enter the scope of the lambda. 12685 getSema().buildLambdaScope(LSI, NewCallOperator, 12686 E->getIntroducerRange(), 12687 E->getCaptureDefault(), 12688 E->getCaptureDefaultLoc(), 12689 E->hasExplicitParameters(), 12690 E->hasExplicitResultType(), 12691 E->isMutable()); 12692 12693 bool Invalid = false; 12694 12695 // Transform captures. 12696 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12697 CEnd = E->capture_end(); 12698 C != CEnd; ++C) { 12699 // When we hit the first implicit capture, tell Sema that we've finished 12700 // the list of explicit captures. 12701 if (C->isImplicit()) 12702 break; 12703 12704 // Capturing 'this' is trivial. 12705 if (C->capturesThis()) { 12706 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12707 /*BuildAndDiagnose*/ true, nullptr, 12708 C->getCaptureKind() == LCK_StarThis); 12709 continue; 12710 } 12711 // Captured expression will be recaptured during captured variables 12712 // rebuilding. 12713 if (C->capturesVLAType()) 12714 continue; 12715 12716 // Rebuild init-captures, including the implied field declaration. 12717 if (E->isInitCapture(C)) { 12718 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12719 12720 VarDecl *OldVD = C->getCapturedVar(); 12721 llvm::SmallVector<Decl*, 4> NewVDs; 12722 12723 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12724 ExprResult Init = Info.first; 12725 QualType InitQualType = Info.second; 12726 if (Init.isInvalid() || InitQualType.isNull()) { 12727 Invalid = true; 12728 break; 12729 } 12730 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12731 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12732 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12733 if (!NewVD) { 12734 Invalid = true; 12735 break; 12736 } 12737 NewVDs.push_back(NewVD); 12738 getSema().addInitCapture(LSI, NewVD); 12739 } 12740 12741 if (Invalid) 12742 break; 12743 12744 getDerived().transformedLocalDecl(OldVD, NewVDs); 12745 continue; 12746 } 12747 12748 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12749 12750 // Determine the capture kind for Sema. 12751 Sema::TryCaptureKind Kind 12752 = C->isImplicit()? Sema::TryCapture_Implicit 12753 : C->getCaptureKind() == LCK_ByCopy 12754 ? Sema::TryCapture_ExplicitByVal 12755 : Sema::TryCapture_ExplicitByRef; 12756 SourceLocation EllipsisLoc; 12757 if (C->isPackExpansion()) { 12758 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12759 bool ShouldExpand = false; 12760 bool RetainExpansion = false; 12761 Optional<unsigned> NumExpansions; 12762 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12763 C->getLocation(), 12764 Unexpanded, 12765 ShouldExpand, RetainExpansion, 12766 NumExpansions)) { 12767 Invalid = true; 12768 continue; 12769 } 12770 12771 if (ShouldExpand) { 12772 // The transform has determined that we should perform an expansion; 12773 // transform and capture each of the arguments. 12774 // expansion of the pattern. Do so. 12775 VarDecl *Pack = C->getCapturedVar(); 12776 for (unsigned I = 0; I != *NumExpansions; ++I) { 12777 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12778 VarDecl *CapturedVar 12779 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12780 Pack)); 12781 if (!CapturedVar) { 12782 Invalid = true; 12783 continue; 12784 } 12785 12786 // Capture the transformed variable. 12787 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12788 } 12789 12790 // FIXME: Retain a pack expansion if RetainExpansion is true. 12791 12792 continue; 12793 } 12794 12795 EllipsisLoc = C->getEllipsisLoc(); 12796 } 12797 12798 // Transform the captured variable. 12799 VarDecl *CapturedVar 12800 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12801 C->getCapturedVar())); 12802 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12803 Invalid = true; 12804 continue; 12805 } 12806 12807 // Capture the transformed variable. 12808 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12809 EllipsisLoc); 12810 } 12811 getSema().finishLambdaExplicitCaptures(LSI); 12812 12813 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12814 // evaluation context even if we're not transforming the function body. 12815 getSema().PushExpressionEvaluationContext( 12816 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12817 12818 // Instantiate the body of the lambda expression. 12819 StmtResult Body = 12820 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12821 12822 // ActOnLambda* will pop the function scope for us. 12823 FuncScopeCleanup.disable(); 12824 12825 if (Body.isInvalid()) { 12826 SavedContext.pop(); 12827 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12828 /*IsInstantiation=*/true); 12829 return ExprError(); 12830 } 12831 12832 // Copy the LSI before ActOnFinishFunctionBody removes it. 12833 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12834 // the call operator. 12835 auto LSICopy = *LSI; 12836 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12837 /*IsInstantiation*/ true); 12838 SavedContext.pop(); 12839 12840 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12841 &LSICopy); 12842 } 12843 12844 template<typename Derived> 12845 StmtResult 12846 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12847 return TransformStmt(S); 12848 } 12849 12850 template<typename Derived> 12851 StmtResult 12852 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12853 // Transform captures. 12854 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12855 CEnd = E->capture_end(); 12856 C != CEnd; ++C) { 12857 // When we hit the first implicit capture, tell Sema that we've finished 12858 // the list of explicit captures. 12859 if (!C->isImplicit()) 12860 continue; 12861 12862 // Capturing 'this' is trivial. 12863 if (C->capturesThis()) { 12864 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12865 /*BuildAndDiagnose*/ true, nullptr, 12866 C->getCaptureKind() == LCK_StarThis); 12867 continue; 12868 } 12869 // Captured expression will be recaptured during captured variables 12870 // rebuilding. 12871 if (C->capturesVLAType()) 12872 continue; 12873 12874 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12875 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12876 12877 // Transform the captured variable. 12878 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12879 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12880 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12881 return StmtError(); 12882 12883 // Capture the transformed variable. 12884 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12885 } 12886 12887 return S; 12888 } 12889 12890 template<typename Derived> 12891 ExprResult 12892 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12893 CXXUnresolvedConstructExpr *E) { 12894 TypeSourceInfo *T = 12895 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12896 if (!T) 12897 return ExprError(); 12898 12899 bool ArgumentChanged = false; 12900 SmallVector<Expr*, 8> Args; 12901 Args.reserve(E->getNumArgs()); 12902 { 12903 EnterExpressionEvaluationContext Context( 12904 getSema(), EnterExpressionEvaluationContext::InitList, 12905 E->isListInitialization()); 12906 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 12907 &ArgumentChanged)) 12908 return ExprError(); 12909 } 12910 12911 if (!getDerived().AlwaysRebuild() && 12912 T == E->getTypeSourceInfo() && 12913 !ArgumentChanged) 12914 return E; 12915 12916 // FIXME: we're faking the locations of the commas 12917 return getDerived().RebuildCXXUnresolvedConstructExpr( 12918 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12919 } 12920 12921 template<typename Derived> 12922 ExprResult 12923 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12924 CXXDependentScopeMemberExpr *E) { 12925 // Transform the base of the expression. 12926 ExprResult Base((Expr*) nullptr); 12927 Expr *OldBase; 12928 QualType BaseType; 12929 QualType ObjectType; 12930 if (!E->isImplicitAccess()) { 12931 OldBase = E->getBase(); 12932 Base = getDerived().TransformExpr(OldBase); 12933 if (Base.isInvalid()) 12934 return ExprError(); 12935 12936 // Start the member reference and compute the object's type. 12937 ParsedType ObjectTy; 12938 bool MayBePseudoDestructor = false; 12939 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12940 E->getOperatorLoc(), 12941 E->isArrow()? tok::arrow : tok::period, 12942 ObjectTy, 12943 MayBePseudoDestructor); 12944 if (Base.isInvalid()) 12945 return ExprError(); 12946 12947 ObjectType = ObjectTy.get(); 12948 BaseType = ((Expr*) Base.get())->getType(); 12949 } else { 12950 OldBase = nullptr; 12951 BaseType = getDerived().TransformType(E->getBaseType()); 12952 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12953 } 12954 12955 // Transform the first part of the nested-name-specifier that qualifies 12956 // the member name. 12957 NamedDecl *FirstQualifierInScope 12958 = getDerived().TransformFirstQualifierInScope( 12959 E->getFirstQualifierFoundInScope(), 12960 E->getQualifierLoc().getBeginLoc()); 12961 12962 NestedNameSpecifierLoc QualifierLoc; 12963 if (E->getQualifier()) { 12964 QualifierLoc 12965 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12966 ObjectType, 12967 FirstQualifierInScope); 12968 if (!QualifierLoc) 12969 return ExprError(); 12970 } 12971 12972 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12973 12974 // TODO: If this is a conversion-function-id, verify that the 12975 // destination type name (if present) resolves the same way after 12976 // instantiation as it did in the local scope. 12977 12978 DeclarationNameInfo NameInfo 12979 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12980 if (!NameInfo.getName()) 12981 return ExprError(); 12982 12983 if (!E->hasExplicitTemplateArgs()) { 12984 // This is a reference to a member without an explicitly-specified 12985 // template argument list. Optimize for this common case. 12986 if (!getDerived().AlwaysRebuild() && 12987 Base.get() == OldBase && 12988 BaseType == E->getBaseType() && 12989 QualifierLoc == E->getQualifierLoc() && 12990 NameInfo.getName() == E->getMember() && 12991 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12992 return E; 12993 12994 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12995 BaseType, 12996 E->isArrow(), 12997 E->getOperatorLoc(), 12998 QualifierLoc, 12999 TemplateKWLoc, 13000 FirstQualifierInScope, 13001 NameInfo, 13002 /*TemplateArgs*/nullptr); 13003 } 13004 13005 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13006 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13007 E->getNumTemplateArgs(), 13008 TransArgs)) 13009 return ExprError(); 13010 13011 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13012 BaseType, 13013 E->isArrow(), 13014 E->getOperatorLoc(), 13015 QualifierLoc, 13016 TemplateKWLoc, 13017 FirstQualifierInScope, 13018 NameInfo, 13019 &TransArgs); 13020 } 13021 13022 template<typename Derived> 13023 ExprResult 13024 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 13025 // Transform the base of the expression. 13026 ExprResult Base((Expr*) nullptr); 13027 QualType BaseType; 13028 if (!Old->isImplicitAccess()) { 13029 Base = getDerived().TransformExpr(Old->getBase()); 13030 if (Base.isInvalid()) 13031 return ExprError(); 13032 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 13033 Old->isArrow()); 13034 if (Base.isInvalid()) 13035 return ExprError(); 13036 BaseType = Base.get()->getType(); 13037 } else { 13038 BaseType = getDerived().TransformType(Old->getBaseType()); 13039 } 13040 13041 NestedNameSpecifierLoc QualifierLoc; 13042 if (Old->getQualifierLoc()) { 13043 QualifierLoc 13044 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13045 if (!QualifierLoc) 13046 return ExprError(); 13047 } 13048 13049 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13050 13051 LookupResult R(SemaRef, Old->getMemberNameInfo(), 13052 Sema::LookupOrdinaryName); 13053 13054 // Transform the declaration set. 13055 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 13056 return ExprError(); 13057 13058 // Determine the naming class. 13059 if (Old->getNamingClass()) { 13060 CXXRecordDecl *NamingClass 13061 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 13062 Old->getMemberLoc(), 13063 Old->getNamingClass())); 13064 if (!NamingClass) 13065 return ExprError(); 13066 13067 R.setNamingClass(NamingClass); 13068 } 13069 13070 TemplateArgumentListInfo TransArgs; 13071 if (Old->hasExplicitTemplateArgs()) { 13072 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13073 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13074 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 13075 Old->getNumTemplateArgs(), 13076 TransArgs)) 13077 return ExprError(); 13078 } 13079 13080 // FIXME: to do this check properly, we will need to preserve the 13081 // first-qualifier-in-scope here, just in case we had a dependent 13082 // base (and therefore couldn't do the check) and a 13083 // nested-name-qualifier (and therefore could do the lookup). 13084 NamedDecl *FirstQualifierInScope = nullptr; 13085 13086 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 13087 BaseType, 13088 Old->getOperatorLoc(), 13089 Old->isArrow(), 13090 QualifierLoc, 13091 TemplateKWLoc, 13092 FirstQualifierInScope, 13093 R, 13094 (Old->hasExplicitTemplateArgs() 13095 ? &TransArgs : nullptr)); 13096 } 13097 13098 template<typename Derived> 13099 ExprResult 13100 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13101 EnterExpressionEvaluationContext Unevaluated( 13102 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13103 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13104 if (SubExpr.isInvalid()) 13105 return ExprError(); 13106 13107 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13108 return E; 13109 13110 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13111 } 13112 13113 template<typename Derived> 13114 ExprResult 13115 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13116 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13117 if (Pattern.isInvalid()) 13118 return ExprError(); 13119 13120 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13121 return E; 13122 13123 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13124 E->getNumExpansions()); 13125 } 13126 13127 template<typename Derived> 13128 ExprResult 13129 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13130 // If E is not value-dependent, then nothing will change when we transform it. 13131 // Note: This is an instantiation-centric view. 13132 if (!E->isValueDependent()) 13133 return E; 13134 13135 EnterExpressionEvaluationContext Unevaluated( 13136 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13137 13138 ArrayRef<TemplateArgument> PackArgs; 13139 TemplateArgument ArgStorage; 13140 13141 // Find the argument list to transform. 13142 if (E->isPartiallySubstituted()) { 13143 PackArgs = E->getPartialArguments(); 13144 } else if (E->isValueDependent()) { 13145 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13146 bool ShouldExpand = false; 13147 bool RetainExpansion = false; 13148 Optional<unsigned> NumExpansions; 13149 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13150 Unexpanded, 13151 ShouldExpand, RetainExpansion, 13152 NumExpansions)) 13153 return ExprError(); 13154 13155 // If we need to expand the pack, build a template argument from it and 13156 // expand that. 13157 if (ShouldExpand) { 13158 auto *Pack = E->getPack(); 13159 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13160 ArgStorage = getSema().Context.getPackExpansionType( 13161 getSema().Context.getTypeDeclType(TTPD), None); 13162 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13163 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13164 } else { 13165 auto *VD = cast<ValueDecl>(Pack); 13166 ExprResult DRE = getSema().BuildDeclRefExpr( 13167 VD, VD->getType().getNonLValueExprType(getSema().Context), 13168 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 13169 E->getPackLoc()); 13170 if (DRE.isInvalid()) 13171 return ExprError(); 13172 ArgStorage = new (getSema().Context) PackExpansionExpr( 13173 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13174 } 13175 PackArgs = ArgStorage; 13176 } 13177 } 13178 13179 // If we're not expanding the pack, just transform the decl. 13180 if (!PackArgs.size()) { 13181 auto *Pack = cast_or_null<NamedDecl>( 13182 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13183 if (!Pack) 13184 return ExprError(); 13185 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13186 E->getPackLoc(), 13187 E->getRParenLoc(), None, None); 13188 } 13189 13190 // Try to compute the result without performing a partial substitution. 13191 Optional<unsigned> Result = 0; 13192 for (const TemplateArgument &Arg : PackArgs) { 13193 if (!Arg.isPackExpansion()) { 13194 Result = *Result + 1; 13195 continue; 13196 } 13197 13198 TemplateArgumentLoc ArgLoc; 13199 InventTemplateArgumentLoc(Arg, ArgLoc); 13200 13201 // Find the pattern of the pack expansion. 13202 SourceLocation Ellipsis; 13203 Optional<unsigned> OrigNumExpansions; 13204 TemplateArgumentLoc Pattern = 13205 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13206 OrigNumExpansions); 13207 13208 // Substitute under the pack expansion. Do not expand the pack (yet). 13209 TemplateArgumentLoc OutPattern; 13210 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13211 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13212 /*Uneval*/ true)) 13213 return true; 13214 13215 // See if we can determine the number of arguments from the result. 13216 Optional<unsigned> NumExpansions = 13217 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13218 if (!NumExpansions) { 13219 // No: we must be in an alias template expansion, and we're going to need 13220 // to actually expand the packs. 13221 Result = None; 13222 break; 13223 } 13224 13225 Result = *Result + *NumExpansions; 13226 } 13227 13228 // Common case: we could determine the number of expansions without 13229 // substituting. 13230 if (Result) 13231 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13232 E->getPackLoc(), 13233 E->getRParenLoc(), *Result, None); 13234 13235 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13236 E->getPackLoc()); 13237 { 13238 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13239 typedef TemplateArgumentLocInventIterator< 13240 Derived, const TemplateArgument*> PackLocIterator; 13241 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13242 PackLocIterator(*this, PackArgs.end()), 13243 TransformedPackArgs, /*Uneval*/true)) 13244 return ExprError(); 13245 } 13246 13247 // Check whether we managed to fully-expand the pack. 13248 // FIXME: Is it possible for us to do so and not hit the early exit path? 13249 SmallVector<TemplateArgument, 8> Args; 13250 bool PartialSubstitution = false; 13251 for (auto &Loc : TransformedPackArgs.arguments()) { 13252 Args.push_back(Loc.getArgument()); 13253 if (Loc.getArgument().isPackExpansion()) 13254 PartialSubstitution = true; 13255 } 13256 13257 if (PartialSubstitution) 13258 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13259 E->getPackLoc(), 13260 E->getRParenLoc(), None, Args); 13261 13262 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13263 E->getPackLoc(), E->getRParenLoc(), 13264 Args.size(), None); 13265 } 13266 13267 template<typename Derived> 13268 ExprResult 13269 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13270 SubstNonTypeTemplateParmPackExpr *E) { 13271 // Default behavior is to do nothing with this transformation. 13272 return E; 13273 } 13274 13275 template<typename Derived> 13276 ExprResult 13277 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13278 SubstNonTypeTemplateParmExpr *E) { 13279 // Default behavior is to do nothing with this transformation. 13280 return E; 13281 } 13282 13283 template<typename Derived> 13284 ExprResult 13285 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13286 // Default behavior is to do nothing with this transformation. 13287 return E; 13288 } 13289 13290 template<typename Derived> 13291 ExprResult 13292 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13293 MaterializeTemporaryExpr *E) { 13294 return getDerived().TransformExpr(E->getSubExpr()); 13295 } 13296 13297 template<typename Derived> 13298 ExprResult 13299 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13300 UnresolvedLookupExpr *Callee = nullptr; 13301 if (Expr *OldCallee = E->getCallee()) { 13302 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13303 if (CalleeResult.isInvalid()) 13304 return ExprError(); 13305 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13306 } 13307 13308 Expr *Pattern = E->getPattern(); 13309 13310 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13311 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13312 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13313 13314 // Determine whether the set of unexpanded parameter packs can and should 13315 // be expanded. 13316 bool Expand = true; 13317 bool RetainExpansion = false; 13318 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13319 NumExpansions = OrigNumExpansions; 13320 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13321 Pattern->getSourceRange(), 13322 Unexpanded, 13323 Expand, RetainExpansion, 13324 NumExpansions)) 13325 return true; 13326 13327 if (!Expand) { 13328 // Do not expand any packs here, just transform and rebuild a fold 13329 // expression. 13330 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13331 13332 ExprResult LHS = 13333 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13334 if (LHS.isInvalid()) 13335 return true; 13336 13337 ExprResult RHS = 13338 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13339 if (RHS.isInvalid()) 13340 return true; 13341 13342 if (!getDerived().AlwaysRebuild() && 13343 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13344 return E; 13345 13346 return getDerived().RebuildCXXFoldExpr( 13347 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13348 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13349 } 13350 13351 // Formally a fold expression expands to nested parenthesized expressions. 13352 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13353 // them. 13354 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13355 SemaRef.Diag(E->getEllipsisLoc(), 13356 clang::diag::err_fold_expression_limit_exceeded) 13357 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13358 << E->getSourceRange(); 13359 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13360 return ExprError(); 13361 } 13362 13363 // The transform has determined that we should perform an elementwise 13364 // expansion of the pattern. Do so. 13365 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13366 if (Result.isInvalid()) 13367 return true; 13368 bool LeftFold = E->isLeftFold(); 13369 13370 // If we're retaining an expansion for a right fold, it is the innermost 13371 // component and takes the init (if any). 13372 if (!LeftFold && RetainExpansion) { 13373 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13374 13375 ExprResult Out = getDerived().TransformExpr(Pattern); 13376 if (Out.isInvalid()) 13377 return true; 13378 13379 Result = getDerived().RebuildCXXFoldExpr( 13380 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13381 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13382 if (Result.isInvalid()) 13383 return true; 13384 } 13385 13386 for (unsigned I = 0; I != *NumExpansions; ++I) { 13387 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13388 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13389 ExprResult Out = getDerived().TransformExpr(Pattern); 13390 if (Out.isInvalid()) 13391 return true; 13392 13393 if (Out.get()->containsUnexpandedParameterPack()) { 13394 // We still have a pack; retain a pack expansion for this slice. 13395 Result = getDerived().RebuildCXXFoldExpr( 13396 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13397 E->getOperator(), E->getEllipsisLoc(), 13398 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13399 OrigNumExpansions); 13400 } else if (Result.isUsable()) { 13401 // We've got down to a single element; build a binary operator. 13402 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13403 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13404 if (Callee) 13405 Result = getDerived().RebuildCXXOperatorCallExpr( 13406 BinaryOperator::getOverloadedOperator(E->getOperator()), 13407 E->getEllipsisLoc(), Callee, LHS, RHS); 13408 else 13409 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13410 E->getOperator(), LHS, RHS); 13411 } else 13412 Result = Out; 13413 13414 if (Result.isInvalid()) 13415 return true; 13416 } 13417 13418 // If we're retaining an expansion for a left fold, it is the outermost 13419 // component and takes the complete expansion so far as its init (if any). 13420 if (LeftFold && RetainExpansion) { 13421 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13422 13423 ExprResult Out = getDerived().TransformExpr(Pattern); 13424 if (Out.isInvalid()) 13425 return true; 13426 13427 Result = getDerived().RebuildCXXFoldExpr( 13428 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13429 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13430 if (Result.isInvalid()) 13431 return true; 13432 } 13433 13434 // If we had no init and an empty pack, and we're not retaining an expansion, 13435 // then produce a fallback value or error. 13436 if (Result.isUnset()) 13437 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13438 E->getOperator()); 13439 13440 return Result; 13441 } 13442 13443 template<typename Derived> 13444 ExprResult 13445 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13446 CXXStdInitializerListExpr *E) { 13447 return getDerived().TransformExpr(E->getSubExpr()); 13448 } 13449 13450 template<typename Derived> 13451 ExprResult 13452 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13453 return SemaRef.MaybeBindToTemporary(E); 13454 } 13455 13456 template<typename Derived> 13457 ExprResult 13458 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13459 return E; 13460 } 13461 13462 template<typename Derived> 13463 ExprResult 13464 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13465 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13466 if (SubExpr.isInvalid()) 13467 return ExprError(); 13468 13469 if (!getDerived().AlwaysRebuild() && 13470 SubExpr.get() == E->getSubExpr()) 13471 return E; 13472 13473 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13474 } 13475 13476 template<typename Derived> 13477 ExprResult 13478 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13479 // Transform each of the elements. 13480 SmallVector<Expr *, 8> Elements; 13481 bool ArgChanged = false; 13482 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13483 /*IsCall=*/false, Elements, &ArgChanged)) 13484 return ExprError(); 13485 13486 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13487 return SemaRef.MaybeBindToTemporary(E); 13488 13489 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13490 Elements.data(), 13491 Elements.size()); 13492 } 13493 13494 template<typename Derived> 13495 ExprResult 13496 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13497 ObjCDictionaryLiteral *E) { 13498 // Transform each of the elements. 13499 SmallVector<ObjCDictionaryElement, 8> Elements; 13500 bool ArgChanged = false; 13501 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13502 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13503 13504 if (OrigElement.isPackExpansion()) { 13505 // This key/value element is a pack expansion. 13506 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13507 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13508 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13509 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13510 13511 // Determine whether the set of unexpanded parameter packs can 13512 // and should be expanded. 13513 bool Expand = true; 13514 bool RetainExpansion = false; 13515 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13516 Optional<unsigned> NumExpansions = OrigNumExpansions; 13517 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13518 OrigElement.Value->getEndLoc()); 13519 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13520 PatternRange, Unexpanded, Expand, 13521 RetainExpansion, NumExpansions)) 13522 return ExprError(); 13523 13524 if (!Expand) { 13525 // The transform has determined that we should perform a simple 13526 // transformation on the pack expansion, producing another pack 13527 // expansion. 13528 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13529 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13530 if (Key.isInvalid()) 13531 return ExprError(); 13532 13533 if (Key.get() != OrigElement.Key) 13534 ArgChanged = true; 13535 13536 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13537 if (Value.isInvalid()) 13538 return ExprError(); 13539 13540 if (Value.get() != OrigElement.Value) 13541 ArgChanged = true; 13542 13543 ObjCDictionaryElement Expansion = { 13544 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13545 }; 13546 Elements.push_back(Expansion); 13547 continue; 13548 } 13549 13550 // Record right away that the argument was changed. This needs 13551 // to happen even if the array expands to nothing. 13552 ArgChanged = true; 13553 13554 // The transform has determined that we should perform an elementwise 13555 // expansion of the pattern. Do so. 13556 for (unsigned I = 0; I != *NumExpansions; ++I) { 13557 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13558 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13559 if (Key.isInvalid()) 13560 return ExprError(); 13561 13562 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13563 if (Value.isInvalid()) 13564 return ExprError(); 13565 13566 ObjCDictionaryElement Element = { 13567 Key.get(), Value.get(), SourceLocation(), NumExpansions 13568 }; 13569 13570 // If any unexpanded parameter packs remain, we still have a 13571 // pack expansion. 13572 // FIXME: Can this really happen? 13573 if (Key.get()->containsUnexpandedParameterPack() || 13574 Value.get()->containsUnexpandedParameterPack()) 13575 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13576 13577 Elements.push_back(Element); 13578 } 13579 13580 // FIXME: Retain a pack expansion if RetainExpansion is true. 13581 13582 // We've finished with this pack expansion. 13583 continue; 13584 } 13585 13586 // Transform and check key. 13587 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13588 if (Key.isInvalid()) 13589 return ExprError(); 13590 13591 if (Key.get() != OrigElement.Key) 13592 ArgChanged = true; 13593 13594 // Transform and check value. 13595 ExprResult Value 13596 = getDerived().TransformExpr(OrigElement.Value); 13597 if (Value.isInvalid()) 13598 return ExprError(); 13599 13600 if (Value.get() != OrigElement.Value) 13601 ArgChanged = true; 13602 13603 ObjCDictionaryElement Element = { 13604 Key.get(), Value.get(), SourceLocation(), None 13605 }; 13606 Elements.push_back(Element); 13607 } 13608 13609 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13610 return SemaRef.MaybeBindToTemporary(E); 13611 13612 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13613 Elements); 13614 } 13615 13616 template<typename Derived> 13617 ExprResult 13618 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13619 TypeSourceInfo *EncodedTypeInfo 13620 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13621 if (!EncodedTypeInfo) 13622 return ExprError(); 13623 13624 if (!getDerived().AlwaysRebuild() && 13625 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13626 return E; 13627 13628 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13629 EncodedTypeInfo, 13630 E->getRParenLoc()); 13631 } 13632 13633 template<typename Derived> 13634 ExprResult TreeTransform<Derived>:: 13635 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13636 // This is a kind of implicit conversion, and it needs to get dropped 13637 // and recomputed for the same general reasons that ImplicitCastExprs 13638 // do, as well a more specific one: this expression is only valid when 13639 // it appears *immediately* as an argument expression. 13640 return getDerived().TransformExpr(E->getSubExpr()); 13641 } 13642 13643 template<typename Derived> 13644 ExprResult TreeTransform<Derived>:: 13645 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13646 TypeSourceInfo *TSInfo 13647 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13648 if (!TSInfo) 13649 return ExprError(); 13650 13651 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13652 if (Result.isInvalid()) 13653 return ExprError(); 13654 13655 if (!getDerived().AlwaysRebuild() && 13656 TSInfo == E->getTypeInfoAsWritten() && 13657 Result.get() == E->getSubExpr()) 13658 return E; 13659 13660 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13661 E->getBridgeKeywordLoc(), TSInfo, 13662 Result.get()); 13663 } 13664 13665 template <typename Derived> 13666 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13667 ObjCAvailabilityCheckExpr *E) { 13668 return E; 13669 } 13670 13671 template<typename Derived> 13672 ExprResult 13673 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13674 // Transform arguments. 13675 bool ArgChanged = false; 13676 SmallVector<Expr*, 8> Args; 13677 Args.reserve(E->getNumArgs()); 13678 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13679 &ArgChanged)) 13680 return ExprError(); 13681 13682 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13683 // Class message: transform the receiver type. 13684 TypeSourceInfo *ReceiverTypeInfo 13685 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13686 if (!ReceiverTypeInfo) 13687 return ExprError(); 13688 13689 // If nothing changed, just retain the existing message send. 13690 if (!getDerived().AlwaysRebuild() && 13691 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13692 return SemaRef.MaybeBindToTemporary(E); 13693 13694 // Build a new class message send. 13695 SmallVector<SourceLocation, 16> SelLocs; 13696 E->getSelectorLocs(SelLocs); 13697 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13698 E->getSelector(), 13699 SelLocs, 13700 E->getMethodDecl(), 13701 E->getLeftLoc(), 13702 Args, 13703 E->getRightLoc()); 13704 } 13705 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13706 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13707 if (!E->getMethodDecl()) 13708 return ExprError(); 13709 13710 // Build a new class message send to 'super'. 13711 SmallVector<SourceLocation, 16> SelLocs; 13712 E->getSelectorLocs(SelLocs); 13713 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13714 E->getSelector(), 13715 SelLocs, 13716 E->getReceiverType(), 13717 E->getMethodDecl(), 13718 E->getLeftLoc(), 13719 Args, 13720 E->getRightLoc()); 13721 } 13722 13723 // Instance message: transform the receiver 13724 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13725 "Only class and instance messages may be instantiated"); 13726 ExprResult Receiver 13727 = getDerived().TransformExpr(E->getInstanceReceiver()); 13728 if (Receiver.isInvalid()) 13729 return ExprError(); 13730 13731 // If nothing changed, just retain the existing message send. 13732 if (!getDerived().AlwaysRebuild() && 13733 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13734 return SemaRef.MaybeBindToTemporary(E); 13735 13736 // Build a new instance message send. 13737 SmallVector<SourceLocation, 16> SelLocs; 13738 E->getSelectorLocs(SelLocs); 13739 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13740 E->getSelector(), 13741 SelLocs, 13742 E->getMethodDecl(), 13743 E->getLeftLoc(), 13744 Args, 13745 E->getRightLoc()); 13746 } 13747 13748 template<typename Derived> 13749 ExprResult 13750 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13751 return E; 13752 } 13753 13754 template<typename Derived> 13755 ExprResult 13756 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13757 return E; 13758 } 13759 13760 template<typename Derived> 13761 ExprResult 13762 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13763 // Transform the base expression. 13764 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13765 if (Base.isInvalid()) 13766 return ExprError(); 13767 13768 // We don't need to transform the ivar; it will never change. 13769 13770 // If nothing changed, just retain the existing expression. 13771 if (!getDerived().AlwaysRebuild() && 13772 Base.get() == E->getBase()) 13773 return E; 13774 13775 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13776 E->getLocation(), 13777 E->isArrow(), E->isFreeIvar()); 13778 } 13779 13780 template<typename Derived> 13781 ExprResult 13782 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13783 // 'super' and types never change. Property never changes. Just 13784 // retain the existing expression. 13785 if (!E->isObjectReceiver()) 13786 return E; 13787 13788 // Transform the base expression. 13789 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13790 if (Base.isInvalid()) 13791 return ExprError(); 13792 13793 // We don't need to transform the property; it will never change. 13794 13795 // If nothing changed, just retain the existing expression. 13796 if (!getDerived().AlwaysRebuild() && 13797 Base.get() == E->getBase()) 13798 return E; 13799 13800 if (E->isExplicitProperty()) 13801 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13802 E->getExplicitProperty(), 13803 E->getLocation()); 13804 13805 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13806 SemaRef.Context.PseudoObjectTy, 13807 E->getImplicitPropertyGetter(), 13808 E->getImplicitPropertySetter(), 13809 E->getLocation()); 13810 } 13811 13812 template<typename Derived> 13813 ExprResult 13814 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13815 // Transform the base expression. 13816 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13817 if (Base.isInvalid()) 13818 return ExprError(); 13819 13820 // Transform the key expression. 13821 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13822 if (Key.isInvalid()) 13823 return ExprError(); 13824 13825 // If nothing changed, just retain the existing expression. 13826 if (!getDerived().AlwaysRebuild() && 13827 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13828 return E; 13829 13830 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13831 Base.get(), Key.get(), 13832 E->getAtIndexMethodDecl(), 13833 E->setAtIndexMethodDecl()); 13834 } 13835 13836 template<typename Derived> 13837 ExprResult 13838 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13839 // Transform the base expression. 13840 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13841 if (Base.isInvalid()) 13842 return ExprError(); 13843 13844 // If nothing changed, just retain the existing expression. 13845 if (!getDerived().AlwaysRebuild() && 13846 Base.get() == E->getBase()) 13847 return E; 13848 13849 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13850 E->getOpLoc(), 13851 E->isArrow()); 13852 } 13853 13854 template<typename Derived> 13855 ExprResult 13856 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13857 bool ArgumentChanged = false; 13858 SmallVector<Expr*, 8> SubExprs; 13859 SubExprs.reserve(E->getNumSubExprs()); 13860 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13861 SubExprs, &ArgumentChanged)) 13862 return ExprError(); 13863 13864 if (!getDerived().AlwaysRebuild() && 13865 !ArgumentChanged) 13866 return E; 13867 13868 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13869 SubExprs, 13870 E->getRParenLoc()); 13871 } 13872 13873 template<typename Derived> 13874 ExprResult 13875 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13876 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13877 if (SrcExpr.isInvalid()) 13878 return ExprError(); 13879 13880 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13881 if (!Type) 13882 return ExprError(); 13883 13884 if (!getDerived().AlwaysRebuild() && 13885 Type == E->getTypeSourceInfo() && 13886 SrcExpr.get() == E->getSrcExpr()) 13887 return E; 13888 13889 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13890 SrcExpr.get(), Type, 13891 E->getRParenLoc()); 13892 } 13893 13894 template<typename Derived> 13895 ExprResult 13896 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13897 BlockDecl *oldBlock = E->getBlockDecl(); 13898 13899 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13900 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13901 13902 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13903 blockScope->TheDecl->setBlockMissingReturnType( 13904 oldBlock->blockMissingReturnType()); 13905 13906 SmallVector<ParmVarDecl*, 4> params; 13907 SmallVector<QualType, 4> paramTypes; 13908 13909 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13910 13911 // Parameter substitution. 13912 Sema::ExtParameterInfoBuilder extParamInfos; 13913 if (getDerived().TransformFunctionTypeParams( 13914 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13915 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13916 extParamInfos)) { 13917 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13918 return ExprError(); 13919 } 13920 13921 QualType exprResultType = 13922 getDerived().TransformType(exprFunctionType->getReturnType()); 13923 13924 auto epi = exprFunctionType->getExtProtoInfo(); 13925 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13926 13927 QualType functionType = 13928 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13929 blockScope->FunctionType = functionType; 13930 13931 // Set the parameters on the block decl. 13932 if (!params.empty()) 13933 blockScope->TheDecl->setParams(params); 13934 13935 if (!oldBlock->blockMissingReturnType()) { 13936 blockScope->HasImplicitReturnType = false; 13937 blockScope->ReturnType = exprResultType; 13938 } 13939 13940 // Transform the body 13941 StmtResult body = getDerived().TransformStmt(E->getBody()); 13942 if (body.isInvalid()) { 13943 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13944 return ExprError(); 13945 } 13946 13947 #ifndef NDEBUG 13948 // In builds with assertions, make sure that we captured everything we 13949 // captured before. 13950 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13951 for (const auto &I : oldBlock->captures()) { 13952 VarDecl *oldCapture = I.getVariable(); 13953 13954 // Ignore parameter packs. 13955 if (oldCapture->isParameterPack()) 13956 continue; 13957 13958 VarDecl *newCapture = 13959 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13960 oldCapture)); 13961 assert(blockScope->CaptureMap.count(newCapture)); 13962 } 13963 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13964 } 13965 #endif 13966 13967 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13968 /*Scope=*/nullptr); 13969 } 13970 13971 template<typename Derived> 13972 ExprResult 13973 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13974 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13975 if (SrcExpr.isInvalid()) 13976 return ExprError(); 13977 13978 QualType Type = getDerived().TransformType(E->getType()); 13979 13980 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 13981 E->getRParenLoc()); 13982 } 13983 13984 template<typename Derived> 13985 ExprResult 13986 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13987 bool ArgumentChanged = false; 13988 SmallVector<Expr*, 8> SubExprs; 13989 SubExprs.reserve(E->getNumSubExprs()); 13990 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13991 SubExprs, &ArgumentChanged)) 13992 return ExprError(); 13993 13994 if (!getDerived().AlwaysRebuild() && 13995 !ArgumentChanged) 13996 return E; 13997 13998 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13999 E->getOp(), E->getRParenLoc()); 14000 } 14001 14002 //===----------------------------------------------------------------------===// 14003 // Type reconstruction 14004 //===----------------------------------------------------------------------===// 14005 14006 template<typename Derived> 14007 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14008 SourceLocation Star) { 14009 return SemaRef.BuildPointerType(PointeeType, Star, 14010 getDerived().getBaseEntity()); 14011 } 14012 14013 template<typename Derived> 14014 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14015 SourceLocation Star) { 14016 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14017 getDerived().getBaseEntity()); 14018 } 14019 14020 template<typename Derived> 14021 QualType 14022 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14023 bool WrittenAsLValue, 14024 SourceLocation Sigil) { 14025 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14026 Sigil, getDerived().getBaseEntity()); 14027 } 14028 14029 template<typename Derived> 14030 QualType 14031 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14032 QualType ClassType, 14033 SourceLocation Sigil) { 14034 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14035 getDerived().getBaseEntity()); 14036 } 14037 14038 template<typename Derived> 14039 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14040 const ObjCTypeParamDecl *Decl, 14041 SourceLocation ProtocolLAngleLoc, 14042 ArrayRef<ObjCProtocolDecl *> Protocols, 14043 ArrayRef<SourceLocation> ProtocolLocs, 14044 SourceLocation ProtocolRAngleLoc) { 14045 return SemaRef.BuildObjCTypeParamType(Decl, 14046 ProtocolLAngleLoc, Protocols, 14047 ProtocolLocs, ProtocolRAngleLoc, 14048 /*FailOnError=*/true); 14049 } 14050 14051 template<typename Derived> 14052 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14053 QualType BaseType, 14054 SourceLocation Loc, 14055 SourceLocation TypeArgsLAngleLoc, 14056 ArrayRef<TypeSourceInfo *> TypeArgs, 14057 SourceLocation TypeArgsRAngleLoc, 14058 SourceLocation ProtocolLAngleLoc, 14059 ArrayRef<ObjCProtocolDecl *> Protocols, 14060 ArrayRef<SourceLocation> ProtocolLocs, 14061 SourceLocation ProtocolRAngleLoc) { 14062 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14063 TypeArgs, TypeArgsRAngleLoc, 14064 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14065 ProtocolRAngleLoc, 14066 /*FailOnError=*/true); 14067 } 14068 14069 template<typename Derived> 14070 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14071 QualType PointeeType, 14072 SourceLocation Star) { 14073 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14074 } 14075 14076 template<typename Derived> 14077 QualType 14078 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14079 ArrayType::ArraySizeModifier SizeMod, 14080 const llvm::APInt *Size, 14081 Expr *SizeExpr, 14082 unsigned IndexTypeQuals, 14083 SourceRange BracketsRange) { 14084 if (SizeExpr || !Size) 14085 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14086 IndexTypeQuals, BracketsRange, 14087 getDerived().getBaseEntity()); 14088 14089 QualType Types[] = { 14090 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14091 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14092 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14093 }; 14094 const unsigned NumTypes = llvm::array_lengthof(Types); 14095 QualType SizeType; 14096 for (unsigned I = 0; I != NumTypes; ++I) 14097 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14098 SizeType = Types[I]; 14099 break; 14100 } 14101 14102 // Note that we can return a VariableArrayType here in the case where 14103 // the element type was a dependent VariableArrayType. 14104 IntegerLiteral *ArraySize 14105 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14106 /*FIXME*/BracketsRange.getBegin()); 14107 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14108 IndexTypeQuals, BracketsRange, 14109 getDerived().getBaseEntity()); 14110 } 14111 14112 template<typename Derived> 14113 QualType 14114 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14115 ArrayType::ArraySizeModifier SizeMod, 14116 const llvm::APInt &Size, 14117 Expr *SizeExpr, 14118 unsigned IndexTypeQuals, 14119 SourceRange BracketsRange) { 14120 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14121 IndexTypeQuals, BracketsRange); 14122 } 14123 14124 template<typename Derived> 14125 QualType 14126 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14127 ArrayType::ArraySizeModifier SizeMod, 14128 unsigned IndexTypeQuals, 14129 SourceRange BracketsRange) { 14130 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14131 IndexTypeQuals, BracketsRange); 14132 } 14133 14134 template<typename Derived> 14135 QualType 14136 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14137 ArrayType::ArraySizeModifier SizeMod, 14138 Expr *SizeExpr, 14139 unsigned IndexTypeQuals, 14140 SourceRange BracketsRange) { 14141 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14142 SizeExpr, 14143 IndexTypeQuals, BracketsRange); 14144 } 14145 14146 template<typename Derived> 14147 QualType 14148 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14149 ArrayType::ArraySizeModifier SizeMod, 14150 Expr *SizeExpr, 14151 unsigned IndexTypeQuals, 14152 SourceRange BracketsRange) { 14153 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14154 SizeExpr, 14155 IndexTypeQuals, BracketsRange); 14156 } 14157 14158 template <typename Derived> 14159 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14160 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14161 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14162 AttributeLoc); 14163 } 14164 14165 template <typename Derived> 14166 QualType 14167 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14168 unsigned NumElements, 14169 VectorType::VectorKind VecKind) { 14170 // FIXME: semantic checking! 14171 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14172 } 14173 14174 template <typename Derived> 14175 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14176 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14177 VectorType::VectorKind VecKind) { 14178 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14179 } 14180 14181 template<typename Derived> 14182 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14183 unsigned NumElements, 14184 SourceLocation AttributeLoc) { 14185 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14186 NumElements, true); 14187 IntegerLiteral *VectorSize 14188 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14189 AttributeLoc); 14190 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14191 } 14192 14193 template<typename Derived> 14194 QualType 14195 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14196 Expr *SizeExpr, 14197 SourceLocation AttributeLoc) { 14198 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14199 } 14200 14201 template <typename Derived> 14202 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14203 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14204 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14205 NumColumns); 14206 } 14207 14208 template <typename Derived> 14209 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14210 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14211 SourceLocation AttributeLoc) { 14212 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14213 AttributeLoc); 14214 } 14215 14216 template<typename Derived> 14217 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14218 QualType T, 14219 MutableArrayRef<QualType> ParamTypes, 14220 const FunctionProtoType::ExtProtoInfo &EPI) { 14221 return SemaRef.BuildFunctionType(T, ParamTypes, 14222 getDerived().getBaseLocation(), 14223 getDerived().getBaseEntity(), 14224 EPI); 14225 } 14226 14227 template<typename Derived> 14228 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14229 return SemaRef.Context.getFunctionNoProtoType(T); 14230 } 14231 14232 template<typename Derived> 14233 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14234 Decl *D) { 14235 assert(D && "no decl found"); 14236 if (D->isInvalidDecl()) return QualType(); 14237 14238 // FIXME: Doesn't account for ObjCInterfaceDecl! 14239 TypeDecl *Ty; 14240 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14241 // A valid resolved using typename pack expansion decl can have multiple 14242 // UsingDecls, but they must each have exactly one type, and it must be 14243 // the same type in every case. But we must have at least one expansion! 14244 if (UPD->expansions().empty()) { 14245 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14246 << UPD->isCXXClassMember() << UPD; 14247 return QualType(); 14248 } 14249 14250 // We might still have some unresolved types. Try to pick a resolved type 14251 // if we can. The final instantiation will check that the remaining 14252 // unresolved types instantiate to the type we pick. 14253 QualType FallbackT; 14254 QualType T; 14255 for (auto *E : UPD->expansions()) { 14256 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14257 if (ThisT.isNull()) 14258 continue; 14259 else if (ThisT->getAs<UnresolvedUsingType>()) 14260 FallbackT = ThisT; 14261 else if (T.isNull()) 14262 T = ThisT; 14263 else 14264 assert(getSema().Context.hasSameType(ThisT, T) && 14265 "mismatched resolved types in using pack expansion"); 14266 } 14267 return T.isNull() ? FallbackT : T; 14268 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14269 assert(Using->hasTypename() && 14270 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14271 14272 // A valid resolved using typename decl points to exactly one type decl. 14273 assert(++Using->shadow_begin() == Using->shadow_end()); 14274 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 14275 } else { 14276 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14277 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14278 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14279 } 14280 14281 return SemaRef.Context.getTypeDeclType(Ty); 14282 } 14283 14284 template<typename Derived> 14285 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14286 SourceLocation Loc) { 14287 return SemaRef.BuildTypeofExprType(E, Loc); 14288 } 14289 14290 template<typename Derived> 14291 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14292 return SemaRef.Context.getTypeOfType(Underlying); 14293 } 14294 14295 template<typename Derived> 14296 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14297 SourceLocation Loc) { 14298 return SemaRef.BuildDecltypeType(E, Loc); 14299 } 14300 14301 template<typename Derived> 14302 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14303 UnaryTransformType::UTTKind UKind, 14304 SourceLocation Loc) { 14305 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14306 } 14307 14308 template<typename Derived> 14309 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14310 TemplateName Template, 14311 SourceLocation TemplateNameLoc, 14312 TemplateArgumentListInfo &TemplateArgs) { 14313 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14314 } 14315 14316 template<typename Derived> 14317 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14318 SourceLocation KWLoc) { 14319 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14320 } 14321 14322 template<typename Derived> 14323 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14324 SourceLocation KWLoc, 14325 bool isReadPipe) { 14326 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14327 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14328 } 14329 14330 template <typename Derived> 14331 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14332 unsigned NumBits, 14333 SourceLocation Loc) { 14334 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14335 NumBits, true); 14336 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14337 SemaRef.Context.IntTy, Loc); 14338 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14339 } 14340 14341 template <typename Derived> 14342 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14343 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14344 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14345 } 14346 14347 template<typename Derived> 14348 TemplateName 14349 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14350 bool TemplateKW, 14351 TemplateDecl *Template) { 14352 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14353 Template); 14354 } 14355 14356 template<typename Derived> 14357 TemplateName 14358 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14359 SourceLocation TemplateKWLoc, 14360 const IdentifierInfo &Name, 14361 SourceLocation NameLoc, 14362 QualType ObjectType, 14363 NamedDecl *FirstQualifierInScope, 14364 bool AllowInjectedClassName) { 14365 UnqualifiedId TemplateName; 14366 TemplateName.setIdentifier(&Name, NameLoc); 14367 Sema::TemplateTy Template; 14368 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14369 TemplateName, ParsedType::make(ObjectType), 14370 /*EnteringContext=*/false, Template, 14371 AllowInjectedClassName); 14372 return Template.get(); 14373 } 14374 14375 template<typename Derived> 14376 TemplateName 14377 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14378 SourceLocation TemplateKWLoc, 14379 OverloadedOperatorKind Operator, 14380 SourceLocation NameLoc, 14381 QualType ObjectType, 14382 bool AllowInjectedClassName) { 14383 UnqualifiedId Name; 14384 // FIXME: Bogus location information. 14385 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14386 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14387 Sema::TemplateTy Template; 14388 getSema().ActOnTemplateName( 14389 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14390 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14391 return Template.get(); 14392 } 14393 14394 template<typename Derived> 14395 ExprResult 14396 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14397 SourceLocation OpLoc, 14398 Expr *OrigCallee, 14399 Expr *First, 14400 Expr *Second) { 14401 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14402 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14403 14404 if (First->getObjectKind() == OK_ObjCProperty) { 14405 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14406 if (BinaryOperator::isAssignmentOp(Opc)) 14407 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14408 First, Second); 14409 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14410 if (Result.isInvalid()) 14411 return ExprError(); 14412 First = Result.get(); 14413 } 14414 14415 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14416 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14417 if (Result.isInvalid()) 14418 return ExprError(); 14419 Second = Result.get(); 14420 } 14421 14422 // Determine whether this should be a builtin operation. 14423 if (Op == OO_Subscript) { 14424 if (!First->getType()->isOverloadableType() && 14425 !Second->getType()->isOverloadableType()) 14426 return getSema().CreateBuiltinArraySubscriptExpr( 14427 First, Callee->getBeginLoc(), Second, OpLoc); 14428 } else if (Op == OO_Arrow) { 14429 // -> is never a builtin operation. 14430 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14431 } else if (Second == nullptr || isPostIncDec) { 14432 if (!First->getType()->isOverloadableType() || 14433 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14434 // The argument is not of overloadable type, or this is an expression 14435 // of the form &Class::member, so try to create a built-in unary 14436 // operation. 14437 UnaryOperatorKind Opc 14438 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14439 14440 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14441 } 14442 } else { 14443 if (!First->getType()->isOverloadableType() && 14444 !Second->getType()->isOverloadableType()) { 14445 // Neither of the arguments is an overloadable type, so try to 14446 // create a built-in binary operation. 14447 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14448 ExprResult Result 14449 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14450 if (Result.isInvalid()) 14451 return ExprError(); 14452 14453 return Result; 14454 } 14455 } 14456 14457 // Compute the transformed set of functions (and function templates) to be 14458 // used during overload resolution. 14459 UnresolvedSet<16> Functions; 14460 bool RequiresADL; 14461 14462 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14463 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14464 // If the overload could not be resolved in the template definition 14465 // (because we had a dependent argument), ADL is performed as part of 14466 // template instantiation. 14467 RequiresADL = ULE->requiresADL(); 14468 } else { 14469 // If we've resolved this to a particular non-member function, just call 14470 // that function. If we resolved it to a member function, 14471 // CreateOverloaded* will find that function for us. 14472 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14473 if (!isa<CXXMethodDecl>(ND)) 14474 Functions.addDecl(ND); 14475 RequiresADL = false; 14476 } 14477 14478 // Add any functions found via argument-dependent lookup. 14479 Expr *Args[2] = { First, Second }; 14480 unsigned NumArgs = 1 + (Second != nullptr); 14481 14482 // Create the overloaded operator invocation for unary operators. 14483 if (NumArgs == 1 || isPostIncDec) { 14484 UnaryOperatorKind Opc 14485 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14486 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14487 RequiresADL); 14488 } 14489 14490 if (Op == OO_Subscript) { 14491 SourceLocation LBrace; 14492 SourceLocation RBrace; 14493 14494 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14495 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14496 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14497 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14498 } else { 14499 LBrace = Callee->getBeginLoc(); 14500 RBrace = OpLoc; 14501 } 14502 14503 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14504 First, Second); 14505 } 14506 14507 // Create the overloaded operator invocation for binary operators. 14508 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14509 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14510 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14511 if (Result.isInvalid()) 14512 return ExprError(); 14513 14514 return Result; 14515 } 14516 14517 template<typename Derived> 14518 ExprResult 14519 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14520 SourceLocation OperatorLoc, 14521 bool isArrow, 14522 CXXScopeSpec &SS, 14523 TypeSourceInfo *ScopeType, 14524 SourceLocation CCLoc, 14525 SourceLocation TildeLoc, 14526 PseudoDestructorTypeStorage Destroyed) { 14527 QualType BaseType = Base->getType(); 14528 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14529 (!isArrow && !BaseType->getAs<RecordType>()) || 14530 (isArrow && BaseType->getAs<PointerType>() && 14531 !BaseType->castAs<PointerType>()->getPointeeType() 14532 ->template getAs<RecordType>())){ 14533 // This pseudo-destructor expression is still a pseudo-destructor. 14534 return SemaRef.BuildPseudoDestructorExpr( 14535 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14536 CCLoc, TildeLoc, Destroyed); 14537 } 14538 14539 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14540 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14541 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14542 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14543 NameInfo.setNamedTypeInfo(DestroyedType); 14544 14545 // The scope type is now known to be a valid nested name specifier 14546 // component. Tack it on to the end of the nested name specifier. 14547 if (ScopeType) { 14548 if (!ScopeType->getType()->getAs<TagType>()) { 14549 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14550 diag::err_expected_class_or_namespace) 14551 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14552 return ExprError(); 14553 } 14554 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14555 CCLoc); 14556 } 14557 14558 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14559 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14560 OperatorLoc, isArrow, 14561 SS, TemplateKWLoc, 14562 /*FIXME: FirstQualifier*/ nullptr, 14563 NameInfo, 14564 /*TemplateArgs*/ nullptr, 14565 /*S*/nullptr); 14566 } 14567 14568 template<typename Derived> 14569 StmtResult 14570 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14571 SourceLocation Loc = S->getBeginLoc(); 14572 CapturedDecl *CD = S->getCapturedDecl(); 14573 unsigned NumParams = CD->getNumParams(); 14574 unsigned ContextParamPos = CD->getContextParamPosition(); 14575 SmallVector<Sema::CapturedParamNameType, 4> Params; 14576 for (unsigned I = 0; I < NumParams; ++I) { 14577 if (I != ContextParamPos) { 14578 Params.push_back( 14579 std::make_pair( 14580 CD->getParam(I)->getName(), 14581 getDerived().TransformType(CD->getParam(I)->getType()))); 14582 } else { 14583 Params.push_back(std::make_pair(StringRef(), QualType())); 14584 } 14585 } 14586 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14587 S->getCapturedRegionKind(), Params); 14588 StmtResult Body; 14589 { 14590 Sema::CompoundScopeRAII CompoundScope(getSema()); 14591 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14592 } 14593 14594 if (Body.isInvalid()) { 14595 getSema().ActOnCapturedRegionError(); 14596 return StmtError(); 14597 } 14598 14599 return getSema().ActOnCapturedRegionEnd(Body.get()); 14600 } 14601 14602 } // end namespace clang 14603 14604 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14605