1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 17 #include "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprConcepts.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/OpenMPClause.h" 27 #include "clang/AST/Stmt.h" 28 #include "clang/AST/StmtCXX.h" 29 #include "clang/AST/StmtObjC.h" 30 #include "clang/AST/StmtOpenMP.h" 31 #include "clang/Basic/OpenMPKinds.h" 32 #include "clang/Sema/Designator.h" 33 #include "clang/Sema/Lookup.h" 34 #include "clang/Sema/Ownership.h" 35 #include "clang/Sema/ParsedTemplate.h" 36 #include "clang/Sema/ScopeInfo.h" 37 #include "clang/Sema/SemaDiagnostic.h" 38 #include "clang/Sema/SemaInternal.h" 39 #include "llvm/ADT/ArrayRef.h" 40 #include "llvm/Support/ErrorHandling.h" 41 #include <algorithm> 42 43 using namespace llvm::omp; 44 45 namespace clang { 46 using namespace sema; 47 48 /// A semantic tree transformation that allows one to transform one 49 /// abstract syntax tree into another. 50 /// 51 /// A new tree transformation is defined by creating a new subclass \c X of 52 /// \c TreeTransform<X> and then overriding certain operations to provide 53 /// behavior specific to that transformation. For example, template 54 /// instantiation is implemented as a tree transformation where the 55 /// transformation of TemplateTypeParmType nodes involves substituting the 56 /// template arguments for their corresponding template parameters; a similar 57 /// transformation is performed for non-type template parameters and 58 /// template template parameters. 59 /// 60 /// This tree-transformation template uses static polymorphism to allow 61 /// subclasses to customize any of its operations. Thus, a subclass can 62 /// override any of the transformation or rebuild operators by providing an 63 /// operation with the same signature as the default implementation. The 64 /// overriding function should not be virtual. 65 /// 66 /// Semantic tree transformations are split into two stages, either of which 67 /// can be replaced by a subclass. The "transform" step transforms an AST node 68 /// or the parts of an AST node using the various transformation functions, 69 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 70 /// node of the appropriate kind from the pieces. The default transformation 71 /// routines recursively transform the operands to composite AST nodes (e.g., 72 /// the pointee type of a PointerType node) and, if any of those operand nodes 73 /// were changed by the transformation, invokes the rebuild operation to create 74 /// a new AST node. 75 /// 76 /// Subclasses can customize the transformation at various levels. The 77 /// most coarse-grained transformations involve replacing TransformType(), 78 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 79 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 80 /// new implementations. 81 /// 82 /// For more fine-grained transformations, subclasses can replace any of the 83 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 84 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 85 /// replacing TransformTemplateTypeParmType() allows template instantiation 86 /// to substitute template arguments for their corresponding template 87 /// parameters. Additionally, subclasses can override the \c RebuildXXX 88 /// functions to control how AST nodes are rebuilt when their operands change. 89 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 90 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 91 /// be able to use more efficient rebuild steps. 92 /// 93 /// There are a handful of other functions that can be overridden, allowing one 94 /// to avoid traversing nodes that don't need any transformation 95 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 96 /// operands have not changed (\c AlwaysRebuild()), and customize the 97 /// default locations and entity names used for type-checking 98 /// (\c getBaseLocation(), \c getBaseEntity()). 99 template<typename Derived> 100 class TreeTransform { 101 /// Private RAII object that helps us forget and then re-remember 102 /// the template argument corresponding to a partially-substituted parameter 103 /// pack. 104 class ForgetPartiallySubstitutedPackRAII { 105 Derived &Self; 106 TemplateArgument Old; 107 108 public: 109 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 110 Old = Self.ForgetPartiallySubstitutedPack(); 111 } 112 113 ~ForgetPartiallySubstitutedPackRAII() { 114 Self.RememberPartiallySubstitutedPack(Old); 115 } 116 }; 117 118 protected: 119 Sema &SemaRef; 120 121 /// The set of local declarations that have been transformed, for 122 /// cases where we are forced to build new declarations within the transformer 123 /// rather than in the subclass (e.g., lambda closure types). 124 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 125 126 public: 127 /// Initializes a new tree transformer. 128 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 129 130 /// Retrieves a reference to the derived class. 131 Derived &getDerived() { return static_cast<Derived&>(*this); } 132 133 /// Retrieves a reference to the derived class. 134 const Derived &getDerived() const { 135 return static_cast<const Derived&>(*this); 136 } 137 138 static inline ExprResult Owned(Expr *E) { return E; } 139 static inline StmtResult Owned(Stmt *S) { return S; } 140 141 /// Retrieves a reference to the semantic analysis object used for 142 /// this tree transform. 143 Sema &getSema() const { return SemaRef; } 144 145 /// Whether the transformation should always rebuild AST nodes, even 146 /// if none of the children have changed. 147 /// 148 /// Subclasses may override this function to specify when the transformation 149 /// should rebuild all AST nodes. 150 /// 151 /// We must always rebuild all AST nodes when performing variadic template 152 /// pack expansion, in order to avoid violating the AST invariant that each 153 /// statement node appears at most once in its containing declaration. 154 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 155 156 /// Whether the transformation is forming an expression or statement that 157 /// replaces the original. In this case, we'll reuse mangling numbers from 158 /// existing lambdas. 159 bool ReplacingOriginal() { return false; } 160 161 /// Wether CXXConstructExpr can be skipped when they are implicit. 162 /// They will be reconstructed when used if needed. 163 /// This is usefull when the user that cause rebuilding of the 164 /// CXXConstructExpr is outside of the expression at which the TreeTransform 165 /// started. 166 bool AllowSkippingCXXConstructExpr() { return true; } 167 168 /// Returns the location of the entity being transformed, if that 169 /// information was not available elsewhere in the AST. 170 /// 171 /// By default, returns no source-location information. Subclasses can 172 /// provide an alternative implementation that provides better location 173 /// information. 174 SourceLocation getBaseLocation() { return SourceLocation(); } 175 176 /// Returns the name of the entity being transformed, if that 177 /// information was not available elsewhere in the AST. 178 /// 179 /// By default, returns an empty name. Subclasses can provide an alternative 180 /// implementation with a more precise name. 181 DeclarationName getBaseEntity() { return DeclarationName(); } 182 183 /// Sets the "base" location and entity when that 184 /// information is known based on another transformation. 185 /// 186 /// By default, the source location and entity are ignored. Subclasses can 187 /// override this function to provide a customized implementation. 188 void setBase(SourceLocation Loc, DeclarationName Entity) { } 189 190 /// RAII object that temporarily sets the base location and entity 191 /// used for reporting diagnostics in types. 192 class TemporaryBase { 193 TreeTransform &Self; 194 SourceLocation OldLocation; 195 DeclarationName OldEntity; 196 197 public: 198 TemporaryBase(TreeTransform &Self, SourceLocation Location, 199 DeclarationName Entity) : Self(Self) { 200 OldLocation = Self.getDerived().getBaseLocation(); 201 OldEntity = Self.getDerived().getBaseEntity(); 202 203 if (Location.isValid()) 204 Self.getDerived().setBase(Location, Entity); 205 } 206 207 ~TemporaryBase() { 208 Self.getDerived().setBase(OldLocation, OldEntity); 209 } 210 }; 211 212 /// Determine whether the given type \p T has already been 213 /// transformed. 214 /// 215 /// Subclasses can provide an alternative implementation of this routine 216 /// to short-circuit evaluation when it is known that a given type will 217 /// not change. For example, template instantiation need not traverse 218 /// non-dependent types. 219 bool AlreadyTransformed(QualType T) { 220 return T.isNull(); 221 } 222 223 /// Transform a template parameter depth level. 224 /// 225 /// During a transformation that transforms template parameters, this maps 226 /// an old template parameter depth to a new depth. 227 unsigned TransformTemplateDepth(unsigned Depth) { 228 return Depth; 229 } 230 231 /// Determine whether the given call argument should be dropped, e.g., 232 /// because it is a default argument. 233 /// 234 /// Subclasses can provide an alternative implementation of this routine to 235 /// determine which kinds of call arguments get dropped. By default, 236 /// CXXDefaultArgument nodes are dropped (prior to transformation). 237 bool DropCallArgument(Expr *E) { 238 return E->isDefaultArgument(); 239 } 240 241 /// Determine whether we should expand a pack expansion with the 242 /// given set of parameter packs into separate arguments by repeatedly 243 /// transforming the pattern. 244 /// 245 /// By default, the transformer never tries to expand pack expansions. 246 /// Subclasses can override this routine to provide different behavior. 247 /// 248 /// \param EllipsisLoc The location of the ellipsis that identifies the 249 /// pack expansion. 250 /// 251 /// \param PatternRange The source range that covers the entire pattern of 252 /// the pack expansion. 253 /// 254 /// \param Unexpanded The set of unexpanded parameter packs within the 255 /// pattern. 256 /// 257 /// \param ShouldExpand Will be set to \c true if the transformer should 258 /// expand the corresponding pack expansions into separate arguments. When 259 /// set, \c NumExpansions must also be set. 260 /// 261 /// \param RetainExpansion Whether the caller should add an unexpanded 262 /// pack expansion after all of the expanded arguments. This is used 263 /// when extending explicitly-specified template argument packs per 264 /// C++0x [temp.arg.explicit]p9. 265 /// 266 /// \param NumExpansions The number of separate arguments that will be in 267 /// the expanded form of the corresponding pack expansion. This is both an 268 /// input and an output parameter, which can be set by the caller if the 269 /// number of expansions is known a priori (e.g., due to a prior substitution) 270 /// and will be set by the callee when the number of expansions is known. 271 /// The callee must set this value when \c ShouldExpand is \c true; it may 272 /// set this value in other cases. 273 /// 274 /// \returns true if an error occurred (e.g., because the parameter packs 275 /// are to be instantiated with arguments of different lengths), false 276 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 277 /// must be set. 278 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 279 SourceRange PatternRange, 280 ArrayRef<UnexpandedParameterPack> Unexpanded, 281 bool &ShouldExpand, 282 bool &RetainExpansion, 283 Optional<unsigned> &NumExpansions) { 284 ShouldExpand = false; 285 return false; 286 } 287 288 /// "Forget" about the partially-substituted pack template argument, 289 /// when performing an instantiation that must preserve the parameter pack 290 /// use. 291 /// 292 /// This routine is meant to be overridden by the template instantiator. 293 TemplateArgument ForgetPartiallySubstitutedPack() { 294 return TemplateArgument(); 295 } 296 297 /// "Remember" the partially-substituted pack template argument 298 /// after performing an instantiation that must preserve the parameter pack 299 /// use. 300 /// 301 /// This routine is meant to be overridden by the template instantiator. 302 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 303 304 /// Note to the derived class when a function parameter pack is 305 /// being expanded. 306 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 307 308 /// Transforms the given type into another type. 309 /// 310 /// By default, this routine transforms a type by creating a 311 /// TypeSourceInfo for it and delegating to the appropriate 312 /// function. This is expensive, but we don't mind, because 313 /// this method is deprecated anyway; all users should be 314 /// switched to storing TypeSourceInfos. 315 /// 316 /// \returns the transformed type. 317 QualType TransformType(QualType T); 318 319 /// Transforms the given type-with-location into a new 320 /// type-with-location. 321 /// 322 /// By default, this routine transforms a type by delegating to the 323 /// appropriate TransformXXXType to build a new type. Subclasses 324 /// may override this function (to take over all type 325 /// transformations) or some set of the TransformXXXType functions 326 /// to alter the transformation. 327 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 328 329 /// Transform the given type-with-location into a new 330 /// type, collecting location information in the given builder 331 /// as necessary. 332 /// 333 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 334 335 /// Transform a type that is permitted to produce a 336 /// DeducedTemplateSpecializationType. 337 /// 338 /// This is used in the (relatively rare) contexts where it is acceptable 339 /// for transformation to produce a class template type with deduced 340 /// template arguments. 341 /// @{ 342 QualType TransformTypeWithDeducedTST(QualType T); 343 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 344 /// @} 345 346 /// The reason why the value of a statement is not discarded, if any. 347 enum StmtDiscardKind { 348 SDK_Discarded, 349 SDK_NotDiscarded, 350 SDK_StmtExprResult, 351 }; 352 353 /// Transform the given statement. 354 /// 355 /// By default, this routine transforms a statement by delegating to the 356 /// appropriate TransformXXXStmt function to transform a specific kind of 357 /// statement or the TransformExpr() function to transform an expression. 358 /// Subclasses may override this function to transform statements using some 359 /// other mechanism. 360 /// 361 /// \returns the transformed statement. 362 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 363 364 /// Transform the given statement. 365 /// 366 /// By default, this routine transforms a statement by delegating to the 367 /// appropriate TransformOMPXXXClause function to transform a specific kind 368 /// of clause. Subclasses may override this function to transform statements 369 /// using some other mechanism. 370 /// 371 /// \returns the transformed OpenMP clause. 372 OMPClause *TransformOMPClause(OMPClause *S); 373 374 /// Transform the given attribute. 375 /// 376 /// By default, this routine transforms a statement by delegating to the 377 /// appropriate TransformXXXAttr function to transform a specific kind 378 /// of attribute. Subclasses may override this function to transform 379 /// attributed statements using some other mechanism. 380 /// 381 /// \returns the transformed attribute 382 const Attr *TransformAttr(const Attr *S); 383 384 /// Transform the specified attribute. 385 /// 386 /// Subclasses should override the transformation of attributes with a pragma 387 /// spelling to transform expressions stored within the attribute. 388 /// 389 /// \returns the transformed attribute. 390 #define ATTR(X) 391 #define PRAGMA_SPELLING_ATTR(X) \ 392 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 393 #include "clang/Basic/AttrList.inc" 394 395 /// Transform the given expression. 396 /// 397 /// By default, this routine transforms an expression by delegating to the 398 /// appropriate TransformXXXExpr function to build a new expression. 399 /// Subclasses may override this function to transform expressions using some 400 /// other mechanism. 401 /// 402 /// \returns the transformed expression. 403 ExprResult TransformExpr(Expr *E); 404 405 /// Transform the given initializer. 406 /// 407 /// By default, this routine transforms an initializer by stripping off the 408 /// semantic nodes added by initialization, then passing the result to 409 /// TransformExpr or TransformExprs. 410 /// 411 /// \returns the transformed initializer. 412 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 413 414 /// Transform the given list of expressions. 415 /// 416 /// This routine transforms a list of expressions by invoking 417 /// \c TransformExpr() for each subexpression. However, it also provides 418 /// support for variadic templates by expanding any pack expansions (if the 419 /// derived class permits such expansion) along the way. When pack expansions 420 /// are present, the number of outputs may not equal the number of inputs. 421 /// 422 /// \param Inputs The set of expressions to be transformed. 423 /// 424 /// \param NumInputs The number of expressions in \c Inputs. 425 /// 426 /// \param IsCall If \c true, then this transform is being performed on 427 /// function-call arguments, and any arguments that should be dropped, will 428 /// be. 429 /// 430 /// \param Outputs The transformed input expressions will be added to this 431 /// vector. 432 /// 433 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 434 /// due to transformation. 435 /// 436 /// \returns true if an error occurred, false otherwise. 437 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 438 SmallVectorImpl<Expr *> &Outputs, 439 bool *ArgChanged = nullptr); 440 441 /// Transform the given declaration, which is referenced from a type 442 /// or expression. 443 /// 444 /// By default, acts as the identity function on declarations, unless the 445 /// transformer has had to transform the declaration itself. Subclasses 446 /// may override this function to provide alternate behavior. 447 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 448 llvm::DenseMap<Decl *, Decl *>::iterator Known 449 = TransformedLocalDecls.find(D); 450 if (Known != TransformedLocalDecls.end()) 451 return Known->second; 452 453 return D; 454 } 455 456 /// Transform the specified condition. 457 /// 458 /// By default, this transforms the variable and expression and rebuilds 459 /// the condition. 460 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 461 Expr *Expr, 462 Sema::ConditionKind Kind); 463 464 /// Transform the attributes associated with the given declaration and 465 /// place them on the new declaration. 466 /// 467 /// By default, this operation does nothing. Subclasses may override this 468 /// behavior to transform attributes. 469 void transformAttrs(Decl *Old, Decl *New) { } 470 471 /// Note that a local declaration has been transformed by this 472 /// transformer. 473 /// 474 /// Local declarations are typically transformed via a call to 475 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 476 /// the transformer itself has to transform the declarations. This routine 477 /// can be overridden by a subclass that keeps track of such mappings. 478 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 479 assert(New.size() == 1 && 480 "must override transformedLocalDecl if performing pack expansion"); 481 TransformedLocalDecls[Old] = New.front(); 482 } 483 484 /// Transform the definition of the given declaration. 485 /// 486 /// By default, invokes TransformDecl() to transform the declaration. 487 /// Subclasses may override this function to provide alternate behavior. 488 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 489 return getDerived().TransformDecl(Loc, D); 490 } 491 492 /// Transform the given declaration, which was the first part of a 493 /// nested-name-specifier in a member access expression. 494 /// 495 /// This specific declaration transformation only applies to the first 496 /// identifier in a nested-name-specifier of a member access expression, e.g., 497 /// the \c T in \c x->T::member 498 /// 499 /// By default, invokes TransformDecl() to transform the declaration. 500 /// Subclasses may override this function to provide alternate behavior. 501 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 502 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 503 } 504 505 /// Transform the set of declarations in an OverloadExpr. 506 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 507 LookupResult &R); 508 509 /// Transform the given nested-name-specifier with source-location 510 /// information. 511 /// 512 /// By default, transforms all of the types and declarations within the 513 /// nested-name-specifier. Subclasses may override this function to provide 514 /// alternate behavior. 515 NestedNameSpecifierLoc 516 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 517 QualType ObjectType = QualType(), 518 NamedDecl *FirstQualifierInScope = nullptr); 519 520 /// Transform the given declaration name. 521 /// 522 /// By default, transforms the types of conversion function, constructor, 523 /// and destructor names and then (if needed) rebuilds the declaration name. 524 /// Identifiers and selectors are returned unmodified. Sublcasses may 525 /// override this function to provide alternate behavior. 526 DeclarationNameInfo 527 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 528 529 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 530 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 531 concepts::TypeRequirement * 532 TransformTypeRequirement(concepts::TypeRequirement *Req); 533 concepts::ExprRequirement * 534 TransformExprRequirement(concepts::ExprRequirement *Req); 535 concepts::NestedRequirement * 536 TransformNestedRequirement(concepts::NestedRequirement *Req); 537 538 /// Transform the given template name. 539 /// 540 /// \param SS The nested-name-specifier that qualifies the template 541 /// name. This nested-name-specifier must already have been transformed. 542 /// 543 /// \param Name The template name to transform. 544 /// 545 /// \param NameLoc The source location of the template name. 546 /// 547 /// \param ObjectType If we're translating a template name within a member 548 /// access expression, this is the type of the object whose member template 549 /// is being referenced. 550 /// 551 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 552 /// also refers to a name within the current (lexical) scope, this is the 553 /// declaration it refers to. 554 /// 555 /// By default, transforms the template name by transforming the declarations 556 /// and nested-name-specifiers that occur within the template name. 557 /// Subclasses may override this function to provide alternate behavior. 558 TemplateName 559 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 560 SourceLocation NameLoc, 561 QualType ObjectType = QualType(), 562 NamedDecl *FirstQualifierInScope = nullptr, 563 bool AllowInjectedClassName = false); 564 565 /// Transform the given template argument. 566 /// 567 /// By default, this operation transforms the type, expression, or 568 /// declaration stored within the template argument and constructs a 569 /// new template argument from the transformed result. Subclasses may 570 /// override this function to provide alternate behavior. 571 /// 572 /// Returns true if there was an error. 573 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 574 TemplateArgumentLoc &Output, 575 bool Uneval = false); 576 577 /// Transform the given set of template arguments. 578 /// 579 /// By default, this operation transforms all of the template arguments 580 /// in the input set using \c TransformTemplateArgument(), and appends 581 /// the transformed arguments to the output list. 582 /// 583 /// Note that this overload of \c TransformTemplateArguments() is merely 584 /// a convenience function. Subclasses that wish to override this behavior 585 /// should override the iterator-based member template version. 586 /// 587 /// \param Inputs The set of template arguments to be transformed. 588 /// 589 /// \param NumInputs The number of template arguments in \p Inputs. 590 /// 591 /// \param Outputs The set of transformed template arguments output by this 592 /// routine. 593 /// 594 /// Returns true if an error occurred. 595 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 596 unsigned NumInputs, 597 TemplateArgumentListInfo &Outputs, 598 bool Uneval = false) { 599 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 600 Uneval); 601 } 602 603 /// Transform the given set of template arguments. 604 /// 605 /// By default, this operation transforms all of the template arguments 606 /// in the input set using \c TransformTemplateArgument(), and appends 607 /// the transformed arguments to the output list. 608 /// 609 /// \param First An iterator to the first template argument. 610 /// 611 /// \param Last An iterator one step past the last template argument. 612 /// 613 /// \param Outputs The set of transformed template arguments output by this 614 /// routine. 615 /// 616 /// Returns true if an error occurred. 617 template<typename InputIterator> 618 bool TransformTemplateArguments(InputIterator First, 619 InputIterator Last, 620 TemplateArgumentListInfo &Outputs, 621 bool Uneval = false); 622 623 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 624 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 625 TemplateArgumentLoc &ArgLoc); 626 627 /// Fakes up a TypeSourceInfo for a type. 628 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 629 return SemaRef.Context.getTrivialTypeSourceInfo(T, 630 getDerived().getBaseLocation()); 631 } 632 633 #define ABSTRACT_TYPELOC(CLASS, PARENT) 634 #define TYPELOC(CLASS, PARENT) \ 635 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 636 #include "clang/AST/TypeLocNodes.def" 637 638 template<typename Fn> 639 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 640 FunctionProtoTypeLoc TL, 641 CXXRecordDecl *ThisContext, 642 Qualifiers ThisTypeQuals, 643 Fn TransformExceptionSpec); 644 645 bool TransformExceptionSpec(SourceLocation Loc, 646 FunctionProtoType::ExceptionSpecInfo &ESI, 647 SmallVectorImpl<QualType> &Exceptions, 648 bool &Changed); 649 650 StmtResult TransformSEHHandler(Stmt *Handler); 651 652 QualType 653 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 654 TemplateSpecializationTypeLoc TL, 655 TemplateName Template); 656 657 QualType 658 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 659 DependentTemplateSpecializationTypeLoc TL, 660 TemplateName Template, 661 CXXScopeSpec &SS); 662 663 QualType TransformDependentTemplateSpecializationType( 664 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 665 NestedNameSpecifierLoc QualifierLoc); 666 667 /// Transforms the parameters of a function type into the 668 /// given vectors. 669 /// 670 /// The result vectors should be kept in sync; null entries in the 671 /// variables vector are acceptable. 672 /// 673 /// Return true on error. 674 bool TransformFunctionTypeParams( 675 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 676 const QualType *ParamTypes, 677 const FunctionProtoType::ExtParameterInfo *ParamInfos, 678 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 679 Sema::ExtParameterInfoBuilder &PInfos); 680 681 /// Transforms a single function-type parameter. Return null 682 /// on error. 683 /// 684 /// \param indexAdjustment - A number to add to the parameter's 685 /// scope index; can be negative 686 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 687 int indexAdjustment, 688 Optional<unsigned> NumExpansions, 689 bool ExpectParameterPack); 690 691 /// Transform the body of a lambda-expression. 692 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 693 /// Alternative implementation of TransformLambdaBody that skips transforming 694 /// the body. 695 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 696 697 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 698 699 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 700 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 701 702 TemplateParameterList *TransformTemplateParameterList( 703 TemplateParameterList *TPL) { 704 return TPL; 705 } 706 707 ExprResult TransformAddressOfOperand(Expr *E); 708 709 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 710 bool IsAddressOfOperand, 711 TypeSourceInfo **RecoveryTSI); 712 713 ExprResult TransformParenDependentScopeDeclRefExpr( 714 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 715 TypeSourceInfo **RecoveryTSI); 716 717 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 718 719 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 720 // amount of stack usage with clang. 721 #define STMT(Node, Parent) \ 722 LLVM_ATTRIBUTE_NOINLINE \ 723 StmtResult Transform##Node(Node *S); 724 #define VALUESTMT(Node, Parent) \ 725 LLVM_ATTRIBUTE_NOINLINE \ 726 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 727 #define EXPR(Node, Parent) \ 728 LLVM_ATTRIBUTE_NOINLINE \ 729 ExprResult Transform##Node(Node *E); 730 #define ABSTRACT_STMT(Stmt) 731 #include "clang/AST/StmtNodes.inc" 732 733 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 734 LLVM_ATTRIBUTE_NOINLINE \ 735 OMPClause *Transform ## Class(Class *S); 736 #include "llvm/Frontend/OpenMP/OMPKinds.def" 737 738 /// Build a new qualified type given its unqualified type and type location. 739 /// 740 /// By default, this routine adds type qualifiers only to types that can 741 /// have qualifiers, and silently suppresses those qualifiers that are not 742 /// permitted. Subclasses may override this routine to provide different 743 /// behavior. 744 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 745 746 /// Build a new pointer type given its pointee type. 747 /// 748 /// By default, performs semantic analysis when building the pointer type. 749 /// Subclasses may override this routine to provide different behavior. 750 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 751 752 /// Build a new block pointer type given its pointee type. 753 /// 754 /// By default, performs semantic analysis when building the block pointer 755 /// type. Subclasses may override this routine to provide different behavior. 756 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 757 758 /// Build a new reference type given the type it references. 759 /// 760 /// By default, performs semantic analysis when building the 761 /// reference type. Subclasses may override this routine to provide 762 /// different behavior. 763 /// 764 /// \param LValue whether the type was written with an lvalue sigil 765 /// or an rvalue sigil. 766 QualType RebuildReferenceType(QualType ReferentType, 767 bool LValue, 768 SourceLocation Sigil); 769 770 /// Build a new member pointer type given the pointee type and the 771 /// class type it refers into. 772 /// 773 /// By default, performs semantic analysis when building the member pointer 774 /// type. Subclasses may override this routine to provide different behavior. 775 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 776 SourceLocation Sigil); 777 778 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 779 SourceLocation ProtocolLAngleLoc, 780 ArrayRef<ObjCProtocolDecl *> Protocols, 781 ArrayRef<SourceLocation> ProtocolLocs, 782 SourceLocation ProtocolRAngleLoc); 783 784 /// Build an Objective-C object type. 785 /// 786 /// By default, performs semantic analysis when building the object type. 787 /// Subclasses may override this routine to provide different behavior. 788 QualType RebuildObjCObjectType(QualType BaseType, 789 SourceLocation Loc, 790 SourceLocation TypeArgsLAngleLoc, 791 ArrayRef<TypeSourceInfo *> TypeArgs, 792 SourceLocation TypeArgsRAngleLoc, 793 SourceLocation ProtocolLAngleLoc, 794 ArrayRef<ObjCProtocolDecl *> Protocols, 795 ArrayRef<SourceLocation> ProtocolLocs, 796 SourceLocation ProtocolRAngleLoc); 797 798 /// Build a new Objective-C object pointer type given the pointee type. 799 /// 800 /// By default, directly builds the pointer type, with no additional semantic 801 /// analysis. 802 QualType RebuildObjCObjectPointerType(QualType PointeeType, 803 SourceLocation Star); 804 805 /// Build a new array type given the element type, size 806 /// modifier, size of the array (if known), size expression, and index type 807 /// qualifiers. 808 /// 809 /// By default, performs semantic analysis when building the array type. 810 /// Subclasses may override this routine to provide different behavior. 811 /// Also by default, all of the other Rebuild*Array 812 QualType RebuildArrayType(QualType ElementType, 813 ArrayType::ArraySizeModifier SizeMod, 814 const llvm::APInt *Size, 815 Expr *SizeExpr, 816 unsigned IndexTypeQuals, 817 SourceRange BracketsRange); 818 819 /// Build a new constant array type given the element type, size 820 /// modifier, (known) size of the array, and index type qualifiers. 821 /// 822 /// By default, performs semantic analysis when building the array type. 823 /// Subclasses may override this routine to provide different behavior. 824 QualType RebuildConstantArrayType(QualType ElementType, 825 ArrayType::ArraySizeModifier SizeMod, 826 const llvm::APInt &Size, 827 Expr *SizeExpr, 828 unsigned IndexTypeQuals, 829 SourceRange BracketsRange); 830 831 /// Build a new incomplete array type given the element type, size 832 /// modifier, and index type qualifiers. 833 /// 834 /// By default, performs semantic analysis when building the array type. 835 /// Subclasses may override this routine to provide different behavior. 836 QualType RebuildIncompleteArrayType(QualType ElementType, 837 ArrayType::ArraySizeModifier SizeMod, 838 unsigned IndexTypeQuals, 839 SourceRange BracketsRange); 840 841 /// Build a new variable-length array type given the element type, 842 /// size modifier, size expression, and index type qualifiers. 843 /// 844 /// By default, performs semantic analysis when building the array type. 845 /// Subclasses may override this routine to provide different behavior. 846 QualType RebuildVariableArrayType(QualType ElementType, 847 ArrayType::ArraySizeModifier SizeMod, 848 Expr *SizeExpr, 849 unsigned IndexTypeQuals, 850 SourceRange BracketsRange); 851 852 /// Build a new dependent-sized array type given the element type, 853 /// size modifier, size expression, and index type qualifiers. 854 /// 855 /// By default, performs semantic analysis when building the array type. 856 /// Subclasses may override this routine to provide different behavior. 857 QualType RebuildDependentSizedArrayType(QualType ElementType, 858 ArrayType::ArraySizeModifier SizeMod, 859 Expr *SizeExpr, 860 unsigned IndexTypeQuals, 861 SourceRange BracketsRange); 862 863 /// Build a new vector type given the element type and 864 /// number of elements. 865 /// 866 /// By default, performs semantic analysis when building the vector type. 867 /// Subclasses may override this routine to provide different behavior. 868 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 869 VectorType::VectorKind VecKind); 870 871 /// Build a new potentially dependently-sized extended vector type 872 /// given the element type and number of elements. 873 /// 874 /// By default, performs semantic analysis when building the vector type. 875 /// Subclasses may override this routine to provide different behavior. 876 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 877 SourceLocation AttributeLoc, 878 VectorType::VectorKind); 879 880 /// Build a new extended vector type given the element type and 881 /// number of elements. 882 /// 883 /// By default, performs semantic analysis when building the vector type. 884 /// Subclasses may override this routine to provide different behavior. 885 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 886 SourceLocation AttributeLoc); 887 888 /// Build a new potentially dependently-sized extended vector type 889 /// given the element type and number of elements. 890 /// 891 /// By default, performs semantic analysis when building the vector type. 892 /// Subclasses may override this routine to provide different behavior. 893 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 894 Expr *SizeExpr, 895 SourceLocation AttributeLoc); 896 897 /// Build a new DependentAddressSpaceType or return the pointee 898 /// type variable with the correct address space (retrieved from 899 /// AddrSpaceExpr) applied to it. The former will be returned in cases 900 /// where the address space remains dependent. 901 /// 902 /// By default, performs semantic analysis when building the type with address 903 /// space applied. Subclasses may override this routine to provide different 904 /// behavior. 905 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 906 Expr *AddrSpaceExpr, 907 SourceLocation AttributeLoc); 908 909 /// Build a new function type. 910 /// 911 /// By default, performs semantic analysis when building the function type. 912 /// Subclasses may override this routine to provide different behavior. 913 QualType RebuildFunctionProtoType(QualType T, 914 MutableArrayRef<QualType> ParamTypes, 915 const FunctionProtoType::ExtProtoInfo &EPI); 916 917 /// Build a new unprototyped function type. 918 QualType RebuildFunctionNoProtoType(QualType ResultType); 919 920 /// Rebuild an unresolved typename type, given the decl that 921 /// the UnresolvedUsingTypenameDecl was transformed to. 922 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 923 924 /// Build a new typedef type. 925 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 926 return SemaRef.Context.getTypeDeclType(Typedef); 927 } 928 929 /// Build a new MacroDefined type. 930 QualType RebuildMacroQualifiedType(QualType T, 931 const IdentifierInfo *MacroII) { 932 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 933 } 934 935 /// Build a new class/struct/union type. 936 QualType RebuildRecordType(RecordDecl *Record) { 937 return SemaRef.Context.getTypeDeclType(Record); 938 } 939 940 /// Build a new Enum type. 941 QualType RebuildEnumType(EnumDecl *Enum) { 942 return SemaRef.Context.getTypeDeclType(Enum); 943 } 944 945 /// Build a new typeof(expr) type. 946 /// 947 /// By default, performs semantic analysis when building the typeof type. 948 /// Subclasses may override this routine to provide different behavior. 949 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 950 951 /// Build a new typeof(type) type. 952 /// 953 /// By default, builds a new TypeOfType with the given underlying type. 954 QualType RebuildTypeOfType(QualType Underlying); 955 956 /// Build a new unary transform type. 957 QualType RebuildUnaryTransformType(QualType BaseType, 958 UnaryTransformType::UTTKind UKind, 959 SourceLocation Loc); 960 961 /// Build a new C++11 decltype type. 962 /// 963 /// By default, performs semantic analysis when building the decltype type. 964 /// Subclasses may override this routine to provide different behavior. 965 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 966 967 /// Build a new C++11 auto type. 968 /// 969 /// By default, builds a new AutoType with the given deduced type. 970 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 971 ConceptDecl *TypeConstraintConcept, 972 ArrayRef<TemplateArgument> TypeConstraintArgs) { 973 // Note, IsDependent is always false here: we implicitly convert an 'auto' 974 // which has been deduced to a dependent type into an undeduced 'auto', so 975 // that we'll retry deduction after the transformation. 976 return SemaRef.Context.getAutoType(Deduced, Keyword, 977 /*IsDependent*/ false, /*IsPack=*/false, 978 TypeConstraintConcept, 979 TypeConstraintArgs); 980 } 981 982 /// By default, builds a new DeducedTemplateSpecializationType with the given 983 /// deduced type. 984 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 985 QualType Deduced) { 986 return SemaRef.Context.getDeducedTemplateSpecializationType( 987 Template, Deduced, /*IsDependent*/ false); 988 } 989 990 /// Build a new template specialization type. 991 /// 992 /// By default, performs semantic analysis when building the template 993 /// specialization type. Subclasses may override this routine to provide 994 /// different behavior. 995 QualType RebuildTemplateSpecializationType(TemplateName Template, 996 SourceLocation TemplateLoc, 997 TemplateArgumentListInfo &Args); 998 999 /// Build a new parenthesized type. 1000 /// 1001 /// By default, builds a new ParenType type from the inner type. 1002 /// Subclasses may override this routine to provide different behavior. 1003 QualType RebuildParenType(QualType InnerType) { 1004 return SemaRef.BuildParenType(InnerType); 1005 } 1006 1007 /// Build a new qualified name type. 1008 /// 1009 /// By default, builds a new ElaboratedType type from the keyword, 1010 /// the nested-name-specifier and the named type. 1011 /// Subclasses may override this routine to provide different behavior. 1012 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1013 ElaboratedTypeKeyword Keyword, 1014 NestedNameSpecifierLoc QualifierLoc, 1015 QualType Named) { 1016 return SemaRef.Context.getElaboratedType(Keyword, 1017 QualifierLoc.getNestedNameSpecifier(), 1018 Named); 1019 } 1020 1021 /// Build a new typename type that refers to a template-id. 1022 /// 1023 /// By default, builds a new DependentNameType type from the 1024 /// nested-name-specifier and the given type. Subclasses may override 1025 /// this routine to provide different behavior. 1026 QualType RebuildDependentTemplateSpecializationType( 1027 ElaboratedTypeKeyword Keyword, 1028 NestedNameSpecifierLoc QualifierLoc, 1029 SourceLocation TemplateKWLoc, 1030 const IdentifierInfo *Name, 1031 SourceLocation NameLoc, 1032 TemplateArgumentListInfo &Args, 1033 bool AllowInjectedClassName) { 1034 // Rebuild the template name. 1035 // TODO: avoid TemplateName abstraction 1036 CXXScopeSpec SS; 1037 SS.Adopt(QualifierLoc); 1038 TemplateName InstName = getDerived().RebuildTemplateName( 1039 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1040 AllowInjectedClassName); 1041 1042 if (InstName.isNull()) 1043 return QualType(); 1044 1045 // If it's still dependent, make a dependent specialization. 1046 if (InstName.getAsDependentTemplateName()) 1047 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1048 QualifierLoc.getNestedNameSpecifier(), 1049 Name, 1050 Args); 1051 1052 // Otherwise, make an elaborated type wrapping a non-dependent 1053 // specialization. 1054 QualType T = 1055 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1056 if (T.isNull()) return QualType(); 1057 1058 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1059 return T; 1060 1061 return SemaRef.Context.getElaboratedType(Keyword, 1062 QualifierLoc.getNestedNameSpecifier(), 1063 T); 1064 } 1065 1066 /// Build a new typename type that refers to an identifier. 1067 /// 1068 /// By default, performs semantic analysis when building the typename type 1069 /// (or elaborated type). Subclasses may override this routine to provide 1070 /// different behavior. 1071 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1072 SourceLocation KeywordLoc, 1073 NestedNameSpecifierLoc QualifierLoc, 1074 const IdentifierInfo *Id, 1075 SourceLocation IdLoc, 1076 bool DeducedTSTContext) { 1077 CXXScopeSpec SS; 1078 SS.Adopt(QualifierLoc); 1079 1080 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1081 // If the name is still dependent, just build a new dependent name type. 1082 if (!SemaRef.computeDeclContext(SS)) 1083 return SemaRef.Context.getDependentNameType(Keyword, 1084 QualifierLoc.getNestedNameSpecifier(), 1085 Id); 1086 } 1087 1088 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1089 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1090 *Id, IdLoc, DeducedTSTContext); 1091 } 1092 1093 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1094 1095 // We had a dependent elaborated-type-specifier that has been transformed 1096 // into a non-dependent elaborated-type-specifier. Find the tag we're 1097 // referring to. 1098 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1099 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1100 if (!DC) 1101 return QualType(); 1102 1103 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1104 return QualType(); 1105 1106 TagDecl *Tag = nullptr; 1107 SemaRef.LookupQualifiedName(Result, DC); 1108 switch (Result.getResultKind()) { 1109 case LookupResult::NotFound: 1110 case LookupResult::NotFoundInCurrentInstantiation: 1111 break; 1112 1113 case LookupResult::Found: 1114 Tag = Result.getAsSingle<TagDecl>(); 1115 break; 1116 1117 case LookupResult::FoundOverloaded: 1118 case LookupResult::FoundUnresolvedValue: 1119 llvm_unreachable("Tag lookup cannot find non-tags"); 1120 1121 case LookupResult::Ambiguous: 1122 // Let the LookupResult structure handle ambiguities. 1123 return QualType(); 1124 } 1125 1126 if (!Tag) { 1127 // Check where the name exists but isn't a tag type and use that to emit 1128 // better diagnostics. 1129 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1130 SemaRef.LookupQualifiedName(Result, DC); 1131 switch (Result.getResultKind()) { 1132 case LookupResult::Found: 1133 case LookupResult::FoundOverloaded: 1134 case LookupResult::FoundUnresolvedValue: { 1135 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1136 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1137 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1138 << NTK << Kind; 1139 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1140 break; 1141 } 1142 default: 1143 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1144 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1145 break; 1146 } 1147 return QualType(); 1148 } 1149 1150 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1151 IdLoc, Id)) { 1152 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1153 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1154 return QualType(); 1155 } 1156 1157 // Build the elaborated-type-specifier type. 1158 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1159 return SemaRef.Context.getElaboratedType(Keyword, 1160 QualifierLoc.getNestedNameSpecifier(), 1161 T); 1162 } 1163 1164 /// Build a new pack expansion type. 1165 /// 1166 /// By default, builds a new PackExpansionType type from the given pattern. 1167 /// Subclasses may override this routine to provide different behavior. 1168 QualType RebuildPackExpansionType(QualType Pattern, 1169 SourceRange PatternRange, 1170 SourceLocation EllipsisLoc, 1171 Optional<unsigned> NumExpansions) { 1172 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1173 NumExpansions); 1174 } 1175 1176 /// Build a new atomic type given its value type. 1177 /// 1178 /// By default, performs semantic analysis when building the atomic type. 1179 /// Subclasses may override this routine to provide different behavior. 1180 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1181 1182 /// Build a new pipe type given its value type. 1183 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1184 bool isReadPipe); 1185 1186 /// Build an extended int given its value type. 1187 QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits, 1188 SourceLocation Loc); 1189 1190 /// Build a dependent extended int given its value type. 1191 QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr, 1192 SourceLocation Loc); 1193 1194 /// Build a new template name given a nested name specifier, a flag 1195 /// indicating whether the "template" keyword was provided, and the template 1196 /// that the template name refers to. 1197 /// 1198 /// By default, builds the new template name directly. Subclasses may override 1199 /// this routine to provide different behavior. 1200 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1201 bool TemplateKW, 1202 TemplateDecl *Template); 1203 1204 /// Build a new template name given a nested name specifier and the 1205 /// name that is referred to as a template. 1206 /// 1207 /// By default, performs semantic analysis to determine whether the name can 1208 /// be resolved to a specific template, then builds the appropriate kind of 1209 /// template name. Subclasses may override this routine to provide different 1210 /// behavior. 1211 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1212 SourceLocation TemplateKWLoc, 1213 const IdentifierInfo &Name, 1214 SourceLocation NameLoc, QualType ObjectType, 1215 NamedDecl *FirstQualifierInScope, 1216 bool AllowInjectedClassName); 1217 1218 /// Build a new template name given a nested name specifier and the 1219 /// overloaded operator name that is referred to as a template. 1220 /// 1221 /// By default, performs semantic analysis to determine whether the name can 1222 /// be resolved to a specific template, then builds the appropriate kind of 1223 /// template name. Subclasses may override this routine to provide different 1224 /// behavior. 1225 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1226 SourceLocation TemplateKWLoc, 1227 OverloadedOperatorKind Operator, 1228 SourceLocation NameLoc, QualType ObjectType, 1229 bool AllowInjectedClassName); 1230 1231 /// Build a new template name given a template template parameter pack 1232 /// and the 1233 /// 1234 /// By default, performs semantic analysis to determine whether the name can 1235 /// be resolved to a specific template, then builds the appropriate kind of 1236 /// template name. Subclasses may override this routine to provide different 1237 /// behavior. 1238 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1239 const TemplateArgument &ArgPack) { 1240 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1241 } 1242 1243 /// Build a new compound statement. 1244 /// 1245 /// By default, performs semantic analysis to build the new statement. 1246 /// Subclasses may override this routine to provide different behavior. 1247 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1248 MultiStmtArg Statements, 1249 SourceLocation RBraceLoc, 1250 bool IsStmtExpr) { 1251 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1252 IsStmtExpr); 1253 } 1254 1255 /// Build a new case 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 RebuildCaseStmt(SourceLocation CaseLoc, 1260 Expr *LHS, 1261 SourceLocation EllipsisLoc, 1262 Expr *RHS, 1263 SourceLocation ColonLoc) { 1264 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1265 ColonLoc); 1266 } 1267 1268 /// Attach the body to a new case statement. 1269 /// 1270 /// By default, performs semantic analysis to build the new statement. 1271 /// Subclasses may override this routine to provide different behavior. 1272 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1273 getSema().ActOnCaseStmtBody(S, Body); 1274 return S; 1275 } 1276 1277 /// Build a new default statement. 1278 /// 1279 /// By default, performs semantic analysis to build the new statement. 1280 /// Subclasses may override this routine to provide different behavior. 1281 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1282 SourceLocation ColonLoc, 1283 Stmt *SubStmt) { 1284 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1285 /*CurScope=*/nullptr); 1286 } 1287 1288 /// Build a new label statement. 1289 /// 1290 /// By default, performs semantic analysis to build the new statement. 1291 /// Subclasses may override this routine to provide different behavior. 1292 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1293 SourceLocation ColonLoc, Stmt *SubStmt) { 1294 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1295 } 1296 1297 /// Build a new label statement. 1298 /// 1299 /// By default, performs semantic analysis to build the new statement. 1300 /// Subclasses may override this routine to provide different behavior. 1301 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1302 ArrayRef<const Attr*> Attrs, 1303 Stmt *SubStmt) { 1304 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1305 } 1306 1307 /// Build a new "if" statement. 1308 /// 1309 /// By default, performs semantic analysis to build the new statement. 1310 /// Subclasses may override this routine to provide different behavior. 1311 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1312 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1313 SourceLocation ElseLoc, Stmt *Else) { 1314 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1315 ElseLoc, Else); 1316 } 1317 1318 /// Start building a new switch statement. 1319 /// 1320 /// By default, performs semantic analysis to build the new statement. 1321 /// Subclasses may override this routine to provide different behavior. 1322 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1323 Sema::ConditionResult Cond) { 1324 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1325 } 1326 1327 /// Attach the body to the switch statement. 1328 /// 1329 /// By default, performs semantic analysis to build the new statement. 1330 /// Subclasses may override this routine to provide different behavior. 1331 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1332 Stmt *Switch, Stmt *Body) { 1333 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1334 } 1335 1336 /// Build a new while statement. 1337 /// 1338 /// By default, performs semantic analysis to build the new statement. 1339 /// Subclasses may override this routine to provide different behavior. 1340 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1341 Sema::ConditionResult Cond, Stmt *Body) { 1342 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1343 } 1344 1345 /// Build a new do-while statement. 1346 /// 1347 /// By default, performs semantic analysis to build the new statement. 1348 /// Subclasses may override this routine to provide different behavior. 1349 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1350 SourceLocation WhileLoc, SourceLocation LParenLoc, 1351 Expr *Cond, SourceLocation RParenLoc) { 1352 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1353 Cond, RParenLoc); 1354 } 1355 1356 /// Build a new for statement. 1357 /// 1358 /// By default, performs semantic analysis to build the new statement. 1359 /// Subclasses may override this routine to provide different behavior. 1360 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1361 Stmt *Init, Sema::ConditionResult Cond, 1362 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1363 Stmt *Body) { 1364 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1365 Inc, RParenLoc, Body); 1366 } 1367 1368 /// Build a new goto statement. 1369 /// 1370 /// By default, performs semantic analysis to build the new statement. 1371 /// Subclasses may override this routine to provide different behavior. 1372 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1373 LabelDecl *Label) { 1374 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1375 } 1376 1377 /// Build a new indirect goto statement. 1378 /// 1379 /// By default, performs semantic analysis to build the new statement. 1380 /// Subclasses may override this routine to provide different behavior. 1381 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1382 SourceLocation StarLoc, 1383 Expr *Target) { 1384 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1385 } 1386 1387 /// Build a new return statement. 1388 /// 1389 /// By default, performs semantic analysis to build the new statement. 1390 /// Subclasses may override this routine to provide different behavior. 1391 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1392 return getSema().BuildReturnStmt(ReturnLoc, Result); 1393 } 1394 1395 /// Build a new declaration statement. 1396 /// 1397 /// By default, performs semantic analysis to build the new statement. 1398 /// Subclasses may override this routine to provide different behavior. 1399 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1400 SourceLocation StartLoc, SourceLocation EndLoc) { 1401 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1402 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1403 } 1404 1405 /// Build a new inline asm statement. 1406 /// 1407 /// By default, performs semantic analysis to build the new statement. 1408 /// Subclasses may override this routine to provide different behavior. 1409 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1410 bool IsVolatile, unsigned NumOutputs, 1411 unsigned NumInputs, IdentifierInfo **Names, 1412 MultiExprArg Constraints, MultiExprArg Exprs, 1413 Expr *AsmString, MultiExprArg Clobbers, 1414 unsigned NumLabels, 1415 SourceLocation RParenLoc) { 1416 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1417 NumInputs, Names, Constraints, Exprs, 1418 AsmString, Clobbers, NumLabels, RParenLoc); 1419 } 1420 1421 /// Build a new MS style inline asm statement. 1422 /// 1423 /// By default, performs semantic analysis to build the new statement. 1424 /// Subclasses may override this routine to provide different behavior. 1425 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1426 ArrayRef<Token> AsmToks, 1427 StringRef AsmString, 1428 unsigned NumOutputs, unsigned NumInputs, 1429 ArrayRef<StringRef> Constraints, 1430 ArrayRef<StringRef> Clobbers, 1431 ArrayRef<Expr*> Exprs, 1432 SourceLocation EndLoc) { 1433 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1434 NumOutputs, NumInputs, 1435 Constraints, Clobbers, Exprs, EndLoc); 1436 } 1437 1438 /// Build a new co_return 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 RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1443 bool IsImplicit) { 1444 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1445 } 1446 1447 /// Build a new co_await expression. 1448 /// 1449 /// By default, performs semantic analysis to build the new expression. 1450 /// Subclasses may override this routine to provide different behavior. 1451 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1452 bool IsImplicit) { 1453 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1454 } 1455 1456 /// Build a new co_await expression. 1457 /// 1458 /// By default, performs semantic analysis to build the new expression. 1459 /// Subclasses may override this routine to provide different behavior. 1460 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1461 Expr *Result, 1462 UnresolvedLookupExpr *Lookup) { 1463 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1464 } 1465 1466 /// Build a new co_yield expression. 1467 /// 1468 /// By default, performs semantic analysis to build the new expression. 1469 /// Subclasses may override this routine to provide different behavior. 1470 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1471 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1472 } 1473 1474 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1475 return getSema().BuildCoroutineBodyStmt(Args); 1476 } 1477 1478 /// Build a new Objective-C \@try statement. 1479 /// 1480 /// By default, performs semantic analysis to build the new statement. 1481 /// Subclasses may override this routine to provide different behavior. 1482 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1483 Stmt *TryBody, 1484 MultiStmtArg CatchStmts, 1485 Stmt *Finally) { 1486 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1487 Finally); 1488 } 1489 1490 /// Rebuild an Objective-C exception declaration. 1491 /// 1492 /// By default, performs semantic analysis to build the new declaration. 1493 /// Subclasses may override this routine to provide different behavior. 1494 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1495 TypeSourceInfo *TInfo, QualType T) { 1496 return getSema().BuildObjCExceptionDecl(TInfo, T, 1497 ExceptionDecl->getInnerLocStart(), 1498 ExceptionDecl->getLocation(), 1499 ExceptionDecl->getIdentifier()); 1500 } 1501 1502 /// Build a new Objective-C \@catch statement. 1503 /// 1504 /// By default, performs semantic analysis to build the new statement. 1505 /// Subclasses may override this routine to provide different behavior. 1506 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1507 SourceLocation RParenLoc, 1508 VarDecl *Var, 1509 Stmt *Body) { 1510 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1511 Var, Body); 1512 } 1513 1514 /// Build a new Objective-C \@finally statement. 1515 /// 1516 /// By default, performs semantic analysis to build the new statement. 1517 /// Subclasses may override this routine to provide different behavior. 1518 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1519 Stmt *Body) { 1520 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1521 } 1522 1523 /// Build a new Objective-C \@throw statement. 1524 /// 1525 /// By default, performs semantic analysis to build the new statement. 1526 /// Subclasses may override this routine to provide different behavior. 1527 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1528 Expr *Operand) { 1529 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1530 } 1531 1532 /// Build a new OpenMP executable directive. 1533 /// 1534 /// By default, performs semantic analysis to build the new statement. 1535 /// Subclasses may override this routine to provide different behavior. 1536 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1537 DeclarationNameInfo DirName, 1538 OpenMPDirectiveKind CancelRegion, 1539 ArrayRef<OMPClause *> Clauses, 1540 Stmt *AStmt, SourceLocation StartLoc, 1541 SourceLocation EndLoc) { 1542 return getSema().ActOnOpenMPExecutableDirective( 1543 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1544 } 1545 1546 /// Build a new OpenMP 'if' clause. 1547 /// 1548 /// By default, performs semantic analysis to build the new OpenMP clause. 1549 /// Subclasses may override this routine to provide different behavior. 1550 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1551 Expr *Condition, SourceLocation StartLoc, 1552 SourceLocation LParenLoc, 1553 SourceLocation NameModifierLoc, 1554 SourceLocation ColonLoc, 1555 SourceLocation EndLoc) { 1556 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1557 LParenLoc, NameModifierLoc, ColonLoc, 1558 EndLoc); 1559 } 1560 1561 /// Build a new OpenMP 'final' clause. 1562 /// 1563 /// By default, performs semantic analysis to build the new OpenMP clause. 1564 /// Subclasses may override this routine to provide different behavior. 1565 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1566 SourceLocation LParenLoc, 1567 SourceLocation EndLoc) { 1568 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1569 EndLoc); 1570 } 1571 1572 /// Build a new OpenMP 'num_threads' clause. 1573 /// 1574 /// By default, performs semantic analysis to build the new OpenMP clause. 1575 /// Subclasses may override this routine to provide different behavior. 1576 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1577 SourceLocation StartLoc, 1578 SourceLocation LParenLoc, 1579 SourceLocation EndLoc) { 1580 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1581 LParenLoc, EndLoc); 1582 } 1583 1584 /// Build a new OpenMP 'safelen' clause. 1585 /// 1586 /// By default, performs semantic analysis to build the new OpenMP clause. 1587 /// Subclasses may override this routine to provide different behavior. 1588 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1589 SourceLocation LParenLoc, 1590 SourceLocation EndLoc) { 1591 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1592 } 1593 1594 /// Build a new OpenMP 'simdlen' clause. 1595 /// 1596 /// By default, performs semantic analysis to build the new OpenMP clause. 1597 /// Subclasses may override this routine to provide different behavior. 1598 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1599 SourceLocation LParenLoc, 1600 SourceLocation EndLoc) { 1601 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1602 } 1603 1604 /// Build a new OpenMP 'allocator' clause. 1605 /// 1606 /// By default, performs semantic analysis to build the new OpenMP clause. 1607 /// Subclasses may override this routine to provide different behavior. 1608 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1609 SourceLocation LParenLoc, 1610 SourceLocation EndLoc) { 1611 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1612 } 1613 1614 /// Build a new OpenMP 'collapse' clause. 1615 /// 1616 /// By default, performs semantic analysis to build the new OpenMP clause. 1617 /// Subclasses may override this routine to provide different behavior. 1618 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1619 SourceLocation LParenLoc, 1620 SourceLocation EndLoc) { 1621 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1622 EndLoc); 1623 } 1624 1625 /// Build a new OpenMP 'default' clause. 1626 /// 1627 /// By default, performs semantic analysis to build the new OpenMP clause. 1628 /// Subclasses may override this routine to provide different behavior. 1629 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1630 SourceLocation StartLoc, 1631 SourceLocation LParenLoc, 1632 SourceLocation EndLoc) { 1633 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1634 StartLoc, LParenLoc, EndLoc); 1635 } 1636 1637 /// Build a new OpenMP 'proc_bind' clause. 1638 /// 1639 /// By default, performs semantic analysis to build the new OpenMP clause. 1640 /// Subclasses may override this routine to provide different behavior. 1641 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1642 SourceLocation KindKwLoc, 1643 SourceLocation StartLoc, 1644 SourceLocation LParenLoc, 1645 SourceLocation EndLoc) { 1646 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1647 StartLoc, LParenLoc, EndLoc); 1648 } 1649 1650 /// Build a new OpenMP 'schedule' clause. 1651 /// 1652 /// By default, performs semantic analysis to build the new OpenMP clause. 1653 /// Subclasses may override this routine to provide different behavior. 1654 OMPClause *RebuildOMPScheduleClause( 1655 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1656 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1657 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1658 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1659 return getSema().ActOnOpenMPScheduleClause( 1660 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1661 CommaLoc, EndLoc); 1662 } 1663 1664 /// Build a new OpenMP 'ordered' clause. 1665 /// 1666 /// By default, performs semantic analysis to build the new OpenMP clause. 1667 /// Subclasses may override this routine to provide different behavior. 1668 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1669 SourceLocation EndLoc, 1670 SourceLocation LParenLoc, Expr *Num) { 1671 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1672 } 1673 1674 /// Build a new OpenMP 'private' clause. 1675 /// 1676 /// By default, performs semantic analysis to build the new OpenMP clause. 1677 /// Subclasses may override this routine to provide different behavior. 1678 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1679 SourceLocation StartLoc, 1680 SourceLocation LParenLoc, 1681 SourceLocation EndLoc) { 1682 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1683 EndLoc); 1684 } 1685 1686 /// Build a new OpenMP 'firstprivate' clause. 1687 /// 1688 /// By default, performs semantic analysis to build the new OpenMP clause. 1689 /// Subclasses may override this routine to provide different behavior. 1690 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1691 SourceLocation StartLoc, 1692 SourceLocation LParenLoc, 1693 SourceLocation EndLoc) { 1694 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1695 EndLoc); 1696 } 1697 1698 /// Build a new OpenMP 'lastprivate' clause. 1699 /// 1700 /// By default, performs semantic analysis to build the new OpenMP clause. 1701 /// Subclasses may override this routine to provide different behavior. 1702 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1703 OpenMPLastprivateModifier LPKind, 1704 SourceLocation LPKindLoc, 1705 SourceLocation ColonLoc, 1706 SourceLocation StartLoc, 1707 SourceLocation LParenLoc, 1708 SourceLocation EndLoc) { 1709 return getSema().ActOnOpenMPLastprivateClause( 1710 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1711 } 1712 1713 /// Build a new OpenMP 'shared' clause. 1714 /// 1715 /// By default, performs semantic analysis to build the new OpenMP clause. 1716 /// Subclasses may override this routine to provide different behavior. 1717 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1718 SourceLocation StartLoc, 1719 SourceLocation LParenLoc, 1720 SourceLocation EndLoc) { 1721 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1722 EndLoc); 1723 } 1724 1725 /// Build a new OpenMP 'reduction' clause. 1726 /// 1727 /// By default, performs semantic analysis to build the new statement. 1728 /// Subclasses may override this routine to provide different behavior. 1729 OMPClause *RebuildOMPReductionClause( 1730 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1731 SourceLocation StartLoc, SourceLocation LParenLoc, 1732 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1733 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1734 const DeclarationNameInfo &ReductionId, 1735 ArrayRef<Expr *> UnresolvedReductions) { 1736 return getSema().ActOnOpenMPReductionClause( 1737 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1738 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1739 } 1740 1741 /// Build a new OpenMP 'task_reduction' clause. 1742 /// 1743 /// By default, performs semantic analysis to build the new statement. 1744 /// Subclasses may override this routine to provide different behavior. 1745 OMPClause *RebuildOMPTaskReductionClause( 1746 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1747 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1748 CXXScopeSpec &ReductionIdScopeSpec, 1749 const DeclarationNameInfo &ReductionId, 1750 ArrayRef<Expr *> UnresolvedReductions) { 1751 return getSema().ActOnOpenMPTaskReductionClause( 1752 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1753 ReductionId, UnresolvedReductions); 1754 } 1755 1756 /// Build a new OpenMP 'in_reduction' clause. 1757 /// 1758 /// By default, performs semantic analysis to build the new statement. 1759 /// Subclasses may override this routine to provide different behavior. 1760 OMPClause * 1761 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1762 SourceLocation LParenLoc, SourceLocation ColonLoc, 1763 SourceLocation EndLoc, 1764 CXXScopeSpec &ReductionIdScopeSpec, 1765 const DeclarationNameInfo &ReductionId, 1766 ArrayRef<Expr *> UnresolvedReductions) { 1767 return getSema().ActOnOpenMPInReductionClause( 1768 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1769 ReductionId, UnresolvedReductions); 1770 } 1771 1772 /// Build a new OpenMP 'linear' clause. 1773 /// 1774 /// By default, performs semantic analysis to build the new OpenMP clause. 1775 /// Subclasses may override this routine to provide different behavior. 1776 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1777 SourceLocation StartLoc, 1778 SourceLocation LParenLoc, 1779 OpenMPLinearClauseKind Modifier, 1780 SourceLocation ModifierLoc, 1781 SourceLocation ColonLoc, 1782 SourceLocation EndLoc) { 1783 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1784 Modifier, ModifierLoc, ColonLoc, 1785 EndLoc); 1786 } 1787 1788 /// Build a new OpenMP 'aligned' clause. 1789 /// 1790 /// By default, performs semantic analysis to build the new OpenMP clause. 1791 /// Subclasses may override this routine to provide different behavior. 1792 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1793 SourceLocation StartLoc, 1794 SourceLocation LParenLoc, 1795 SourceLocation ColonLoc, 1796 SourceLocation EndLoc) { 1797 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1798 LParenLoc, ColonLoc, EndLoc); 1799 } 1800 1801 /// Build a new OpenMP 'copyin' clause. 1802 /// 1803 /// By default, performs semantic analysis to build the new OpenMP clause. 1804 /// Subclasses may override this routine to provide different behavior. 1805 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1806 SourceLocation StartLoc, 1807 SourceLocation LParenLoc, 1808 SourceLocation EndLoc) { 1809 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1810 EndLoc); 1811 } 1812 1813 /// Build a new OpenMP 'copyprivate' clause. 1814 /// 1815 /// By default, performs semantic analysis to build the new OpenMP clause. 1816 /// Subclasses may override this routine to provide different behavior. 1817 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1818 SourceLocation StartLoc, 1819 SourceLocation LParenLoc, 1820 SourceLocation EndLoc) { 1821 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1822 EndLoc); 1823 } 1824 1825 /// Build a new OpenMP 'flush' pseudo clause. 1826 /// 1827 /// By default, performs semantic analysis to build the new OpenMP clause. 1828 /// Subclasses may override this routine to provide different behavior. 1829 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1830 SourceLocation StartLoc, 1831 SourceLocation LParenLoc, 1832 SourceLocation EndLoc) { 1833 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1834 EndLoc); 1835 } 1836 1837 /// Build a new OpenMP 'depobj' pseudo clause. 1838 /// 1839 /// By default, performs semantic analysis to build the new OpenMP clause. 1840 /// Subclasses may override this routine to provide different behavior. 1841 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1842 SourceLocation LParenLoc, 1843 SourceLocation EndLoc) { 1844 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1845 EndLoc); 1846 } 1847 1848 /// Build a new OpenMP 'depend' pseudo clause. 1849 /// 1850 /// By default, performs semantic analysis to build the new OpenMP clause. 1851 /// Subclasses may override this routine to provide different behavior. 1852 OMPClause * 1853 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1854 SourceLocation DepLoc, SourceLocation ColonLoc, 1855 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1856 SourceLocation LParenLoc, SourceLocation EndLoc) { 1857 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1858 ColonLoc, VarList, StartLoc, 1859 LParenLoc, EndLoc); 1860 } 1861 1862 /// Build a new OpenMP 'device' clause. 1863 /// 1864 /// By default, performs semantic analysis to build the new statement. 1865 /// Subclasses may override this routine to provide different behavior. 1866 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1867 Expr *Device, SourceLocation StartLoc, 1868 SourceLocation LParenLoc, 1869 SourceLocation ModifierLoc, 1870 SourceLocation EndLoc) { 1871 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1872 LParenLoc, ModifierLoc, EndLoc); 1873 } 1874 1875 /// Build a new OpenMP 'map' clause. 1876 /// 1877 /// By default, performs semantic analysis to build the new OpenMP clause. 1878 /// Subclasses may override this routine to provide different behavior. 1879 OMPClause *RebuildOMPMapClause( 1880 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1881 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1882 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1883 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1884 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1885 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1886 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1887 MapperIdScopeSpec, MapperId, MapType, 1888 IsMapTypeImplicit, MapLoc, ColonLoc, 1889 VarList, Locs, UnresolvedMappers); 1890 } 1891 1892 /// Build a new OpenMP 'allocate' clause. 1893 /// 1894 /// By default, performs semantic analysis to build the new OpenMP clause. 1895 /// Subclasses may override this routine to provide different behavior. 1896 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1897 SourceLocation StartLoc, 1898 SourceLocation LParenLoc, 1899 SourceLocation ColonLoc, 1900 SourceLocation EndLoc) { 1901 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1902 LParenLoc, ColonLoc, EndLoc); 1903 } 1904 1905 /// Build a new OpenMP 'num_teams' clause. 1906 /// 1907 /// By default, performs semantic analysis to build the new statement. 1908 /// Subclasses may override this routine to provide different behavior. 1909 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1910 SourceLocation LParenLoc, 1911 SourceLocation EndLoc) { 1912 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1913 EndLoc); 1914 } 1915 1916 /// Build a new OpenMP 'thread_limit' clause. 1917 /// 1918 /// By default, performs semantic analysis to build the new statement. 1919 /// Subclasses may override this routine to provide different behavior. 1920 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1921 SourceLocation StartLoc, 1922 SourceLocation LParenLoc, 1923 SourceLocation EndLoc) { 1924 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1925 LParenLoc, EndLoc); 1926 } 1927 1928 /// Build a new OpenMP 'priority' clause. 1929 /// 1930 /// By default, performs semantic analysis to build the new statement. 1931 /// Subclasses may override this routine to provide different behavior. 1932 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1933 SourceLocation LParenLoc, 1934 SourceLocation EndLoc) { 1935 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1936 EndLoc); 1937 } 1938 1939 /// Build a new OpenMP 'grainsize' clause. 1940 /// 1941 /// By default, performs semantic analysis to build the new statement. 1942 /// Subclasses may override this routine to provide different behavior. 1943 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1944 SourceLocation LParenLoc, 1945 SourceLocation EndLoc) { 1946 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1947 EndLoc); 1948 } 1949 1950 /// Build a new OpenMP 'num_tasks' clause. 1951 /// 1952 /// By default, performs semantic analysis to build the new statement. 1953 /// Subclasses may override this routine to provide different behavior. 1954 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1955 SourceLocation LParenLoc, 1956 SourceLocation EndLoc) { 1957 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1958 EndLoc); 1959 } 1960 1961 /// Build a new OpenMP 'hint' clause. 1962 /// 1963 /// By default, performs semantic analysis to build the new statement. 1964 /// Subclasses may override this routine to provide different behavior. 1965 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1966 SourceLocation LParenLoc, 1967 SourceLocation EndLoc) { 1968 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1969 } 1970 1971 /// Build a new OpenMP 'detach' 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 *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 1976 SourceLocation LParenLoc, 1977 SourceLocation EndLoc) { 1978 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 1979 } 1980 1981 /// Build a new OpenMP 'dist_schedule' clause. 1982 /// 1983 /// By default, performs semantic analysis to build the new OpenMP clause. 1984 /// Subclasses may override this routine to provide different behavior. 1985 OMPClause * 1986 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1987 Expr *ChunkSize, SourceLocation StartLoc, 1988 SourceLocation LParenLoc, SourceLocation KindLoc, 1989 SourceLocation CommaLoc, SourceLocation EndLoc) { 1990 return getSema().ActOnOpenMPDistScheduleClause( 1991 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1992 } 1993 1994 /// Build a new OpenMP 'to' clause. 1995 /// 1996 /// By default, performs semantic analysis to build the new statement. 1997 /// Subclasses may override this routine to provide different behavior. 1998 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1999 CXXScopeSpec &MapperIdScopeSpec, 2000 DeclarationNameInfo &MapperId, 2001 const OMPVarListLocTy &Locs, 2002 ArrayRef<Expr *> UnresolvedMappers) { 2003 return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId, 2004 Locs, UnresolvedMappers); 2005 } 2006 2007 /// Build a new OpenMP 'from' clause. 2008 /// 2009 /// By default, performs semantic analysis to build the new statement. 2010 /// Subclasses may override this routine to provide different behavior. 2011 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 2012 CXXScopeSpec &MapperIdScopeSpec, 2013 DeclarationNameInfo &MapperId, 2014 const OMPVarListLocTy &Locs, 2015 ArrayRef<Expr *> UnresolvedMappers) { 2016 return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId, 2017 Locs, UnresolvedMappers); 2018 } 2019 2020 /// Build a new OpenMP 'use_device_ptr' clause. 2021 /// 2022 /// By default, performs semantic analysis to build the new OpenMP clause. 2023 /// Subclasses may override this routine to provide different behavior. 2024 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2025 const OMPVarListLocTy &Locs) { 2026 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2027 } 2028 2029 /// Build a new OpenMP 'is_device_ptr' clause. 2030 /// 2031 /// By default, performs semantic analysis to build the new OpenMP clause. 2032 /// Subclasses may override this routine to provide different behavior. 2033 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2034 const OMPVarListLocTy &Locs) { 2035 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2036 } 2037 2038 /// Build a new OpenMP 'defaultmap' clause. 2039 /// 2040 /// By default, performs semantic analysis to build the new OpenMP clause. 2041 /// Subclasses may override this routine to provide different behavior. 2042 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2043 OpenMPDefaultmapClauseKind Kind, 2044 SourceLocation StartLoc, 2045 SourceLocation LParenLoc, 2046 SourceLocation MLoc, 2047 SourceLocation KindLoc, 2048 SourceLocation EndLoc) { 2049 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2050 MLoc, KindLoc, EndLoc); 2051 } 2052 2053 /// Build a new OpenMP 'nontemporal' clause. 2054 /// 2055 /// By default, performs semantic analysis to build the new OpenMP clause. 2056 /// Subclasses may override this routine to provide different behavior. 2057 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2058 SourceLocation StartLoc, 2059 SourceLocation LParenLoc, 2060 SourceLocation EndLoc) { 2061 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2062 EndLoc); 2063 } 2064 2065 /// Build a new OpenMP 'inclusive' clause. 2066 /// 2067 /// By default, performs semantic analysis to build the new OpenMP clause. 2068 /// Subclasses may override this routine to provide different behavior. 2069 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2070 SourceLocation StartLoc, 2071 SourceLocation LParenLoc, 2072 SourceLocation EndLoc) { 2073 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2074 EndLoc); 2075 } 2076 2077 /// Build a new OpenMP 'exclusive' clause. 2078 /// 2079 /// By default, performs semantic analysis to build the new OpenMP clause. 2080 /// Subclasses may override this routine to provide different behavior. 2081 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2082 SourceLocation StartLoc, 2083 SourceLocation LParenLoc, 2084 SourceLocation EndLoc) { 2085 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2086 EndLoc); 2087 } 2088 2089 /// Build a new OpenMP 'order' clause. 2090 /// 2091 /// By default, performs semantic analysis to build the new OpenMP clause. 2092 /// Subclasses may override this routine to provide different behavior. 2093 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2094 SourceLocation KindKwLoc, 2095 SourceLocation StartLoc, 2096 SourceLocation LParenLoc, 2097 SourceLocation EndLoc) { 2098 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2099 LParenLoc, EndLoc); 2100 } 2101 2102 /// Rebuild the operand to an Objective-C \@synchronized statement. 2103 /// 2104 /// By default, performs semantic analysis to build the new statement. 2105 /// Subclasses may override this routine to provide different behavior. 2106 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2107 Expr *object) { 2108 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2109 } 2110 2111 /// Build a new Objective-C \@synchronized statement. 2112 /// 2113 /// By default, performs semantic analysis to build the new statement. 2114 /// Subclasses may override this routine to provide different behavior. 2115 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2116 Expr *Object, Stmt *Body) { 2117 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2118 } 2119 2120 /// Build a new Objective-C \@autoreleasepool statement. 2121 /// 2122 /// By default, performs semantic analysis to build the new statement. 2123 /// Subclasses may override this routine to provide different behavior. 2124 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2125 Stmt *Body) { 2126 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2127 } 2128 2129 /// Build a new Objective-C fast enumeration statement. 2130 /// 2131 /// By default, performs semantic analysis to build the new statement. 2132 /// Subclasses may override this routine to provide different behavior. 2133 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2134 Stmt *Element, 2135 Expr *Collection, 2136 SourceLocation RParenLoc, 2137 Stmt *Body) { 2138 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2139 Element, 2140 Collection, 2141 RParenLoc); 2142 if (ForEachStmt.isInvalid()) 2143 return StmtError(); 2144 2145 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2146 } 2147 2148 /// Build a new C++ exception declaration. 2149 /// 2150 /// By default, performs semantic analysis to build the new decaration. 2151 /// Subclasses may override this routine to provide different behavior. 2152 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2153 TypeSourceInfo *Declarator, 2154 SourceLocation StartLoc, 2155 SourceLocation IdLoc, 2156 IdentifierInfo *Id) { 2157 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2158 StartLoc, IdLoc, Id); 2159 if (Var) 2160 getSema().CurContext->addDecl(Var); 2161 return Var; 2162 } 2163 2164 /// Build a new C++ catch statement. 2165 /// 2166 /// By default, performs semantic analysis to build the new statement. 2167 /// Subclasses may override this routine to provide different behavior. 2168 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2169 VarDecl *ExceptionDecl, 2170 Stmt *Handler) { 2171 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2172 Handler)); 2173 } 2174 2175 /// Build a new C++ try statement. 2176 /// 2177 /// By default, performs semantic analysis to build the new statement. 2178 /// Subclasses may override this routine to provide different behavior. 2179 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2180 ArrayRef<Stmt *> Handlers) { 2181 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2182 } 2183 2184 /// Build a new C++0x range-based for statement. 2185 /// 2186 /// By default, performs semantic analysis to build the new statement. 2187 /// Subclasses may override this routine to provide different behavior. 2188 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2189 SourceLocation CoawaitLoc, Stmt *Init, 2190 SourceLocation ColonLoc, Stmt *Range, 2191 Stmt *Begin, Stmt *End, Expr *Cond, 2192 Expr *Inc, Stmt *LoopVar, 2193 SourceLocation RParenLoc) { 2194 // If we've just learned that the range is actually an Objective-C 2195 // collection, treat this as an Objective-C fast enumeration loop. 2196 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2197 if (RangeStmt->isSingleDecl()) { 2198 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2199 if (RangeVar->isInvalidDecl()) 2200 return StmtError(); 2201 2202 Expr *RangeExpr = RangeVar->getInit(); 2203 if (!RangeExpr->isTypeDependent() && 2204 RangeExpr->getType()->isObjCObjectPointerType()) { 2205 // FIXME: Support init-statements in Objective-C++20 ranged for 2206 // statement. 2207 if (Init) { 2208 return SemaRef.Diag(Init->getBeginLoc(), 2209 diag::err_objc_for_range_init_stmt) 2210 << Init->getSourceRange(); 2211 } 2212 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2213 RangeExpr, RParenLoc); 2214 } 2215 } 2216 } 2217 } 2218 2219 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2220 Range, Begin, End, Cond, Inc, LoopVar, 2221 RParenLoc, Sema::BFRK_Rebuild); 2222 } 2223 2224 /// Build a new C++0x range-based for statement. 2225 /// 2226 /// By default, performs semantic analysis to build the new statement. 2227 /// Subclasses may override this routine to provide different behavior. 2228 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2229 bool IsIfExists, 2230 NestedNameSpecifierLoc QualifierLoc, 2231 DeclarationNameInfo NameInfo, 2232 Stmt *Nested) { 2233 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2234 QualifierLoc, NameInfo, Nested); 2235 } 2236 2237 /// Attach body to a C++0x range-based for statement. 2238 /// 2239 /// By default, performs semantic analysis to finish the new statement. 2240 /// Subclasses may override this routine to provide different behavior. 2241 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2242 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2243 } 2244 2245 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2246 Stmt *TryBlock, Stmt *Handler) { 2247 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2248 } 2249 2250 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2251 Stmt *Block) { 2252 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2253 } 2254 2255 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2256 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2257 } 2258 2259 /// Build a new predefined expression. 2260 /// 2261 /// By default, performs semantic analysis to build the new expression. 2262 /// Subclasses may override this routine to provide different behavior. 2263 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2264 PredefinedExpr::IdentKind IK) { 2265 return getSema().BuildPredefinedExpr(Loc, IK); 2266 } 2267 2268 /// Build a new expression that references a declaration. 2269 /// 2270 /// By default, performs semantic analysis to build the new expression. 2271 /// Subclasses may override this routine to provide different behavior. 2272 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2273 LookupResult &R, 2274 bool RequiresADL) { 2275 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2276 } 2277 2278 2279 /// Build a new expression that references a declaration. 2280 /// 2281 /// By default, performs semantic analysis to build the new expression. 2282 /// Subclasses may override this routine to provide different behavior. 2283 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2284 ValueDecl *VD, 2285 const DeclarationNameInfo &NameInfo, 2286 NamedDecl *Found, 2287 TemplateArgumentListInfo *TemplateArgs) { 2288 CXXScopeSpec SS; 2289 SS.Adopt(QualifierLoc); 2290 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2291 TemplateArgs); 2292 } 2293 2294 /// Build a new expression in parentheses. 2295 /// 2296 /// By default, performs semantic analysis to build the new expression. 2297 /// Subclasses may override this routine to provide different behavior. 2298 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2299 SourceLocation RParen) { 2300 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2301 } 2302 2303 /// Build a new pseudo-destructor expression. 2304 /// 2305 /// By default, performs semantic analysis to build the new expression. 2306 /// Subclasses may override this routine to provide different behavior. 2307 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2308 SourceLocation OperatorLoc, 2309 bool isArrow, 2310 CXXScopeSpec &SS, 2311 TypeSourceInfo *ScopeType, 2312 SourceLocation CCLoc, 2313 SourceLocation TildeLoc, 2314 PseudoDestructorTypeStorage Destroyed); 2315 2316 /// Build a new unary operator expression. 2317 /// 2318 /// By default, performs semantic analysis to build the new expression. 2319 /// Subclasses may override this routine to provide different behavior. 2320 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2321 UnaryOperatorKind Opc, 2322 Expr *SubExpr) { 2323 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2324 } 2325 2326 /// Build a new builtin offsetof expression. 2327 /// 2328 /// By default, performs semantic analysis to build the new expression. 2329 /// Subclasses may override this routine to provide different behavior. 2330 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2331 TypeSourceInfo *Type, 2332 ArrayRef<Sema::OffsetOfComponent> Components, 2333 SourceLocation RParenLoc) { 2334 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2335 RParenLoc); 2336 } 2337 2338 /// Build a new sizeof, alignof or vec_step expression with a 2339 /// type argument. 2340 /// 2341 /// By default, performs semantic analysis to build the new expression. 2342 /// Subclasses may override this routine to provide different behavior. 2343 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2344 SourceLocation OpLoc, 2345 UnaryExprOrTypeTrait ExprKind, 2346 SourceRange R) { 2347 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2348 } 2349 2350 /// Build a new sizeof, alignof or vec step expression with an 2351 /// expression argument. 2352 /// 2353 /// By default, performs semantic analysis to build the new expression. 2354 /// Subclasses may override this routine to provide different behavior. 2355 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2356 UnaryExprOrTypeTrait ExprKind, 2357 SourceRange R) { 2358 ExprResult Result 2359 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2360 if (Result.isInvalid()) 2361 return ExprError(); 2362 2363 return Result; 2364 } 2365 2366 /// Build a new array subscript expression. 2367 /// 2368 /// By default, performs semantic analysis to build the new expression. 2369 /// Subclasses may override this routine to provide different behavior. 2370 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2371 SourceLocation LBracketLoc, 2372 Expr *RHS, 2373 SourceLocation RBracketLoc) { 2374 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2375 LBracketLoc, RHS, 2376 RBracketLoc); 2377 } 2378 2379 /// Build a new array section expression. 2380 /// 2381 /// By default, performs semantic analysis to build the new expression. 2382 /// Subclasses may override this routine to provide different behavior. 2383 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2384 Expr *LowerBound, 2385 SourceLocation ColonLoc, Expr *Length, 2386 SourceLocation RBracketLoc) { 2387 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2388 ColonLoc, Length, RBracketLoc); 2389 } 2390 2391 /// Build a new array shaping expression. 2392 /// 2393 /// By default, performs semantic analysis to build the new expression. 2394 /// Subclasses may override this routine to provide different behavior. 2395 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2396 SourceLocation RParenLoc, 2397 ArrayRef<Expr *> Dims, 2398 ArrayRef<SourceRange> BracketsRanges) { 2399 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2400 BracketsRanges); 2401 } 2402 2403 /// Build a new iterator expression. 2404 /// 2405 /// By default, performs semantic analysis to build the new expression. 2406 /// Subclasses may override this routine to provide different behavior. 2407 ExprResult RebuildOMPIteratorExpr( 2408 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2409 ArrayRef<Sema::OMPIteratorData> Data) { 2410 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2411 LLoc, RLoc, Data); 2412 } 2413 2414 /// Build a new call expression. 2415 /// 2416 /// By default, performs semantic analysis to build the new expression. 2417 /// Subclasses may override this routine to provide different behavior. 2418 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2419 MultiExprArg Args, 2420 SourceLocation RParenLoc, 2421 Expr *ExecConfig = nullptr) { 2422 return getSema().ActOnCallExpr( 2423 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2424 } 2425 2426 /// Build a new member access expression. 2427 /// 2428 /// By default, performs semantic analysis to build the new expression. 2429 /// Subclasses may override this routine to provide different behavior. 2430 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2431 bool isArrow, 2432 NestedNameSpecifierLoc QualifierLoc, 2433 SourceLocation TemplateKWLoc, 2434 const DeclarationNameInfo &MemberNameInfo, 2435 ValueDecl *Member, 2436 NamedDecl *FoundDecl, 2437 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2438 NamedDecl *FirstQualifierInScope) { 2439 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2440 isArrow); 2441 if (!Member->getDeclName()) { 2442 // We have a reference to an unnamed field. This is always the 2443 // base of an anonymous struct/union member access, i.e. the 2444 // field is always of record type. 2445 assert(Member->getType()->isRecordType() && 2446 "unnamed member not of record type?"); 2447 2448 BaseResult = 2449 getSema().PerformObjectMemberConversion(BaseResult.get(), 2450 QualifierLoc.getNestedNameSpecifier(), 2451 FoundDecl, Member); 2452 if (BaseResult.isInvalid()) 2453 return ExprError(); 2454 Base = BaseResult.get(); 2455 2456 CXXScopeSpec EmptySS; 2457 return getSema().BuildFieldReferenceExpr( 2458 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2459 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2460 } 2461 2462 CXXScopeSpec SS; 2463 SS.Adopt(QualifierLoc); 2464 2465 Base = BaseResult.get(); 2466 QualType BaseType = Base->getType(); 2467 2468 if (isArrow && !BaseType->isPointerType()) 2469 return ExprError(); 2470 2471 // FIXME: this involves duplicating earlier analysis in a lot of 2472 // cases; we should avoid this when possible. 2473 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2474 R.addDecl(FoundDecl); 2475 R.resolveKind(); 2476 2477 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2478 SS, TemplateKWLoc, 2479 FirstQualifierInScope, 2480 R, ExplicitTemplateArgs, 2481 /*S*/nullptr); 2482 } 2483 2484 /// Build a new binary operator expression. 2485 /// 2486 /// By default, performs semantic analysis to build the new expression. 2487 /// Subclasses may override this routine to provide different behavior. 2488 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2489 BinaryOperatorKind Opc, 2490 Expr *LHS, Expr *RHS) { 2491 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2492 } 2493 2494 /// Build a new rewritten operator expression. 2495 /// 2496 /// By default, performs semantic analysis to build the new expression. 2497 /// Subclasses may override this routine to provide different behavior. 2498 ExprResult RebuildCXXRewrittenBinaryOperator( 2499 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2500 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2501 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2502 RHS, /*RequiresADL*/false); 2503 } 2504 2505 /// Build a new conditional operator expression. 2506 /// 2507 /// By default, performs semantic analysis to build the new expression. 2508 /// Subclasses may override this routine to provide different behavior. 2509 ExprResult RebuildConditionalOperator(Expr *Cond, 2510 SourceLocation QuestionLoc, 2511 Expr *LHS, 2512 SourceLocation ColonLoc, 2513 Expr *RHS) { 2514 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2515 LHS, RHS); 2516 } 2517 2518 /// Build a new C-style cast expression. 2519 /// 2520 /// By default, performs semantic analysis to build the new expression. 2521 /// Subclasses may override this routine to provide different behavior. 2522 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2523 TypeSourceInfo *TInfo, 2524 SourceLocation RParenLoc, 2525 Expr *SubExpr) { 2526 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2527 SubExpr); 2528 } 2529 2530 /// Build a new compound literal expression. 2531 /// 2532 /// By default, performs semantic analysis to build the new expression. 2533 /// Subclasses may override this routine to provide different behavior. 2534 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2535 TypeSourceInfo *TInfo, 2536 SourceLocation RParenLoc, 2537 Expr *Init) { 2538 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2539 Init); 2540 } 2541 2542 /// Build a new extended vector element access expression. 2543 /// 2544 /// By default, performs semantic analysis to build the new expression. 2545 /// Subclasses may override this routine to provide different behavior. 2546 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2547 SourceLocation OpLoc, 2548 SourceLocation AccessorLoc, 2549 IdentifierInfo &Accessor) { 2550 2551 CXXScopeSpec SS; 2552 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2553 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2554 OpLoc, /*IsArrow*/ false, 2555 SS, SourceLocation(), 2556 /*FirstQualifierInScope*/ nullptr, 2557 NameInfo, 2558 /* TemplateArgs */ nullptr, 2559 /*S*/ nullptr); 2560 } 2561 2562 /// Build a new initializer list expression. 2563 /// 2564 /// By default, performs semantic analysis to build the new expression. 2565 /// Subclasses may override this routine to provide different behavior. 2566 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2567 MultiExprArg Inits, 2568 SourceLocation RBraceLoc) { 2569 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2570 } 2571 2572 /// Build a new designated initializer expression. 2573 /// 2574 /// By default, performs semantic analysis to build the new expression. 2575 /// Subclasses may override this routine to provide different behavior. 2576 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2577 MultiExprArg ArrayExprs, 2578 SourceLocation EqualOrColonLoc, 2579 bool GNUSyntax, 2580 Expr *Init) { 2581 ExprResult Result 2582 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2583 Init); 2584 if (Result.isInvalid()) 2585 return ExprError(); 2586 2587 return Result; 2588 } 2589 2590 /// Build a new value-initialized expression. 2591 /// 2592 /// By default, builds the implicit value initialization without performing 2593 /// any semantic analysis. Subclasses may override this routine to provide 2594 /// different behavior. 2595 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2596 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2597 } 2598 2599 /// Build a new \c va_arg expression. 2600 /// 2601 /// By default, performs semantic analysis to build the new expression. 2602 /// Subclasses may override this routine to provide different behavior. 2603 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2604 Expr *SubExpr, TypeSourceInfo *TInfo, 2605 SourceLocation RParenLoc) { 2606 return getSema().BuildVAArgExpr(BuiltinLoc, 2607 SubExpr, TInfo, 2608 RParenLoc); 2609 } 2610 2611 /// Build a new expression list in parentheses. 2612 /// 2613 /// By default, performs semantic analysis to build the new expression. 2614 /// Subclasses may override this routine to provide different behavior. 2615 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2616 MultiExprArg SubExprs, 2617 SourceLocation RParenLoc) { 2618 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2619 } 2620 2621 /// Build a new address-of-label expression. 2622 /// 2623 /// By default, performs semantic analysis, using the name of the label 2624 /// rather than attempting to map the label statement itself. 2625 /// Subclasses may override this routine to provide different behavior. 2626 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2627 SourceLocation LabelLoc, LabelDecl *Label) { 2628 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2629 } 2630 2631 /// Build a new GNU statement expression. 2632 /// 2633 /// By default, performs semantic analysis to build the new expression. 2634 /// Subclasses may override this routine to provide different behavior. 2635 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2636 SourceLocation RParenLoc, unsigned TemplateDepth) { 2637 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2638 TemplateDepth); 2639 } 2640 2641 /// Build a new __builtin_choose_expr 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 RebuildChooseExpr(SourceLocation BuiltinLoc, 2646 Expr *Cond, Expr *LHS, Expr *RHS, 2647 SourceLocation RParenLoc) { 2648 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2649 Cond, LHS, RHS, 2650 RParenLoc); 2651 } 2652 2653 /// Build a new generic selection 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 RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2658 SourceLocation DefaultLoc, 2659 SourceLocation RParenLoc, 2660 Expr *ControllingExpr, 2661 ArrayRef<TypeSourceInfo *> Types, 2662 ArrayRef<Expr *> Exprs) { 2663 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2664 ControllingExpr, Types, Exprs); 2665 } 2666 2667 /// Build a new overloaded operator call expression. 2668 /// 2669 /// By default, performs semantic analysis to build the new expression. 2670 /// The semantic analysis provides the behavior of template instantiation, 2671 /// copying with transformations that turn what looks like an overloaded 2672 /// operator call into a use of a builtin operator, performing 2673 /// argument-dependent lookup, etc. Subclasses may override this routine to 2674 /// provide different behavior. 2675 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2676 SourceLocation OpLoc, 2677 Expr *Callee, 2678 Expr *First, 2679 Expr *Second); 2680 2681 /// Build a new C++ "named" cast expression, such as static_cast or 2682 /// reinterpret_cast. 2683 /// 2684 /// By default, this routine dispatches to one of the more-specific routines 2685 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2686 /// Subclasses may override this routine to provide different behavior. 2687 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2688 Stmt::StmtClass Class, 2689 SourceLocation LAngleLoc, 2690 TypeSourceInfo *TInfo, 2691 SourceLocation RAngleLoc, 2692 SourceLocation LParenLoc, 2693 Expr *SubExpr, 2694 SourceLocation RParenLoc) { 2695 switch (Class) { 2696 case Stmt::CXXStaticCastExprClass: 2697 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2698 RAngleLoc, LParenLoc, 2699 SubExpr, RParenLoc); 2700 2701 case Stmt::CXXDynamicCastExprClass: 2702 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2703 RAngleLoc, LParenLoc, 2704 SubExpr, RParenLoc); 2705 2706 case Stmt::CXXReinterpretCastExprClass: 2707 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2708 RAngleLoc, LParenLoc, 2709 SubExpr, 2710 RParenLoc); 2711 2712 case Stmt::CXXConstCastExprClass: 2713 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2714 RAngleLoc, LParenLoc, 2715 SubExpr, RParenLoc); 2716 2717 default: 2718 llvm_unreachable("Invalid C++ named cast"); 2719 } 2720 } 2721 2722 /// Build a new C++ static_cast 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 RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2727 SourceLocation LAngleLoc, 2728 TypeSourceInfo *TInfo, 2729 SourceLocation RAngleLoc, 2730 SourceLocation LParenLoc, 2731 Expr *SubExpr, 2732 SourceLocation RParenLoc) { 2733 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2734 TInfo, SubExpr, 2735 SourceRange(LAngleLoc, RAngleLoc), 2736 SourceRange(LParenLoc, RParenLoc)); 2737 } 2738 2739 /// Build a new C++ dynamic_cast expression. 2740 /// 2741 /// By default, performs semantic analysis to build the new expression. 2742 /// Subclasses may override this routine to provide different behavior. 2743 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2744 SourceLocation LAngleLoc, 2745 TypeSourceInfo *TInfo, 2746 SourceLocation RAngleLoc, 2747 SourceLocation LParenLoc, 2748 Expr *SubExpr, 2749 SourceLocation RParenLoc) { 2750 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2751 TInfo, SubExpr, 2752 SourceRange(LAngleLoc, RAngleLoc), 2753 SourceRange(LParenLoc, RParenLoc)); 2754 } 2755 2756 /// Build a new C++ reinterpret_cast expression. 2757 /// 2758 /// By default, performs semantic analysis to build the new expression. 2759 /// Subclasses may override this routine to provide different behavior. 2760 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2761 SourceLocation LAngleLoc, 2762 TypeSourceInfo *TInfo, 2763 SourceLocation RAngleLoc, 2764 SourceLocation LParenLoc, 2765 Expr *SubExpr, 2766 SourceLocation RParenLoc) { 2767 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2768 TInfo, SubExpr, 2769 SourceRange(LAngleLoc, RAngleLoc), 2770 SourceRange(LParenLoc, RParenLoc)); 2771 } 2772 2773 /// Build a new C++ const_cast expression. 2774 /// 2775 /// By default, performs semantic analysis to build the new expression. 2776 /// Subclasses may override this routine to provide different behavior. 2777 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2778 SourceLocation LAngleLoc, 2779 TypeSourceInfo *TInfo, 2780 SourceLocation RAngleLoc, 2781 SourceLocation LParenLoc, 2782 Expr *SubExpr, 2783 SourceLocation RParenLoc) { 2784 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2785 TInfo, SubExpr, 2786 SourceRange(LAngleLoc, RAngleLoc), 2787 SourceRange(LParenLoc, RParenLoc)); 2788 } 2789 2790 /// Build a new C++ functional-style cast expression. 2791 /// 2792 /// By default, performs semantic analysis to build the new expression. 2793 /// Subclasses may override this routine to provide different behavior. 2794 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2795 SourceLocation LParenLoc, 2796 Expr *Sub, 2797 SourceLocation RParenLoc, 2798 bool ListInitialization) { 2799 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2800 MultiExprArg(&Sub, 1), RParenLoc, 2801 ListInitialization); 2802 } 2803 2804 /// Build a new C++ __builtin_bit_cast expression. 2805 /// 2806 /// By default, performs semantic analysis to build the new expression. 2807 /// Subclasses may override this routine to provide different behavior. 2808 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2809 TypeSourceInfo *TSI, Expr *Sub, 2810 SourceLocation RParenLoc) { 2811 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2812 } 2813 2814 /// Build a new C++ typeid(type) expression. 2815 /// 2816 /// By default, performs semantic analysis to build the new expression. 2817 /// Subclasses may override this routine to provide different behavior. 2818 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2819 SourceLocation TypeidLoc, 2820 TypeSourceInfo *Operand, 2821 SourceLocation RParenLoc) { 2822 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2823 RParenLoc); 2824 } 2825 2826 2827 /// Build a new C++ typeid(expr) expression. 2828 /// 2829 /// By default, performs semantic analysis to build the new expression. 2830 /// Subclasses may override this routine to provide different behavior. 2831 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2832 SourceLocation TypeidLoc, 2833 Expr *Operand, 2834 SourceLocation RParenLoc) { 2835 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2836 RParenLoc); 2837 } 2838 2839 /// Build a new C++ __uuidof(type) expression. 2840 /// 2841 /// By default, performs semantic analysis to build the new expression. 2842 /// Subclasses may override this routine to provide different behavior. 2843 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2844 TypeSourceInfo *Operand, 2845 SourceLocation RParenLoc) { 2846 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2847 } 2848 2849 /// Build a new C++ __uuidof(expr) 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 RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2854 Expr *Operand, SourceLocation RParenLoc) { 2855 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2856 } 2857 2858 /// Build a new C++ "this" expression. 2859 /// 2860 /// By default, builds a new "this" expression without performing any 2861 /// semantic analysis. Subclasses may override this routine to provide 2862 /// different behavior. 2863 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2864 QualType ThisType, 2865 bool isImplicit) { 2866 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 2867 } 2868 2869 /// Build a new C++ throw expression. 2870 /// 2871 /// By default, performs semantic analysis to build the new expression. 2872 /// Subclasses may override this routine to provide different behavior. 2873 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2874 bool IsThrownVariableInScope) { 2875 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2876 } 2877 2878 /// Build a new C++ default-argument expression. 2879 /// 2880 /// By default, builds a new default-argument expression, which does not 2881 /// require any semantic analysis. Subclasses may override this routine to 2882 /// provide different behavior. 2883 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 2884 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 2885 getSema().CurContext); 2886 } 2887 2888 /// Build a new C++11 default-initialization expression. 2889 /// 2890 /// By default, builds a new default field initialization expression, which 2891 /// does not require any semantic analysis. Subclasses may override this 2892 /// routine to provide different behavior. 2893 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2894 FieldDecl *Field) { 2895 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 2896 getSema().CurContext); 2897 } 2898 2899 /// Build a new C++ zero-initialization expression. 2900 /// 2901 /// By default, performs semantic analysis to build the new expression. 2902 /// Subclasses may override this routine to provide different behavior. 2903 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2904 SourceLocation LParenLoc, 2905 SourceLocation RParenLoc) { 2906 return getSema().BuildCXXTypeConstructExpr( 2907 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2908 } 2909 2910 /// Build a new C++ "new" expression. 2911 /// 2912 /// By default, performs semantic analysis to build the new expression. 2913 /// Subclasses may override this routine to provide different behavior. 2914 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2915 bool UseGlobal, 2916 SourceLocation PlacementLParen, 2917 MultiExprArg PlacementArgs, 2918 SourceLocation PlacementRParen, 2919 SourceRange TypeIdParens, 2920 QualType AllocatedType, 2921 TypeSourceInfo *AllocatedTypeInfo, 2922 Optional<Expr *> ArraySize, 2923 SourceRange DirectInitRange, 2924 Expr *Initializer) { 2925 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2926 PlacementLParen, 2927 PlacementArgs, 2928 PlacementRParen, 2929 TypeIdParens, 2930 AllocatedType, 2931 AllocatedTypeInfo, 2932 ArraySize, 2933 DirectInitRange, 2934 Initializer); 2935 } 2936 2937 /// Build a new C++ "delete" expression. 2938 /// 2939 /// By default, performs semantic analysis to build the new expression. 2940 /// Subclasses may override this routine to provide different behavior. 2941 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2942 bool IsGlobalDelete, 2943 bool IsArrayForm, 2944 Expr *Operand) { 2945 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2946 Operand); 2947 } 2948 2949 /// Build a new type trait expression. 2950 /// 2951 /// By default, performs semantic analysis to build the new expression. 2952 /// Subclasses may override this routine to provide different behavior. 2953 ExprResult RebuildTypeTrait(TypeTrait Trait, 2954 SourceLocation StartLoc, 2955 ArrayRef<TypeSourceInfo *> Args, 2956 SourceLocation RParenLoc) { 2957 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2958 } 2959 2960 /// Build a new array type trait expression. 2961 /// 2962 /// By default, performs semantic analysis to build the new expression. 2963 /// Subclasses may override this routine to provide different behavior. 2964 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2965 SourceLocation StartLoc, 2966 TypeSourceInfo *TSInfo, 2967 Expr *DimExpr, 2968 SourceLocation RParenLoc) { 2969 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2970 } 2971 2972 /// Build a new expression trait expression. 2973 /// 2974 /// By default, performs semantic analysis to build the new expression. 2975 /// Subclasses may override this routine to provide different behavior. 2976 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2977 SourceLocation StartLoc, 2978 Expr *Queried, 2979 SourceLocation RParenLoc) { 2980 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2981 } 2982 2983 /// Build a new (previously unresolved) declaration reference 2984 /// expression. 2985 /// 2986 /// By default, performs semantic analysis to build the new expression. 2987 /// Subclasses may override this routine to provide different behavior. 2988 ExprResult RebuildDependentScopeDeclRefExpr( 2989 NestedNameSpecifierLoc QualifierLoc, 2990 SourceLocation TemplateKWLoc, 2991 const DeclarationNameInfo &NameInfo, 2992 const TemplateArgumentListInfo *TemplateArgs, 2993 bool IsAddressOfOperand, 2994 TypeSourceInfo **RecoveryTSI) { 2995 CXXScopeSpec SS; 2996 SS.Adopt(QualifierLoc); 2997 2998 if (TemplateArgs || TemplateKWLoc.isValid()) 2999 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3000 TemplateArgs); 3001 3002 return getSema().BuildQualifiedDeclarationNameExpr( 3003 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3004 } 3005 3006 /// Build a new template-id 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 RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3011 SourceLocation TemplateKWLoc, 3012 LookupResult &R, 3013 bool RequiresADL, 3014 const TemplateArgumentListInfo *TemplateArgs) { 3015 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3016 TemplateArgs); 3017 } 3018 3019 /// Build a new object-construction expression. 3020 /// 3021 /// By default, performs semantic analysis to build the new expression. 3022 /// Subclasses may override this routine to provide different behavior. 3023 ExprResult RebuildCXXConstructExpr(QualType T, 3024 SourceLocation Loc, 3025 CXXConstructorDecl *Constructor, 3026 bool IsElidable, 3027 MultiExprArg Args, 3028 bool HadMultipleCandidates, 3029 bool ListInitialization, 3030 bool StdInitListInitialization, 3031 bool RequiresZeroInit, 3032 CXXConstructExpr::ConstructionKind ConstructKind, 3033 SourceRange ParenRange) { 3034 // Reconstruct the constructor we originally found, which might be 3035 // different if this is a call to an inherited constructor. 3036 CXXConstructorDecl *FoundCtor = Constructor; 3037 if (Constructor->isInheritingConstructor()) 3038 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3039 3040 SmallVector<Expr*, 8> ConvertedArgs; 3041 if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs)) 3042 return ExprError(); 3043 3044 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3045 IsElidable, 3046 ConvertedArgs, 3047 HadMultipleCandidates, 3048 ListInitialization, 3049 StdInitListInitialization, 3050 RequiresZeroInit, ConstructKind, 3051 ParenRange); 3052 } 3053 3054 /// Build a new implicit construction via inherited constructor 3055 /// expression. 3056 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3057 CXXConstructorDecl *Constructor, 3058 bool ConstructsVBase, 3059 bool InheritedFromVBase) { 3060 return new (getSema().Context) CXXInheritedCtorInitExpr( 3061 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3062 } 3063 3064 /// Build a new object-construction expression. 3065 /// 3066 /// By default, performs semantic analysis to build the new expression. 3067 /// Subclasses may override this routine to provide different behavior. 3068 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3069 SourceLocation LParenOrBraceLoc, 3070 MultiExprArg Args, 3071 SourceLocation RParenOrBraceLoc, 3072 bool ListInitialization) { 3073 return getSema().BuildCXXTypeConstructExpr( 3074 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3075 } 3076 3077 /// Build a new object-construction expression. 3078 /// 3079 /// By default, performs semantic analysis to build the new expression. 3080 /// Subclasses may override this routine to provide different behavior. 3081 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3082 SourceLocation LParenLoc, 3083 MultiExprArg Args, 3084 SourceLocation RParenLoc, 3085 bool ListInitialization) { 3086 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3087 RParenLoc, ListInitialization); 3088 } 3089 3090 /// Build a new member reference expression. 3091 /// 3092 /// By default, performs semantic analysis to build the new expression. 3093 /// Subclasses may override this routine to provide different behavior. 3094 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3095 QualType BaseType, 3096 bool IsArrow, 3097 SourceLocation OperatorLoc, 3098 NestedNameSpecifierLoc QualifierLoc, 3099 SourceLocation TemplateKWLoc, 3100 NamedDecl *FirstQualifierInScope, 3101 const DeclarationNameInfo &MemberNameInfo, 3102 const TemplateArgumentListInfo *TemplateArgs) { 3103 CXXScopeSpec SS; 3104 SS.Adopt(QualifierLoc); 3105 3106 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3107 OperatorLoc, IsArrow, 3108 SS, TemplateKWLoc, 3109 FirstQualifierInScope, 3110 MemberNameInfo, 3111 TemplateArgs, /*S*/nullptr); 3112 } 3113 3114 /// Build a new member reference expression. 3115 /// 3116 /// By default, performs semantic analysis to build the new expression. 3117 /// Subclasses may override this routine to provide different behavior. 3118 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3119 SourceLocation OperatorLoc, 3120 bool IsArrow, 3121 NestedNameSpecifierLoc QualifierLoc, 3122 SourceLocation TemplateKWLoc, 3123 NamedDecl *FirstQualifierInScope, 3124 LookupResult &R, 3125 const TemplateArgumentListInfo *TemplateArgs) { 3126 CXXScopeSpec SS; 3127 SS.Adopt(QualifierLoc); 3128 3129 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3130 OperatorLoc, IsArrow, 3131 SS, TemplateKWLoc, 3132 FirstQualifierInScope, 3133 R, TemplateArgs, /*S*/nullptr); 3134 } 3135 3136 /// Build a new noexcept expression. 3137 /// 3138 /// By default, performs semantic analysis to build the new expression. 3139 /// Subclasses may override this routine to provide different behavior. 3140 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3141 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3142 } 3143 3144 /// Build a new expression to compute the length of a parameter pack. 3145 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3146 NamedDecl *Pack, 3147 SourceLocation PackLoc, 3148 SourceLocation RParenLoc, 3149 Optional<unsigned> Length, 3150 ArrayRef<TemplateArgument> PartialArgs) { 3151 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3152 RParenLoc, Length, PartialArgs); 3153 } 3154 3155 /// Build a new expression representing a call to a source location 3156 /// builtin. 3157 /// 3158 /// By default, performs semantic analysis to build the new expression. 3159 /// Subclasses may override this routine to provide different behavior. 3160 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3161 SourceLocation BuiltinLoc, 3162 SourceLocation RPLoc, 3163 DeclContext *ParentContext) { 3164 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3165 } 3166 3167 /// Build a new Objective-C boxed expression. 3168 /// 3169 /// By default, performs semantic analysis to build the new expression. 3170 /// Subclasses may override this routine to provide different behavior. 3171 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3172 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3173 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3174 TemplateArgumentListInfo *TALI) { 3175 CXXScopeSpec SS; 3176 SS.Adopt(NNS); 3177 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3178 ConceptNameInfo, 3179 FoundDecl, 3180 NamedConcept, TALI); 3181 if (Result.isInvalid()) 3182 return ExprError(); 3183 return Result; 3184 } 3185 3186 /// \brief Build a new requires expression. 3187 /// 3188 /// By default, performs semantic analysis to build the new expression. 3189 /// Subclasses may override this routine to provide different behavior. 3190 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3191 RequiresExprBodyDecl *Body, 3192 ArrayRef<ParmVarDecl *> LocalParameters, 3193 ArrayRef<concepts::Requirement *> Requirements, 3194 SourceLocation ClosingBraceLoc) { 3195 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3196 LocalParameters, Requirements, ClosingBraceLoc); 3197 } 3198 3199 concepts::TypeRequirement * 3200 RebuildTypeRequirement( 3201 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3202 return SemaRef.BuildTypeRequirement(SubstDiag); 3203 } 3204 3205 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3206 return SemaRef.BuildTypeRequirement(T); 3207 } 3208 3209 concepts::ExprRequirement * 3210 RebuildExprRequirement( 3211 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3212 SourceLocation NoexceptLoc, 3213 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3214 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3215 std::move(Ret)); 3216 } 3217 3218 concepts::ExprRequirement * 3219 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3220 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3221 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3222 std::move(Ret)); 3223 } 3224 3225 concepts::NestedRequirement * 3226 RebuildNestedRequirement( 3227 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3228 return SemaRef.BuildNestedRequirement(SubstDiag); 3229 } 3230 3231 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3232 return SemaRef.BuildNestedRequirement(Constraint); 3233 } 3234 3235 /// \brief Build a new Objective-C boxed expression. 3236 /// 3237 /// By default, performs semantic analysis to build the new expression. 3238 /// Subclasses may override this routine to provide different behavior. 3239 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3240 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3241 } 3242 3243 /// Build a new Objective-C array literal. 3244 /// 3245 /// By default, performs semantic analysis to build the new expression. 3246 /// Subclasses may override this routine to provide different behavior. 3247 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3248 Expr **Elements, unsigned NumElements) { 3249 return getSema().BuildObjCArrayLiteral(Range, 3250 MultiExprArg(Elements, NumElements)); 3251 } 3252 3253 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3254 Expr *Base, Expr *Key, 3255 ObjCMethodDecl *getterMethod, 3256 ObjCMethodDecl *setterMethod) { 3257 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3258 getterMethod, setterMethod); 3259 } 3260 3261 /// Build a new Objective-C dictionary literal. 3262 /// 3263 /// By default, performs semantic analysis to build the new expression. 3264 /// Subclasses may override this routine to provide different behavior. 3265 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3266 MutableArrayRef<ObjCDictionaryElement> Elements) { 3267 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3268 } 3269 3270 /// Build a new Objective-C \@encode expression. 3271 /// 3272 /// By default, performs semantic analysis to build the new expression. 3273 /// Subclasses may override this routine to provide different behavior. 3274 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3275 TypeSourceInfo *EncodeTypeInfo, 3276 SourceLocation RParenLoc) { 3277 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3278 } 3279 3280 /// Build a new Objective-C class message. 3281 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3282 Selector Sel, 3283 ArrayRef<SourceLocation> SelectorLocs, 3284 ObjCMethodDecl *Method, 3285 SourceLocation LBracLoc, 3286 MultiExprArg Args, 3287 SourceLocation RBracLoc) { 3288 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3289 ReceiverTypeInfo->getType(), 3290 /*SuperLoc=*/SourceLocation(), 3291 Sel, Method, LBracLoc, SelectorLocs, 3292 RBracLoc, Args); 3293 } 3294 3295 /// Build a new Objective-C instance message. 3296 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3297 Selector Sel, 3298 ArrayRef<SourceLocation> SelectorLocs, 3299 ObjCMethodDecl *Method, 3300 SourceLocation LBracLoc, 3301 MultiExprArg Args, 3302 SourceLocation RBracLoc) { 3303 return SemaRef.BuildInstanceMessage(Receiver, 3304 Receiver->getType(), 3305 /*SuperLoc=*/SourceLocation(), 3306 Sel, Method, LBracLoc, SelectorLocs, 3307 RBracLoc, Args); 3308 } 3309 3310 /// Build a new Objective-C instance/class message to 'super'. 3311 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3312 Selector Sel, 3313 ArrayRef<SourceLocation> SelectorLocs, 3314 QualType SuperType, 3315 ObjCMethodDecl *Method, 3316 SourceLocation LBracLoc, 3317 MultiExprArg Args, 3318 SourceLocation RBracLoc) { 3319 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3320 SuperType, 3321 SuperLoc, 3322 Sel, Method, LBracLoc, SelectorLocs, 3323 RBracLoc, Args) 3324 : SemaRef.BuildClassMessage(nullptr, 3325 SuperType, 3326 SuperLoc, 3327 Sel, Method, LBracLoc, SelectorLocs, 3328 RBracLoc, Args); 3329 3330 3331 } 3332 3333 /// Build a new Objective-C ivar reference expression. 3334 /// 3335 /// By default, performs semantic analysis to build the new expression. 3336 /// Subclasses may override this routine to provide different behavior. 3337 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3338 SourceLocation IvarLoc, 3339 bool IsArrow, bool IsFreeIvar) { 3340 CXXScopeSpec SS; 3341 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3342 ExprResult Result = getSema().BuildMemberReferenceExpr( 3343 BaseArg, BaseArg->getType(), 3344 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3345 /*FirstQualifierInScope=*/nullptr, NameInfo, 3346 /*TemplateArgs=*/nullptr, 3347 /*S=*/nullptr); 3348 if (IsFreeIvar && Result.isUsable()) 3349 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3350 return Result; 3351 } 3352 3353 /// Build a new Objective-C property reference expression. 3354 /// 3355 /// By default, performs semantic analysis to build the new expression. 3356 /// Subclasses may override this routine to provide different behavior. 3357 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3358 ObjCPropertyDecl *Property, 3359 SourceLocation PropertyLoc) { 3360 CXXScopeSpec SS; 3361 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3362 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3363 /*FIXME:*/PropertyLoc, 3364 /*IsArrow=*/false, 3365 SS, SourceLocation(), 3366 /*FirstQualifierInScope=*/nullptr, 3367 NameInfo, 3368 /*TemplateArgs=*/nullptr, 3369 /*S=*/nullptr); 3370 } 3371 3372 /// Build a new Objective-C property reference expression. 3373 /// 3374 /// By default, performs semantic analysis to build the new expression. 3375 /// Subclasses may override this routine to provide different behavior. 3376 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3377 ObjCMethodDecl *Getter, 3378 ObjCMethodDecl *Setter, 3379 SourceLocation PropertyLoc) { 3380 // Since these expressions can only be value-dependent, we do not 3381 // need to perform semantic analysis again. 3382 return Owned( 3383 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3384 VK_LValue, OK_ObjCProperty, 3385 PropertyLoc, Base)); 3386 } 3387 3388 /// Build a new Objective-C "isa" expression. 3389 /// 3390 /// By default, performs semantic analysis to build the new expression. 3391 /// Subclasses may override this routine to provide different behavior. 3392 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3393 SourceLocation OpLoc, bool IsArrow) { 3394 CXXScopeSpec SS; 3395 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3396 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3397 OpLoc, IsArrow, 3398 SS, SourceLocation(), 3399 /*FirstQualifierInScope=*/nullptr, 3400 NameInfo, 3401 /*TemplateArgs=*/nullptr, 3402 /*S=*/nullptr); 3403 } 3404 3405 /// Build a new shuffle vector expression. 3406 /// 3407 /// By default, performs semantic analysis to build the new expression. 3408 /// Subclasses may override this routine to provide different behavior. 3409 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3410 MultiExprArg SubExprs, 3411 SourceLocation RParenLoc) { 3412 // Find the declaration for __builtin_shufflevector 3413 const IdentifierInfo &Name 3414 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3415 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3416 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3417 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3418 3419 // Build a reference to the __builtin_shufflevector builtin 3420 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3421 Expr *Callee = new (SemaRef.Context) 3422 DeclRefExpr(SemaRef.Context, Builtin, false, 3423 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3424 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3425 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3426 CK_BuiltinFnToFnPtr).get(); 3427 3428 // Build the CallExpr 3429 ExprResult TheCall = CallExpr::Create( 3430 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3431 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3432 3433 // Type-check the __builtin_shufflevector expression. 3434 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3435 } 3436 3437 /// Build a new convert vector expression. 3438 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3439 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3440 SourceLocation RParenLoc) { 3441 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3442 BuiltinLoc, RParenLoc); 3443 } 3444 3445 /// Build a new template argument pack expansion. 3446 /// 3447 /// By default, performs semantic analysis to build a new pack expansion 3448 /// for a template argument. Subclasses may override this routine to provide 3449 /// different behavior. 3450 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3451 SourceLocation EllipsisLoc, 3452 Optional<unsigned> NumExpansions) { 3453 switch (Pattern.getArgument().getKind()) { 3454 case TemplateArgument::Expression: { 3455 ExprResult Result 3456 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3457 EllipsisLoc, NumExpansions); 3458 if (Result.isInvalid()) 3459 return TemplateArgumentLoc(); 3460 3461 return TemplateArgumentLoc(Result.get(), Result.get()); 3462 } 3463 3464 case TemplateArgument::Template: 3465 return TemplateArgumentLoc(TemplateArgument( 3466 Pattern.getArgument().getAsTemplate(), 3467 NumExpansions), 3468 Pattern.getTemplateQualifierLoc(), 3469 Pattern.getTemplateNameLoc(), 3470 EllipsisLoc); 3471 3472 case TemplateArgument::Null: 3473 case TemplateArgument::Integral: 3474 case TemplateArgument::Declaration: 3475 case TemplateArgument::Pack: 3476 case TemplateArgument::TemplateExpansion: 3477 case TemplateArgument::NullPtr: 3478 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3479 3480 case TemplateArgument::Type: 3481 if (TypeSourceInfo *Expansion 3482 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3483 EllipsisLoc, 3484 NumExpansions)) 3485 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3486 Expansion); 3487 break; 3488 } 3489 3490 return TemplateArgumentLoc(); 3491 } 3492 3493 /// Build a new expression pack expansion. 3494 /// 3495 /// By default, performs semantic analysis to build a new pack expansion 3496 /// for an expression. Subclasses may override this routine to provide 3497 /// different behavior. 3498 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3499 Optional<unsigned> NumExpansions) { 3500 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3501 } 3502 3503 /// Build a new C++1z fold-expression. 3504 /// 3505 /// By default, performs semantic analysis in order to build a new fold 3506 /// expression. 3507 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3508 BinaryOperatorKind Operator, 3509 SourceLocation EllipsisLoc, Expr *RHS, 3510 SourceLocation RParenLoc, 3511 Optional<unsigned> NumExpansions) { 3512 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3513 RHS, RParenLoc, NumExpansions); 3514 } 3515 3516 /// Build an empty C++1z fold-expression with the given operator. 3517 /// 3518 /// By default, produces the fallback value for the fold-expression, or 3519 /// produce an error if there is no fallback value. 3520 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3521 BinaryOperatorKind Operator) { 3522 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3523 } 3524 3525 /// Build a new atomic operation expression. 3526 /// 3527 /// By default, performs semantic analysis to build the new expression. 3528 /// Subclasses may override this routine to provide different behavior. 3529 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3530 AtomicExpr::AtomicOp Op, 3531 SourceLocation RParenLoc) { 3532 // Use this for all of the locations, since we don't know the difference 3533 // between the call and the expr at this point. 3534 SourceRange Range{BuiltinLoc, RParenLoc}; 3535 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3536 Sema::AtomicArgumentOrder::AST); 3537 } 3538 3539 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3540 ArrayRef<Expr *> SubExprs) { 3541 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs); 3542 } 3543 3544 private: 3545 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3546 QualType ObjectType, 3547 NamedDecl *FirstQualifierInScope, 3548 CXXScopeSpec &SS); 3549 3550 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3551 QualType ObjectType, 3552 NamedDecl *FirstQualifierInScope, 3553 CXXScopeSpec &SS); 3554 3555 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3556 NamedDecl *FirstQualifierInScope, 3557 CXXScopeSpec &SS); 3558 3559 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3560 DependentNameTypeLoc TL, 3561 bool DeducibleTSTContext); 3562 }; 3563 3564 template <typename Derived> 3565 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3566 if (!S) 3567 return S; 3568 3569 switch (S->getStmtClass()) { 3570 case Stmt::NoStmtClass: break; 3571 3572 // Transform individual statement nodes 3573 // Pass SDK into statements that can produce a value 3574 #define STMT(Node, Parent) \ 3575 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3576 #define VALUESTMT(Node, Parent) \ 3577 case Stmt::Node##Class: \ 3578 return getDerived().Transform##Node(cast<Node>(S), SDK); 3579 #define ABSTRACT_STMT(Node) 3580 #define EXPR(Node, Parent) 3581 #include "clang/AST/StmtNodes.inc" 3582 3583 // Transform expressions by calling TransformExpr. 3584 #define STMT(Node, Parent) 3585 #define ABSTRACT_STMT(Stmt) 3586 #define EXPR(Node, Parent) case Stmt::Node##Class: 3587 #include "clang/AST/StmtNodes.inc" 3588 { 3589 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3590 3591 if (SDK == SDK_StmtExprResult) 3592 E = getSema().ActOnStmtExprResult(E); 3593 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3594 } 3595 } 3596 3597 return S; 3598 } 3599 3600 template<typename Derived> 3601 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3602 if (!S) 3603 return S; 3604 3605 switch (S->getClauseKind()) { 3606 default: break; 3607 // Transform individual clause nodes 3608 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 3609 case Enum: \ 3610 return getDerived().Transform ## Class(cast<Class>(S)); 3611 #include "llvm/Frontend/OpenMP/OMPKinds.def" 3612 } 3613 3614 return S; 3615 } 3616 3617 3618 template<typename Derived> 3619 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3620 if (!E) 3621 return E; 3622 3623 switch (E->getStmtClass()) { 3624 case Stmt::NoStmtClass: break; 3625 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3626 #define ABSTRACT_STMT(Stmt) 3627 #define EXPR(Node, Parent) \ 3628 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3629 #include "clang/AST/StmtNodes.inc" 3630 } 3631 3632 return E; 3633 } 3634 3635 template<typename Derived> 3636 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3637 bool NotCopyInit) { 3638 // Initializers are instantiated like expressions, except that various outer 3639 // layers are stripped. 3640 if (!Init) 3641 return Init; 3642 3643 if (auto *FE = dyn_cast<FullExpr>(Init)) 3644 Init = FE->getSubExpr(); 3645 3646 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3647 Init = AIL->getCommonExpr(); 3648 3649 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3650 Init = MTE->getSubExpr(); 3651 3652 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3653 Init = Binder->getSubExpr(); 3654 3655 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3656 Init = ICE->getSubExprAsWritten(); 3657 3658 if (CXXStdInitializerListExpr *ILE = 3659 dyn_cast<CXXStdInitializerListExpr>(Init)) 3660 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3661 3662 // If this is copy-initialization, we only need to reconstruct 3663 // InitListExprs. Other forms of copy-initialization will be a no-op if 3664 // the initializer is already the right type. 3665 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3666 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3667 return getDerived().TransformExpr(Init); 3668 3669 // Revert value-initialization back to empty parens. 3670 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3671 SourceRange Parens = VIE->getSourceRange(); 3672 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3673 Parens.getEnd()); 3674 } 3675 3676 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3677 if (isa<ImplicitValueInitExpr>(Init)) 3678 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3679 SourceLocation()); 3680 3681 // Revert initialization by constructor back to a parenthesized or braced list 3682 // of expressions. Any other form of initializer can just be reused directly. 3683 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3684 return getDerived().TransformExpr(Init); 3685 3686 // If the initialization implicitly converted an initializer list to a 3687 // std::initializer_list object, unwrap the std::initializer_list too. 3688 if (Construct && Construct->isStdInitListInitialization()) 3689 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3690 3691 // Enter a list-init context if this was list initialization. 3692 EnterExpressionEvaluationContext Context( 3693 getSema(), EnterExpressionEvaluationContext::InitList, 3694 Construct->isListInitialization()); 3695 3696 SmallVector<Expr*, 8> NewArgs; 3697 bool ArgChanged = false; 3698 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3699 /*IsCall*/true, NewArgs, &ArgChanged)) 3700 return ExprError(); 3701 3702 // If this was list initialization, revert to syntactic list form. 3703 if (Construct->isListInitialization()) 3704 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3705 Construct->getEndLoc()); 3706 3707 // Build a ParenListExpr to represent anything else. 3708 SourceRange Parens = Construct->getParenOrBraceRange(); 3709 if (Parens.isInvalid()) { 3710 // This was a variable declaration's initialization for which no initializer 3711 // was specified. 3712 assert(NewArgs.empty() && 3713 "no parens or braces but have direct init with arguments?"); 3714 return ExprEmpty(); 3715 } 3716 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3717 Parens.getEnd()); 3718 } 3719 3720 template<typename Derived> 3721 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3722 unsigned NumInputs, 3723 bool IsCall, 3724 SmallVectorImpl<Expr *> &Outputs, 3725 bool *ArgChanged) { 3726 for (unsigned I = 0; I != NumInputs; ++I) { 3727 // If requested, drop call arguments that need to be dropped. 3728 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3729 if (ArgChanged) 3730 *ArgChanged = true; 3731 3732 break; 3733 } 3734 3735 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3736 Expr *Pattern = Expansion->getPattern(); 3737 3738 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3739 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3740 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3741 3742 // Determine whether the set of unexpanded parameter packs can and should 3743 // be expanded. 3744 bool Expand = true; 3745 bool RetainExpansion = false; 3746 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3747 Optional<unsigned> NumExpansions = OrigNumExpansions; 3748 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3749 Pattern->getSourceRange(), 3750 Unexpanded, 3751 Expand, RetainExpansion, 3752 NumExpansions)) 3753 return true; 3754 3755 if (!Expand) { 3756 // The transform has determined that we should perform a simple 3757 // transformation on the pack expansion, producing another pack 3758 // expansion. 3759 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3760 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3761 if (OutPattern.isInvalid()) 3762 return true; 3763 3764 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3765 Expansion->getEllipsisLoc(), 3766 NumExpansions); 3767 if (Out.isInvalid()) 3768 return true; 3769 3770 if (ArgChanged) 3771 *ArgChanged = true; 3772 Outputs.push_back(Out.get()); 3773 continue; 3774 } 3775 3776 // Record right away that the argument was changed. This needs 3777 // to happen even if the array expands to nothing. 3778 if (ArgChanged) *ArgChanged = true; 3779 3780 // The transform has determined that we should perform an elementwise 3781 // expansion of the pattern. Do so. 3782 for (unsigned I = 0; I != *NumExpansions; ++I) { 3783 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3784 ExprResult Out = getDerived().TransformExpr(Pattern); 3785 if (Out.isInvalid()) 3786 return true; 3787 3788 if (Out.get()->containsUnexpandedParameterPack()) { 3789 Out = getDerived().RebuildPackExpansion( 3790 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3791 if (Out.isInvalid()) 3792 return true; 3793 } 3794 3795 Outputs.push_back(Out.get()); 3796 } 3797 3798 // If we're supposed to retain a pack expansion, do so by temporarily 3799 // forgetting the partially-substituted parameter pack. 3800 if (RetainExpansion) { 3801 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3802 3803 ExprResult Out = getDerived().TransformExpr(Pattern); 3804 if (Out.isInvalid()) 3805 return true; 3806 3807 Out = getDerived().RebuildPackExpansion( 3808 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3809 if (Out.isInvalid()) 3810 return true; 3811 3812 Outputs.push_back(Out.get()); 3813 } 3814 3815 continue; 3816 } 3817 3818 ExprResult Result = 3819 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3820 : getDerived().TransformExpr(Inputs[I]); 3821 if (Result.isInvalid()) 3822 return true; 3823 3824 if (Result.get() != Inputs[I] && ArgChanged) 3825 *ArgChanged = true; 3826 3827 Outputs.push_back(Result.get()); 3828 } 3829 3830 return false; 3831 } 3832 3833 template <typename Derived> 3834 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3835 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3836 if (Var) { 3837 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3838 getDerived().TransformDefinition(Var->getLocation(), Var)); 3839 3840 if (!ConditionVar) 3841 return Sema::ConditionError(); 3842 3843 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3844 } 3845 3846 if (Expr) { 3847 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3848 3849 if (CondExpr.isInvalid()) 3850 return Sema::ConditionError(); 3851 3852 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3853 } 3854 3855 return Sema::ConditionResult(); 3856 } 3857 3858 template<typename Derived> 3859 NestedNameSpecifierLoc 3860 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3861 NestedNameSpecifierLoc NNS, 3862 QualType ObjectType, 3863 NamedDecl *FirstQualifierInScope) { 3864 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3865 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3866 Qualifier = Qualifier.getPrefix()) 3867 Qualifiers.push_back(Qualifier); 3868 3869 CXXScopeSpec SS; 3870 while (!Qualifiers.empty()) { 3871 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3872 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3873 3874 switch (QNNS->getKind()) { 3875 case NestedNameSpecifier::Identifier: { 3876 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3877 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3878 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3879 SS, FirstQualifierInScope, false)) 3880 return NestedNameSpecifierLoc(); 3881 } 3882 break; 3883 3884 case NestedNameSpecifier::Namespace: { 3885 NamespaceDecl *NS 3886 = cast_or_null<NamespaceDecl>( 3887 getDerived().TransformDecl( 3888 Q.getLocalBeginLoc(), 3889 QNNS->getAsNamespace())); 3890 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3891 break; 3892 } 3893 3894 case NestedNameSpecifier::NamespaceAlias: { 3895 NamespaceAliasDecl *Alias 3896 = cast_or_null<NamespaceAliasDecl>( 3897 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3898 QNNS->getAsNamespaceAlias())); 3899 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3900 Q.getLocalEndLoc()); 3901 break; 3902 } 3903 3904 case NestedNameSpecifier::Global: 3905 // There is no meaningful transformation that one could perform on the 3906 // global scope. 3907 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3908 break; 3909 3910 case NestedNameSpecifier::Super: { 3911 CXXRecordDecl *RD = 3912 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3913 SourceLocation(), QNNS->getAsRecordDecl())); 3914 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3915 break; 3916 } 3917 3918 case NestedNameSpecifier::TypeSpecWithTemplate: 3919 case NestedNameSpecifier::TypeSpec: { 3920 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3921 FirstQualifierInScope, SS); 3922 3923 if (!TL) 3924 return NestedNameSpecifierLoc(); 3925 3926 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3927 (SemaRef.getLangOpts().CPlusPlus11 && 3928 TL.getType()->isEnumeralType())) { 3929 assert(!TL.getType().hasLocalQualifiers() && 3930 "Can't get cv-qualifiers here"); 3931 if (TL.getType()->isEnumeralType()) 3932 SemaRef.Diag(TL.getBeginLoc(), 3933 diag::warn_cxx98_compat_enum_nested_name_spec); 3934 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3935 Q.getLocalEndLoc()); 3936 break; 3937 } 3938 // If the nested-name-specifier is an invalid type def, don't emit an 3939 // error because a previous error should have already been emitted. 3940 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3941 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3942 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3943 << TL.getType() << SS.getRange(); 3944 } 3945 return NestedNameSpecifierLoc(); 3946 } 3947 } 3948 3949 // The qualifier-in-scope and object type only apply to the leftmost entity. 3950 FirstQualifierInScope = nullptr; 3951 ObjectType = QualType(); 3952 } 3953 3954 // Don't rebuild the nested-name-specifier if we don't have to. 3955 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3956 !getDerived().AlwaysRebuild()) 3957 return NNS; 3958 3959 // If we can re-use the source-location data from the original 3960 // nested-name-specifier, do so. 3961 if (SS.location_size() == NNS.getDataLength() && 3962 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3963 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3964 3965 // Allocate new nested-name-specifier location information. 3966 return SS.getWithLocInContext(SemaRef.Context); 3967 } 3968 3969 template<typename Derived> 3970 DeclarationNameInfo 3971 TreeTransform<Derived> 3972 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3973 DeclarationName Name = NameInfo.getName(); 3974 if (!Name) 3975 return DeclarationNameInfo(); 3976 3977 switch (Name.getNameKind()) { 3978 case DeclarationName::Identifier: 3979 case DeclarationName::ObjCZeroArgSelector: 3980 case DeclarationName::ObjCOneArgSelector: 3981 case DeclarationName::ObjCMultiArgSelector: 3982 case DeclarationName::CXXOperatorName: 3983 case DeclarationName::CXXLiteralOperatorName: 3984 case DeclarationName::CXXUsingDirective: 3985 return NameInfo; 3986 3987 case DeclarationName::CXXDeductionGuideName: { 3988 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3989 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3990 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3991 if (!NewTemplate) 3992 return DeclarationNameInfo(); 3993 3994 DeclarationNameInfo NewNameInfo(NameInfo); 3995 NewNameInfo.setName( 3996 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3997 return NewNameInfo; 3998 } 3999 4000 case DeclarationName::CXXConstructorName: 4001 case DeclarationName::CXXDestructorName: 4002 case DeclarationName::CXXConversionFunctionName: { 4003 TypeSourceInfo *NewTInfo; 4004 CanQualType NewCanTy; 4005 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4006 NewTInfo = getDerived().TransformType(OldTInfo); 4007 if (!NewTInfo) 4008 return DeclarationNameInfo(); 4009 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4010 } 4011 else { 4012 NewTInfo = nullptr; 4013 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4014 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4015 if (NewT.isNull()) 4016 return DeclarationNameInfo(); 4017 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4018 } 4019 4020 DeclarationName NewName 4021 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4022 NewCanTy); 4023 DeclarationNameInfo NewNameInfo(NameInfo); 4024 NewNameInfo.setName(NewName); 4025 NewNameInfo.setNamedTypeInfo(NewTInfo); 4026 return NewNameInfo; 4027 } 4028 } 4029 4030 llvm_unreachable("Unknown name kind."); 4031 } 4032 4033 template<typename Derived> 4034 TemplateName 4035 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4036 TemplateName Name, 4037 SourceLocation NameLoc, 4038 QualType ObjectType, 4039 NamedDecl *FirstQualifierInScope, 4040 bool AllowInjectedClassName) { 4041 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4042 TemplateDecl *Template = QTN->getTemplateDecl(); 4043 assert(Template && "qualified template name must refer to a template"); 4044 4045 TemplateDecl *TransTemplate 4046 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4047 Template)); 4048 if (!TransTemplate) 4049 return TemplateName(); 4050 4051 if (!getDerived().AlwaysRebuild() && 4052 SS.getScopeRep() == QTN->getQualifier() && 4053 TransTemplate == Template) 4054 return Name; 4055 4056 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4057 TransTemplate); 4058 } 4059 4060 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4061 if (SS.getScopeRep()) { 4062 // These apply to the scope specifier, not the template. 4063 ObjectType = QualType(); 4064 FirstQualifierInScope = nullptr; 4065 } 4066 4067 if (!getDerived().AlwaysRebuild() && 4068 SS.getScopeRep() == DTN->getQualifier() && 4069 ObjectType.isNull()) 4070 return Name; 4071 4072 // FIXME: Preserve the location of the "template" keyword. 4073 SourceLocation TemplateKWLoc = NameLoc; 4074 4075 if (DTN->isIdentifier()) { 4076 return getDerived().RebuildTemplateName(SS, 4077 TemplateKWLoc, 4078 *DTN->getIdentifier(), 4079 NameLoc, 4080 ObjectType, 4081 FirstQualifierInScope, 4082 AllowInjectedClassName); 4083 } 4084 4085 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4086 DTN->getOperator(), NameLoc, 4087 ObjectType, AllowInjectedClassName); 4088 } 4089 4090 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4091 TemplateDecl *TransTemplate 4092 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4093 Template)); 4094 if (!TransTemplate) 4095 return TemplateName(); 4096 4097 if (!getDerived().AlwaysRebuild() && 4098 TransTemplate == Template) 4099 return Name; 4100 4101 return TemplateName(TransTemplate); 4102 } 4103 4104 if (SubstTemplateTemplateParmPackStorage *SubstPack 4105 = Name.getAsSubstTemplateTemplateParmPack()) { 4106 TemplateTemplateParmDecl *TransParam 4107 = cast_or_null<TemplateTemplateParmDecl>( 4108 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4109 if (!TransParam) 4110 return TemplateName(); 4111 4112 if (!getDerived().AlwaysRebuild() && 4113 TransParam == SubstPack->getParameterPack()) 4114 return Name; 4115 4116 return getDerived().RebuildTemplateName(TransParam, 4117 SubstPack->getArgumentPack()); 4118 } 4119 4120 // These should be getting filtered out before they reach the AST. 4121 llvm_unreachable("overloaded function decl survived to here"); 4122 } 4123 4124 template<typename Derived> 4125 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4126 const TemplateArgument &Arg, 4127 TemplateArgumentLoc &Output) { 4128 Output = getSema().getTrivialTemplateArgumentLoc( 4129 Arg, QualType(), getDerived().getBaseLocation()); 4130 } 4131 4132 template<typename Derived> 4133 bool TreeTransform<Derived>::TransformTemplateArgument( 4134 const TemplateArgumentLoc &Input, 4135 TemplateArgumentLoc &Output, bool Uneval) { 4136 const TemplateArgument &Arg = Input.getArgument(); 4137 switch (Arg.getKind()) { 4138 case TemplateArgument::Null: 4139 case TemplateArgument::Pack: 4140 llvm_unreachable("Unexpected TemplateArgument"); 4141 4142 case TemplateArgument::Integral: 4143 case TemplateArgument::NullPtr: 4144 case TemplateArgument::Declaration: { 4145 // Transform a resolved template argument straight to a resolved template 4146 // argument. We get here when substituting into an already-substituted 4147 // template type argument during concept satisfaction checking. 4148 QualType T = Arg.getNonTypeTemplateArgumentType(); 4149 QualType NewT = getDerived().TransformType(T); 4150 if (NewT.isNull()) 4151 return true; 4152 4153 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4154 ? Arg.getAsDecl() 4155 : nullptr; 4156 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4157 getDerived().getBaseLocation(), D)) 4158 : nullptr; 4159 if (D && !NewD) 4160 return true; 4161 4162 if (NewT == T && D == NewD) 4163 Output = Input; 4164 else if (Arg.getKind() == TemplateArgument::Integral) 4165 Output = TemplateArgumentLoc( 4166 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4167 TemplateArgumentLocInfo()); 4168 else if (Arg.getKind() == TemplateArgument::NullPtr) 4169 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4170 TemplateArgumentLocInfo()); 4171 else 4172 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4173 TemplateArgumentLocInfo()); 4174 4175 return false; 4176 } 4177 4178 case TemplateArgument::Type: { 4179 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4180 if (!DI) 4181 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4182 4183 DI = getDerived().TransformType(DI); 4184 if (!DI) return true; 4185 4186 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4187 return false; 4188 } 4189 4190 case TemplateArgument::Template: { 4191 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4192 if (QualifierLoc) { 4193 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4194 if (!QualifierLoc) 4195 return true; 4196 } 4197 4198 CXXScopeSpec SS; 4199 SS.Adopt(QualifierLoc); 4200 TemplateName Template 4201 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4202 Input.getTemplateNameLoc()); 4203 if (Template.isNull()) 4204 return true; 4205 4206 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 4207 Input.getTemplateNameLoc()); 4208 return false; 4209 } 4210 4211 case TemplateArgument::TemplateExpansion: 4212 llvm_unreachable("Caller should expand pack expansions"); 4213 4214 case TemplateArgument::Expression: { 4215 // Template argument expressions are constant expressions. 4216 EnterExpressionEvaluationContext Unevaluated( 4217 getSema(), 4218 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4219 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4220 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4221 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4222 4223 Expr *InputExpr = Input.getSourceExpression(); 4224 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4225 4226 ExprResult E = getDerived().TransformExpr(InputExpr); 4227 E = SemaRef.ActOnConstantExpression(E); 4228 if (E.isInvalid()) return true; 4229 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4230 return false; 4231 } 4232 } 4233 4234 // Work around bogus GCC warning 4235 return true; 4236 } 4237 4238 /// Iterator adaptor that invents template argument location information 4239 /// for each of the template arguments in its underlying iterator. 4240 template<typename Derived, typename InputIterator> 4241 class TemplateArgumentLocInventIterator { 4242 TreeTransform<Derived> &Self; 4243 InputIterator Iter; 4244 4245 public: 4246 typedef TemplateArgumentLoc value_type; 4247 typedef TemplateArgumentLoc reference; 4248 typedef typename std::iterator_traits<InputIterator>::difference_type 4249 difference_type; 4250 typedef std::input_iterator_tag iterator_category; 4251 4252 class pointer { 4253 TemplateArgumentLoc Arg; 4254 4255 public: 4256 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4257 4258 const TemplateArgumentLoc *operator->() const { return &Arg; } 4259 }; 4260 4261 TemplateArgumentLocInventIterator() { } 4262 4263 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4264 InputIterator Iter) 4265 : Self(Self), Iter(Iter) { } 4266 4267 TemplateArgumentLocInventIterator &operator++() { 4268 ++Iter; 4269 return *this; 4270 } 4271 4272 TemplateArgumentLocInventIterator operator++(int) { 4273 TemplateArgumentLocInventIterator Old(*this); 4274 ++(*this); 4275 return Old; 4276 } 4277 4278 reference operator*() const { 4279 TemplateArgumentLoc Result; 4280 Self.InventTemplateArgumentLoc(*Iter, Result); 4281 return Result; 4282 } 4283 4284 pointer operator->() const { return pointer(**this); } 4285 4286 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4287 const TemplateArgumentLocInventIterator &Y) { 4288 return X.Iter == Y.Iter; 4289 } 4290 4291 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4292 const TemplateArgumentLocInventIterator &Y) { 4293 return X.Iter != Y.Iter; 4294 } 4295 }; 4296 4297 template<typename Derived> 4298 template<typename InputIterator> 4299 bool TreeTransform<Derived>::TransformTemplateArguments( 4300 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4301 bool Uneval) { 4302 for (; First != Last; ++First) { 4303 TemplateArgumentLoc Out; 4304 TemplateArgumentLoc In = *First; 4305 4306 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4307 // Unpack argument packs, which we translate them into separate 4308 // arguments. 4309 // FIXME: We could do much better if we could guarantee that the 4310 // TemplateArgumentLocInfo for the pack expansion would be usable for 4311 // all of the template arguments in the argument pack. 4312 typedef TemplateArgumentLocInventIterator<Derived, 4313 TemplateArgument::pack_iterator> 4314 PackLocIterator; 4315 if (TransformTemplateArguments(PackLocIterator(*this, 4316 In.getArgument().pack_begin()), 4317 PackLocIterator(*this, 4318 In.getArgument().pack_end()), 4319 Outputs, Uneval)) 4320 return true; 4321 4322 continue; 4323 } 4324 4325 if (In.getArgument().isPackExpansion()) { 4326 // We have a pack expansion, for which we will be substituting into 4327 // the pattern. 4328 SourceLocation Ellipsis; 4329 Optional<unsigned> OrigNumExpansions; 4330 TemplateArgumentLoc Pattern 4331 = getSema().getTemplateArgumentPackExpansionPattern( 4332 In, Ellipsis, OrigNumExpansions); 4333 4334 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4335 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4336 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4337 4338 // Determine whether the set of unexpanded parameter packs can and should 4339 // be expanded. 4340 bool Expand = true; 4341 bool RetainExpansion = false; 4342 Optional<unsigned> NumExpansions = OrigNumExpansions; 4343 if (getDerived().TryExpandParameterPacks(Ellipsis, 4344 Pattern.getSourceRange(), 4345 Unexpanded, 4346 Expand, 4347 RetainExpansion, 4348 NumExpansions)) 4349 return true; 4350 4351 if (!Expand) { 4352 // The transform has determined that we should perform a simple 4353 // transformation on the pack expansion, producing another pack 4354 // expansion. 4355 TemplateArgumentLoc OutPattern; 4356 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4357 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4358 return true; 4359 4360 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4361 NumExpansions); 4362 if (Out.getArgument().isNull()) 4363 return true; 4364 4365 Outputs.addArgument(Out); 4366 continue; 4367 } 4368 4369 // The transform has determined that we should perform an elementwise 4370 // expansion of the pattern. Do so. 4371 for (unsigned I = 0; I != *NumExpansions; ++I) { 4372 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4373 4374 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4375 return true; 4376 4377 if (Out.getArgument().containsUnexpandedParameterPack()) { 4378 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4379 OrigNumExpansions); 4380 if (Out.getArgument().isNull()) 4381 return true; 4382 } 4383 4384 Outputs.addArgument(Out); 4385 } 4386 4387 // If we're supposed to retain a pack expansion, do so by temporarily 4388 // forgetting the partially-substituted parameter pack. 4389 if (RetainExpansion) { 4390 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4391 4392 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4393 return true; 4394 4395 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4396 OrigNumExpansions); 4397 if (Out.getArgument().isNull()) 4398 return true; 4399 4400 Outputs.addArgument(Out); 4401 } 4402 4403 continue; 4404 } 4405 4406 // The simple case: 4407 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4408 return true; 4409 4410 Outputs.addArgument(Out); 4411 } 4412 4413 return false; 4414 4415 } 4416 4417 //===----------------------------------------------------------------------===// 4418 // Type transformation 4419 //===----------------------------------------------------------------------===// 4420 4421 template<typename Derived> 4422 QualType TreeTransform<Derived>::TransformType(QualType T) { 4423 if (getDerived().AlreadyTransformed(T)) 4424 return T; 4425 4426 // Temporary workaround. All of these transformations should 4427 // eventually turn into transformations on TypeLocs. 4428 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4429 getDerived().getBaseLocation()); 4430 4431 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4432 4433 if (!NewDI) 4434 return QualType(); 4435 4436 return NewDI->getType(); 4437 } 4438 4439 template<typename Derived> 4440 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4441 // Refine the base location to the type's location. 4442 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4443 getDerived().getBaseEntity()); 4444 if (getDerived().AlreadyTransformed(DI->getType())) 4445 return DI; 4446 4447 TypeLocBuilder TLB; 4448 4449 TypeLoc TL = DI->getTypeLoc(); 4450 TLB.reserve(TL.getFullDataSize()); 4451 4452 QualType Result = getDerived().TransformType(TLB, TL); 4453 if (Result.isNull()) 4454 return nullptr; 4455 4456 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4457 } 4458 4459 template<typename Derived> 4460 QualType 4461 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4462 switch (T.getTypeLocClass()) { 4463 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4464 #define TYPELOC(CLASS, PARENT) \ 4465 case TypeLoc::CLASS: \ 4466 return getDerived().Transform##CLASS##Type(TLB, \ 4467 T.castAs<CLASS##TypeLoc>()); 4468 #include "clang/AST/TypeLocNodes.def" 4469 } 4470 4471 llvm_unreachable("unhandled type loc!"); 4472 } 4473 4474 template<typename Derived> 4475 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4476 if (!isa<DependentNameType>(T)) 4477 return TransformType(T); 4478 4479 if (getDerived().AlreadyTransformed(T)) 4480 return T; 4481 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4482 getDerived().getBaseLocation()); 4483 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4484 return NewDI ? NewDI->getType() : QualType(); 4485 } 4486 4487 template<typename Derived> 4488 TypeSourceInfo * 4489 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4490 if (!isa<DependentNameType>(DI->getType())) 4491 return TransformType(DI); 4492 4493 // Refine the base location to the type's location. 4494 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4495 getDerived().getBaseEntity()); 4496 if (getDerived().AlreadyTransformed(DI->getType())) 4497 return DI; 4498 4499 TypeLocBuilder TLB; 4500 4501 TypeLoc TL = DI->getTypeLoc(); 4502 TLB.reserve(TL.getFullDataSize()); 4503 4504 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4505 if (QTL) 4506 TL = QTL.getUnqualifiedLoc(); 4507 4508 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4509 4510 QualType Result = getDerived().TransformDependentNameType( 4511 TLB, DNTL, /*DeducedTSTContext*/true); 4512 if (Result.isNull()) 4513 return nullptr; 4514 4515 if (QTL) { 4516 Result = getDerived().RebuildQualifiedType(Result, QTL); 4517 if (Result.isNull()) 4518 return nullptr; 4519 TLB.TypeWasModifiedSafely(Result); 4520 } 4521 4522 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4523 } 4524 4525 template<typename Derived> 4526 QualType 4527 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4528 QualifiedTypeLoc T) { 4529 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4530 if (Result.isNull()) 4531 return QualType(); 4532 4533 Result = getDerived().RebuildQualifiedType(Result, T); 4534 4535 if (Result.isNull()) 4536 return QualType(); 4537 4538 // RebuildQualifiedType might have updated the type, but not in a way 4539 // that invalidates the TypeLoc. (There's no location information for 4540 // qualifiers.) 4541 TLB.TypeWasModifiedSafely(Result); 4542 4543 return Result; 4544 } 4545 4546 template <typename Derived> 4547 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4548 QualifiedTypeLoc TL) { 4549 4550 SourceLocation Loc = TL.getBeginLoc(); 4551 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4552 4553 if (((T.getAddressSpace() != LangAS::Default && 4554 Quals.getAddressSpace() != LangAS::Default)) && 4555 T.getAddressSpace() != Quals.getAddressSpace()) { 4556 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4557 << TL.getType() << T; 4558 return QualType(); 4559 } 4560 4561 // C++ [dcl.fct]p7: 4562 // [When] adding cv-qualifications on top of the function type [...] the 4563 // cv-qualifiers are ignored. 4564 if (T->isFunctionType()) { 4565 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4566 Quals.getAddressSpace()); 4567 return T; 4568 } 4569 4570 // C++ [dcl.ref]p1: 4571 // when the cv-qualifiers are introduced through the use of a typedef-name 4572 // or decltype-specifier [...] the cv-qualifiers are ignored. 4573 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4574 // applied to a reference type. 4575 if (T->isReferenceType()) { 4576 // The only qualifier that applies to a reference type is restrict. 4577 if (!Quals.hasRestrict()) 4578 return T; 4579 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4580 } 4581 4582 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4583 // resulting type. 4584 if (Quals.hasObjCLifetime()) { 4585 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4586 Quals.removeObjCLifetime(); 4587 else if (T.getObjCLifetime()) { 4588 // Objective-C ARC: 4589 // A lifetime qualifier applied to a substituted template parameter 4590 // overrides the lifetime qualifier from the template argument. 4591 const AutoType *AutoTy; 4592 if (const SubstTemplateTypeParmType *SubstTypeParam 4593 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4594 QualType Replacement = SubstTypeParam->getReplacementType(); 4595 Qualifiers Qs = Replacement.getQualifiers(); 4596 Qs.removeObjCLifetime(); 4597 Replacement = SemaRef.Context.getQualifiedType( 4598 Replacement.getUnqualifiedType(), Qs); 4599 T = SemaRef.Context.getSubstTemplateTypeParmType( 4600 SubstTypeParam->getReplacedParameter(), Replacement); 4601 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4602 // 'auto' types behave the same way as template parameters. 4603 QualType Deduced = AutoTy->getDeducedType(); 4604 Qualifiers Qs = Deduced.getQualifiers(); 4605 Qs.removeObjCLifetime(); 4606 Deduced = 4607 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4608 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4609 AutoTy->isDependentType(), 4610 /*isPack=*/false, 4611 AutoTy->getTypeConstraintConcept(), 4612 AutoTy->getTypeConstraintArguments()); 4613 } else { 4614 // Otherwise, complain about the addition of a qualifier to an 4615 // already-qualified type. 4616 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4617 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4618 Quals.removeObjCLifetime(); 4619 } 4620 } 4621 } 4622 4623 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4624 } 4625 4626 template<typename Derived> 4627 TypeLoc 4628 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4629 QualType ObjectType, 4630 NamedDecl *UnqualLookup, 4631 CXXScopeSpec &SS) { 4632 if (getDerived().AlreadyTransformed(TL.getType())) 4633 return TL; 4634 4635 TypeSourceInfo *TSI = 4636 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4637 if (TSI) 4638 return TSI->getTypeLoc(); 4639 return TypeLoc(); 4640 } 4641 4642 template<typename Derived> 4643 TypeSourceInfo * 4644 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4645 QualType ObjectType, 4646 NamedDecl *UnqualLookup, 4647 CXXScopeSpec &SS) { 4648 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4649 return TSInfo; 4650 4651 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4652 UnqualLookup, SS); 4653 } 4654 4655 template <typename Derived> 4656 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4657 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4658 CXXScopeSpec &SS) { 4659 QualType T = TL.getType(); 4660 assert(!getDerived().AlreadyTransformed(T)); 4661 4662 TypeLocBuilder TLB; 4663 QualType Result; 4664 4665 if (isa<TemplateSpecializationType>(T)) { 4666 TemplateSpecializationTypeLoc SpecTL = 4667 TL.castAs<TemplateSpecializationTypeLoc>(); 4668 4669 TemplateName Template = getDerived().TransformTemplateName( 4670 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4671 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4672 if (Template.isNull()) 4673 return nullptr; 4674 4675 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4676 Template); 4677 } else if (isa<DependentTemplateSpecializationType>(T)) { 4678 DependentTemplateSpecializationTypeLoc SpecTL = 4679 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4680 4681 TemplateName Template 4682 = getDerived().RebuildTemplateName(SS, 4683 SpecTL.getTemplateKeywordLoc(), 4684 *SpecTL.getTypePtr()->getIdentifier(), 4685 SpecTL.getTemplateNameLoc(), 4686 ObjectType, UnqualLookup, 4687 /*AllowInjectedClassName*/true); 4688 if (Template.isNull()) 4689 return nullptr; 4690 4691 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4692 SpecTL, 4693 Template, 4694 SS); 4695 } else { 4696 // Nothing special needs to be done for these. 4697 Result = getDerived().TransformType(TLB, TL); 4698 } 4699 4700 if (Result.isNull()) 4701 return nullptr; 4702 4703 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4704 } 4705 4706 template <class TyLoc> static inline 4707 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4708 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4709 NewT.setNameLoc(T.getNameLoc()); 4710 return T.getType(); 4711 } 4712 4713 template<typename Derived> 4714 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4715 BuiltinTypeLoc T) { 4716 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4717 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4718 if (T.needsExtraLocalData()) 4719 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4720 return T.getType(); 4721 } 4722 4723 template<typename Derived> 4724 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4725 ComplexTypeLoc T) { 4726 // FIXME: recurse? 4727 return TransformTypeSpecType(TLB, T); 4728 } 4729 4730 template <typename Derived> 4731 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4732 AdjustedTypeLoc TL) { 4733 // Adjustments applied during transformation are handled elsewhere. 4734 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4735 } 4736 4737 template<typename Derived> 4738 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4739 DecayedTypeLoc TL) { 4740 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4741 if (OriginalType.isNull()) 4742 return QualType(); 4743 4744 QualType Result = TL.getType(); 4745 if (getDerived().AlwaysRebuild() || 4746 OriginalType != TL.getOriginalLoc().getType()) 4747 Result = SemaRef.Context.getDecayedType(OriginalType); 4748 TLB.push<DecayedTypeLoc>(Result); 4749 // Nothing to set for DecayedTypeLoc. 4750 return Result; 4751 } 4752 4753 template<typename Derived> 4754 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4755 PointerTypeLoc TL) { 4756 QualType PointeeType 4757 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4758 if (PointeeType.isNull()) 4759 return QualType(); 4760 4761 QualType Result = TL.getType(); 4762 if (PointeeType->getAs<ObjCObjectType>()) { 4763 // A dependent pointer type 'T *' has is being transformed such 4764 // that an Objective-C class type is being replaced for 'T'. The 4765 // resulting pointer type is an ObjCObjectPointerType, not a 4766 // PointerType. 4767 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4768 4769 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4770 NewT.setStarLoc(TL.getStarLoc()); 4771 return Result; 4772 } 4773 4774 if (getDerived().AlwaysRebuild() || 4775 PointeeType != TL.getPointeeLoc().getType()) { 4776 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4777 if (Result.isNull()) 4778 return QualType(); 4779 } 4780 4781 // Objective-C ARC can add lifetime qualifiers to the type that we're 4782 // pointing to. 4783 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4784 4785 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4786 NewT.setSigilLoc(TL.getSigilLoc()); 4787 return Result; 4788 } 4789 4790 template<typename Derived> 4791 QualType 4792 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4793 BlockPointerTypeLoc TL) { 4794 QualType PointeeType 4795 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4796 if (PointeeType.isNull()) 4797 return QualType(); 4798 4799 QualType Result = TL.getType(); 4800 if (getDerived().AlwaysRebuild() || 4801 PointeeType != TL.getPointeeLoc().getType()) { 4802 Result = getDerived().RebuildBlockPointerType(PointeeType, 4803 TL.getSigilLoc()); 4804 if (Result.isNull()) 4805 return QualType(); 4806 } 4807 4808 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4809 NewT.setSigilLoc(TL.getSigilLoc()); 4810 return Result; 4811 } 4812 4813 /// Transforms a reference type. Note that somewhat paradoxically we 4814 /// don't care whether the type itself is an l-value type or an r-value 4815 /// type; we only care if the type was *written* as an l-value type 4816 /// or an r-value type. 4817 template<typename Derived> 4818 QualType 4819 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4820 ReferenceTypeLoc TL) { 4821 const ReferenceType *T = TL.getTypePtr(); 4822 4823 // Note that this works with the pointee-as-written. 4824 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4825 if (PointeeType.isNull()) 4826 return QualType(); 4827 4828 QualType Result = TL.getType(); 4829 if (getDerived().AlwaysRebuild() || 4830 PointeeType != T->getPointeeTypeAsWritten()) { 4831 Result = getDerived().RebuildReferenceType(PointeeType, 4832 T->isSpelledAsLValue(), 4833 TL.getSigilLoc()); 4834 if (Result.isNull()) 4835 return QualType(); 4836 } 4837 4838 // Objective-C ARC can add lifetime qualifiers to the type that we're 4839 // referring to. 4840 TLB.TypeWasModifiedSafely( 4841 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4842 4843 // r-value references can be rebuilt as l-value references. 4844 ReferenceTypeLoc NewTL; 4845 if (isa<LValueReferenceType>(Result)) 4846 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4847 else 4848 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4849 NewTL.setSigilLoc(TL.getSigilLoc()); 4850 4851 return Result; 4852 } 4853 4854 template<typename Derived> 4855 QualType 4856 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4857 LValueReferenceTypeLoc TL) { 4858 return TransformReferenceType(TLB, TL); 4859 } 4860 4861 template<typename Derived> 4862 QualType 4863 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4864 RValueReferenceTypeLoc TL) { 4865 return TransformReferenceType(TLB, TL); 4866 } 4867 4868 template<typename Derived> 4869 QualType 4870 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4871 MemberPointerTypeLoc TL) { 4872 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4873 if (PointeeType.isNull()) 4874 return QualType(); 4875 4876 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4877 TypeSourceInfo *NewClsTInfo = nullptr; 4878 if (OldClsTInfo) { 4879 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4880 if (!NewClsTInfo) 4881 return QualType(); 4882 } 4883 4884 const MemberPointerType *T = TL.getTypePtr(); 4885 QualType OldClsType = QualType(T->getClass(), 0); 4886 QualType NewClsType; 4887 if (NewClsTInfo) 4888 NewClsType = NewClsTInfo->getType(); 4889 else { 4890 NewClsType = getDerived().TransformType(OldClsType); 4891 if (NewClsType.isNull()) 4892 return QualType(); 4893 } 4894 4895 QualType Result = TL.getType(); 4896 if (getDerived().AlwaysRebuild() || 4897 PointeeType != T->getPointeeType() || 4898 NewClsType != OldClsType) { 4899 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4900 TL.getStarLoc()); 4901 if (Result.isNull()) 4902 return QualType(); 4903 } 4904 4905 // If we had to adjust the pointee type when building a member pointer, make 4906 // sure to push TypeLoc info for it. 4907 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4908 if (MPT && PointeeType != MPT->getPointeeType()) { 4909 assert(isa<AdjustedType>(MPT->getPointeeType())); 4910 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4911 } 4912 4913 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4914 NewTL.setSigilLoc(TL.getSigilLoc()); 4915 NewTL.setClassTInfo(NewClsTInfo); 4916 4917 return Result; 4918 } 4919 4920 template<typename Derived> 4921 QualType 4922 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4923 ConstantArrayTypeLoc TL) { 4924 const ConstantArrayType *T = TL.getTypePtr(); 4925 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4926 if (ElementType.isNull()) 4927 return QualType(); 4928 4929 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4930 Expr *OldSize = TL.getSizeExpr(); 4931 if (!OldSize) 4932 OldSize = const_cast<Expr*>(T->getSizeExpr()); 4933 Expr *NewSize = nullptr; 4934 if (OldSize) { 4935 EnterExpressionEvaluationContext Unevaluated( 4936 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4937 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 4938 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 4939 } 4940 4941 QualType Result = TL.getType(); 4942 if (getDerived().AlwaysRebuild() || 4943 ElementType != T->getElementType() || 4944 (T->getSizeExpr() && NewSize != OldSize)) { 4945 Result = getDerived().RebuildConstantArrayType(ElementType, 4946 T->getSizeModifier(), 4947 T->getSize(), NewSize, 4948 T->getIndexTypeCVRQualifiers(), 4949 TL.getBracketsRange()); 4950 if (Result.isNull()) 4951 return QualType(); 4952 } 4953 4954 // We might have either a ConstantArrayType or a VariableArrayType now: 4955 // a ConstantArrayType is allowed to have an element type which is a 4956 // VariableArrayType if the type is dependent. Fortunately, all array 4957 // types have the same location layout. 4958 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4959 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4960 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4961 NewTL.setSizeExpr(NewSize); 4962 4963 return Result; 4964 } 4965 4966 template<typename Derived> 4967 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4968 TypeLocBuilder &TLB, 4969 IncompleteArrayTypeLoc TL) { 4970 const IncompleteArrayType *T = TL.getTypePtr(); 4971 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4972 if (ElementType.isNull()) 4973 return QualType(); 4974 4975 QualType Result = TL.getType(); 4976 if (getDerived().AlwaysRebuild() || 4977 ElementType != T->getElementType()) { 4978 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4979 T->getSizeModifier(), 4980 T->getIndexTypeCVRQualifiers(), 4981 TL.getBracketsRange()); 4982 if (Result.isNull()) 4983 return QualType(); 4984 } 4985 4986 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4987 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4988 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4989 NewTL.setSizeExpr(nullptr); 4990 4991 return Result; 4992 } 4993 4994 template<typename Derived> 4995 QualType 4996 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4997 VariableArrayTypeLoc TL) { 4998 const VariableArrayType *T = TL.getTypePtr(); 4999 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5000 if (ElementType.isNull()) 5001 return QualType(); 5002 5003 ExprResult SizeResult; 5004 { 5005 EnterExpressionEvaluationContext Context( 5006 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5007 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5008 } 5009 if (SizeResult.isInvalid()) 5010 return QualType(); 5011 SizeResult = 5012 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5013 if (SizeResult.isInvalid()) 5014 return QualType(); 5015 5016 Expr *Size = SizeResult.get(); 5017 5018 QualType Result = TL.getType(); 5019 if (getDerived().AlwaysRebuild() || 5020 ElementType != T->getElementType() || 5021 Size != T->getSizeExpr()) { 5022 Result = getDerived().RebuildVariableArrayType(ElementType, 5023 T->getSizeModifier(), 5024 Size, 5025 T->getIndexTypeCVRQualifiers(), 5026 TL.getBracketsRange()); 5027 if (Result.isNull()) 5028 return QualType(); 5029 } 5030 5031 // We might have constant size array now, but fortunately it has the same 5032 // location layout. 5033 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5034 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5035 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5036 NewTL.setSizeExpr(Size); 5037 5038 return Result; 5039 } 5040 5041 template<typename Derived> 5042 QualType 5043 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5044 DependentSizedArrayTypeLoc TL) { 5045 const DependentSizedArrayType *T = TL.getTypePtr(); 5046 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5047 if (ElementType.isNull()) 5048 return QualType(); 5049 5050 // Array bounds are constant expressions. 5051 EnterExpressionEvaluationContext Unevaluated( 5052 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5053 5054 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5055 Expr *origSize = TL.getSizeExpr(); 5056 if (!origSize) origSize = T->getSizeExpr(); 5057 5058 ExprResult sizeResult 5059 = getDerived().TransformExpr(origSize); 5060 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5061 if (sizeResult.isInvalid()) 5062 return QualType(); 5063 5064 Expr *size = sizeResult.get(); 5065 5066 QualType Result = TL.getType(); 5067 if (getDerived().AlwaysRebuild() || 5068 ElementType != T->getElementType() || 5069 size != origSize) { 5070 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5071 T->getSizeModifier(), 5072 size, 5073 T->getIndexTypeCVRQualifiers(), 5074 TL.getBracketsRange()); 5075 if (Result.isNull()) 5076 return QualType(); 5077 } 5078 5079 // We might have any sort of array type now, but fortunately they 5080 // all have the same location layout. 5081 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5082 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5083 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5084 NewTL.setSizeExpr(size); 5085 5086 return Result; 5087 } 5088 5089 template <typename Derived> 5090 QualType TreeTransform<Derived>::TransformDependentVectorType( 5091 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5092 const DependentVectorType *T = TL.getTypePtr(); 5093 QualType ElementType = getDerived().TransformType(T->getElementType()); 5094 if (ElementType.isNull()) 5095 return QualType(); 5096 5097 EnterExpressionEvaluationContext Unevaluated( 5098 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5099 5100 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5101 Size = SemaRef.ActOnConstantExpression(Size); 5102 if (Size.isInvalid()) 5103 return QualType(); 5104 5105 QualType Result = TL.getType(); 5106 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5107 Size.get() != T->getSizeExpr()) { 5108 Result = getDerived().RebuildDependentVectorType( 5109 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5110 if (Result.isNull()) 5111 return QualType(); 5112 } 5113 5114 // Result might be dependent or not. 5115 if (isa<DependentVectorType>(Result)) { 5116 DependentVectorTypeLoc NewTL = 5117 TLB.push<DependentVectorTypeLoc>(Result); 5118 NewTL.setNameLoc(TL.getNameLoc()); 5119 } else { 5120 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5121 NewTL.setNameLoc(TL.getNameLoc()); 5122 } 5123 5124 return Result; 5125 } 5126 5127 template<typename Derived> 5128 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5129 TypeLocBuilder &TLB, 5130 DependentSizedExtVectorTypeLoc TL) { 5131 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5132 5133 // FIXME: ext vector locs should be nested 5134 QualType ElementType = getDerived().TransformType(T->getElementType()); 5135 if (ElementType.isNull()) 5136 return QualType(); 5137 5138 // Vector sizes are constant expressions. 5139 EnterExpressionEvaluationContext Unevaluated( 5140 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5141 5142 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5143 Size = SemaRef.ActOnConstantExpression(Size); 5144 if (Size.isInvalid()) 5145 return QualType(); 5146 5147 QualType Result = TL.getType(); 5148 if (getDerived().AlwaysRebuild() || 5149 ElementType != T->getElementType() || 5150 Size.get() != T->getSizeExpr()) { 5151 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5152 Size.get(), 5153 T->getAttributeLoc()); 5154 if (Result.isNull()) 5155 return QualType(); 5156 } 5157 5158 // Result might be dependent or not. 5159 if (isa<DependentSizedExtVectorType>(Result)) { 5160 DependentSizedExtVectorTypeLoc NewTL 5161 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5162 NewTL.setNameLoc(TL.getNameLoc()); 5163 } else { 5164 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5165 NewTL.setNameLoc(TL.getNameLoc()); 5166 } 5167 5168 return Result; 5169 } 5170 5171 template <typename Derived> 5172 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5173 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5174 const DependentAddressSpaceType *T = TL.getTypePtr(); 5175 5176 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5177 5178 if (pointeeType.isNull()) 5179 return QualType(); 5180 5181 // Address spaces are constant expressions. 5182 EnterExpressionEvaluationContext Unevaluated( 5183 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5184 5185 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5186 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5187 if (AddrSpace.isInvalid()) 5188 return QualType(); 5189 5190 QualType Result = TL.getType(); 5191 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5192 AddrSpace.get() != T->getAddrSpaceExpr()) { 5193 Result = getDerived().RebuildDependentAddressSpaceType( 5194 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5195 if (Result.isNull()) 5196 return QualType(); 5197 } 5198 5199 // Result might be dependent or not. 5200 if (isa<DependentAddressSpaceType>(Result)) { 5201 DependentAddressSpaceTypeLoc NewTL = 5202 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5203 5204 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5205 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5206 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5207 5208 } else { 5209 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5210 Result, getDerived().getBaseLocation()); 5211 TransformType(TLB, DI->getTypeLoc()); 5212 } 5213 5214 return Result; 5215 } 5216 5217 template <typename Derived> 5218 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5219 VectorTypeLoc TL) { 5220 const VectorType *T = TL.getTypePtr(); 5221 QualType ElementType = getDerived().TransformType(T->getElementType()); 5222 if (ElementType.isNull()) 5223 return QualType(); 5224 5225 QualType Result = TL.getType(); 5226 if (getDerived().AlwaysRebuild() || 5227 ElementType != T->getElementType()) { 5228 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5229 T->getVectorKind()); 5230 if (Result.isNull()) 5231 return QualType(); 5232 } 5233 5234 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5235 NewTL.setNameLoc(TL.getNameLoc()); 5236 5237 return Result; 5238 } 5239 5240 template<typename Derived> 5241 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5242 ExtVectorTypeLoc TL) { 5243 const VectorType *T = TL.getTypePtr(); 5244 QualType ElementType = getDerived().TransformType(T->getElementType()); 5245 if (ElementType.isNull()) 5246 return QualType(); 5247 5248 QualType Result = TL.getType(); 5249 if (getDerived().AlwaysRebuild() || 5250 ElementType != T->getElementType()) { 5251 Result = getDerived().RebuildExtVectorType(ElementType, 5252 T->getNumElements(), 5253 /*FIXME*/ SourceLocation()); 5254 if (Result.isNull()) 5255 return QualType(); 5256 } 5257 5258 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5259 NewTL.setNameLoc(TL.getNameLoc()); 5260 5261 return Result; 5262 } 5263 5264 template <typename Derived> 5265 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5266 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5267 bool ExpectParameterPack) { 5268 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5269 TypeSourceInfo *NewDI = nullptr; 5270 5271 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5272 // If we're substituting into a pack expansion type and we know the 5273 // length we want to expand to, just substitute for the pattern. 5274 TypeLoc OldTL = OldDI->getTypeLoc(); 5275 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5276 5277 TypeLocBuilder TLB; 5278 TypeLoc NewTL = OldDI->getTypeLoc(); 5279 TLB.reserve(NewTL.getFullDataSize()); 5280 5281 QualType Result = getDerived().TransformType(TLB, 5282 OldExpansionTL.getPatternLoc()); 5283 if (Result.isNull()) 5284 return nullptr; 5285 5286 Result = RebuildPackExpansionType(Result, 5287 OldExpansionTL.getPatternLoc().getSourceRange(), 5288 OldExpansionTL.getEllipsisLoc(), 5289 NumExpansions); 5290 if (Result.isNull()) 5291 return nullptr; 5292 5293 PackExpansionTypeLoc NewExpansionTL 5294 = TLB.push<PackExpansionTypeLoc>(Result); 5295 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5296 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5297 } else 5298 NewDI = getDerived().TransformType(OldDI); 5299 if (!NewDI) 5300 return nullptr; 5301 5302 if (NewDI == OldDI && indexAdjustment == 0) 5303 return OldParm; 5304 5305 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5306 OldParm->getDeclContext(), 5307 OldParm->getInnerLocStart(), 5308 OldParm->getLocation(), 5309 OldParm->getIdentifier(), 5310 NewDI->getType(), 5311 NewDI, 5312 OldParm->getStorageClass(), 5313 /* DefArg */ nullptr); 5314 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5315 OldParm->getFunctionScopeIndex() + indexAdjustment); 5316 return newParm; 5317 } 5318 5319 template <typename Derived> 5320 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5321 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5322 const QualType *ParamTypes, 5323 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5324 SmallVectorImpl<QualType> &OutParamTypes, 5325 SmallVectorImpl<ParmVarDecl *> *PVars, 5326 Sema::ExtParameterInfoBuilder &PInfos) { 5327 int indexAdjustment = 0; 5328 5329 unsigned NumParams = Params.size(); 5330 for (unsigned i = 0; i != NumParams; ++i) { 5331 if (ParmVarDecl *OldParm = Params[i]) { 5332 assert(OldParm->getFunctionScopeIndex() == i); 5333 5334 Optional<unsigned> NumExpansions; 5335 ParmVarDecl *NewParm = nullptr; 5336 if (OldParm->isParameterPack()) { 5337 // We have a function parameter pack that may need to be expanded. 5338 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5339 5340 // Find the parameter packs that could be expanded. 5341 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5342 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5343 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5344 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5345 5346 // Determine whether we should expand the parameter packs. 5347 bool ShouldExpand = false; 5348 bool RetainExpansion = false; 5349 Optional<unsigned> OrigNumExpansions; 5350 if (Unexpanded.size() > 0) { 5351 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5352 NumExpansions = OrigNumExpansions; 5353 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5354 Pattern.getSourceRange(), 5355 Unexpanded, 5356 ShouldExpand, 5357 RetainExpansion, 5358 NumExpansions)) { 5359 return true; 5360 } 5361 } else { 5362 #ifndef NDEBUG 5363 const AutoType *AT = 5364 Pattern.getType().getTypePtr()->getContainedAutoType(); 5365 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5366 "Could not find parameter packs or undeduced auto type!"); 5367 #endif 5368 } 5369 5370 if (ShouldExpand) { 5371 // Expand the function parameter pack into multiple, separate 5372 // parameters. 5373 getDerived().ExpandingFunctionParameterPack(OldParm); 5374 for (unsigned I = 0; I != *NumExpansions; ++I) { 5375 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5376 ParmVarDecl *NewParm 5377 = getDerived().TransformFunctionTypeParam(OldParm, 5378 indexAdjustment++, 5379 OrigNumExpansions, 5380 /*ExpectParameterPack=*/false); 5381 if (!NewParm) 5382 return true; 5383 5384 if (ParamInfos) 5385 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5386 OutParamTypes.push_back(NewParm->getType()); 5387 if (PVars) 5388 PVars->push_back(NewParm); 5389 } 5390 5391 // If we're supposed to retain a pack expansion, do so by temporarily 5392 // forgetting the partially-substituted parameter pack. 5393 if (RetainExpansion) { 5394 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5395 ParmVarDecl *NewParm 5396 = getDerived().TransformFunctionTypeParam(OldParm, 5397 indexAdjustment++, 5398 OrigNumExpansions, 5399 /*ExpectParameterPack=*/false); 5400 if (!NewParm) 5401 return true; 5402 5403 if (ParamInfos) 5404 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5405 OutParamTypes.push_back(NewParm->getType()); 5406 if (PVars) 5407 PVars->push_back(NewParm); 5408 } 5409 5410 // The next parameter should have the same adjustment as the 5411 // last thing we pushed, but we post-incremented indexAdjustment 5412 // on every push. Also, if we push nothing, the adjustment should 5413 // go down by one. 5414 indexAdjustment--; 5415 5416 // We're done with the pack expansion. 5417 continue; 5418 } 5419 5420 // We'll substitute the parameter now without expanding the pack 5421 // expansion. 5422 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5423 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5424 indexAdjustment, 5425 NumExpansions, 5426 /*ExpectParameterPack=*/true); 5427 assert(NewParm->isParameterPack() && 5428 "Parameter pack no longer a parameter pack after " 5429 "transformation."); 5430 } else { 5431 NewParm = getDerived().TransformFunctionTypeParam( 5432 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5433 } 5434 5435 if (!NewParm) 5436 return true; 5437 5438 if (ParamInfos) 5439 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5440 OutParamTypes.push_back(NewParm->getType()); 5441 if (PVars) 5442 PVars->push_back(NewParm); 5443 continue; 5444 } 5445 5446 // Deal with the possibility that we don't have a parameter 5447 // declaration for this parameter. 5448 QualType OldType = ParamTypes[i]; 5449 bool IsPackExpansion = false; 5450 Optional<unsigned> NumExpansions; 5451 QualType NewType; 5452 if (const PackExpansionType *Expansion 5453 = dyn_cast<PackExpansionType>(OldType)) { 5454 // We have a function parameter pack that may need to be expanded. 5455 QualType Pattern = Expansion->getPattern(); 5456 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5457 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5458 5459 // Determine whether we should expand the parameter packs. 5460 bool ShouldExpand = false; 5461 bool RetainExpansion = false; 5462 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5463 Unexpanded, 5464 ShouldExpand, 5465 RetainExpansion, 5466 NumExpansions)) { 5467 return true; 5468 } 5469 5470 if (ShouldExpand) { 5471 // Expand the function parameter pack into multiple, separate 5472 // parameters. 5473 for (unsigned I = 0; I != *NumExpansions; ++I) { 5474 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5475 QualType NewType = getDerived().TransformType(Pattern); 5476 if (NewType.isNull()) 5477 return true; 5478 5479 if (NewType->containsUnexpandedParameterPack()) { 5480 NewType = 5481 getSema().getASTContext().getPackExpansionType(NewType, None); 5482 5483 if (NewType.isNull()) 5484 return true; 5485 } 5486 5487 if (ParamInfos) 5488 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5489 OutParamTypes.push_back(NewType); 5490 if (PVars) 5491 PVars->push_back(nullptr); 5492 } 5493 5494 // We're done with the pack expansion. 5495 continue; 5496 } 5497 5498 // If we're supposed to retain a pack expansion, do so by temporarily 5499 // forgetting the partially-substituted parameter pack. 5500 if (RetainExpansion) { 5501 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5502 QualType NewType = getDerived().TransformType(Pattern); 5503 if (NewType.isNull()) 5504 return true; 5505 5506 if (ParamInfos) 5507 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5508 OutParamTypes.push_back(NewType); 5509 if (PVars) 5510 PVars->push_back(nullptr); 5511 } 5512 5513 // We'll substitute the parameter now without expanding the pack 5514 // expansion. 5515 OldType = Expansion->getPattern(); 5516 IsPackExpansion = true; 5517 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5518 NewType = getDerived().TransformType(OldType); 5519 } else { 5520 NewType = getDerived().TransformType(OldType); 5521 } 5522 5523 if (NewType.isNull()) 5524 return true; 5525 5526 if (IsPackExpansion) 5527 NewType = getSema().Context.getPackExpansionType(NewType, 5528 NumExpansions); 5529 5530 if (ParamInfos) 5531 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5532 OutParamTypes.push_back(NewType); 5533 if (PVars) 5534 PVars->push_back(nullptr); 5535 } 5536 5537 #ifndef NDEBUG 5538 if (PVars) { 5539 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5540 if (ParmVarDecl *parm = (*PVars)[i]) 5541 assert(parm->getFunctionScopeIndex() == i); 5542 } 5543 #endif 5544 5545 return false; 5546 } 5547 5548 template<typename Derived> 5549 QualType 5550 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5551 FunctionProtoTypeLoc TL) { 5552 SmallVector<QualType, 4> ExceptionStorage; 5553 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5554 return getDerived().TransformFunctionProtoType( 5555 TLB, TL, nullptr, Qualifiers(), 5556 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5557 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5558 ExceptionStorage, Changed); 5559 }); 5560 } 5561 5562 template<typename Derived> template<typename Fn> 5563 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5564 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5565 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5566 5567 // Transform the parameters and return type. 5568 // 5569 // We are required to instantiate the params and return type in source order. 5570 // When the function has a trailing return type, we instantiate the 5571 // parameters before the return type, since the return type can then refer 5572 // to the parameters themselves (via decltype, sizeof, etc.). 5573 // 5574 SmallVector<QualType, 4> ParamTypes; 5575 SmallVector<ParmVarDecl*, 4> ParamDecls; 5576 Sema::ExtParameterInfoBuilder ExtParamInfos; 5577 const FunctionProtoType *T = TL.getTypePtr(); 5578 5579 QualType ResultType; 5580 5581 if (T->hasTrailingReturn()) { 5582 if (getDerived().TransformFunctionTypeParams( 5583 TL.getBeginLoc(), TL.getParams(), 5584 TL.getTypePtr()->param_type_begin(), 5585 T->getExtParameterInfosOrNull(), 5586 ParamTypes, &ParamDecls, ExtParamInfos)) 5587 return QualType(); 5588 5589 { 5590 // C++11 [expr.prim.general]p3: 5591 // If a declaration declares a member function or member function 5592 // template of a class X, the expression this is a prvalue of type 5593 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5594 // and the end of the function-definition, member-declarator, or 5595 // declarator. 5596 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5597 5598 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5599 if (ResultType.isNull()) 5600 return QualType(); 5601 } 5602 } 5603 else { 5604 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5605 if (ResultType.isNull()) 5606 return QualType(); 5607 5608 if (getDerived().TransformFunctionTypeParams( 5609 TL.getBeginLoc(), TL.getParams(), 5610 TL.getTypePtr()->param_type_begin(), 5611 T->getExtParameterInfosOrNull(), 5612 ParamTypes, &ParamDecls, ExtParamInfos)) 5613 return QualType(); 5614 } 5615 5616 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5617 5618 bool EPIChanged = false; 5619 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5620 return QualType(); 5621 5622 // Handle extended parameter information. 5623 if (auto NewExtParamInfos = 5624 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5625 if (!EPI.ExtParameterInfos || 5626 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5627 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5628 EPIChanged = true; 5629 } 5630 EPI.ExtParameterInfos = NewExtParamInfos; 5631 } else if (EPI.ExtParameterInfos) { 5632 EPIChanged = true; 5633 EPI.ExtParameterInfos = nullptr; 5634 } 5635 5636 QualType Result = TL.getType(); 5637 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5638 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5639 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5640 if (Result.isNull()) 5641 return QualType(); 5642 } 5643 5644 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5645 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5646 NewTL.setLParenLoc(TL.getLParenLoc()); 5647 NewTL.setRParenLoc(TL.getRParenLoc()); 5648 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5649 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5650 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5651 NewTL.setParam(i, ParamDecls[i]); 5652 5653 return Result; 5654 } 5655 5656 template<typename Derived> 5657 bool TreeTransform<Derived>::TransformExceptionSpec( 5658 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5659 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5660 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5661 5662 // Instantiate a dynamic noexcept expression, if any. 5663 if (isComputedNoexcept(ESI.Type)) { 5664 EnterExpressionEvaluationContext Unevaluated( 5665 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5666 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5667 if (NoexceptExpr.isInvalid()) 5668 return true; 5669 5670 ExceptionSpecificationType EST = ESI.Type; 5671 NoexceptExpr = 5672 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5673 if (NoexceptExpr.isInvalid()) 5674 return true; 5675 5676 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5677 Changed = true; 5678 ESI.NoexceptExpr = NoexceptExpr.get(); 5679 ESI.Type = EST; 5680 } 5681 5682 if (ESI.Type != EST_Dynamic) 5683 return false; 5684 5685 // Instantiate a dynamic exception specification's type. 5686 for (QualType T : ESI.Exceptions) { 5687 if (const PackExpansionType *PackExpansion = 5688 T->getAs<PackExpansionType>()) { 5689 Changed = true; 5690 5691 // We have a pack expansion. Instantiate it. 5692 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5693 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5694 Unexpanded); 5695 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5696 5697 // Determine whether the set of unexpanded parameter packs can and 5698 // should 5699 // be expanded. 5700 bool Expand = false; 5701 bool RetainExpansion = false; 5702 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5703 // FIXME: Track the location of the ellipsis (and track source location 5704 // information for the types in the exception specification in general). 5705 if (getDerived().TryExpandParameterPacks( 5706 Loc, SourceRange(), Unexpanded, Expand, 5707 RetainExpansion, NumExpansions)) 5708 return true; 5709 5710 if (!Expand) { 5711 // We can't expand this pack expansion into separate arguments yet; 5712 // just substitute into the pattern and create a new pack expansion 5713 // type. 5714 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5715 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5716 if (U.isNull()) 5717 return true; 5718 5719 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5720 Exceptions.push_back(U); 5721 continue; 5722 } 5723 5724 // Substitute into the pack expansion pattern for each slice of the 5725 // pack. 5726 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5727 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5728 5729 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5730 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5731 return true; 5732 5733 Exceptions.push_back(U); 5734 } 5735 } else { 5736 QualType U = getDerived().TransformType(T); 5737 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5738 return true; 5739 if (T != U) 5740 Changed = true; 5741 5742 Exceptions.push_back(U); 5743 } 5744 } 5745 5746 ESI.Exceptions = Exceptions; 5747 if (ESI.Exceptions.empty()) 5748 ESI.Type = EST_DynamicNone; 5749 return false; 5750 } 5751 5752 template<typename Derived> 5753 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5754 TypeLocBuilder &TLB, 5755 FunctionNoProtoTypeLoc TL) { 5756 const FunctionNoProtoType *T = TL.getTypePtr(); 5757 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5758 if (ResultType.isNull()) 5759 return QualType(); 5760 5761 QualType Result = TL.getType(); 5762 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5763 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5764 5765 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5766 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5767 NewTL.setLParenLoc(TL.getLParenLoc()); 5768 NewTL.setRParenLoc(TL.getRParenLoc()); 5769 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5770 5771 return Result; 5772 } 5773 5774 template<typename Derived> QualType 5775 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5776 UnresolvedUsingTypeLoc TL) { 5777 const UnresolvedUsingType *T = TL.getTypePtr(); 5778 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5779 if (!D) 5780 return QualType(); 5781 5782 QualType Result = TL.getType(); 5783 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5784 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5785 if (Result.isNull()) 5786 return QualType(); 5787 } 5788 5789 // We might get an arbitrary type spec type back. We should at 5790 // least always get a type spec type, though. 5791 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5792 NewTL.setNameLoc(TL.getNameLoc()); 5793 5794 return Result; 5795 } 5796 5797 template<typename Derived> 5798 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5799 TypedefTypeLoc TL) { 5800 const TypedefType *T = TL.getTypePtr(); 5801 TypedefNameDecl *Typedef 5802 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5803 T->getDecl())); 5804 if (!Typedef) 5805 return QualType(); 5806 5807 QualType Result = TL.getType(); 5808 if (getDerived().AlwaysRebuild() || 5809 Typedef != T->getDecl()) { 5810 Result = getDerived().RebuildTypedefType(Typedef); 5811 if (Result.isNull()) 5812 return QualType(); 5813 } 5814 5815 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5816 NewTL.setNameLoc(TL.getNameLoc()); 5817 5818 return Result; 5819 } 5820 5821 template<typename Derived> 5822 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5823 TypeOfExprTypeLoc TL) { 5824 // typeof expressions are not potentially evaluated contexts 5825 EnterExpressionEvaluationContext Unevaluated( 5826 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5827 Sema::ReuseLambdaContextDecl); 5828 5829 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5830 if (E.isInvalid()) 5831 return QualType(); 5832 5833 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5834 if (E.isInvalid()) 5835 return QualType(); 5836 5837 QualType Result = TL.getType(); 5838 if (getDerived().AlwaysRebuild() || 5839 E.get() != TL.getUnderlyingExpr()) { 5840 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5841 if (Result.isNull()) 5842 return QualType(); 5843 } 5844 else E.get(); 5845 5846 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5847 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5848 NewTL.setLParenLoc(TL.getLParenLoc()); 5849 NewTL.setRParenLoc(TL.getRParenLoc()); 5850 5851 return Result; 5852 } 5853 5854 template<typename Derived> 5855 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5856 TypeOfTypeLoc TL) { 5857 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5858 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5859 if (!New_Under_TI) 5860 return QualType(); 5861 5862 QualType Result = TL.getType(); 5863 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5864 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5865 if (Result.isNull()) 5866 return QualType(); 5867 } 5868 5869 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5870 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5871 NewTL.setLParenLoc(TL.getLParenLoc()); 5872 NewTL.setRParenLoc(TL.getRParenLoc()); 5873 NewTL.setUnderlyingTInfo(New_Under_TI); 5874 5875 return Result; 5876 } 5877 5878 template<typename Derived> 5879 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5880 DecltypeTypeLoc TL) { 5881 const DecltypeType *T = TL.getTypePtr(); 5882 5883 // decltype expressions are not potentially evaluated contexts 5884 EnterExpressionEvaluationContext Unevaluated( 5885 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5886 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 5887 5888 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5889 if (E.isInvalid()) 5890 return QualType(); 5891 5892 E = getSema().ActOnDecltypeExpression(E.get()); 5893 if (E.isInvalid()) 5894 return QualType(); 5895 5896 QualType Result = TL.getType(); 5897 if (getDerived().AlwaysRebuild() || 5898 E.get() != T->getUnderlyingExpr()) { 5899 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5900 if (Result.isNull()) 5901 return QualType(); 5902 } 5903 else E.get(); 5904 5905 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5906 NewTL.setNameLoc(TL.getNameLoc()); 5907 5908 return Result; 5909 } 5910 5911 template<typename Derived> 5912 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5913 TypeLocBuilder &TLB, 5914 UnaryTransformTypeLoc TL) { 5915 QualType Result = TL.getType(); 5916 if (Result->isDependentType()) { 5917 const UnaryTransformType *T = TL.getTypePtr(); 5918 QualType NewBase = 5919 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5920 Result = getDerived().RebuildUnaryTransformType(NewBase, 5921 T->getUTTKind(), 5922 TL.getKWLoc()); 5923 if (Result.isNull()) 5924 return QualType(); 5925 } 5926 5927 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5928 NewTL.setKWLoc(TL.getKWLoc()); 5929 NewTL.setParensRange(TL.getParensRange()); 5930 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5931 return Result; 5932 } 5933 5934 template<typename Derived> 5935 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5936 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5937 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5938 5939 CXXScopeSpec SS; 5940 TemplateName TemplateName = getDerived().TransformTemplateName( 5941 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5942 if (TemplateName.isNull()) 5943 return QualType(); 5944 5945 QualType OldDeduced = T->getDeducedType(); 5946 QualType NewDeduced; 5947 if (!OldDeduced.isNull()) { 5948 NewDeduced = getDerived().TransformType(OldDeduced); 5949 if (NewDeduced.isNull()) 5950 return QualType(); 5951 } 5952 5953 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5954 TemplateName, NewDeduced); 5955 if (Result.isNull()) 5956 return QualType(); 5957 5958 DeducedTemplateSpecializationTypeLoc NewTL = 5959 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5960 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5961 5962 return Result; 5963 } 5964 5965 template<typename Derived> 5966 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5967 RecordTypeLoc TL) { 5968 const RecordType *T = TL.getTypePtr(); 5969 RecordDecl *Record 5970 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5971 T->getDecl())); 5972 if (!Record) 5973 return QualType(); 5974 5975 QualType Result = TL.getType(); 5976 if (getDerived().AlwaysRebuild() || 5977 Record != T->getDecl()) { 5978 Result = getDerived().RebuildRecordType(Record); 5979 if (Result.isNull()) 5980 return QualType(); 5981 } 5982 5983 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5984 NewTL.setNameLoc(TL.getNameLoc()); 5985 5986 return Result; 5987 } 5988 5989 template<typename Derived> 5990 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5991 EnumTypeLoc TL) { 5992 const EnumType *T = TL.getTypePtr(); 5993 EnumDecl *Enum 5994 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5995 T->getDecl())); 5996 if (!Enum) 5997 return QualType(); 5998 5999 QualType Result = TL.getType(); 6000 if (getDerived().AlwaysRebuild() || 6001 Enum != T->getDecl()) { 6002 Result = getDerived().RebuildEnumType(Enum); 6003 if (Result.isNull()) 6004 return QualType(); 6005 } 6006 6007 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6008 NewTL.setNameLoc(TL.getNameLoc()); 6009 6010 return Result; 6011 } 6012 6013 template<typename Derived> 6014 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6015 TypeLocBuilder &TLB, 6016 InjectedClassNameTypeLoc TL) { 6017 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6018 TL.getTypePtr()->getDecl()); 6019 if (!D) return QualType(); 6020 6021 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6022 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6023 return T; 6024 } 6025 6026 template<typename Derived> 6027 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6028 TypeLocBuilder &TLB, 6029 TemplateTypeParmTypeLoc TL) { 6030 return TransformTypeSpecType(TLB, TL); 6031 } 6032 6033 template<typename Derived> 6034 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6035 TypeLocBuilder &TLB, 6036 SubstTemplateTypeParmTypeLoc TL) { 6037 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6038 6039 // Substitute into the replacement type, which itself might involve something 6040 // that needs to be transformed. This only tends to occur with default 6041 // template arguments of template template parameters. 6042 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6043 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6044 if (Replacement.isNull()) 6045 return QualType(); 6046 6047 // Always canonicalize the replacement type. 6048 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6049 QualType Result 6050 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6051 Replacement); 6052 6053 // Propagate type-source information. 6054 SubstTemplateTypeParmTypeLoc NewTL 6055 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6056 NewTL.setNameLoc(TL.getNameLoc()); 6057 return Result; 6058 6059 } 6060 6061 template<typename Derived> 6062 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6063 TypeLocBuilder &TLB, 6064 SubstTemplateTypeParmPackTypeLoc TL) { 6065 return TransformTypeSpecType(TLB, TL); 6066 } 6067 6068 template<typename Derived> 6069 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6070 TypeLocBuilder &TLB, 6071 TemplateSpecializationTypeLoc TL) { 6072 const TemplateSpecializationType *T = TL.getTypePtr(); 6073 6074 // The nested-name-specifier never matters in a TemplateSpecializationType, 6075 // because we can't have a dependent nested-name-specifier anyway. 6076 CXXScopeSpec SS; 6077 TemplateName Template 6078 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6079 TL.getTemplateNameLoc()); 6080 if (Template.isNull()) 6081 return QualType(); 6082 6083 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6084 } 6085 6086 template<typename Derived> 6087 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6088 AtomicTypeLoc TL) { 6089 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6090 if (ValueType.isNull()) 6091 return QualType(); 6092 6093 QualType Result = TL.getType(); 6094 if (getDerived().AlwaysRebuild() || 6095 ValueType != TL.getValueLoc().getType()) { 6096 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6097 if (Result.isNull()) 6098 return QualType(); 6099 } 6100 6101 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6102 NewTL.setKWLoc(TL.getKWLoc()); 6103 NewTL.setLParenLoc(TL.getLParenLoc()); 6104 NewTL.setRParenLoc(TL.getRParenLoc()); 6105 6106 return Result; 6107 } 6108 6109 template <typename Derived> 6110 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6111 PipeTypeLoc TL) { 6112 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6113 if (ValueType.isNull()) 6114 return QualType(); 6115 6116 QualType Result = TL.getType(); 6117 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6118 const PipeType *PT = Result->castAs<PipeType>(); 6119 bool isReadPipe = PT->isReadOnly(); 6120 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6121 if (Result.isNull()) 6122 return QualType(); 6123 } 6124 6125 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6126 NewTL.setKWLoc(TL.getKWLoc()); 6127 6128 return Result; 6129 } 6130 6131 template <typename Derived> 6132 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6133 ExtIntTypeLoc TL) { 6134 const ExtIntType *EIT = TL.getTypePtr(); 6135 QualType Result = TL.getType(); 6136 6137 if (getDerived().AlwaysRebuild()) { 6138 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6139 EIT->getNumBits(), TL.getNameLoc()); 6140 if (Result.isNull()) 6141 return QualType(); 6142 } 6143 6144 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6145 NewTL.setNameLoc(TL.getNameLoc()); 6146 return Result; 6147 } 6148 6149 template <typename Derived> 6150 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6151 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6152 const DependentExtIntType *EIT = TL.getTypePtr(); 6153 6154 EnterExpressionEvaluationContext Unevaluated( 6155 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6156 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6157 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6158 6159 if (BitsExpr.isInvalid()) 6160 return QualType(); 6161 6162 QualType Result = TL.getType(); 6163 6164 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6165 Result = getDerived().RebuildDependentExtIntType( 6166 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6167 6168 if (Result.isNull()) 6169 return QualType(); 6170 } 6171 6172 if (isa<DependentExtIntType>(Result)) { 6173 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6174 NewTL.setNameLoc(TL.getNameLoc()); 6175 } else { 6176 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6177 NewTL.setNameLoc(TL.getNameLoc()); 6178 } 6179 return Result; 6180 } 6181 6182 /// Simple iterator that traverses the template arguments in a 6183 /// container that provides a \c getArgLoc() member function. 6184 /// 6185 /// This iterator is intended to be used with the iterator form of 6186 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6187 template<typename ArgLocContainer> 6188 class TemplateArgumentLocContainerIterator { 6189 ArgLocContainer *Container; 6190 unsigned Index; 6191 6192 public: 6193 typedef TemplateArgumentLoc value_type; 6194 typedef TemplateArgumentLoc reference; 6195 typedef int difference_type; 6196 typedef std::input_iterator_tag iterator_category; 6197 6198 class pointer { 6199 TemplateArgumentLoc Arg; 6200 6201 public: 6202 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6203 6204 const TemplateArgumentLoc *operator->() const { 6205 return &Arg; 6206 } 6207 }; 6208 6209 6210 TemplateArgumentLocContainerIterator() {} 6211 6212 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6213 unsigned Index) 6214 : Container(&Container), Index(Index) { } 6215 6216 TemplateArgumentLocContainerIterator &operator++() { 6217 ++Index; 6218 return *this; 6219 } 6220 6221 TemplateArgumentLocContainerIterator operator++(int) { 6222 TemplateArgumentLocContainerIterator Old(*this); 6223 ++(*this); 6224 return Old; 6225 } 6226 6227 TemplateArgumentLoc operator*() const { 6228 return Container->getArgLoc(Index); 6229 } 6230 6231 pointer operator->() const { 6232 return pointer(Container->getArgLoc(Index)); 6233 } 6234 6235 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6236 const TemplateArgumentLocContainerIterator &Y) { 6237 return X.Container == Y.Container && X.Index == Y.Index; 6238 } 6239 6240 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6241 const TemplateArgumentLocContainerIterator &Y) { 6242 return !(X == Y); 6243 } 6244 }; 6245 6246 template<typename Derived> 6247 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6248 AutoTypeLoc TL) { 6249 const AutoType *T = TL.getTypePtr(); 6250 QualType OldDeduced = T->getDeducedType(); 6251 QualType NewDeduced; 6252 if (!OldDeduced.isNull()) { 6253 NewDeduced = getDerived().TransformType(OldDeduced); 6254 if (NewDeduced.isNull()) 6255 return QualType(); 6256 } 6257 6258 ConceptDecl *NewCD = nullptr; 6259 TemplateArgumentListInfo NewTemplateArgs; 6260 NestedNameSpecifierLoc NewNestedNameSpec; 6261 if (TL.getTypePtr()->isConstrained()) { 6262 NewCD = cast_or_null<ConceptDecl>( 6263 getDerived().TransformDecl( 6264 TL.getConceptNameLoc(), 6265 TL.getTypePtr()->getTypeConstraintConcept())); 6266 6267 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6268 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6269 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6270 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6271 ArgIterator(TL, 6272 TL.getNumArgs()), 6273 NewTemplateArgs)) 6274 return QualType(); 6275 6276 if (TL.getNestedNameSpecifierLoc()) { 6277 NewNestedNameSpec 6278 = getDerived().TransformNestedNameSpecifierLoc( 6279 TL.getNestedNameSpecifierLoc()); 6280 if (!NewNestedNameSpec) 6281 return QualType(); 6282 } 6283 } 6284 6285 QualType Result = TL.getType(); 6286 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6287 T->isDependentType()) { 6288 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6289 NewArgList.reserve(NewArgList.size()); 6290 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6291 NewArgList.push_back(ArgLoc.getArgument()); 6292 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6293 NewArgList); 6294 if (Result.isNull()) 6295 return QualType(); 6296 } 6297 6298 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6299 NewTL.setNameLoc(TL.getNameLoc()); 6300 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6301 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6302 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6303 NewTL.setFoundDecl(TL.getFoundDecl()); 6304 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6305 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6306 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6307 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6308 6309 return Result; 6310 } 6311 6312 template <typename Derived> 6313 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6314 TypeLocBuilder &TLB, 6315 TemplateSpecializationTypeLoc TL, 6316 TemplateName Template) { 6317 TemplateArgumentListInfo NewTemplateArgs; 6318 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6319 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6320 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6321 ArgIterator; 6322 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6323 ArgIterator(TL, TL.getNumArgs()), 6324 NewTemplateArgs)) 6325 return QualType(); 6326 6327 // FIXME: maybe don't rebuild if all the template arguments are the same. 6328 6329 QualType Result = 6330 getDerived().RebuildTemplateSpecializationType(Template, 6331 TL.getTemplateNameLoc(), 6332 NewTemplateArgs); 6333 6334 if (!Result.isNull()) { 6335 // Specializations of template template parameters are represented as 6336 // TemplateSpecializationTypes, and substitution of type alias templates 6337 // within a dependent context can transform them into 6338 // DependentTemplateSpecializationTypes. 6339 if (isa<DependentTemplateSpecializationType>(Result)) { 6340 DependentTemplateSpecializationTypeLoc NewTL 6341 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6342 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6343 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6344 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6345 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6346 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6347 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6348 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6349 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6350 return Result; 6351 } 6352 6353 TemplateSpecializationTypeLoc NewTL 6354 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6355 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6356 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6357 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6358 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6359 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6360 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6361 } 6362 6363 return Result; 6364 } 6365 6366 template <typename Derived> 6367 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6368 TypeLocBuilder &TLB, 6369 DependentTemplateSpecializationTypeLoc TL, 6370 TemplateName Template, 6371 CXXScopeSpec &SS) { 6372 TemplateArgumentListInfo NewTemplateArgs; 6373 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6374 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6375 typedef TemplateArgumentLocContainerIterator< 6376 DependentTemplateSpecializationTypeLoc> ArgIterator; 6377 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6378 ArgIterator(TL, TL.getNumArgs()), 6379 NewTemplateArgs)) 6380 return QualType(); 6381 6382 // FIXME: maybe don't rebuild if all the template arguments are the same. 6383 6384 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6385 QualType Result 6386 = getSema().Context.getDependentTemplateSpecializationType( 6387 TL.getTypePtr()->getKeyword(), 6388 DTN->getQualifier(), 6389 DTN->getIdentifier(), 6390 NewTemplateArgs); 6391 6392 DependentTemplateSpecializationTypeLoc NewTL 6393 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6394 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6395 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6396 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6397 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6398 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6399 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6400 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6401 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6402 return Result; 6403 } 6404 6405 QualType Result 6406 = getDerived().RebuildTemplateSpecializationType(Template, 6407 TL.getTemplateNameLoc(), 6408 NewTemplateArgs); 6409 6410 if (!Result.isNull()) { 6411 /// FIXME: Wrap this in an elaborated-type-specifier? 6412 TemplateSpecializationTypeLoc NewTL 6413 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6414 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6415 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6416 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6417 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6418 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6419 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6420 } 6421 6422 return Result; 6423 } 6424 6425 template<typename Derived> 6426 QualType 6427 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6428 ElaboratedTypeLoc TL) { 6429 const ElaboratedType *T = TL.getTypePtr(); 6430 6431 NestedNameSpecifierLoc QualifierLoc; 6432 // NOTE: the qualifier in an ElaboratedType is optional. 6433 if (TL.getQualifierLoc()) { 6434 QualifierLoc 6435 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6436 if (!QualifierLoc) 6437 return QualType(); 6438 } 6439 6440 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6441 if (NamedT.isNull()) 6442 return QualType(); 6443 6444 // C++0x [dcl.type.elab]p2: 6445 // If the identifier resolves to a typedef-name or the simple-template-id 6446 // resolves to an alias template specialization, the 6447 // elaborated-type-specifier is ill-formed. 6448 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6449 if (const TemplateSpecializationType *TST = 6450 NamedT->getAs<TemplateSpecializationType>()) { 6451 TemplateName Template = TST->getTemplateName(); 6452 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6453 Template.getAsTemplateDecl())) { 6454 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6455 diag::err_tag_reference_non_tag) 6456 << TAT << Sema::NTK_TypeAliasTemplate 6457 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6458 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6459 } 6460 } 6461 } 6462 6463 QualType Result = TL.getType(); 6464 if (getDerived().AlwaysRebuild() || 6465 QualifierLoc != TL.getQualifierLoc() || 6466 NamedT != T->getNamedType()) { 6467 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6468 T->getKeyword(), 6469 QualifierLoc, NamedT); 6470 if (Result.isNull()) 6471 return QualType(); 6472 } 6473 6474 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6475 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6476 NewTL.setQualifierLoc(QualifierLoc); 6477 return Result; 6478 } 6479 6480 template<typename Derived> 6481 QualType TreeTransform<Derived>::TransformAttributedType( 6482 TypeLocBuilder &TLB, 6483 AttributedTypeLoc TL) { 6484 const AttributedType *oldType = TL.getTypePtr(); 6485 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6486 if (modifiedType.isNull()) 6487 return QualType(); 6488 6489 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6490 const Attr *oldAttr = TL.getAttr(); 6491 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6492 if (oldAttr && !newAttr) 6493 return QualType(); 6494 6495 QualType result = TL.getType(); 6496 6497 // FIXME: dependent operand expressions? 6498 if (getDerived().AlwaysRebuild() || 6499 modifiedType != oldType->getModifiedType()) { 6500 // TODO: this is really lame; we should really be rebuilding the 6501 // equivalent type from first principles. 6502 QualType equivalentType 6503 = getDerived().TransformType(oldType->getEquivalentType()); 6504 if (equivalentType.isNull()) 6505 return QualType(); 6506 6507 // Check whether we can add nullability; it is only represented as 6508 // type sugar, and therefore cannot be diagnosed in any other way. 6509 if (auto nullability = oldType->getImmediateNullability()) { 6510 if (!modifiedType->canHaveNullability()) { 6511 SemaRef.Diag(TL.getAttr()->getLocation(), 6512 diag::err_nullability_nonpointer) 6513 << DiagNullabilityKind(*nullability, false) << modifiedType; 6514 return QualType(); 6515 } 6516 } 6517 6518 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6519 modifiedType, 6520 equivalentType); 6521 } 6522 6523 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6524 newTL.setAttr(newAttr); 6525 return result; 6526 } 6527 6528 template<typename Derived> 6529 QualType 6530 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6531 ParenTypeLoc TL) { 6532 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6533 if (Inner.isNull()) 6534 return QualType(); 6535 6536 QualType Result = TL.getType(); 6537 if (getDerived().AlwaysRebuild() || 6538 Inner != TL.getInnerLoc().getType()) { 6539 Result = getDerived().RebuildParenType(Inner); 6540 if (Result.isNull()) 6541 return QualType(); 6542 } 6543 6544 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6545 NewTL.setLParenLoc(TL.getLParenLoc()); 6546 NewTL.setRParenLoc(TL.getRParenLoc()); 6547 return Result; 6548 } 6549 6550 template <typename Derived> 6551 QualType 6552 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6553 MacroQualifiedTypeLoc TL) { 6554 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6555 if (Inner.isNull()) 6556 return QualType(); 6557 6558 QualType Result = TL.getType(); 6559 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6560 Result = 6561 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6562 if (Result.isNull()) 6563 return QualType(); 6564 } 6565 6566 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6567 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6568 return Result; 6569 } 6570 6571 template<typename Derived> 6572 QualType TreeTransform<Derived>::TransformDependentNameType( 6573 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6574 return TransformDependentNameType(TLB, TL, false); 6575 } 6576 6577 template<typename Derived> 6578 QualType TreeTransform<Derived>::TransformDependentNameType( 6579 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6580 const DependentNameType *T = TL.getTypePtr(); 6581 6582 NestedNameSpecifierLoc QualifierLoc 6583 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6584 if (!QualifierLoc) 6585 return QualType(); 6586 6587 QualType Result 6588 = getDerived().RebuildDependentNameType(T->getKeyword(), 6589 TL.getElaboratedKeywordLoc(), 6590 QualifierLoc, 6591 T->getIdentifier(), 6592 TL.getNameLoc(), 6593 DeducedTSTContext); 6594 if (Result.isNull()) 6595 return QualType(); 6596 6597 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6598 QualType NamedT = ElabT->getNamedType(); 6599 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6600 6601 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6602 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6603 NewTL.setQualifierLoc(QualifierLoc); 6604 } else { 6605 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6606 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6607 NewTL.setQualifierLoc(QualifierLoc); 6608 NewTL.setNameLoc(TL.getNameLoc()); 6609 } 6610 return Result; 6611 } 6612 6613 template<typename Derived> 6614 QualType TreeTransform<Derived>:: 6615 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6616 DependentTemplateSpecializationTypeLoc TL) { 6617 NestedNameSpecifierLoc QualifierLoc; 6618 if (TL.getQualifierLoc()) { 6619 QualifierLoc 6620 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6621 if (!QualifierLoc) 6622 return QualType(); 6623 } 6624 6625 return getDerived() 6626 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6627 } 6628 6629 template<typename Derived> 6630 QualType TreeTransform<Derived>:: 6631 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6632 DependentTemplateSpecializationTypeLoc TL, 6633 NestedNameSpecifierLoc QualifierLoc) { 6634 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6635 6636 TemplateArgumentListInfo NewTemplateArgs; 6637 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6638 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6639 6640 typedef TemplateArgumentLocContainerIterator< 6641 DependentTemplateSpecializationTypeLoc> ArgIterator; 6642 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6643 ArgIterator(TL, TL.getNumArgs()), 6644 NewTemplateArgs)) 6645 return QualType(); 6646 6647 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6648 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6649 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6650 /*AllowInjectedClassName*/ false); 6651 if (Result.isNull()) 6652 return QualType(); 6653 6654 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6655 QualType NamedT = ElabT->getNamedType(); 6656 6657 // Copy information relevant to the template specialization. 6658 TemplateSpecializationTypeLoc NamedTL 6659 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6660 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6661 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6662 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6663 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6664 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6665 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6666 6667 // Copy information relevant to the elaborated type. 6668 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6669 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6670 NewTL.setQualifierLoc(QualifierLoc); 6671 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6672 DependentTemplateSpecializationTypeLoc SpecTL 6673 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6674 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6675 SpecTL.setQualifierLoc(QualifierLoc); 6676 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6677 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6678 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6679 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6680 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6681 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6682 } else { 6683 TemplateSpecializationTypeLoc SpecTL 6684 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6685 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6686 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6687 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6688 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6689 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6690 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6691 } 6692 return Result; 6693 } 6694 6695 template<typename Derived> 6696 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6697 PackExpansionTypeLoc TL) { 6698 QualType Pattern 6699 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6700 if (Pattern.isNull()) 6701 return QualType(); 6702 6703 QualType Result = TL.getType(); 6704 if (getDerived().AlwaysRebuild() || 6705 Pattern != TL.getPatternLoc().getType()) { 6706 Result = getDerived().RebuildPackExpansionType(Pattern, 6707 TL.getPatternLoc().getSourceRange(), 6708 TL.getEllipsisLoc(), 6709 TL.getTypePtr()->getNumExpansions()); 6710 if (Result.isNull()) 6711 return QualType(); 6712 } 6713 6714 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6715 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6716 return Result; 6717 } 6718 6719 template<typename Derived> 6720 QualType 6721 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6722 ObjCInterfaceTypeLoc TL) { 6723 // ObjCInterfaceType is never dependent. 6724 TLB.pushFullCopy(TL); 6725 return TL.getType(); 6726 } 6727 6728 template<typename Derived> 6729 QualType 6730 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6731 ObjCTypeParamTypeLoc TL) { 6732 const ObjCTypeParamType *T = TL.getTypePtr(); 6733 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6734 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6735 if (!OTP) 6736 return QualType(); 6737 6738 QualType Result = TL.getType(); 6739 if (getDerived().AlwaysRebuild() || 6740 OTP != T->getDecl()) { 6741 Result = getDerived().RebuildObjCTypeParamType(OTP, 6742 TL.getProtocolLAngleLoc(), 6743 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6744 TL.getNumProtocols()), 6745 TL.getProtocolLocs(), 6746 TL.getProtocolRAngleLoc()); 6747 if (Result.isNull()) 6748 return QualType(); 6749 } 6750 6751 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6752 if (TL.getNumProtocols()) { 6753 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6754 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6755 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6756 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6757 } 6758 return Result; 6759 } 6760 6761 template<typename Derived> 6762 QualType 6763 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6764 ObjCObjectTypeLoc TL) { 6765 // Transform base type. 6766 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6767 if (BaseType.isNull()) 6768 return QualType(); 6769 6770 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6771 6772 // Transform type arguments. 6773 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6774 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6775 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6776 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6777 QualType TypeArg = TypeArgInfo->getType(); 6778 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6779 AnyChanged = true; 6780 6781 // We have a pack expansion. Instantiate it. 6782 const auto *PackExpansion = PackExpansionLoc.getType() 6783 ->castAs<PackExpansionType>(); 6784 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6785 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6786 Unexpanded); 6787 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6788 6789 // Determine whether the set of unexpanded parameter packs can 6790 // and should be expanded. 6791 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6792 bool Expand = false; 6793 bool RetainExpansion = false; 6794 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6795 if (getDerived().TryExpandParameterPacks( 6796 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6797 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6798 return QualType(); 6799 6800 if (!Expand) { 6801 // We can't expand this pack expansion into separate arguments yet; 6802 // just substitute into the pattern and create a new pack expansion 6803 // type. 6804 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6805 6806 TypeLocBuilder TypeArgBuilder; 6807 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6808 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6809 PatternLoc); 6810 if (NewPatternType.isNull()) 6811 return QualType(); 6812 6813 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6814 NewPatternType, NumExpansions); 6815 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6816 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6817 NewTypeArgInfos.push_back( 6818 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6819 continue; 6820 } 6821 6822 // Substitute into the pack expansion pattern for each slice of the 6823 // pack. 6824 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6825 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6826 6827 TypeLocBuilder TypeArgBuilder; 6828 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6829 6830 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6831 PatternLoc); 6832 if (NewTypeArg.isNull()) 6833 return QualType(); 6834 6835 NewTypeArgInfos.push_back( 6836 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6837 } 6838 6839 continue; 6840 } 6841 6842 TypeLocBuilder TypeArgBuilder; 6843 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6844 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6845 if (NewTypeArg.isNull()) 6846 return QualType(); 6847 6848 // If nothing changed, just keep the old TypeSourceInfo. 6849 if (NewTypeArg == TypeArg) { 6850 NewTypeArgInfos.push_back(TypeArgInfo); 6851 continue; 6852 } 6853 6854 NewTypeArgInfos.push_back( 6855 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6856 AnyChanged = true; 6857 } 6858 6859 QualType Result = TL.getType(); 6860 if (getDerived().AlwaysRebuild() || AnyChanged) { 6861 // Rebuild the type. 6862 Result = getDerived().RebuildObjCObjectType( 6863 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 6864 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 6865 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 6866 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 6867 6868 if (Result.isNull()) 6869 return QualType(); 6870 } 6871 6872 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6873 NewT.setHasBaseTypeAsWritten(true); 6874 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6875 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6876 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6877 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6878 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6879 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6880 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6881 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6882 return Result; 6883 } 6884 6885 template<typename Derived> 6886 QualType 6887 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6888 ObjCObjectPointerTypeLoc TL) { 6889 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6890 if (PointeeType.isNull()) 6891 return QualType(); 6892 6893 QualType Result = TL.getType(); 6894 if (getDerived().AlwaysRebuild() || 6895 PointeeType != TL.getPointeeLoc().getType()) { 6896 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6897 TL.getStarLoc()); 6898 if (Result.isNull()) 6899 return QualType(); 6900 } 6901 6902 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6903 NewT.setStarLoc(TL.getStarLoc()); 6904 return Result; 6905 } 6906 6907 //===----------------------------------------------------------------------===// 6908 // Statement transformation 6909 //===----------------------------------------------------------------------===// 6910 template<typename Derived> 6911 StmtResult 6912 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6913 return S; 6914 } 6915 6916 template<typename Derived> 6917 StmtResult 6918 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6919 return getDerived().TransformCompoundStmt(S, false); 6920 } 6921 6922 template<typename Derived> 6923 StmtResult 6924 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6925 bool IsStmtExpr) { 6926 Sema::CompoundScopeRAII CompoundScope(getSema()); 6927 6928 const Stmt *ExprResult = S->getStmtExprResult(); 6929 bool SubStmtInvalid = false; 6930 bool SubStmtChanged = false; 6931 SmallVector<Stmt*, 8> Statements; 6932 for (auto *B : S->body()) { 6933 StmtResult Result = getDerived().TransformStmt( 6934 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 6935 6936 if (Result.isInvalid()) { 6937 // Immediately fail if this was a DeclStmt, since it's very 6938 // likely that this will cause problems for future statements. 6939 if (isa<DeclStmt>(B)) 6940 return StmtError(); 6941 6942 // Otherwise, just keep processing substatements and fail later. 6943 SubStmtInvalid = true; 6944 continue; 6945 } 6946 6947 SubStmtChanged = SubStmtChanged || Result.get() != B; 6948 Statements.push_back(Result.getAs<Stmt>()); 6949 } 6950 6951 if (SubStmtInvalid) 6952 return StmtError(); 6953 6954 if (!getDerived().AlwaysRebuild() && 6955 !SubStmtChanged) 6956 return S; 6957 6958 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6959 Statements, 6960 S->getRBracLoc(), 6961 IsStmtExpr); 6962 } 6963 6964 template<typename Derived> 6965 StmtResult 6966 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6967 ExprResult LHS, RHS; 6968 { 6969 EnterExpressionEvaluationContext Unevaluated( 6970 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6971 6972 // Transform the left-hand case value. 6973 LHS = getDerived().TransformExpr(S->getLHS()); 6974 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 6975 if (LHS.isInvalid()) 6976 return StmtError(); 6977 6978 // Transform the right-hand case value (for the GNU case-range extension). 6979 RHS = getDerived().TransformExpr(S->getRHS()); 6980 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 6981 if (RHS.isInvalid()) 6982 return StmtError(); 6983 } 6984 6985 // Build the case statement. 6986 // Case statements are always rebuilt so that they will attached to their 6987 // transformed switch statement. 6988 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6989 LHS.get(), 6990 S->getEllipsisLoc(), 6991 RHS.get(), 6992 S->getColonLoc()); 6993 if (Case.isInvalid()) 6994 return StmtError(); 6995 6996 // Transform the statement following the case 6997 StmtResult SubStmt = 6998 getDerived().TransformStmt(S->getSubStmt()); 6999 if (SubStmt.isInvalid()) 7000 return StmtError(); 7001 7002 // Attach the body to the case statement 7003 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7004 } 7005 7006 template <typename Derived> 7007 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7008 // Transform the statement following the default case 7009 StmtResult SubStmt = 7010 getDerived().TransformStmt(S->getSubStmt()); 7011 if (SubStmt.isInvalid()) 7012 return StmtError(); 7013 7014 // Default statements are always rebuilt 7015 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7016 SubStmt.get()); 7017 } 7018 7019 template<typename Derived> 7020 StmtResult 7021 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7022 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7023 if (SubStmt.isInvalid()) 7024 return StmtError(); 7025 7026 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7027 S->getDecl()); 7028 if (!LD) 7029 return StmtError(); 7030 7031 // If we're transforming "in-place" (we're not creating new local 7032 // declarations), assume we're replacing the old label statement 7033 // and clear out the reference to it. 7034 if (LD == S->getDecl()) 7035 S->getDecl()->setStmt(nullptr); 7036 7037 // FIXME: Pass the real colon location in. 7038 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7039 cast<LabelDecl>(LD), SourceLocation(), 7040 SubStmt.get()); 7041 } 7042 7043 template <typename Derived> 7044 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7045 if (!R) 7046 return R; 7047 7048 switch (R->getKind()) { 7049 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7050 #define ATTR(X) 7051 #define PRAGMA_SPELLING_ATTR(X) \ 7052 case attr::X: \ 7053 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7054 #include "clang/Basic/AttrList.inc" 7055 default: 7056 return R; 7057 } 7058 } 7059 7060 template <typename Derived> 7061 StmtResult 7062 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7063 StmtDiscardKind SDK) { 7064 bool AttrsChanged = false; 7065 SmallVector<const Attr *, 1> Attrs; 7066 7067 // Visit attributes and keep track if any are transformed. 7068 for (const auto *I : S->getAttrs()) { 7069 const Attr *R = getDerived().TransformAttr(I); 7070 AttrsChanged |= (I != R); 7071 Attrs.push_back(R); 7072 } 7073 7074 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7075 if (SubStmt.isInvalid()) 7076 return StmtError(); 7077 7078 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7079 return S; 7080 7081 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7082 SubStmt.get()); 7083 } 7084 7085 template<typename Derived> 7086 StmtResult 7087 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7088 // Transform the initialization statement 7089 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7090 if (Init.isInvalid()) 7091 return StmtError(); 7092 7093 // Transform the condition 7094 Sema::ConditionResult Cond = getDerived().TransformCondition( 7095 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7096 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7097 : Sema::ConditionKind::Boolean); 7098 if (Cond.isInvalid()) 7099 return StmtError(); 7100 7101 // If this is a constexpr if, determine which arm we should instantiate. 7102 llvm::Optional<bool> ConstexprConditionValue; 7103 if (S->isConstexpr()) 7104 ConstexprConditionValue = Cond.getKnownValue(); 7105 7106 // Transform the "then" branch. 7107 StmtResult Then; 7108 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7109 Then = getDerived().TransformStmt(S->getThen()); 7110 if (Then.isInvalid()) 7111 return StmtError(); 7112 } else { 7113 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7114 } 7115 7116 // Transform the "else" branch. 7117 StmtResult Else; 7118 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7119 Else = getDerived().TransformStmt(S->getElse()); 7120 if (Else.isInvalid()) 7121 return StmtError(); 7122 } 7123 7124 if (!getDerived().AlwaysRebuild() && 7125 Init.get() == S->getInit() && 7126 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7127 Then.get() == S->getThen() && 7128 Else.get() == S->getElse()) 7129 return S; 7130 7131 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 7132 Init.get(), Then.get(), S->getElseLoc(), 7133 Else.get()); 7134 } 7135 7136 template<typename Derived> 7137 StmtResult 7138 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7139 // Transform the initialization statement 7140 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7141 if (Init.isInvalid()) 7142 return StmtError(); 7143 7144 // Transform the condition. 7145 Sema::ConditionResult Cond = getDerived().TransformCondition( 7146 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7147 Sema::ConditionKind::Switch); 7148 if (Cond.isInvalid()) 7149 return StmtError(); 7150 7151 // Rebuild the switch statement. 7152 StmtResult Switch 7153 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 7154 if (Switch.isInvalid()) 7155 return StmtError(); 7156 7157 // Transform the body of the switch statement. 7158 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7159 if (Body.isInvalid()) 7160 return StmtError(); 7161 7162 // Complete the switch statement. 7163 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7164 Body.get()); 7165 } 7166 7167 template<typename Derived> 7168 StmtResult 7169 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7170 // Transform the condition 7171 Sema::ConditionResult Cond = getDerived().TransformCondition( 7172 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7173 Sema::ConditionKind::Boolean); 7174 if (Cond.isInvalid()) 7175 return StmtError(); 7176 7177 // Transform the body 7178 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7179 if (Body.isInvalid()) 7180 return StmtError(); 7181 7182 if (!getDerived().AlwaysRebuild() && 7183 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7184 Body.get() == S->getBody()) 7185 return Owned(S); 7186 7187 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 7188 } 7189 7190 template<typename Derived> 7191 StmtResult 7192 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7193 // Transform the body 7194 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7195 if (Body.isInvalid()) 7196 return StmtError(); 7197 7198 // Transform the condition 7199 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7200 if (Cond.isInvalid()) 7201 return StmtError(); 7202 7203 if (!getDerived().AlwaysRebuild() && 7204 Cond.get() == S->getCond() && 7205 Body.get() == S->getBody()) 7206 return S; 7207 7208 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7209 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7210 S->getRParenLoc()); 7211 } 7212 7213 template<typename Derived> 7214 StmtResult 7215 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7216 if (getSema().getLangOpts().OpenMP) 7217 getSema().startOpenMPLoop(); 7218 7219 // Transform the initialization statement 7220 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7221 if (Init.isInvalid()) 7222 return StmtError(); 7223 7224 // In OpenMP loop region loop control variable must be captured and be 7225 // private. Perform analysis of first part (if any). 7226 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7227 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7228 7229 // Transform the condition 7230 Sema::ConditionResult Cond = getDerived().TransformCondition( 7231 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7232 Sema::ConditionKind::Boolean); 7233 if (Cond.isInvalid()) 7234 return StmtError(); 7235 7236 // Transform the increment 7237 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7238 if (Inc.isInvalid()) 7239 return StmtError(); 7240 7241 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7242 if (S->getInc() && !FullInc.get()) 7243 return StmtError(); 7244 7245 // Transform the body 7246 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7247 if (Body.isInvalid()) 7248 return StmtError(); 7249 7250 if (!getDerived().AlwaysRebuild() && 7251 Init.get() == S->getInit() && 7252 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7253 Inc.get() == S->getInc() && 7254 Body.get() == S->getBody()) 7255 return S; 7256 7257 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7258 Init.get(), Cond, FullInc, 7259 S->getRParenLoc(), Body.get()); 7260 } 7261 7262 template<typename Derived> 7263 StmtResult 7264 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7265 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7266 S->getLabel()); 7267 if (!LD) 7268 return StmtError(); 7269 7270 // Goto statements must always be rebuilt, to resolve the label. 7271 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7272 cast<LabelDecl>(LD)); 7273 } 7274 7275 template<typename Derived> 7276 StmtResult 7277 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7278 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7279 if (Target.isInvalid()) 7280 return StmtError(); 7281 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7282 7283 if (!getDerived().AlwaysRebuild() && 7284 Target.get() == S->getTarget()) 7285 return S; 7286 7287 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7288 Target.get()); 7289 } 7290 7291 template<typename Derived> 7292 StmtResult 7293 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7294 return S; 7295 } 7296 7297 template<typename Derived> 7298 StmtResult 7299 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7300 return S; 7301 } 7302 7303 template<typename Derived> 7304 StmtResult 7305 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7306 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7307 /*NotCopyInit*/false); 7308 if (Result.isInvalid()) 7309 return StmtError(); 7310 7311 // FIXME: We always rebuild the return statement because there is no way 7312 // to tell whether the return type of the function has changed. 7313 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7314 } 7315 7316 template<typename Derived> 7317 StmtResult 7318 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7319 bool DeclChanged = false; 7320 SmallVector<Decl *, 4> Decls; 7321 for (auto *D : S->decls()) { 7322 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7323 if (!Transformed) 7324 return StmtError(); 7325 7326 if (Transformed != D) 7327 DeclChanged = true; 7328 7329 Decls.push_back(Transformed); 7330 } 7331 7332 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7333 return S; 7334 7335 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7336 } 7337 7338 template<typename Derived> 7339 StmtResult 7340 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7341 7342 SmallVector<Expr*, 8> Constraints; 7343 SmallVector<Expr*, 8> Exprs; 7344 SmallVector<IdentifierInfo *, 4> Names; 7345 7346 ExprResult AsmString; 7347 SmallVector<Expr*, 8> Clobbers; 7348 7349 bool ExprsChanged = false; 7350 7351 // Go through the outputs. 7352 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7353 Names.push_back(S->getOutputIdentifier(I)); 7354 7355 // No need to transform the constraint literal. 7356 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7357 7358 // Transform the output expr. 7359 Expr *OutputExpr = S->getOutputExpr(I); 7360 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7361 if (Result.isInvalid()) 7362 return StmtError(); 7363 7364 ExprsChanged |= Result.get() != OutputExpr; 7365 7366 Exprs.push_back(Result.get()); 7367 } 7368 7369 // Go through the inputs. 7370 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7371 Names.push_back(S->getInputIdentifier(I)); 7372 7373 // No need to transform the constraint literal. 7374 Constraints.push_back(S->getInputConstraintLiteral(I)); 7375 7376 // Transform the input expr. 7377 Expr *InputExpr = S->getInputExpr(I); 7378 ExprResult Result = getDerived().TransformExpr(InputExpr); 7379 if (Result.isInvalid()) 7380 return StmtError(); 7381 7382 ExprsChanged |= Result.get() != InputExpr; 7383 7384 Exprs.push_back(Result.get()); 7385 } 7386 7387 // Go through the Labels. 7388 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7389 Names.push_back(S->getLabelIdentifier(I)); 7390 7391 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7392 if (Result.isInvalid()) 7393 return StmtError(); 7394 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7395 Exprs.push_back(Result.get()); 7396 } 7397 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7398 return S; 7399 7400 // Go through the clobbers. 7401 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7402 Clobbers.push_back(S->getClobberStringLiteral(I)); 7403 7404 // No need to transform the asm string literal. 7405 AsmString = S->getAsmString(); 7406 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7407 S->isVolatile(), S->getNumOutputs(), 7408 S->getNumInputs(), Names.data(), 7409 Constraints, Exprs, AsmString.get(), 7410 Clobbers, S->getNumLabels(), 7411 S->getRParenLoc()); 7412 } 7413 7414 template<typename Derived> 7415 StmtResult 7416 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7417 ArrayRef<Token> AsmToks = 7418 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7419 7420 bool HadError = false, HadChange = false; 7421 7422 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7423 SmallVector<Expr*, 8> TransformedExprs; 7424 TransformedExprs.reserve(SrcExprs.size()); 7425 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7426 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7427 if (!Result.isUsable()) { 7428 HadError = true; 7429 } else { 7430 HadChange |= (Result.get() != SrcExprs[i]); 7431 TransformedExprs.push_back(Result.get()); 7432 } 7433 } 7434 7435 if (HadError) return StmtError(); 7436 if (!HadChange && !getDerived().AlwaysRebuild()) 7437 return Owned(S); 7438 7439 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7440 AsmToks, S->getAsmString(), 7441 S->getNumOutputs(), S->getNumInputs(), 7442 S->getAllConstraints(), S->getClobbers(), 7443 TransformedExprs, S->getEndLoc()); 7444 } 7445 7446 // C++ Coroutines TS 7447 7448 template<typename Derived> 7449 StmtResult 7450 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7451 auto *ScopeInfo = SemaRef.getCurFunction(); 7452 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7453 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7454 ScopeInfo->NeedsCoroutineSuspends && 7455 ScopeInfo->CoroutineSuspends.first == nullptr && 7456 ScopeInfo->CoroutineSuspends.second == nullptr && 7457 "expected clean scope info"); 7458 7459 // Set that we have (possibly-invalid) suspend points before we do anything 7460 // that may fail. 7461 ScopeInfo->setNeedsCoroutineSuspends(false); 7462 7463 // We re-build the coroutine promise object (and the coroutine parameters its 7464 // type and constructor depend on) based on the types used in our current 7465 // function. We must do so, and set it on the current FunctionScopeInfo, 7466 // before attempting to transform the other parts of the coroutine body 7467 // statement, such as the implicit suspend statements (because those 7468 // statements reference the FunctionScopeInfo::CoroutinePromise). 7469 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7470 return StmtError(); 7471 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7472 if (!Promise) 7473 return StmtError(); 7474 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7475 ScopeInfo->CoroutinePromise = Promise; 7476 7477 // Transform the implicit coroutine statements constructed using dependent 7478 // types during the previous parse: initial and final suspensions, the return 7479 // object, and others. We also transform the coroutine function's body. 7480 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7481 if (InitSuspend.isInvalid()) 7482 return StmtError(); 7483 StmtResult FinalSuspend = 7484 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7485 if (FinalSuspend.isInvalid()) 7486 return StmtError(); 7487 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7488 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7489 7490 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7491 if (BodyRes.isInvalid()) 7492 return StmtError(); 7493 7494 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7495 if (Builder.isInvalid()) 7496 return StmtError(); 7497 7498 Expr *ReturnObject = S->getReturnValueInit(); 7499 assert(ReturnObject && "the return object is expected to be valid"); 7500 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7501 /*NoCopyInit*/ false); 7502 if (Res.isInvalid()) 7503 return StmtError(); 7504 Builder.ReturnValue = Res.get(); 7505 7506 // If during the previous parse the coroutine still had a dependent promise 7507 // statement, we may need to build some implicit coroutine statements 7508 // (such as exception and fallthrough handlers) for the first time. 7509 if (S->hasDependentPromiseType()) { 7510 // We can only build these statements, however, if the current promise type 7511 // is not dependent. 7512 if (!Promise->getType()->isDependentType()) { 7513 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7514 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7515 "these nodes should not have been built yet"); 7516 if (!Builder.buildDependentStatements()) 7517 return StmtError(); 7518 } 7519 } else { 7520 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7521 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7522 if (Res.isInvalid()) 7523 return StmtError(); 7524 Builder.OnFallthrough = Res.get(); 7525 } 7526 7527 if (auto *OnException = S->getExceptionHandler()) { 7528 StmtResult Res = getDerived().TransformStmt(OnException); 7529 if (Res.isInvalid()) 7530 return StmtError(); 7531 Builder.OnException = Res.get(); 7532 } 7533 7534 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7535 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7536 if (Res.isInvalid()) 7537 return StmtError(); 7538 Builder.ReturnStmtOnAllocFailure = Res.get(); 7539 } 7540 7541 // Transform any additional statements we may have already built 7542 assert(S->getAllocate() && S->getDeallocate() && 7543 "allocation and deallocation calls must already be built"); 7544 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7545 if (AllocRes.isInvalid()) 7546 return StmtError(); 7547 Builder.Allocate = AllocRes.get(); 7548 7549 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7550 if (DeallocRes.isInvalid()) 7551 return StmtError(); 7552 Builder.Deallocate = DeallocRes.get(); 7553 7554 assert(S->getResultDecl() && "ResultDecl must already be built"); 7555 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7556 if (ResultDecl.isInvalid()) 7557 return StmtError(); 7558 Builder.ResultDecl = ResultDecl.get(); 7559 7560 if (auto *ReturnStmt = S->getReturnStmt()) { 7561 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7562 if (Res.isInvalid()) 7563 return StmtError(); 7564 Builder.ReturnStmt = Res.get(); 7565 } 7566 } 7567 7568 return getDerived().RebuildCoroutineBodyStmt(Builder); 7569 } 7570 7571 template<typename Derived> 7572 StmtResult 7573 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7574 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7575 /*NotCopyInit*/false); 7576 if (Result.isInvalid()) 7577 return StmtError(); 7578 7579 // Always rebuild; we don't know if this needs to be injected into a new 7580 // context or if the promise type has changed. 7581 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7582 S->isImplicit()); 7583 } 7584 7585 template<typename Derived> 7586 ExprResult 7587 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7588 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7589 /*NotCopyInit*/false); 7590 if (Result.isInvalid()) 7591 return ExprError(); 7592 7593 // Always rebuild; we don't know if this needs to be injected into a new 7594 // context or if the promise type has changed. 7595 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7596 E->isImplicit()); 7597 } 7598 7599 template <typename Derived> 7600 ExprResult 7601 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7602 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7603 /*NotCopyInit*/ false); 7604 if (OperandResult.isInvalid()) 7605 return ExprError(); 7606 7607 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7608 E->getOperatorCoawaitLookup()); 7609 7610 if (LookupResult.isInvalid()) 7611 return ExprError(); 7612 7613 // Always rebuild; we don't know if this needs to be injected into a new 7614 // context or if the promise type has changed. 7615 return getDerived().RebuildDependentCoawaitExpr( 7616 E->getKeywordLoc(), OperandResult.get(), 7617 cast<UnresolvedLookupExpr>(LookupResult.get())); 7618 } 7619 7620 template<typename Derived> 7621 ExprResult 7622 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7623 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7624 /*NotCopyInit*/false); 7625 if (Result.isInvalid()) 7626 return ExprError(); 7627 7628 // Always rebuild; we don't know if this needs to be injected into a new 7629 // context or if the promise type has changed. 7630 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7631 } 7632 7633 // Objective-C Statements. 7634 7635 template<typename Derived> 7636 StmtResult 7637 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7638 // Transform the body of the @try. 7639 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7640 if (TryBody.isInvalid()) 7641 return StmtError(); 7642 7643 // Transform the @catch statements (if present). 7644 bool AnyCatchChanged = false; 7645 SmallVector<Stmt*, 8> CatchStmts; 7646 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7647 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7648 if (Catch.isInvalid()) 7649 return StmtError(); 7650 if (Catch.get() != S->getCatchStmt(I)) 7651 AnyCatchChanged = true; 7652 CatchStmts.push_back(Catch.get()); 7653 } 7654 7655 // Transform the @finally statement (if present). 7656 StmtResult Finally; 7657 if (S->getFinallyStmt()) { 7658 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7659 if (Finally.isInvalid()) 7660 return StmtError(); 7661 } 7662 7663 // If nothing changed, just retain this statement. 7664 if (!getDerived().AlwaysRebuild() && 7665 TryBody.get() == S->getTryBody() && 7666 !AnyCatchChanged && 7667 Finally.get() == S->getFinallyStmt()) 7668 return S; 7669 7670 // Build a new statement. 7671 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7672 CatchStmts, Finally.get()); 7673 } 7674 7675 template<typename Derived> 7676 StmtResult 7677 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7678 // Transform the @catch parameter, if there is one. 7679 VarDecl *Var = nullptr; 7680 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7681 TypeSourceInfo *TSInfo = nullptr; 7682 if (FromVar->getTypeSourceInfo()) { 7683 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7684 if (!TSInfo) 7685 return StmtError(); 7686 } 7687 7688 QualType T; 7689 if (TSInfo) 7690 T = TSInfo->getType(); 7691 else { 7692 T = getDerived().TransformType(FromVar->getType()); 7693 if (T.isNull()) 7694 return StmtError(); 7695 } 7696 7697 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7698 if (!Var) 7699 return StmtError(); 7700 } 7701 7702 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7703 if (Body.isInvalid()) 7704 return StmtError(); 7705 7706 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7707 S->getRParenLoc(), 7708 Var, Body.get()); 7709 } 7710 7711 template<typename Derived> 7712 StmtResult 7713 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7714 // Transform the body. 7715 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7716 if (Body.isInvalid()) 7717 return StmtError(); 7718 7719 // If nothing changed, just retain this statement. 7720 if (!getDerived().AlwaysRebuild() && 7721 Body.get() == S->getFinallyBody()) 7722 return S; 7723 7724 // Build a new statement. 7725 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7726 Body.get()); 7727 } 7728 7729 template<typename Derived> 7730 StmtResult 7731 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7732 ExprResult Operand; 7733 if (S->getThrowExpr()) { 7734 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7735 if (Operand.isInvalid()) 7736 return StmtError(); 7737 } 7738 7739 if (!getDerived().AlwaysRebuild() && 7740 Operand.get() == S->getThrowExpr()) 7741 return S; 7742 7743 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7744 } 7745 7746 template<typename Derived> 7747 StmtResult 7748 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7749 ObjCAtSynchronizedStmt *S) { 7750 // Transform the object we are locking. 7751 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7752 if (Object.isInvalid()) 7753 return StmtError(); 7754 Object = 7755 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7756 Object.get()); 7757 if (Object.isInvalid()) 7758 return StmtError(); 7759 7760 // Transform the body. 7761 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7762 if (Body.isInvalid()) 7763 return StmtError(); 7764 7765 // If nothing change, just retain the current statement. 7766 if (!getDerived().AlwaysRebuild() && 7767 Object.get() == S->getSynchExpr() && 7768 Body.get() == S->getSynchBody()) 7769 return S; 7770 7771 // Build a new statement. 7772 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7773 Object.get(), Body.get()); 7774 } 7775 7776 template<typename Derived> 7777 StmtResult 7778 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7779 ObjCAutoreleasePoolStmt *S) { 7780 // Transform the body. 7781 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7782 if (Body.isInvalid()) 7783 return StmtError(); 7784 7785 // If nothing changed, just retain this statement. 7786 if (!getDerived().AlwaysRebuild() && 7787 Body.get() == S->getSubStmt()) 7788 return S; 7789 7790 // Build a new statement. 7791 return getDerived().RebuildObjCAutoreleasePoolStmt( 7792 S->getAtLoc(), Body.get()); 7793 } 7794 7795 template<typename Derived> 7796 StmtResult 7797 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7798 ObjCForCollectionStmt *S) { 7799 // Transform the element statement. 7800 StmtResult Element = 7801 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7802 if (Element.isInvalid()) 7803 return StmtError(); 7804 7805 // Transform the collection expression. 7806 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7807 if (Collection.isInvalid()) 7808 return StmtError(); 7809 7810 // Transform the body. 7811 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7812 if (Body.isInvalid()) 7813 return StmtError(); 7814 7815 // If nothing changed, just retain this statement. 7816 if (!getDerived().AlwaysRebuild() && 7817 Element.get() == S->getElement() && 7818 Collection.get() == S->getCollection() && 7819 Body.get() == S->getBody()) 7820 return S; 7821 7822 // Build a new statement. 7823 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7824 Element.get(), 7825 Collection.get(), 7826 S->getRParenLoc(), 7827 Body.get()); 7828 } 7829 7830 template <typename Derived> 7831 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7832 // Transform the exception declaration, if any. 7833 VarDecl *Var = nullptr; 7834 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7835 TypeSourceInfo *T = 7836 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7837 if (!T) 7838 return StmtError(); 7839 7840 Var = getDerived().RebuildExceptionDecl( 7841 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7842 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7843 if (!Var || Var->isInvalidDecl()) 7844 return StmtError(); 7845 } 7846 7847 // Transform the actual exception handler. 7848 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7849 if (Handler.isInvalid()) 7850 return StmtError(); 7851 7852 if (!getDerived().AlwaysRebuild() && !Var && 7853 Handler.get() == S->getHandlerBlock()) 7854 return S; 7855 7856 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7857 } 7858 7859 template <typename Derived> 7860 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7861 // Transform the try block itself. 7862 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7863 if (TryBlock.isInvalid()) 7864 return StmtError(); 7865 7866 // Transform the handlers. 7867 bool HandlerChanged = false; 7868 SmallVector<Stmt *, 8> Handlers; 7869 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7870 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7871 if (Handler.isInvalid()) 7872 return StmtError(); 7873 7874 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7875 Handlers.push_back(Handler.getAs<Stmt>()); 7876 } 7877 7878 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7879 !HandlerChanged) 7880 return S; 7881 7882 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7883 Handlers); 7884 } 7885 7886 template<typename Derived> 7887 StmtResult 7888 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7889 StmtResult Init = 7890 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 7891 if (Init.isInvalid()) 7892 return StmtError(); 7893 7894 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7895 if (Range.isInvalid()) 7896 return StmtError(); 7897 7898 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7899 if (Begin.isInvalid()) 7900 return StmtError(); 7901 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7902 if (End.isInvalid()) 7903 return StmtError(); 7904 7905 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7906 if (Cond.isInvalid()) 7907 return StmtError(); 7908 if (Cond.get()) 7909 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7910 if (Cond.isInvalid()) 7911 return StmtError(); 7912 if (Cond.get()) 7913 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7914 7915 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7916 if (Inc.isInvalid()) 7917 return StmtError(); 7918 if (Inc.get()) 7919 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7920 7921 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7922 if (LoopVar.isInvalid()) 7923 return StmtError(); 7924 7925 StmtResult NewStmt = S; 7926 if (getDerived().AlwaysRebuild() || 7927 Init.get() != S->getInit() || 7928 Range.get() != S->getRangeStmt() || 7929 Begin.get() != S->getBeginStmt() || 7930 End.get() != S->getEndStmt() || 7931 Cond.get() != S->getCond() || 7932 Inc.get() != S->getInc() || 7933 LoopVar.get() != S->getLoopVarStmt()) { 7934 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7935 S->getCoawaitLoc(), Init.get(), 7936 S->getColonLoc(), Range.get(), 7937 Begin.get(), End.get(), 7938 Cond.get(), 7939 Inc.get(), LoopVar.get(), 7940 S->getRParenLoc()); 7941 if (NewStmt.isInvalid()) 7942 return StmtError(); 7943 } 7944 7945 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7946 if (Body.isInvalid()) 7947 return StmtError(); 7948 7949 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7950 // it now so we have a new statement to attach the body to. 7951 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7952 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7953 S->getCoawaitLoc(), Init.get(), 7954 S->getColonLoc(), Range.get(), 7955 Begin.get(), End.get(), 7956 Cond.get(), 7957 Inc.get(), LoopVar.get(), 7958 S->getRParenLoc()); 7959 if (NewStmt.isInvalid()) 7960 return StmtError(); 7961 } 7962 7963 if (NewStmt.get() == S) 7964 return S; 7965 7966 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7967 } 7968 7969 template<typename Derived> 7970 StmtResult 7971 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7972 MSDependentExistsStmt *S) { 7973 // Transform the nested-name-specifier, if any. 7974 NestedNameSpecifierLoc QualifierLoc; 7975 if (S->getQualifierLoc()) { 7976 QualifierLoc 7977 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7978 if (!QualifierLoc) 7979 return StmtError(); 7980 } 7981 7982 // Transform the declaration name. 7983 DeclarationNameInfo NameInfo = S->getNameInfo(); 7984 if (NameInfo.getName()) { 7985 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7986 if (!NameInfo.getName()) 7987 return StmtError(); 7988 } 7989 7990 // Check whether anything changed. 7991 if (!getDerived().AlwaysRebuild() && 7992 QualifierLoc == S->getQualifierLoc() && 7993 NameInfo.getName() == S->getNameInfo().getName()) 7994 return S; 7995 7996 // Determine whether this name exists, if we can. 7997 CXXScopeSpec SS; 7998 SS.Adopt(QualifierLoc); 7999 bool Dependent = false; 8000 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8001 case Sema::IER_Exists: 8002 if (S->isIfExists()) 8003 break; 8004 8005 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8006 8007 case Sema::IER_DoesNotExist: 8008 if (S->isIfNotExists()) 8009 break; 8010 8011 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8012 8013 case Sema::IER_Dependent: 8014 Dependent = true; 8015 break; 8016 8017 case Sema::IER_Error: 8018 return StmtError(); 8019 } 8020 8021 // We need to continue with the instantiation, so do so now. 8022 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8023 if (SubStmt.isInvalid()) 8024 return StmtError(); 8025 8026 // If we have resolved the name, just transform to the substatement. 8027 if (!Dependent) 8028 return SubStmt; 8029 8030 // The name is still dependent, so build a dependent expression again. 8031 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8032 S->isIfExists(), 8033 QualifierLoc, 8034 NameInfo, 8035 SubStmt.get()); 8036 } 8037 8038 template<typename Derived> 8039 ExprResult 8040 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8041 NestedNameSpecifierLoc QualifierLoc; 8042 if (E->getQualifierLoc()) { 8043 QualifierLoc 8044 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8045 if (!QualifierLoc) 8046 return ExprError(); 8047 } 8048 8049 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8050 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8051 if (!PD) 8052 return ExprError(); 8053 8054 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8055 if (Base.isInvalid()) 8056 return ExprError(); 8057 8058 return new (SemaRef.getASTContext()) 8059 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8060 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8061 QualifierLoc, E->getMemberLoc()); 8062 } 8063 8064 template <typename Derived> 8065 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8066 MSPropertySubscriptExpr *E) { 8067 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8068 if (BaseRes.isInvalid()) 8069 return ExprError(); 8070 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8071 if (IdxRes.isInvalid()) 8072 return ExprError(); 8073 8074 if (!getDerived().AlwaysRebuild() && 8075 BaseRes.get() == E->getBase() && 8076 IdxRes.get() == E->getIdx()) 8077 return E; 8078 8079 return getDerived().RebuildArraySubscriptExpr( 8080 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8081 } 8082 8083 template <typename Derived> 8084 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8085 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8086 if (TryBlock.isInvalid()) 8087 return StmtError(); 8088 8089 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8090 if (Handler.isInvalid()) 8091 return StmtError(); 8092 8093 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8094 Handler.get() == S->getHandler()) 8095 return S; 8096 8097 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8098 TryBlock.get(), Handler.get()); 8099 } 8100 8101 template <typename Derived> 8102 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8103 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8104 if (Block.isInvalid()) 8105 return StmtError(); 8106 8107 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8108 } 8109 8110 template <typename Derived> 8111 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8112 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8113 if (FilterExpr.isInvalid()) 8114 return StmtError(); 8115 8116 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8117 if (Block.isInvalid()) 8118 return StmtError(); 8119 8120 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8121 Block.get()); 8122 } 8123 8124 template <typename Derived> 8125 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8126 if (isa<SEHFinallyStmt>(Handler)) 8127 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8128 else 8129 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8130 } 8131 8132 template<typename Derived> 8133 StmtResult 8134 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8135 return S; 8136 } 8137 8138 //===----------------------------------------------------------------------===// 8139 // OpenMP directive transformation 8140 //===----------------------------------------------------------------------===// 8141 template <typename Derived> 8142 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8143 OMPExecutableDirective *D) { 8144 8145 // Transform the clauses 8146 llvm::SmallVector<OMPClause *, 16> TClauses; 8147 ArrayRef<OMPClause *> Clauses = D->clauses(); 8148 TClauses.reserve(Clauses.size()); 8149 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8150 I != E; ++I) { 8151 if (*I) { 8152 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8153 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8154 getDerived().getSema().EndOpenMPClause(); 8155 if (Clause) 8156 TClauses.push_back(Clause); 8157 } else { 8158 TClauses.push_back(nullptr); 8159 } 8160 } 8161 StmtResult AssociatedStmt; 8162 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8163 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8164 /*CurScope=*/nullptr); 8165 StmtResult Body; 8166 { 8167 Sema::CompoundScopeRAII CompoundScope(getSema()); 8168 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 8169 Body = getDerived().TransformStmt(CS); 8170 } 8171 AssociatedStmt = 8172 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8173 if (AssociatedStmt.isInvalid()) { 8174 return StmtError(); 8175 } 8176 } 8177 if (TClauses.size() != Clauses.size()) { 8178 return StmtError(); 8179 } 8180 8181 // Transform directive name for 'omp critical' directive. 8182 DeclarationNameInfo DirName; 8183 if (D->getDirectiveKind() == OMPD_critical) { 8184 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8185 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8186 } 8187 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8188 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8189 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8190 } else if (D->getDirectiveKind() == OMPD_cancel) { 8191 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8192 } 8193 8194 return getDerived().RebuildOMPExecutableDirective( 8195 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8196 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8197 } 8198 8199 template <typename Derived> 8200 StmtResult 8201 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8202 DeclarationNameInfo DirName; 8203 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8204 D->getBeginLoc()); 8205 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8206 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8207 return Res; 8208 } 8209 8210 template <typename Derived> 8211 StmtResult 8212 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8213 DeclarationNameInfo DirName; 8214 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8215 D->getBeginLoc()); 8216 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8217 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8218 return Res; 8219 } 8220 8221 template <typename Derived> 8222 StmtResult 8223 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8224 DeclarationNameInfo DirName; 8225 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8226 D->getBeginLoc()); 8227 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8228 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8229 return Res; 8230 } 8231 8232 template <typename Derived> 8233 StmtResult 8234 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8235 DeclarationNameInfo DirName; 8236 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8237 D->getBeginLoc()); 8238 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8239 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8240 return Res; 8241 } 8242 8243 template <typename Derived> 8244 StmtResult 8245 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8246 DeclarationNameInfo DirName; 8247 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8248 D->getBeginLoc()); 8249 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8250 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8251 return Res; 8252 } 8253 8254 template <typename Derived> 8255 StmtResult 8256 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8257 DeclarationNameInfo DirName; 8258 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8259 D->getBeginLoc()); 8260 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8261 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8262 return Res; 8263 } 8264 8265 template <typename Derived> 8266 StmtResult 8267 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8268 DeclarationNameInfo DirName; 8269 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8270 D->getBeginLoc()); 8271 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8272 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8273 return Res; 8274 } 8275 8276 template <typename Derived> 8277 StmtResult 8278 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8279 DeclarationNameInfo DirName; 8280 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8281 D->getBeginLoc()); 8282 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8283 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8284 return Res; 8285 } 8286 8287 template <typename Derived> 8288 StmtResult 8289 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8290 getDerived().getSema().StartOpenMPDSABlock( 8291 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8292 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8293 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8294 return Res; 8295 } 8296 8297 template <typename Derived> 8298 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8299 OMPParallelForDirective *D) { 8300 DeclarationNameInfo DirName; 8301 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8302 nullptr, D->getBeginLoc()); 8303 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8304 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8305 return Res; 8306 } 8307 8308 template <typename Derived> 8309 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8310 OMPParallelForSimdDirective *D) { 8311 DeclarationNameInfo DirName; 8312 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8313 nullptr, D->getBeginLoc()); 8314 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8315 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8316 return Res; 8317 } 8318 8319 template <typename Derived> 8320 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8321 OMPParallelMasterDirective *D) { 8322 DeclarationNameInfo DirName; 8323 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8324 nullptr, D->getBeginLoc()); 8325 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8326 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8327 return Res; 8328 } 8329 8330 template <typename Derived> 8331 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8332 OMPParallelSectionsDirective *D) { 8333 DeclarationNameInfo DirName; 8334 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8335 nullptr, D->getBeginLoc()); 8336 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8337 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8338 return Res; 8339 } 8340 8341 template <typename Derived> 8342 StmtResult 8343 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8344 DeclarationNameInfo DirName; 8345 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8346 D->getBeginLoc()); 8347 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8348 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8349 return Res; 8350 } 8351 8352 template <typename Derived> 8353 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8354 OMPTaskyieldDirective *D) { 8355 DeclarationNameInfo DirName; 8356 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8357 D->getBeginLoc()); 8358 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8359 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8360 return Res; 8361 } 8362 8363 template <typename Derived> 8364 StmtResult 8365 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8366 DeclarationNameInfo DirName; 8367 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8368 D->getBeginLoc()); 8369 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8370 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8371 return Res; 8372 } 8373 8374 template <typename Derived> 8375 StmtResult 8376 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8377 DeclarationNameInfo DirName; 8378 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8379 D->getBeginLoc()); 8380 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8381 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8382 return Res; 8383 } 8384 8385 template <typename Derived> 8386 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8387 OMPTaskgroupDirective *D) { 8388 DeclarationNameInfo DirName; 8389 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8390 D->getBeginLoc()); 8391 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8392 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8393 return Res; 8394 } 8395 8396 template <typename Derived> 8397 StmtResult 8398 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8399 DeclarationNameInfo DirName; 8400 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8401 D->getBeginLoc()); 8402 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8403 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8404 return Res; 8405 } 8406 8407 template <typename Derived> 8408 StmtResult 8409 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8410 DeclarationNameInfo DirName; 8411 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8412 D->getBeginLoc()); 8413 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8414 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8415 return Res; 8416 } 8417 8418 template <typename Derived> 8419 StmtResult 8420 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8421 DeclarationNameInfo DirName; 8422 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8423 D->getBeginLoc()); 8424 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8425 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8426 return Res; 8427 } 8428 8429 template <typename Derived> 8430 StmtResult 8431 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8432 DeclarationNameInfo DirName; 8433 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8434 D->getBeginLoc()); 8435 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8436 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8437 return Res; 8438 } 8439 8440 template <typename Derived> 8441 StmtResult 8442 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8443 DeclarationNameInfo DirName; 8444 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8445 D->getBeginLoc()); 8446 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8447 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8448 return Res; 8449 } 8450 8451 template <typename Derived> 8452 StmtResult 8453 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8454 DeclarationNameInfo DirName; 8455 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8456 D->getBeginLoc()); 8457 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8458 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8459 return Res; 8460 } 8461 8462 template <typename Derived> 8463 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8464 OMPTargetDataDirective *D) { 8465 DeclarationNameInfo DirName; 8466 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8467 D->getBeginLoc()); 8468 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8469 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8470 return Res; 8471 } 8472 8473 template <typename Derived> 8474 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8475 OMPTargetEnterDataDirective *D) { 8476 DeclarationNameInfo DirName; 8477 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8478 nullptr, D->getBeginLoc()); 8479 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8480 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8481 return Res; 8482 } 8483 8484 template <typename Derived> 8485 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8486 OMPTargetExitDataDirective *D) { 8487 DeclarationNameInfo DirName; 8488 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8489 nullptr, D->getBeginLoc()); 8490 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8491 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8492 return Res; 8493 } 8494 8495 template <typename Derived> 8496 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8497 OMPTargetParallelDirective *D) { 8498 DeclarationNameInfo DirName; 8499 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8500 nullptr, D->getBeginLoc()); 8501 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8502 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8503 return Res; 8504 } 8505 8506 template <typename Derived> 8507 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8508 OMPTargetParallelForDirective *D) { 8509 DeclarationNameInfo DirName; 8510 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8511 nullptr, D->getBeginLoc()); 8512 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8513 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8514 return Res; 8515 } 8516 8517 template <typename Derived> 8518 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8519 OMPTargetUpdateDirective *D) { 8520 DeclarationNameInfo DirName; 8521 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8522 nullptr, D->getBeginLoc()); 8523 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8524 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8525 return Res; 8526 } 8527 8528 template <typename Derived> 8529 StmtResult 8530 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8531 DeclarationNameInfo DirName; 8532 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8533 D->getBeginLoc()); 8534 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8535 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8536 return Res; 8537 } 8538 8539 template <typename Derived> 8540 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8541 OMPCancellationPointDirective *D) { 8542 DeclarationNameInfo DirName; 8543 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8544 nullptr, D->getBeginLoc()); 8545 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8546 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8547 return Res; 8548 } 8549 8550 template <typename Derived> 8551 StmtResult 8552 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8553 DeclarationNameInfo DirName; 8554 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8555 D->getBeginLoc()); 8556 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8557 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8558 return Res; 8559 } 8560 8561 template <typename Derived> 8562 StmtResult 8563 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8564 DeclarationNameInfo DirName; 8565 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8566 D->getBeginLoc()); 8567 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8568 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8569 return Res; 8570 } 8571 8572 template <typename Derived> 8573 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8574 OMPTaskLoopSimdDirective *D) { 8575 DeclarationNameInfo DirName; 8576 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8577 nullptr, D->getBeginLoc()); 8578 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8579 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8580 return Res; 8581 } 8582 8583 template <typename Derived> 8584 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8585 OMPMasterTaskLoopDirective *D) { 8586 DeclarationNameInfo DirName; 8587 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8588 nullptr, D->getBeginLoc()); 8589 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8590 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8591 return Res; 8592 } 8593 8594 template <typename Derived> 8595 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8596 OMPMasterTaskLoopSimdDirective *D) { 8597 DeclarationNameInfo DirName; 8598 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8599 nullptr, D->getBeginLoc()); 8600 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8601 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8602 return Res; 8603 } 8604 8605 template <typename Derived> 8606 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8607 OMPParallelMasterTaskLoopDirective *D) { 8608 DeclarationNameInfo DirName; 8609 getDerived().getSema().StartOpenMPDSABlock( 8610 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8611 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8612 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8613 return Res; 8614 } 8615 8616 template <typename Derived> 8617 StmtResult 8618 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8619 OMPParallelMasterTaskLoopSimdDirective *D) { 8620 DeclarationNameInfo DirName; 8621 getDerived().getSema().StartOpenMPDSABlock( 8622 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8623 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8624 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8625 return Res; 8626 } 8627 8628 template <typename Derived> 8629 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8630 OMPDistributeDirective *D) { 8631 DeclarationNameInfo DirName; 8632 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8633 D->getBeginLoc()); 8634 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8635 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8636 return Res; 8637 } 8638 8639 template <typename Derived> 8640 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8641 OMPDistributeParallelForDirective *D) { 8642 DeclarationNameInfo DirName; 8643 getDerived().getSema().StartOpenMPDSABlock( 8644 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8645 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8646 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8647 return Res; 8648 } 8649 8650 template <typename Derived> 8651 StmtResult 8652 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8653 OMPDistributeParallelForSimdDirective *D) { 8654 DeclarationNameInfo DirName; 8655 getDerived().getSema().StartOpenMPDSABlock( 8656 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8657 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8658 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8659 return Res; 8660 } 8661 8662 template <typename Derived> 8663 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8664 OMPDistributeSimdDirective *D) { 8665 DeclarationNameInfo DirName; 8666 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8667 nullptr, D->getBeginLoc()); 8668 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8669 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8670 return Res; 8671 } 8672 8673 template <typename Derived> 8674 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8675 OMPTargetParallelForSimdDirective *D) { 8676 DeclarationNameInfo DirName; 8677 getDerived().getSema().StartOpenMPDSABlock( 8678 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8679 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8680 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8681 return Res; 8682 } 8683 8684 template <typename Derived> 8685 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8686 OMPTargetSimdDirective *D) { 8687 DeclarationNameInfo DirName; 8688 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8689 D->getBeginLoc()); 8690 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8691 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8692 return Res; 8693 } 8694 8695 template <typename Derived> 8696 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8697 OMPTeamsDistributeDirective *D) { 8698 DeclarationNameInfo DirName; 8699 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8700 nullptr, D->getBeginLoc()); 8701 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8702 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8703 return Res; 8704 } 8705 8706 template <typename Derived> 8707 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8708 OMPTeamsDistributeSimdDirective *D) { 8709 DeclarationNameInfo DirName; 8710 getDerived().getSema().StartOpenMPDSABlock( 8711 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8712 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8713 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8714 return Res; 8715 } 8716 8717 template <typename Derived> 8718 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8719 OMPTeamsDistributeParallelForSimdDirective *D) { 8720 DeclarationNameInfo DirName; 8721 getDerived().getSema().StartOpenMPDSABlock( 8722 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8723 D->getBeginLoc()); 8724 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8725 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8726 return Res; 8727 } 8728 8729 template <typename Derived> 8730 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8731 OMPTeamsDistributeParallelForDirective *D) { 8732 DeclarationNameInfo DirName; 8733 getDerived().getSema().StartOpenMPDSABlock( 8734 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8735 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8736 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8737 return Res; 8738 } 8739 8740 template <typename Derived> 8741 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8742 OMPTargetTeamsDirective *D) { 8743 DeclarationNameInfo DirName; 8744 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8745 nullptr, D->getBeginLoc()); 8746 auto Res = getDerived().TransformOMPExecutableDirective(D); 8747 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8748 return Res; 8749 } 8750 8751 template <typename Derived> 8752 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8753 OMPTargetTeamsDistributeDirective *D) { 8754 DeclarationNameInfo DirName; 8755 getDerived().getSema().StartOpenMPDSABlock( 8756 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8757 auto Res = getDerived().TransformOMPExecutableDirective(D); 8758 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8759 return Res; 8760 } 8761 8762 template <typename Derived> 8763 StmtResult 8764 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8765 OMPTargetTeamsDistributeParallelForDirective *D) { 8766 DeclarationNameInfo DirName; 8767 getDerived().getSema().StartOpenMPDSABlock( 8768 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8769 D->getBeginLoc()); 8770 auto Res = getDerived().TransformOMPExecutableDirective(D); 8771 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8772 return Res; 8773 } 8774 8775 template <typename Derived> 8776 StmtResult TreeTransform<Derived>:: 8777 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8778 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8779 DeclarationNameInfo DirName; 8780 getDerived().getSema().StartOpenMPDSABlock( 8781 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8782 D->getBeginLoc()); 8783 auto Res = getDerived().TransformOMPExecutableDirective(D); 8784 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8785 return Res; 8786 } 8787 8788 template <typename Derived> 8789 StmtResult 8790 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8791 OMPTargetTeamsDistributeSimdDirective *D) { 8792 DeclarationNameInfo DirName; 8793 getDerived().getSema().StartOpenMPDSABlock( 8794 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8795 auto Res = getDerived().TransformOMPExecutableDirective(D); 8796 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8797 return Res; 8798 } 8799 8800 8801 //===----------------------------------------------------------------------===// 8802 // OpenMP clause transformation 8803 //===----------------------------------------------------------------------===// 8804 template <typename Derived> 8805 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8806 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8807 if (Cond.isInvalid()) 8808 return nullptr; 8809 return getDerived().RebuildOMPIfClause( 8810 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8811 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8812 } 8813 8814 template <typename Derived> 8815 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8816 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8817 if (Cond.isInvalid()) 8818 return nullptr; 8819 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8820 C->getLParenLoc(), C->getEndLoc()); 8821 } 8822 8823 template <typename Derived> 8824 OMPClause * 8825 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8826 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8827 if (NumThreads.isInvalid()) 8828 return nullptr; 8829 return getDerived().RebuildOMPNumThreadsClause( 8830 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8831 } 8832 8833 template <typename Derived> 8834 OMPClause * 8835 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8836 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8837 if (E.isInvalid()) 8838 return nullptr; 8839 return getDerived().RebuildOMPSafelenClause( 8840 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8841 } 8842 8843 template <typename Derived> 8844 OMPClause * 8845 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 8846 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 8847 if (E.isInvalid()) 8848 return nullptr; 8849 return getDerived().RebuildOMPAllocatorClause( 8850 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8851 } 8852 8853 template <typename Derived> 8854 OMPClause * 8855 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8856 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8857 if (E.isInvalid()) 8858 return nullptr; 8859 return getDerived().RebuildOMPSimdlenClause( 8860 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8861 } 8862 8863 template <typename Derived> 8864 OMPClause * 8865 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8866 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8867 if (E.isInvalid()) 8868 return nullptr; 8869 return getDerived().RebuildOMPCollapseClause( 8870 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8871 } 8872 8873 template <typename Derived> 8874 OMPClause * 8875 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8876 return getDerived().RebuildOMPDefaultClause( 8877 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 8878 C->getLParenLoc(), C->getEndLoc()); 8879 } 8880 8881 template <typename Derived> 8882 OMPClause * 8883 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8884 return getDerived().RebuildOMPProcBindClause( 8885 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 8886 C->getLParenLoc(), C->getEndLoc()); 8887 } 8888 8889 template <typename Derived> 8890 OMPClause * 8891 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8892 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8893 if (E.isInvalid()) 8894 return nullptr; 8895 return getDerived().RebuildOMPScheduleClause( 8896 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8897 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8898 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8899 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8900 } 8901 8902 template <typename Derived> 8903 OMPClause * 8904 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8905 ExprResult E; 8906 if (auto *Num = C->getNumForLoops()) { 8907 E = getDerived().TransformExpr(Num); 8908 if (E.isInvalid()) 8909 return nullptr; 8910 } 8911 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 8912 C->getLParenLoc(), E.get()); 8913 } 8914 8915 template <typename Derived> 8916 OMPClause * 8917 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 8918 ExprResult E; 8919 if (Expr *Evt = C->getEventHandler()) { 8920 E = getDerived().TransformExpr(Evt); 8921 if (E.isInvalid()) 8922 return nullptr; 8923 } 8924 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 8925 C->getLParenLoc(), C->getEndLoc()); 8926 } 8927 8928 template <typename Derived> 8929 OMPClause * 8930 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8931 // No need to rebuild this clause, no template-dependent parameters. 8932 return C; 8933 } 8934 8935 template <typename Derived> 8936 OMPClause * 8937 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8938 // No need to rebuild this clause, no template-dependent parameters. 8939 return C; 8940 } 8941 8942 template <typename Derived> 8943 OMPClause * 8944 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8945 // No need to rebuild this clause, no template-dependent parameters. 8946 return C; 8947 } 8948 8949 template <typename Derived> 8950 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8951 // No need to rebuild this clause, no template-dependent parameters. 8952 return C; 8953 } 8954 8955 template <typename Derived> 8956 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8957 // No need to rebuild this clause, no template-dependent parameters. 8958 return C; 8959 } 8960 8961 template <typename Derived> 8962 OMPClause * 8963 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8964 // No need to rebuild this clause, no template-dependent parameters. 8965 return C; 8966 } 8967 8968 template <typename Derived> 8969 OMPClause * 8970 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8971 // No need to rebuild this clause, no template-dependent parameters. 8972 return C; 8973 } 8974 8975 template <typename Derived> 8976 OMPClause * 8977 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8978 // No need to rebuild this clause, no template-dependent parameters. 8979 return C; 8980 } 8981 8982 template <typename Derived> 8983 OMPClause * 8984 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 8985 // No need to rebuild this clause, no template-dependent parameters. 8986 return C; 8987 } 8988 8989 template <typename Derived> 8990 OMPClause * 8991 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 8992 // No need to rebuild this clause, no template-dependent parameters. 8993 return C; 8994 } 8995 8996 template <typename Derived> 8997 OMPClause * 8998 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 8999 // No need to rebuild this clause, no template-dependent parameters. 9000 return C; 9001 } 9002 9003 template <typename Derived> 9004 OMPClause * 9005 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9006 // No need to rebuild this clause, no template-dependent parameters. 9007 return C; 9008 } 9009 9010 template <typename Derived> 9011 OMPClause * 9012 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9013 // No need to rebuild this clause, no template-dependent parameters. 9014 return C; 9015 } 9016 9017 template <typename Derived> 9018 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9019 // No need to rebuild this clause, no template-dependent parameters. 9020 return C; 9021 } 9022 9023 template <typename Derived> 9024 OMPClause * 9025 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9026 // No need to rebuild this clause, no template-dependent parameters. 9027 return C; 9028 } 9029 9030 template <typename Derived> 9031 OMPClause * 9032 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9033 // No need to rebuild this clause, no template-dependent parameters. 9034 return C; 9035 } 9036 9037 template <typename Derived> 9038 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9039 OMPUnifiedAddressClause *C) { 9040 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9041 } 9042 9043 template <typename Derived> 9044 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9045 OMPUnifiedSharedMemoryClause *C) { 9046 llvm_unreachable( 9047 "unified_shared_memory clause cannot appear in dependent context"); 9048 } 9049 9050 template <typename Derived> 9051 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9052 OMPReverseOffloadClause *C) { 9053 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9054 } 9055 9056 template <typename Derived> 9057 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9058 OMPDynamicAllocatorsClause *C) { 9059 llvm_unreachable( 9060 "dynamic_allocators clause cannot appear in dependent context"); 9061 } 9062 9063 template <typename Derived> 9064 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9065 OMPAtomicDefaultMemOrderClause *C) { 9066 llvm_unreachable( 9067 "atomic_default_mem_order clause cannot appear in dependent context"); 9068 } 9069 9070 template <typename Derived> 9071 OMPClause * 9072 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9073 llvm::SmallVector<Expr *, 16> Vars; 9074 Vars.reserve(C->varlist_size()); 9075 for (auto *VE : C->varlists()) { 9076 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9077 if (EVar.isInvalid()) 9078 return nullptr; 9079 Vars.push_back(EVar.get()); 9080 } 9081 return getDerived().RebuildOMPPrivateClause( 9082 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9083 } 9084 9085 template <typename Derived> 9086 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9087 OMPFirstprivateClause *C) { 9088 llvm::SmallVector<Expr *, 16> Vars; 9089 Vars.reserve(C->varlist_size()); 9090 for (auto *VE : C->varlists()) { 9091 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9092 if (EVar.isInvalid()) 9093 return nullptr; 9094 Vars.push_back(EVar.get()); 9095 } 9096 return getDerived().RebuildOMPFirstprivateClause( 9097 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9098 } 9099 9100 template <typename Derived> 9101 OMPClause * 9102 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9103 llvm::SmallVector<Expr *, 16> Vars; 9104 Vars.reserve(C->varlist_size()); 9105 for (auto *VE : C->varlists()) { 9106 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9107 if (EVar.isInvalid()) 9108 return nullptr; 9109 Vars.push_back(EVar.get()); 9110 } 9111 return getDerived().RebuildOMPLastprivateClause( 9112 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9113 C->getLParenLoc(), C->getEndLoc()); 9114 } 9115 9116 template <typename Derived> 9117 OMPClause * 9118 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9119 llvm::SmallVector<Expr *, 16> Vars; 9120 Vars.reserve(C->varlist_size()); 9121 for (auto *VE : C->varlists()) { 9122 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9123 if (EVar.isInvalid()) 9124 return nullptr; 9125 Vars.push_back(EVar.get()); 9126 } 9127 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9128 C->getLParenLoc(), C->getEndLoc()); 9129 } 9130 9131 template <typename Derived> 9132 OMPClause * 9133 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9134 llvm::SmallVector<Expr *, 16> Vars; 9135 Vars.reserve(C->varlist_size()); 9136 for (auto *VE : C->varlists()) { 9137 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9138 if (EVar.isInvalid()) 9139 return nullptr; 9140 Vars.push_back(EVar.get()); 9141 } 9142 CXXScopeSpec ReductionIdScopeSpec; 9143 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9144 9145 DeclarationNameInfo NameInfo = C->getNameInfo(); 9146 if (NameInfo.getName()) { 9147 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9148 if (!NameInfo.getName()) 9149 return nullptr; 9150 } 9151 // Build a list of all UDR decls with the same names ranged by the Scopes. 9152 // The Scope boundary is a duplication of the previous decl. 9153 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9154 for (auto *E : C->reduction_ops()) { 9155 // Transform all the decls. 9156 if (E) { 9157 auto *ULE = cast<UnresolvedLookupExpr>(E); 9158 UnresolvedSet<8> Decls; 9159 for (auto *D : ULE->decls()) { 9160 NamedDecl *InstD = 9161 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9162 Decls.addDecl(InstD, InstD->getAccess()); 9163 } 9164 UnresolvedReductions.push_back( 9165 UnresolvedLookupExpr::Create( 9166 SemaRef.Context, /*NamingClass=*/nullptr, 9167 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9168 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9169 Decls.begin(), Decls.end())); 9170 } else 9171 UnresolvedReductions.push_back(nullptr); 9172 } 9173 return getDerived().RebuildOMPReductionClause( 9174 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9175 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9176 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9177 } 9178 9179 template <typename Derived> 9180 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9181 OMPTaskReductionClause *C) { 9182 llvm::SmallVector<Expr *, 16> Vars; 9183 Vars.reserve(C->varlist_size()); 9184 for (auto *VE : C->varlists()) { 9185 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9186 if (EVar.isInvalid()) 9187 return nullptr; 9188 Vars.push_back(EVar.get()); 9189 } 9190 CXXScopeSpec ReductionIdScopeSpec; 9191 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9192 9193 DeclarationNameInfo NameInfo = C->getNameInfo(); 9194 if (NameInfo.getName()) { 9195 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9196 if (!NameInfo.getName()) 9197 return nullptr; 9198 } 9199 // Build a list of all UDR decls with the same names ranged by the Scopes. 9200 // The Scope boundary is a duplication of the previous decl. 9201 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9202 for (auto *E : C->reduction_ops()) { 9203 // Transform all the decls. 9204 if (E) { 9205 auto *ULE = cast<UnresolvedLookupExpr>(E); 9206 UnresolvedSet<8> Decls; 9207 for (auto *D : ULE->decls()) { 9208 NamedDecl *InstD = 9209 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9210 Decls.addDecl(InstD, InstD->getAccess()); 9211 } 9212 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9213 SemaRef.Context, /*NamingClass=*/nullptr, 9214 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9215 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9216 } else 9217 UnresolvedReductions.push_back(nullptr); 9218 } 9219 return getDerived().RebuildOMPTaskReductionClause( 9220 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9221 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9222 } 9223 9224 template <typename Derived> 9225 OMPClause * 9226 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9227 llvm::SmallVector<Expr *, 16> Vars; 9228 Vars.reserve(C->varlist_size()); 9229 for (auto *VE : C->varlists()) { 9230 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9231 if (EVar.isInvalid()) 9232 return nullptr; 9233 Vars.push_back(EVar.get()); 9234 } 9235 CXXScopeSpec ReductionIdScopeSpec; 9236 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9237 9238 DeclarationNameInfo NameInfo = C->getNameInfo(); 9239 if (NameInfo.getName()) { 9240 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9241 if (!NameInfo.getName()) 9242 return nullptr; 9243 } 9244 // Build a list of all UDR decls with the same names ranged by the Scopes. 9245 // The Scope boundary is a duplication of the previous decl. 9246 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9247 for (auto *E : C->reduction_ops()) { 9248 // Transform all the decls. 9249 if (E) { 9250 auto *ULE = cast<UnresolvedLookupExpr>(E); 9251 UnresolvedSet<8> Decls; 9252 for (auto *D : ULE->decls()) { 9253 NamedDecl *InstD = 9254 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9255 Decls.addDecl(InstD, InstD->getAccess()); 9256 } 9257 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9258 SemaRef.Context, /*NamingClass=*/nullptr, 9259 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9260 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9261 } else 9262 UnresolvedReductions.push_back(nullptr); 9263 } 9264 return getDerived().RebuildOMPInReductionClause( 9265 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9266 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9267 } 9268 9269 template <typename Derived> 9270 OMPClause * 9271 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9272 llvm::SmallVector<Expr *, 16> Vars; 9273 Vars.reserve(C->varlist_size()); 9274 for (auto *VE : C->varlists()) { 9275 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9276 if (EVar.isInvalid()) 9277 return nullptr; 9278 Vars.push_back(EVar.get()); 9279 } 9280 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9281 if (Step.isInvalid()) 9282 return nullptr; 9283 return getDerived().RebuildOMPLinearClause( 9284 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9285 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9286 } 9287 9288 template <typename Derived> 9289 OMPClause * 9290 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9291 llvm::SmallVector<Expr *, 16> Vars; 9292 Vars.reserve(C->varlist_size()); 9293 for (auto *VE : C->varlists()) { 9294 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9295 if (EVar.isInvalid()) 9296 return nullptr; 9297 Vars.push_back(EVar.get()); 9298 } 9299 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9300 if (Alignment.isInvalid()) 9301 return nullptr; 9302 return getDerived().RebuildOMPAlignedClause( 9303 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9304 C->getColonLoc(), C->getEndLoc()); 9305 } 9306 9307 template <typename Derived> 9308 OMPClause * 9309 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9310 llvm::SmallVector<Expr *, 16> Vars; 9311 Vars.reserve(C->varlist_size()); 9312 for (auto *VE : C->varlists()) { 9313 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9314 if (EVar.isInvalid()) 9315 return nullptr; 9316 Vars.push_back(EVar.get()); 9317 } 9318 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9319 C->getLParenLoc(), C->getEndLoc()); 9320 } 9321 9322 template <typename Derived> 9323 OMPClause * 9324 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9325 llvm::SmallVector<Expr *, 16> Vars; 9326 Vars.reserve(C->varlist_size()); 9327 for (auto *VE : C->varlists()) { 9328 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9329 if (EVar.isInvalid()) 9330 return nullptr; 9331 Vars.push_back(EVar.get()); 9332 } 9333 return getDerived().RebuildOMPCopyprivateClause( 9334 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9335 } 9336 9337 template <typename Derived> 9338 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9339 llvm::SmallVector<Expr *, 16> Vars; 9340 Vars.reserve(C->varlist_size()); 9341 for (auto *VE : C->varlists()) { 9342 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9343 if (EVar.isInvalid()) 9344 return nullptr; 9345 Vars.push_back(EVar.get()); 9346 } 9347 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9348 C->getLParenLoc(), C->getEndLoc()); 9349 } 9350 9351 template <typename Derived> 9352 OMPClause * 9353 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9354 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9355 if (E.isInvalid()) 9356 return nullptr; 9357 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9358 C->getLParenLoc(), C->getEndLoc()); 9359 } 9360 9361 template <typename Derived> 9362 OMPClause * 9363 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9364 llvm::SmallVector<Expr *, 16> Vars; 9365 Expr *DepModifier = C->getModifier(); 9366 if (DepModifier) { 9367 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9368 if (DepModRes.isInvalid()) 9369 return nullptr; 9370 DepModifier = DepModRes.get(); 9371 } 9372 Vars.reserve(C->varlist_size()); 9373 for (auto *VE : C->varlists()) { 9374 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9375 if (EVar.isInvalid()) 9376 return nullptr; 9377 Vars.push_back(EVar.get()); 9378 } 9379 return getDerived().RebuildOMPDependClause( 9380 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9381 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9382 C->getEndLoc()); 9383 } 9384 9385 template <typename Derived> 9386 OMPClause * 9387 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9388 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9389 if (E.isInvalid()) 9390 return nullptr; 9391 return getDerived().RebuildOMPDeviceClause( 9392 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9393 C->getModifierLoc(), C->getEndLoc()); 9394 } 9395 9396 template <typename Derived, class T> 9397 bool transformOMPMappableExprListClause( 9398 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9399 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9400 DeclarationNameInfo &MapperIdInfo, 9401 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9402 // Transform expressions in the list. 9403 Vars.reserve(C->varlist_size()); 9404 for (auto *VE : C->varlists()) { 9405 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9406 if (EVar.isInvalid()) 9407 return true; 9408 Vars.push_back(EVar.get()); 9409 } 9410 // Transform mapper scope specifier and identifier. 9411 NestedNameSpecifierLoc QualifierLoc; 9412 if (C->getMapperQualifierLoc()) { 9413 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9414 C->getMapperQualifierLoc()); 9415 if (!QualifierLoc) 9416 return true; 9417 } 9418 MapperIdScopeSpec.Adopt(QualifierLoc); 9419 MapperIdInfo = C->getMapperIdInfo(); 9420 if (MapperIdInfo.getName()) { 9421 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9422 if (!MapperIdInfo.getName()) 9423 return true; 9424 } 9425 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9426 // the previous user-defined mapper lookup in dependent environment. 9427 for (auto *E : C->mapperlists()) { 9428 // Transform all the decls. 9429 if (E) { 9430 auto *ULE = cast<UnresolvedLookupExpr>(E); 9431 UnresolvedSet<8> Decls; 9432 for (auto *D : ULE->decls()) { 9433 NamedDecl *InstD = 9434 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9435 Decls.addDecl(InstD, InstD->getAccess()); 9436 } 9437 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9438 TT.getSema().Context, /*NamingClass=*/nullptr, 9439 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9440 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9441 Decls.end())); 9442 } else { 9443 UnresolvedMappers.push_back(nullptr); 9444 } 9445 } 9446 return false; 9447 } 9448 9449 template <typename Derived> 9450 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9451 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9452 llvm::SmallVector<Expr *, 16> Vars; 9453 CXXScopeSpec MapperIdScopeSpec; 9454 DeclarationNameInfo MapperIdInfo; 9455 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9456 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9457 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9458 return nullptr; 9459 return getDerived().RebuildOMPMapClause( 9460 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9461 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9462 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9463 } 9464 9465 template <typename Derived> 9466 OMPClause * 9467 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9468 Expr *Allocator = C->getAllocator(); 9469 if (Allocator) { 9470 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9471 if (AllocatorRes.isInvalid()) 9472 return nullptr; 9473 Allocator = AllocatorRes.get(); 9474 } 9475 llvm::SmallVector<Expr *, 16> Vars; 9476 Vars.reserve(C->varlist_size()); 9477 for (auto *VE : C->varlists()) { 9478 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9479 if (EVar.isInvalid()) 9480 return nullptr; 9481 Vars.push_back(EVar.get()); 9482 } 9483 return getDerived().RebuildOMPAllocateClause( 9484 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9485 C->getEndLoc()); 9486 } 9487 9488 template <typename Derived> 9489 OMPClause * 9490 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9491 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9492 if (E.isInvalid()) 9493 return nullptr; 9494 return getDerived().RebuildOMPNumTeamsClause( 9495 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9496 } 9497 9498 template <typename Derived> 9499 OMPClause * 9500 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9501 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9502 if (E.isInvalid()) 9503 return nullptr; 9504 return getDerived().RebuildOMPThreadLimitClause( 9505 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9506 } 9507 9508 template <typename Derived> 9509 OMPClause * 9510 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9511 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9512 if (E.isInvalid()) 9513 return nullptr; 9514 return getDerived().RebuildOMPPriorityClause( 9515 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9516 } 9517 9518 template <typename Derived> 9519 OMPClause * 9520 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9521 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9522 if (E.isInvalid()) 9523 return nullptr; 9524 return getDerived().RebuildOMPGrainsizeClause( 9525 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9526 } 9527 9528 template <typename Derived> 9529 OMPClause * 9530 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9531 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9532 if (E.isInvalid()) 9533 return nullptr; 9534 return getDerived().RebuildOMPNumTasksClause( 9535 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9536 } 9537 9538 template <typename Derived> 9539 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9540 ExprResult E = getDerived().TransformExpr(C->getHint()); 9541 if (E.isInvalid()) 9542 return nullptr; 9543 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9544 C->getLParenLoc(), C->getEndLoc()); 9545 } 9546 9547 template <typename Derived> 9548 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9549 OMPDistScheduleClause *C) { 9550 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9551 if (E.isInvalid()) 9552 return nullptr; 9553 return getDerived().RebuildOMPDistScheduleClause( 9554 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9555 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9556 } 9557 9558 template <typename Derived> 9559 OMPClause * 9560 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9561 // Rebuild Defaultmap Clause since we need to invoke the checking of 9562 // defaultmap(none:variable-category) after template initialization. 9563 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9564 C->getDefaultmapKind(), 9565 C->getBeginLoc(), 9566 C->getLParenLoc(), 9567 C->getDefaultmapModifierLoc(), 9568 C->getDefaultmapKindLoc(), 9569 C->getEndLoc()); 9570 } 9571 9572 template <typename Derived> 9573 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9574 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9575 llvm::SmallVector<Expr *, 16> Vars; 9576 CXXScopeSpec MapperIdScopeSpec; 9577 DeclarationNameInfo MapperIdInfo; 9578 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9579 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9580 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9581 return nullptr; 9582 return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo, 9583 Locs, UnresolvedMappers); 9584 } 9585 9586 template <typename Derived> 9587 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9588 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9589 llvm::SmallVector<Expr *, 16> Vars; 9590 CXXScopeSpec MapperIdScopeSpec; 9591 DeclarationNameInfo MapperIdInfo; 9592 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9593 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9594 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9595 return nullptr; 9596 return getDerived().RebuildOMPFromClause( 9597 Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers); 9598 } 9599 9600 template <typename Derived> 9601 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9602 OMPUseDevicePtrClause *C) { 9603 llvm::SmallVector<Expr *, 16> Vars; 9604 Vars.reserve(C->varlist_size()); 9605 for (auto *VE : C->varlists()) { 9606 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9607 if (EVar.isInvalid()) 9608 return nullptr; 9609 Vars.push_back(EVar.get()); 9610 } 9611 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9612 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9613 } 9614 9615 template <typename Derived> 9616 OMPClause * 9617 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9618 llvm::SmallVector<Expr *, 16> Vars; 9619 Vars.reserve(C->varlist_size()); 9620 for (auto *VE : C->varlists()) { 9621 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9622 if (EVar.isInvalid()) 9623 return nullptr; 9624 Vars.push_back(EVar.get()); 9625 } 9626 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9627 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9628 } 9629 9630 template <typename Derived> 9631 OMPClause * 9632 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9633 llvm::SmallVector<Expr *, 16> Vars; 9634 Vars.reserve(C->varlist_size()); 9635 for (auto *VE : C->varlists()) { 9636 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9637 if (EVar.isInvalid()) 9638 return nullptr; 9639 Vars.push_back(EVar.get()); 9640 } 9641 return getDerived().RebuildOMPNontemporalClause( 9642 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9643 } 9644 9645 template <typename Derived> 9646 OMPClause * 9647 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 9648 llvm::SmallVector<Expr *, 16> Vars; 9649 Vars.reserve(C->varlist_size()); 9650 for (auto *VE : C->varlists()) { 9651 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9652 if (EVar.isInvalid()) 9653 return nullptr; 9654 Vars.push_back(EVar.get()); 9655 } 9656 return getDerived().RebuildOMPInclusiveClause( 9657 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9658 } 9659 9660 template <typename Derived> 9661 OMPClause * 9662 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 9663 llvm::SmallVector<Expr *, 16> Vars; 9664 Vars.reserve(C->varlist_size()); 9665 for (auto *VE : C->varlists()) { 9666 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9667 if (EVar.isInvalid()) 9668 return nullptr; 9669 Vars.push_back(EVar.get()); 9670 } 9671 return getDerived().RebuildOMPExclusiveClause( 9672 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9673 } 9674 9675 template <typename Derived> 9676 OMPClause * 9677 TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 9678 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 9679 C->getBeginLoc(), C->getLParenLoc(), 9680 C->getEndLoc()); 9681 } 9682 9683 //===----------------------------------------------------------------------===// 9684 // Expression transformation 9685 //===----------------------------------------------------------------------===// 9686 template<typename Derived> 9687 ExprResult 9688 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9689 return TransformExpr(E->getSubExpr()); 9690 } 9691 9692 template<typename Derived> 9693 ExprResult 9694 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9695 if (!E->isTypeDependent()) 9696 return E; 9697 9698 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9699 E->getIdentKind()); 9700 } 9701 9702 template<typename Derived> 9703 ExprResult 9704 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9705 NestedNameSpecifierLoc QualifierLoc; 9706 if (E->getQualifierLoc()) { 9707 QualifierLoc 9708 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9709 if (!QualifierLoc) 9710 return ExprError(); 9711 } 9712 9713 ValueDecl *ND 9714 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9715 E->getDecl())); 9716 if (!ND) 9717 return ExprError(); 9718 9719 NamedDecl *Found = ND; 9720 if (E->getFoundDecl() != E->getDecl()) { 9721 Found = cast_or_null<NamedDecl>( 9722 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 9723 if (!Found) 9724 return ExprError(); 9725 } 9726 9727 DeclarationNameInfo NameInfo = E->getNameInfo(); 9728 if (NameInfo.getName()) { 9729 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9730 if (!NameInfo.getName()) 9731 return ExprError(); 9732 } 9733 9734 if (!getDerived().AlwaysRebuild() && 9735 QualifierLoc == E->getQualifierLoc() && 9736 ND == E->getDecl() && 9737 Found == E->getFoundDecl() && 9738 NameInfo.getName() == E->getDecl()->getDeclName() && 9739 !E->hasExplicitTemplateArgs()) { 9740 9741 // Mark it referenced in the new context regardless. 9742 // FIXME: this is a bit instantiation-specific. 9743 SemaRef.MarkDeclRefReferenced(E); 9744 9745 return E; 9746 } 9747 9748 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9749 if (E->hasExplicitTemplateArgs()) { 9750 TemplateArgs = &TransArgs; 9751 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9752 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9753 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9754 E->getNumTemplateArgs(), 9755 TransArgs)) 9756 return ExprError(); 9757 } 9758 9759 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 9760 Found, TemplateArgs); 9761 } 9762 9763 template<typename Derived> 9764 ExprResult 9765 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 9766 return E; 9767 } 9768 9769 template <typename Derived> 9770 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 9771 FixedPointLiteral *E) { 9772 return E; 9773 } 9774 9775 template<typename Derived> 9776 ExprResult 9777 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 9778 return E; 9779 } 9780 9781 template<typename Derived> 9782 ExprResult 9783 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9784 return E; 9785 } 9786 9787 template<typename Derived> 9788 ExprResult 9789 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 9790 return E; 9791 } 9792 9793 template<typename Derived> 9794 ExprResult 9795 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 9796 return E; 9797 } 9798 9799 template<typename Derived> 9800 ExprResult 9801 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 9802 if (FunctionDecl *FD = E->getDirectCallee()) 9803 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 9804 return SemaRef.MaybeBindToTemporary(E); 9805 } 9806 9807 template<typename Derived> 9808 ExprResult 9809 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 9810 ExprResult ControllingExpr = 9811 getDerived().TransformExpr(E->getControllingExpr()); 9812 if (ControllingExpr.isInvalid()) 9813 return ExprError(); 9814 9815 SmallVector<Expr *, 4> AssocExprs; 9816 SmallVector<TypeSourceInfo *, 4> AssocTypes; 9817 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 9818 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 9819 if (TSI) { 9820 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 9821 if (!AssocType) 9822 return ExprError(); 9823 AssocTypes.push_back(AssocType); 9824 } else { 9825 AssocTypes.push_back(nullptr); 9826 } 9827 9828 ExprResult AssocExpr = 9829 getDerived().TransformExpr(Assoc.getAssociationExpr()); 9830 if (AssocExpr.isInvalid()) 9831 return ExprError(); 9832 AssocExprs.push_back(AssocExpr.get()); 9833 } 9834 9835 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 9836 E->getDefaultLoc(), 9837 E->getRParenLoc(), 9838 ControllingExpr.get(), 9839 AssocTypes, 9840 AssocExprs); 9841 } 9842 9843 template<typename Derived> 9844 ExprResult 9845 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 9846 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9847 if (SubExpr.isInvalid()) 9848 return ExprError(); 9849 9850 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9851 return E; 9852 9853 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 9854 E->getRParen()); 9855 } 9856 9857 /// The operand of a unary address-of operator has special rules: it's 9858 /// allowed to refer to a non-static member of a class even if there's no 'this' 9859 /// object available. 9860 template<typename Derived> 9861 ExprResult 9862 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 9863 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 9864 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 9865 else 9866 return getDerived().TransformExpr(E); 9867 } 9868 9869 template<typename Derived> 9870 ExprResult 9871 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 9872 ExprResult SubExpr; 9873 if (E->getOpcode() == UO_AddrOf) 9874 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 9875 else 9876 SubExpr = TransformExpr(E->getSubExpr()); 9877 if (SubExpr.isInvalid()) 9878 return ExprError(); 9879 9880 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9881 return E; 9882 9883 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9884 E->getOpcode(), 9885 SubExpr.get()); 9886 } 9887 9888 template<typename Derived> 9889 ExprResult 9890 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9891 // Transform the type. 9892 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9893 if (!Type) 9894 return ExprError(); 9895 9896 // Transform all of the components into components similar to what the 9897 // parser uses. 9898 // FIXME: It would be slightly more efficient in the non-dependent case to 9899 // just map FieldDecls, rather than requiring the rebuilder to look for 9900 // the fields again. However, __builtin_offsetof is rare enough in 9901 // template code that we don't care. 9902 bool ExprChanged = false; 9903 typedef Sema::OffsetOfComponent Component; 9904 SmallVector<Component, 4> Components; 9905 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9906 const OffsetOfNode &ON = E->getComponent(I); 9907 Component Comp; 9908 Comp.isBrackets = true; 9909 Comp.LocStart = ON.getSourceRange().getBegin(); 9910 Comp.LocEnd = ON.getSourceRange().getEnd(); 9911 switch (ON.getKind()) { 9912 case OffsetOfNode::Array: { 9913 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9914 ExprResult Index = getDerived().TransformExpr(FromIndex); 9915 if (Index.isInvalid()) 9916 return ExprError(); 9917 9918 ExprChanged = ExprChanged || Index.get() != FromIndex; 9919 Comp.isBrackets = true; 9920 Comp.U.E = Index.get(); 9921 break; 9922 } 9923 9924 case OffsetOfNode::Field: 9925 case OffsetOfNode::Identifier: 9926 Comp.isBrackets = false; 9927 Comp.U.IdentInfo = ON.getFieldName(); 9928 if (!Comp.U.IdentInfo) 9929 continue; 9930 9931 break; 9932 9933 case OffsetOfNode::Base: 9934 // Will be recomputed during the rebuild. 9935 continue; 9936 } 9937 9938 Components.push_back(Comp); 9939 } 9940 9941 // If nothing changed, retain the existing expression. 9942 if (!getDerived().AlwaysRebuild() && 9943 Type == E->getTypeSourceInfo() && 9944 !ExprChanged) 9945 return E; 9946 9947 // Build a new offsetof expression. 9948 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9949 Components, E->getRParenLoc()); 9950 } 9951 9952 template<typename Derived> 9953 ExprResult 9954 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9955 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9956 "opaque value expression requires transformation"); 9957 return E; 9958 } 9959 9960 template<typename Derived> 9961 ExprResult 9962 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9963 return E; 9964 } 9965 9966 template <typename Derived> 9967 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 9968 llvm::SmallVector<Expr *, 8> Children; 9969 bool Changed = false; 9970 for (Expr *C : E->subExpressions()) { 9971 ExprResult NewC = getDerived().TransformExpr(C); 9972 if (NewC.isInvalid()) 9973 return ExprError(); 9974 Children.push_back(NewC.get()); 9975 9976 Changed |= NewC.get() != C; 9977 } 9978 if (!getDerived().AlwaysRebuild() && !Changed) 9979 return E; 9980 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 9981 Children); 9982 } 9983 9984 template<typename Derived> 9985 ExprResult 9986 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9987 // Rebuild the syntactic form. The original syntactic form has 9988 // opaque-value expressions in it, so strip those away and rebuild 9989 // the result. This is a really awful way of doing this, but the 9990 // better solution (rebuilding the semantic expressions and 9991 // rebinding OVEs as necessary) doesn't work; we'd need 9992 // TreeTransform to not strip away implicit conversions. 9993 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9994 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9995 if (result.isInvalid()) return ExprError(); 9996 9997 // If that gives us a pseudo-object result back, the pseudo-object 9998 // expression must have been an lvalue-to-rvalue conversion which we 9999 // should reapply. 10000 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10001 result = SemaRef.checkPseudoObjectRValue(result.get()); 10002 10003 return result; 10004 } 10005 10006 template<typename Derived> 10007 ExprResult 10008 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10009 UnaryExprOrTypeTraitExpr *E) { 10010 if (E->isArgumentType()) { 10011 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10012 10013 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10014 if (!NewT) 10015 return ExprError(); 10016 10017 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10018 return E; 10019 10020 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10021 E->getKind(), 10022 E->getSourceRange()); 10023 } 10024 10025 // C++0x [expr.sizeof]p1: 10026 // The operand is either an expression, which is an unevaluated operand 10027 // [...] 10028 EnterExpressionEvaluationContext Unevaluated( 10029 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10030 Sema::ReuseLambdaContextDecl); 10031 10032 // Try to recover if we have something like sizeof(T::X) where X is a type. 10033 // Notably, there must be *exactly* one set of parens if X is a type. 10034 TypeSourceInfo *RecoveryTSI = nullptr; 10035 ExprResult SubExpr; 10036 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10037 if (auto *DRE = 10038 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10039 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10040 PE, DRE, false, &RecoveryTSI); 10041 else 10042 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10043 10044 if (RecoveryTSI) { 10045 return getDerived().RebuildUnaryExprOrTypeTrait( 10046 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10047 } else if (SubExpr.isInvalid()) 10048 return ExprError(); 10049 10050 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10051 return E; 10052 10053 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10054 E->getOperatorLoc(), 10055 E->getKind(), 10056 E->getSourceRange()); 10057 } 10058 10059 template<typename Derived> 10060 ExprResult 10061 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10062 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10063 if (LHS.isInvalid()) 10064 return ExprError(); 10065 10066 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10067 if (RHS.isInvalid()) 10068 return ExprError(); 10069 10070 10071 if (!getDerived().AlwaysRebuild() && 10072 LHS.get() == E->getLHS() && 10073 RHS.get() == E->getRHS()) 10074 return E; 10075 10076 return getDerived().RebuildArraySubscriptExpr( 10077 LHS.get(), 10078 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10079 } 10080 10081 template <typename Derived> 10082 ExprResult 10083 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10084 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10085 if (Base.isInvalid()) 10086 return ExprError(); 10087 10088 ExprResult LowerBound; 10089 if (E->getLowerBound()) { 10090 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10091 if (LowerBound.isInvalid()) 10092 return ExprError(); 10093 } 10094 10095 ExprResult Length; 10096 if (E->getLength()) { 10097 Length = getDerived().TransformExpr(E->getLength()); 10098 if (Length.isInvalid()) 10099 return ExprError(); 10100 } 10101 10102 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10103 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10104 return E; 10105 10106 return getDerived().RebuildOMPArraySectionExpr( 10107 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 10108 Length.get(), E->getRBracketLoc()); 10109 } 10110 10111 template <typename Derived> 10112 ExprResult 10113 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10114 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10115 if (Base.isInvalid()) 10116 return ExprError(); 10117 10118 SmallVector<Expr *, 4> Dims; 10119 bool ErrorFound = false; 10120 for (Expr *Dim : E->getDimensions()) { 10121 ExprResult DimRes = getDerived().TransformExpr(Dim); 10122 if (DimRes.isInvalid()) { 10123 ErrorFound = true; 10124 continue; 10125 } 10126 Dims.push_back(DimRes.get()); 10127 } 10128 10129 if (ErrorFound) 10130 return ExprError(); 10131 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10132 E->getRParenLoc(), Dims, 10133 E->getBracketsRanges()); 10134 } 10135 10136 template <typename Derived> 10137 ExprResult 10138 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10139 unsigned NumIterators = E->numOfIterators(); 10140 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10141 10142 bool ErrorFound = false; 10143 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10144 for (unsigned I = 0; I < NumIterators; ++I) { 10145 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10146 Data[I].DeclIdent = D->getIdentifier(); 10147 Data[I].DeclIdentLoc = D->getLocation(); 10148 if (D->getLocation() == D->getBeginLoc()) { 10149 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10150 "Implicit type must be int."); 10151 } else { 10152 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10153 QualType DeclTy = getDerived().TransformType(D->getType()); 10154 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10155 } 10156 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10157 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10158 ExprResult End = getDerived().TransformExpr(Range.End); 10159 ExprResult Step = getDerived().TransformExpr(Range.Step); 10160 ErrorFound = ErrorFound || 10161 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10162 !Data[I].Type.get().isNull())) || 10163 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10164 if (ErrorFound) 10165 continue; 10166 Data[I].Range.Begin = Begin.get(); 10167 Data[I].Range.End = End.get(); 10168 Data[I].Range.Step = Step.get(); 10169 Data[I].AssignLoc = E->getAssignLoc(I); 10170 Data[I].ColonLoc = E->getColonLoc(I); 10171 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10172 NeedToRebuild = 10173 NeedToRebuild || 10174 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10175 D->getType().getTypePtrOrNull()) || 10176 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10177 Range.Step != Data[I].Range.Step; 10178 } 10179 if (ErrorFound) 10180 return ExprError(); 10181 if (!NeedToRebuild) 10182 return E; 10183 10184 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10185 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10186 if (!Res.isUsable()) 10187 return Res; 10188 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10189 for (unsigned I = 0; I < NumIterators; ++I) 10190 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10191 IE->getIteratorDecl(I)); 10192 return Res; 10193 } 10194 10195 template<typename Derived> 10196 ExprResult 10197 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10198 // Transform the callee. 10199 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10200 if (Callee.isInvalid()) 10201 return ExprError(); 10202 10203 // Transform arguments. 10204 bool ArgChanged = false; 10205 SmallVector<Expr*, 8> Args; 10206 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10207 &ArgChanged)) 10208 return ExprError(); 10209 10210 if (!getDerived().AlwaysRebuild() && 10211 Callee.get() == E->getCallee() && 10212 !ArgChanged) 10213 return SemaRef.MaybeBindToTemporary(E); 10214 10215 // FIXME: Wrong source location information for the '('. 10216 SourceLocation FakeLParenLoc 10217 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10218 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10219 Args, 10220 E->getRParenLoc()); 10221 } 10222 10223 template<typename Derived> 10224 ExprResult 10225 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10226 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10227 if (Base.isInvalid()) 10228 return ExprError(); 10229 10230 NestedNameSpecifierLoc QualifierLoc; 10231 if (E->hasQualifier()) { 10232 QualifierLoc 10233 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10234 10235 if (!QualifierLoc) 10236 return ExprError(); 10237 } 10238 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10239 10240 ValueDecl *Member 10241 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10242 E->getMemberDecl())); 10243 if (!Member) 10244 return ExprError(); 10245 10246 NamedDecl *FoundDecl = E->getFoundDecl(); 10247 if (FoundDecl == E->getMemberDecl()) { 10248 FoundDecl = Member; 10249 } else { 10250 FoundDecl = cast_or_null<NamedDecl>( 10251 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10252 if (!FoundDecl) 10253 return ExprError(); 10254 } 10255 10256 if (!getDerived().AlwaysRebuild() && 10257 Base.get() == E->getBase() && 10258 QualifierLoc == E->getQualifierLoc() && 10259 Member == E->getMemberDecl() && 10260 FoundDecl == E->getFoundDecl() && 10261 !E->hasExplicitTemplateArgs()) { 10262 10263 // Mark it referenced in the new context regardless. 10264 // FIXME: this is a bit instantiation-specific. 10265 SemaRef.MarkMemberReferenced(E); 10266 10267 return E; 10268 } 10269 10270 TemplateArgumentListInfo TransArgs; 10271 if (E->hasExplicitTemplateArgs()) { 10272 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10273 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10274 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10275 E->getNumTemplateArgs(), 10276 TransArgs)) 10277 return ExprError(); 10278 } 10279 10280 // FIXME: Bogus source location for the operator 10281 SourceLocation FakeOperatorLoc = 10282 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10283 10284 // FIXME: to do this check properly, we will need to preserve the 10285 // first-qualifier-in-scope here, just in case we had a dependent 10286 // base (and therefore couldn't do the check) and a 10287 // nested-name-qualifier (and therefore could do the lookup). 10288 NamedDecl *FirstQualifierInScope = nullptr; 10289 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10290 if (MemberNameInfo.getName()) { 10291 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10292 if (!MemberNameInfo.getName()) 10293 return ExprError(); 10294 } 10295 10296 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10297 E->isArrow(), 10298 QualifierLoc, 10299 TemplateKWLoc, 10300 MemberNameInfo, 10301 Member, 10302 FoundDecl, 10303 (E->hasExplicitTemplateArgs() 10304 ? &TransArgs : nullptr), 10305 FirstQualifierInScope); 10306 } 10307 10308 template<typename Derived> 10309 ExprResult 10310 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10311 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10312 if (LHS.isInvalid()) 10313 return ExprError(); 10314 10315 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10316 if (RHS.isInvalid()) 10317 return ExprError(); 10318 10319 if (!getDerived().AlwaysRebuild() && 10320 LHS.get() == E->getLHS() && 10321 RHS.get() == E->getRHS()) 10322 return E; 10323 10324 if (E->isCompoundAssignmentOp()) 10325 // FPFeatures has already been established from trailing storage 10326 return getDerived().RebuildBinaryOperator( 10327 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10328 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10329 getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts()); 10330 10331 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10332 LHS.get(), RHS.get()); 10333 } 10334 10335 template <typename Derived> 10336 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10337 CXXRewrittenBinaryOperator *E) { 10338 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10339 10340 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10341 if (LHS.isInvalid()) 10342 return ExprError(); 10343 10344 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10345 if (RHS.isInvalid()) 10346 return ExprError(); 10347 10348 if (!getDerived().AlwaysRebuild() && 10349 LHS.get() == Decomp.LHS && 10350 RHS.get() == Decomp.RHS) 10351 return E; 10352 10353 // Extract the already-resolved callee declarations so that we can restrict 10354 // ourselves to using them as the unqualified lookup results when rebuilding. 10355 UnresolvedSet<2> UnqualLookups; 10356 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10357 const_cast<Expr *>(Decomp.InnerBinOp)}; 10358 for (Expr *PossibleBinOp : PossibleBinOps) { 10359 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10360 if (!Op) 10361 continue; 10362 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10363 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10364 continue; 10365 10366 // Transform the callee in case we built a call to a local extern 10367 // declaration. 10368 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10369 E->getOperatorLoc(), Callee->getFoundDecl())); 10370 if (!Found) 10371 return ExprError(); 10372 UnqualLookups.addDecl(Found); 10373 } 10374 10375 return getDerived().RebuildCXXRewrittenBinaryOperator( 10376 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10377 } 10378 10379 template<typename Derived> 10380 ExprResult 10381 TreeTransform<Derived>::TransformCompoundAssignOperator( 10382 CompoundAssignOperator *E) { 10383 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10384 getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts()); 10385 return getDerived().TransformBinaryOperator(E); 10386 } 10387 10388 template<typename Derived> 10389 ExprResult TreeTransform<Derived>:: 10390 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10391 // Just rebuild the common and RHS expressions and see whether we 10392 // get any changes. 10393 10394 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10395 if (commonExpr.isInvalid()) 10396 return ExprError(); 10397 10398 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10399 if (rhs.isInvalid()) 10400 return ExprError(); 10401 10402 if (!getDerived().AlwaysRebuild() && 10403 commonExpr.get() == e->getCommon() && 10404 rhs.get() == e->getFalseExpr()) 10405 return e; 10406 10407 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10408 e->getQuestionLoc(), 10409 nullptr, 10410 e->getColonLoc(), 10411 rhs.get()); 10412 } 10413 10414 template<typename Derived> 10415 ExprResult 10416 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10417 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10418 if (Cond.isInvalid()) 10419 return ExprError(); 10420 10421 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10422 if (LHS.isInvalid()) 10423 return ExprError(); 10424 10425 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10426 if (RHS.isInvalid()) 10427 return ExprError(); 10428 10429 if (!getDerived().AlwaysRebuild() && 10430 Cond.get() == E->getCond() && 10431 LHS.get() == E->getLHS() && 10432 RHS.get() == E->getRHS()) 10433 return E; 10434 10435 return getDerived().RebuildConditionalOperator(Cond.get(), 10436 E->getQuestionLoc(), 10437 LHS.get(), 10438 E->getColonLoc(), 10439 RHS.get()); 10440 } 10441 10442 template<typename Derived> 10443 ExprResult 10444 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10445 // Implicit casts are eliminated during transformation, since they 10446 // will be recomputed by semantic analysis after transformation. 10447 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10448 } 10449 10450 template<typename Derived> 10451 ExprResult 10452 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10453 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10454 if (!Type) 10455 return ExprError(); 10456 10457 ExprResult SubExpr 10458 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10459 if (SubExpr.isInvalid()) 10460 return ExprError(); 10461 10462 if (!getDerived().AlwaysRebuild() && 10463 Type == E->getTypeInfoAsWritten() && 10464 SubExpr.get() == E->getSubExpr()) 10465 return E; 10466 10467 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10468 Type, 10469 E->getRParenLoc(), 10470 SubExpr.get()); 10471 } 10472 10473 template<typename Derived> 10474 ExprResult 10475 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10476 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10477 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10478 if (!NewT) 10479 return ExprError(); 10480 10481 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10482 if (Init.isInvalid()) 10483 return ExprError(); 10484 10485 if (!getDerived().AlwaysRebuild() && 10486 OldT == NewT && 10487 Init.get() == E->getInitializer()) 10488 return SemaRef.MaybeBindToTemporary(E); 10489 10490 // Note: the expression type doesn't necessarily match the 10491 // type-as-written, but that's okay, because it should always be 10492 // derivable from the initializer. 10493 10494 return getDerived().RebuildCompoundLiteralExpr( 10495 E->getLParenLoc(), NewT, 10496 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10497 } 10498 10499 template<typename Derived> 10500 ExprResult 10501 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10502 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10503 if (Base.isInvalid()) 10504 return ExprError(); 10505 10506 if (!getDerived().AlwaysRebuild() && 10507 Base.get() == E->getBase()) 10508 return E; 10509 10510 // FIXME: Bad source location 10511 SourceLocation FakeOperatorLoc = 10512 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10513 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10514 E->getAccessorLoc(), 10515 E->getAccessor()); 10516 } 10517 10518 template<typename Derived> 10519 ExprResult 10520 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10521 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10522 E = Syntactic; 10523 10524 bool InitChanged = false; 10525 10526 EnterExpressionEvaluationContext Context( 10527 getSema(), EnterExpressionEvaluationContext::InitList); 10528 10529 SmallVector<Expr*, 4> Inits; 10530 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10531 Inits, &InitChanged)) 10532 return ExprError(); 10533 10534 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10535 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10536 // in some cases. We can't reuse it in general, because the syntactic and 10537 // semantic forms are linked, and we can't know that semantic form will 10538 // match even if the syntactic form does. 10539 } 10540 10541 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10542 E->getRBraceLoc()); 10543 } 10544 10545 template<typename Derived> 10546 ExprResult 10547 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10548 Designation Desig; 10549 10550 // transform the initializer value 10551 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10552 if (Init.isInvalid()) 10553 return ExprError(); 10554 10555 // transform the designators. 10556 SmallVector<Expr*, 4> ArrayExprs; 10557 bool ExprChanged = false; 10558 for (const DesignatedInitExpr::Designator &D : E->designators()) { 10559 if (D.isFieldDesignator()) { 10560 Desig.AddDesignator(Designator::getField(D.getFieldName(), 10561 D.getDotLoc(), 10562 D.getFieldLoc())); 10563 if (D.getField()) { 10564 FieldDecl *Field = cast_or_null<FieldDecl>( 10565 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 10566 if (Field != D.getField()) 10567 // Rebuild the expression when the transformed FieldDecl is 10568 // different to the already assigned FieldDecl. 10569 ExprChanged = true; 10570 } else { 10571 // Ensure that the designator expression is rebuilt when there isn't 10572 // a resolved FieldDecl in the designator as we don't want to assign 10573 // a FieldDecl to a pattern designator that will be instantiated again. 10574 ExprChanged = true; 10575 } 10576 continue; 10577 } 10578 10579 if (D.isArrayDesignator()) { 10580 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 10581 if (Index.isInvalid()) 10582 return ExprError(); 10583 10584 Desig.AddDesignator( 10585 Designator::getArray(Index.get(), D.getLBracketLoc())); 10586 10587 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 10588 ArrayExprs.push_back(Index.get()); 10589 continue; 10590 } 10591 10592 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 10593 ExprResult Start 10594 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 10595 if (Start.isInvalid()) 10596 return ExprError(); 10597 10598 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 10599 if (End.isInvalid()) 10600 return ExprError(); 10601 10602 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 10603 End.get(), 10604 D.getLBracketLoc(), 10605 D.getEllipsisLoc())); 10606 10607 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 10608 End.get() != E->getArrayRangeEnd(D); 10609 10610 ArrayExprs.push_back(Start.get()); 10611 ArrayExprs.push_back(End.get()); 10612 } 10613 10614 if (!getDerived().AlwaysRebuild() && 10615 Init.get() == E->getInit() && 10616 !ExprChanged) 10617 return E; 10618 10619 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 10620 E->getEqualOrColonLoc(), 10621 E->usesGNUSyntax(), Init.get()); 10622 } 10623 10624 // Seems that if TransformInitListExpr() only works on the syntactic form of an 10625 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 10626 template<typename Derived> 10627 ExprResult 10628 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 10629 DesignatedInitUpdateExpr *E) { 10630 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 10631 "initializer"); 10632 return ExprError(); 10633 } 10634 10635 template<typename Derived> 10636 ExprResult 10637 TreeTransform<Derived>::TransformNoInitExpr( 10638 NoInitExpr *E) { 10639 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 10640 return ExprError(); 10641 } 10642 10643 template<typename Derived> 10644 ExprResult 10645 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 10646 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 10647 return ExprError(); 10648 } 10649 10650 template<typename Derived> 10651 ExprResult 10652 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 10653 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 10654 return ExprError(); 10655 } 10656 10657 template<typename Derived> 10658 ExprResult 10659 TreeTransform<Derived>::TransformImplicitValueInitExpr( 10660 ImplicitValueInitExpr *E) { 10661 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 10662 10663 // FIXME: Will we ever have proper type location here? Will we actually 10664 // need to transform the type? 10665 QualType T = getDerived().TransformType(E->getType()); 10666 if (T.isNull()) 10667 return ExprError(); 10668 10669 if (!getDerived().AlwaysRebuild() && 10670 T == E->getType()) 10671 return E; 10672 10673 return getDerived().RebuildImplicitValueInitExpr(T); 10674 } 10675 10676 template<typename Derived> 10677 ExprResult 10678 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 10679 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 10680 if (!TInfo) 10681 return ExprError(); 10682 10683 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10684 if (SubExpr.isInvalid()) 10685 return ExprError(); 10686 10687 if (!getDerived().AlwaysRebuild() && 10688 TInfo == E->getWrittenTypeInfo() && 10689 SubExpr.get() == E->getSubExpr()) 10690 return E; 10691 10692 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 10693 TInfo, E->getRParenLoc()); 10694 } 10695 10696 template<typename Derived> 10697 ExprResult 10698 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 10699 bool ArgumentChanged = false; 10700 SmallVector<Expr*, 4> Inits; 10701 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 10702 &ArgumentChanged)) 10703 return ExprError(); 10704 10705 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 10706 Inits, 10707 E->getRParenLoc()); 10708 } 10709 10710 /// Transform an address-of-label expression. 10711 /// 10712 /// By default, the transformation of an address-of-label expression always 10713 /// rebuilds the expression, so that the label identifier can be resolved to 10714 /// the corresponding label statement by semantic analysis. 10715 template<typename Derived> 10716 ExprResult 10717 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 10718 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 10719 E->getLabel()); 10720 if (!LD) 10721 return ExprError(); 10722 10723 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 10724 cast<LabelDecl>(LD)); 10725 } 10726 10727 template<typename Derived> 10728 ExprResult 10729 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 10730 SemaRef.ActOnStartStmtExpr(); 10731 StmtResult SubStmt 10732 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 10733 if (SubStmt.isInvalid()) { 10734 SemaRef.ActOnStmtExprError(); 10735 return ExprError(); 10736 } 10737 10738 unsigned OldDepth = E->getTemplateDepth(); 10739 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 10740 10741 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 10742 SubStmt.get() == E->getSubStmt()) { 10743 // Calling this an 'error' is unintuitive, but it does the right thing. 10744 SemaRef.ActOnStmtExprError(); 10745 return SemaRef.MaybeBindToTemporary(E); 10746 } 10747 10748 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 10749 E->getRParenLoc(), NewDepth); 10750 } 10751 10752 template<typename Derived> 10753 ExprResult 10754 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 10755 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10756 if (Cond.isInvalid()) 10757 return ExprError(); 10758 10759 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10760 if (LHS.isInvalid()) 10761 return ExprError(); 10762 10763 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10764 if (RHS.isInvalid()) 10765 return ExprError(); 10766 10767 if (!getDerived().AlwaysRebuild() && 10768 Cond.get() == E->getCond() && 10769 LHS.get() == E->getLHS() && 10770 RHS.get() == E->getRHS()) 10771 return E; 10772 10773 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 10774 Cond.get(), LHS.get(), RHS.get(), 10775 E->getRParenLoc()); 10776 } 10777 10778 template<typename Derived> 10779 ExprResult 10780 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 10781 return E; 10782 } 10783 10784 template<typename Derived> 10785 ExprResult 10786 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 10787 switch (E->getOperator()) { 10788 case OO_New: 10789 case OO_Delete: 10790 case OO_Array_New: 10791 case OO_Array_Delete: 10792 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 10793 10794 case OO_Call: { 10795 // This is a call to an object's operator(). 10796 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 10797 10798 // Transform the object itself. 10799 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 10800 if (Object.isInvalid()) 10801 return ExprError(); 10802 10803 // FIXME: Poor location information 10804 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 10805 static_cast<Expr *>(Object.get())->getEndLoc()); 10806 10807 // Transform the call arguments. 10808 SmallVector<Expr*, 8> Args; 10809 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 10810 Args)) 10811 return ExprError(); 10812 10813 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 10814 E->getEndLoc()); 10815 } 10816 10817 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 10818 case OO_##Name: 10819 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 10820 #include "clang/Basic/OperatorKinds.def" 10821 case OO_Subscript: 10822 // Handled below. 10823 break; 10824 10825 case OO_Conditional: 10826 llvm_unreachable("conditional operator is not actually overloadable"); 10827 10828 case OO_None: 10829 case NUM_OVERLOADED_OPERATORS: 10830 llvm_unreachable("not an overloaded operator?"); 10831 } 10832 10833 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10834 if (Callee.isInvalid()) 10835 return ExprError(); 10836 10837 ExprResult First; 10838 if (E->getOperator() == OO_Amp) 10839 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 10840 else 10841 First = getDerived().TransformExpr(E->getArg(0)); 10842 if (First.isInvalid()) 10843 return ExprError(); 10844 10845 ExprResult Second; 10846 if (E->getNumArgs() == 2) { 10847 Second = getDerived().TransformExpr(E->getArg(1)); 10848 if (Second.isInvalid()) 10849 return ExprError(); 10850 } 10851 10852 if (!getDerived().AlwaysRebuild() && 10853 Callee.get() == E->getCallee() && 10854 First.get() == E->getArg(0) && 10855 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 10856 return SemaRef.MaybeBindToTemporary(E); 10857 10858 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10859 getSema().CurFPFeatures = E->getFPFeatures(); 10860 10861 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 10862 E->getOperatorLoc(), 10863 Callee.get(), 10864 First.get(), 10865 Second.get()); 10866 } 10867 10868 template<typename Derived> 10869 ExprResult 10870 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 10871 return getDerived().TransformCallExpr(E); 10872 } 10873 10874 template <typename Derived> 10875 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 10876 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 10877 getSema().CurContext != E->getParentContext(); 10878 10879 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 10880 return E; 10881 10882 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 10883 E->getEndLoc(), 10884 getSema().CurContext); 10885 } 10886 10887 template<typename Derived> 10888 ExprResult 10889 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 10890 // Transform the callee. 10891 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10892 if (Callee.isInvalid()) 10893 return ExprError(); 10894 10895 // Transform exec config. 10896 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 10897 if (EC.isInvalid()) 10898 return ExprError(); 10899 10900 // Transform arguments. 10901 bool ArgChanged = false; 10902 SmallVector<Expr*, 8> Args; 10903 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10904 &ArgChanged)) 10905 return ExprError(); 10906 10907 if (!getDerived().AlwaysRebuild() && 10908 Callee.get() == E->getCallee() && 10909 !ArgChanged) 10910 return SemaRef.MaybeBindToTemporary(E); 10911 10912 // FIXME: Wrong source location information for the '('. 10913 SourceLocation FakeLParenLoc 10914 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10915 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10916 Args, 10917 E->getRParenLoc(), EC.get()); 10918 } 10919 10920 template<typename Derived> 10921 ExprResult 10922 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 10923 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10924 if (!Type) 10925 return ExprError(); 10926 10927 ExprResult SubExpr 10928 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10929 if (SubExpr.isInvalid()) 10930 return ExprError(); 10931 10932 if (!getDerived().AlwaysRebuild() && 10933 Type == E->getTypeInfoAsWritten() && 10934 SubExpr.get() == E->getSubExpr()) 10935 return E; 10936 return getDerived().RebuildCXXNamedCastExpr( 10937 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 10938 Type, E->getAngleBrackets().getEnd(), 10939 // FIXME. this should be '(' location 10940 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 10941 } 10942 10943 template<typename Derived> 10944 ExprResult 10945 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 10946 TypeSourceInfo *TSI = 10947 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 10948 if (!TSI) 10949 return ExprError(); 10950 10951 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 10952 if (Sub.isInvalid()) 10953 return ExprError(); 10954 10955 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 10956 Sub.get(), BCE->getEndLoc()); 10957 } 10958 10959 template<typename Derived> 10960 ExprResult 10961 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 10962 return getDerived().TransformCXXNamedCastExpr(E); 10963 } 10964 10965 template<typename Derived> 10966 ExprResult 10967 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 10968 return getDerived().TransformCXXNamedCastExpr(E); 10969 } 10970 10971 template<typename Derived> 10972 ExprResult 10973 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 10974 CXXReinterpretCastExpr *E) { 10975 return getDerived().TransformCXXNamedCastExpr(E); 10976 } 10977 10978 template<typename Derived> 10979 ExprResult 10980 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 10981 return getDerived().TransformCXXNamedCastExpr(E); 10982 } 10983 10984 template<typename Derived> 10985 ExprResult 10986 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 10987 CXXFunctionalCastExpr *E) { 10988 TypeSourceInfo *Type = 10989 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 10990 if (!Type) 10991 return ExprError(); 10992 10993 ExprResult SubExpr 10994 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10995 if (SubExpr.isInvalid()) 10996 return ExprError(); 10997 10998 if (!getDerived().AlwaysRebuild() && 10999 Type == E->getTypeInfoAsWritten() && 11000 SubExpr.get() == E->getSubExpr()) 11001 return E; 11002 11003 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11004 E->getLParenLoc(), 11005 SubExpr.get(), 11006 E->getRParenLoc(), 11007 E->isListInitialization()); 11008 } 11009 11010 template<typename Derived> 11011 ExprResult 11012 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11013 if (E->isTypeOperand()) { 11014 TypeSourceInfo *TInfo 11015 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11016 if (!TInfo) 11017 return ExprError(); 11018 11019 if (!getDerived().AlwaysRebuild() && 11020 TInfo == E->getTypeOperandSourceInfo()) 11021 return E; 11022 11023 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11024 TInfo, E->getEndLoc()); 11025 } 11026 11027 // We don't know whether the subexpression is potentially evaluated until 11028 // after we perform semantic analysis. We speculatively assume it is 11029 // unevaluated; it will get fixed later if the subexpression is in fact 11030 // potentially evaluated. 11031 EnterExpressionEvaluationContext Unevaluated( 11032 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11033 Sema::ReuseLambdaContextDecl); 11034 11035 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11036 if (SubExpr.isInvalid()) 11037 return ExprError(); 11038 11039 if (!getDerived().AlwaysRebuild() && 11040 SubExpr.get() == E->getExprOperand()) 11041 return E; 11042 11043 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11044 SubExpr.get(), E->getEndLoc()); 11045 } 11046 11047 template<typename Derived> 11048 ExprResult 11049 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11050 if (E->isTypeOperand()) { 11051 TypeSourceInfo *TInfo 11052 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11053 if (!TInfo) 11054 return ExprError(); 11055 11056 if (!getDerived().AlwaysRebuild() && 11057 TInfo == E->getTypeOperandSourceInfo()) 11058 return E; 11059 11060 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11061 TInfo, E->getEndLoc()); 11062 } 11063 11064 EnterExpressionEvaluationContext Unevaluated( 11065 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11066 11067 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11068 if (SubExpr.isInvalid()) 11069 return ExprError(); 11070 11071 if (!getDerived().AlwaysRebuild() && 11072 SubExpr.get() == E->getExprOperand()) 11073 return E; 11074 11075 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11076 SubExpr.get(), E->getEndLoc()); 11077 } 11078 11079 template<typename Derived> 11080 ExprResult 11081 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11082 return E; 11083 } 11084 11085 template<typename Derived> 11086 ExprResult 11087 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11088 CXXNullPtrLiteralExpr *E) { 11089 return E; 11090 } 11091 11092 template<typename Derived> 11093 ExprResult 11094 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11095 QualType T = getSema().getCurrentThisType(); 11096 11097 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11098 // Mark it referenced in the new context regardless. 11099 // FIXME: this is a bit instantiation-specific. 11100 getSema().MarkThisReferenced(E); 11101 return E; 11102 } 11103 11104 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11105 } 11106 11107 template<typename Derived> 11108 ExprResult 11109 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11110 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11111 if (SubExpr.isInvalid()) 11112 return ExprError(); 11113 11114 if (!getDerived().AlwaysRebuild() && 11115 SubExpr.get() == E->getSubExpr()) 11116 return E; 11117 11118 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11119 E->isThrownVariableInScope()); 11120 } 11121 11122 template<typename Derived> 11123 ExprResult 11124 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11125 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11126 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11127 if (!Param) 11128 return ExprError(); 11129 11130 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11131 E->getUsedContext() == SemaRef.CurContext) 11132 return E; 11133 11134 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11135 } 11136 11137 template<typename Derived> 11138 ExprResult 11139 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11140 FieldDecl *Field = cast_or_null<FieldDecl>( 11141 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11142 if (!Field) 11143 return ExprError(); 11144 11145 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11146 E->getUsedContext() == SemaRef.CurContext) 11147 return E; 11148 11149 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11150 } 11151 11152 template<typename Derived> 11153 ExprResult 11154 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11155 CXXScalarValueInitExpr *E) { 11156 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11157 if (!T) 11158 return ExprError(); 11159 11160 if (!getDerived().AlwaysRebuild() && 11161 T == E->getTypeSourceInfo()) 11162 return E; 11163 11164 return getDerived().RebuildCXXScalarValueInitExpr(T, 11165 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11166 E->getRParenLoc()); 11167 } 11168 11169 template<typename Derived> 11170 ExprResult 11171 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11172 // Transform the type that we're allocating 11173 TypeSourceInfo *AllocTypeInfo = 11174 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11175 if (!AllocTypeInfo) 11176 return ExprError(); 11177 11178 // Transform the size of the array we're allocating (if any). 11179 Optional<Expr *> ArraySize; 11180 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11181 ExprResult NewArraySize; 11182 if (*OldArraySize) { 11183 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11184 if (NewArraySize.isInvalid()) 11185 return ExprError(); 11186 } 11187 ArraySize = NewArraySize.get(); 11188 } 11189 11190 // Transform the placement arguments (if any). 11191 bool ArgumentChanged = false; 11192 SmallVector<Expr*, 8> PlacementArgs; 11193 if (getDerived().TransformExprs(E->getPlacementArgs(), 11194 E->getNumPlacementArgs(), true, 11195 PlacementArgs, &ArgumentChanged)) 11196 return ExprError(); 11197 11198 // Transform the initializer (if any). 11199 Expr *OldInit = E->getInitializer(); 11200 ExprResult NewInit; 11201 if (OldInit) 11202 NewInit = getDerived().TransformInitializer(OldInit, true); 11203 if (NewInit.isInvalid()) 11204 return ExprError(); 11205 11206 // Transform new operator and delete operator. 11207 FunctionDecl *OperatorNew = nullptr; 11208 if (E->getOperatorNew()) { 11209 OperatorNew = cast_or_null<FunctionDecl>( 11210 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11211 if (!OperatorNew) 11212 return ExprError(); 11213 } 11214 11215 FunctionDecl *OperatorDelete = nullptr; 11216 if (E->getOperatorDelete()) { 11217 OperatorDelete = cast_or_null<FunctionDecl>( 11218 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11219 if (!OperatorDelete) 11220 return ExprError(); 11221 } 11222 11223 if (!getDerived().AlwaysRebuild() && 11224 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11225 ArraySize == E->getArraySize() && 11226 NewInit.get() == OldInit && 11227 OperatorNew == E->getOperatorNew() && 11228 OperatorDelete == E->getOperatorDelete() && 11229 !ArgumentChanged) { 11230 // Mark any declarations we need as referenced. 11231 // FIXME: instantiation-specific. 11232 if (OperatorNew) 11233 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11234 if (OperatorDelete) 11235 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11236 11237 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11238 QualType ElementType 11239 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11240 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11241 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11242 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11243 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11244 } 11245 } 11246 } 11247 11248 return E; 11249 } 11250 11251 QualType AllocType = AllocTypeInfo->getType(); 11252 if (!ArraySize) { 11253 // If no array size was specified, but the new expression was 11254 // instantiated with an array type (e.g., "new T" where T is 11255 // instantiated with "int[4]"), extract the outer bound from the 11256 // array type as our array size. We do this with constant and 11257 // dependently-sized array types. 11258 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11259 if (!ArrayT) { 11260 // Do nothing 11261 } else if (const ConstantArrayType *ConsArrayT 11262 = dyn_cast<ConstantArrayType>(ArrayT)) { 11263 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11264 SemaRef.Context.getSizeType(), 11265 /*FIXME:*/ E->getBeginLoc()); 11266 AllocType = ConsArrayT->getElementType(); 11267 } else if (const DependentSizedArrayType *DepArrayT 11268 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11269 if (DepArrayT->getSizeExpr()) { 11270 ArraySize = DepArrayT->getSizeExpr(); 11271 AllocType = DepArrayT->getElementType(); 11272 } 11273 } 11274 } 11275 11276 return getDerived().RebuildCXXNewExpr( 11277 E->getBeginLoc(), E->isGlobalNew(), 11278 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11279 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11280 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11281 } 11282 11283 template<typename Derived> 11284 ExprResult 11285 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11286 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11287 if (Operand.isInvalid()) 11288 return ExprError(); 11289 11290 // Transform the delete operator, if known. 11291 FunctionDecl *OperatorDelete = nullptr; 11292 if (E->getOperatorDelete()) { 11293 OperatorDelete = cast_or_null<FunctionDecl>( 11294 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11295 if (!OperatorDelete) 11296 return ExprError(); 11297 } 11298 11299 if (!getDerived().AlwaysRebuild() && 11300 Operand.get() == E->getArgument() && 11301 OperatorDelete == E->getOperatorDelete()) { 11302 // Mark any declarations we need as referenced. 11303 // FIXME: instantiation-specific. 11304 if (OperatorDelete) 11305 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11306 11307 if (!E->getArgument()->isTypeDependent()) { 11308 QualType Destroyed = SemaRef.Context.getBaseElementType( 11309 E->getDestroyedType()); 11310 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11311 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11312 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11313 SemaRef.LookupDestructor(Record)); 11314 } 11315 } 11316 11317 return E; 11318 } 11319 11320 return getDerived().RebuildCXXDeleteExpr( 11321 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11322 } 11323 11324 template<typename Derived> 11325 ExprResult 11326 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11327 CXXPseudoDestructorExpr *E) { 11328 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11329 if (Base.isInvalid()) 11330 return ExprError(); 11331 11332 ParsedType ObjectTypePtr; 11333 bool MayBePseudoDestructor = false; 11334 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11335 E->getOperatorLoc(), 11336 E->isArrow()? tok::arrow : tok::period, 11337 ObjectTypePtr, 11338 MayBePseudoDestructor); 11339 if (Base.isInvalid()) 11340 return ExprError(); 11341 11342 QualType ObjectType = ObjectTypePtr.get(); 11343 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11344 if (QualifierLoc) { 11345 QualifierLoc 11346 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11347 if (!QualifierLoc) 11348 return ExprError(); 11349 } 11350 CXXScopeSpec SS; 11351 SS.Adopt(QualifierLoc); 11352 11353 PseudoDestructorTypeStorage Destroyed; 11354 if (E->getDestroyedTypeInfo()) { 11355 TypeSourceInfo *DestroyedTypeInfo 11356 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11357 ObjectType, nullptr, SS); 11358 if (!DestroyedTypeInfo) 11359 return ExprError(); 11360 Destroyed = DestroyedTypeInfo; 11361 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11362 // We aren't likely to be able to resolve the identifier down to a type 11363 // now anyway, so just retain the identifier. 11364 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11365 E->getDestroyedTypeLoc()); 11366 } else { 11367 // Look for a destructor known with the given name. 11368 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11369 *E->getDestroyedTypeIdentifier(), 11370 E->getDestroyedTypeLoc(), 11371 /*Scope=*/nullptr, 11372 SS, ObjectTypePtr, 11373 false); 11374 if (!T) 11375 return ExprError(); 11376 11377 Destroyed 11378 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11379 E->getDestroyedTypeLoc()); 11380 } 11381 11382 TypeSourceInfo *ScopeTypeInfo = nullptr; 11383 if (E->getScopeTypeInfo()) { 11384 CXXScopeSpec EmptySS; 11385 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11386 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11387 if (!ScopeTypeInfo) 11388 return ExprError(); 11389 } 11390 11391 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11392 E->getOperatorLoc(), 11393 E->isArrow(), 11394 SS, 11395 ScopeTypeInfo, 11396 E->getColonColonLoc(), 11397 E->getTildeLoc(), 11398 Destroyed); 11399 } 11400 11401 template <typename Derived> 11402 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11403 bool RequiresADL, 11404 LookupResult &R) { 11405 // Transform all the decls. 11406 bool AllEmptyPacks = true; 11407 for (auto *OldD : Old->decls()) { 11408 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11409 if (!InstD) { 11410 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11411 // This can happen because of dependent hiding. 11412 if (isa<UsingShadowDecl>(OldD)) 11413 continue; 11414 else { 11415 R.clear(); 11416 return true; 11417 } 11418 } 11419 11420 // Expand using pack declarations. 11421 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11422 ArrayRef<NamedDecl*> Decls = SingleDecl; 11423 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11424 Decls = UPD->expansions(); 11425 11426 // Expand using declarations. 11427 for (auto *D : Decls) { 11428 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11429 for (auto *SD : UD->shadows()) 11430 R.addDecl(SD); 11431 } else { 11432 R.addDecl(D); 11433 } 11434 } 11435 11436 AllEmptyPacks &= Decls.empty(); 11437 }; 11438 11439 // C++ [temp.res]/8.4.2: 11440 // The program is ill-formed, no diagnostic required, if [...] lookup for 11441 // a name in the template definition found a using-declaration, but the 11442 // lookup in the corresponding scope in the instantiation odoes not find 11443 // any declarations because the using-declaration was a pack expansion and 11444 // the corresponding pack is empty 11445 if (AllEmptyPacks && !RequiresADL) { 11446 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11447 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11448 return true; 11449 } 11450 11451 // Resolve a kind, but don't do any further analysis. If it's 11452 // ambiguous, the callee needs to deal with it. 11453 R.resolveKind(); 11454 return false; 11455 } 11456 11457 template<typename Derived> 11458 ExprResult 11459 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11460 UnresolvedLookupExpr *Old) { 11461 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11462 Sema::LookupOrdinaryName); 11463 11464 // Transform the declaration set. 11465 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11466 return ExprError(); 11467 11468 // Rebuild the nested-name qualifier, if present. 11469 CXXScopeSpec SS; 11470 if (Old->getQualifierLoc()) { 11471 NestedNameSpecifierLoc QualifierLoc 11472 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11473 if (!QualifierLoc) 11474 return ExprError(); 11475 11476 SS.Adopt(QualifierLoc); 11477 } 11478 11479 if (Old->getNamingClass()) { 11480 CXXRecordDecl *NamingClass 11481 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11482 Old->getNameLoc(), 11483 Old->getNamingClass())); 11484 if (!NamingClass) { 11485 R.clear(); 11486 return ExprError(); 11487 } 11488 11489 R.setNamingClass(NamingClass); 11490 } 11491 11492 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11493 11494 // If we have neither explicit template arguments, nor the template keyword, 11495 // it's a normal declaration name or member reference. 11496 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11497 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11498 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11499 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11500 // give a good diagnostic. 11501 if (D && D->isCXXInstanceMember()) { 11502 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11503 /*TemplateArgs=*/nullptr, 11504 /*Scope=*/nullptr); 11505 } 11506 11507 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11508 } 11509 11510 // If we have template arguments, rebuild them, then rebuild the 11511 // templateid expression. 11512 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11513 if (Old->hasExplicitTemplateArgs() && 11514 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11515 Old->getNumTemplateArgs(), 11516 TransArgs)) { 11517 R.clear(); 11518 return ExprError(); 11519 } 11520 11521 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11522 Old->requiresADL(), &TransArgs); 11523 } 11524 11525 template<typename Derived> 11526 ExprResult 11527 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11528 bool ArgChanged = false; 11529 SmallVector<TypeSourceInfo *, 4> Args; 11530 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11531 TypeSourceInfo *From = E->getArg(I); 11532 TypeLoc FromTL = From->getTypeLoc(); 11533 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11534 TypeLocBuilder TLB; 11535 TLB.reserve(FromTL.getFullDataSize()); 11536 QualType To = getDerived().TransformType(TLB, FromTL); 11537 if (To.isNull()) 11538 return ExprError(); 11539 11540 if (To == From->getType()) 11541 Args.push_back(From); 11542 else { 11543 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11544 ArgChanged = true; 11545 } 11546 continue; 11547 } 11548 11549 ArgChanged = true; 11550 11551 // We have a pack expansion. Instantiate it. 11552 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 11553 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 11554 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11555 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 11556 11557 // Determine whether the set of unexpanded parameter packs can and should 11558 // be expanded. 11559 bool Expand = true; 11560 bool RetainExpansion = false; 11561 Optional<unsigned> OrigNumExpansions = 11562 ExpansionTL.getTypePtr()->getNumExpansions(); 11563 Optional<unsigned> NumExpansions = OrigNumExpansions; 11564 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 11565 PatternTL.getSourceRange(), 11566 Unexpanded, 11567 Expand, RetainExpansion, 11568 NumExpansions)) 11569 return ExprError(); 11570 11571 if (!Expand) { 11572 // The transform has determined that we should perform a simple 11573 // transformation on the pack expansion, producing another pack 11574 // expansion. 11575 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11576 11577 TypeLocBuilder TLB; 11578 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11579 11580 QualType To = getDerived().TransformType(TLB, PatternTL); 11581 if (To.isNull()) 11582 return ExprError(); 11583 11584 To = getDerived().RebuildPackExpansionType(To, 11585 PatternTL.getSourceRange(), 11586 ExpansionTL.getEllipsisLoc(), 11587 NumExpansions); 11588 if (To.isNull()) 11589 return ExprError(); 11590 11591 PackExpansionTypeLoc ToExpansionTL 11592 = TLB.push<PackExpansionTypeLoc>(To); 11593 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11594 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11595 continue; 11596 } 11597 11598 // Expand the pack expansion by substituting for each argument in the 11599 // pack(s). 11600 for (unsigned I = 0; I != *NumExpansions; ++I) { 11601 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 11602 TypeLocBuilder TLB; 11603 TLB.reserve(PatternTL.getFullDataSize()); 11604 QualType To = getDerived().TransformType(TLB, PatternTL); 11605 if (To.isNull()) 11606 return ExprError(); 11607 11608 if (To->containsUnexpandedParameterPack()) { 11609 To = getDerived().RebuildPackExpansionType(To, 11610 PatternTL.getSourceRange(), 11611 ExpansionTL.getEllipsisLoc(), 11612 NumExpansions); 11613 if (To.isNull()) 11614 return ExprError(); 11615 11616 PackExpansionTypeLoc ToExpansionTL 11617 = TLB.push<PackExpansionTypeLoc>(To); 11618 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11619 } 11620 11621 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11622 } 11623 11624 if (!RetainExpansion) 11625 continue; 11626 11627 // If we're supposed to retain a pack expansion, do so by temporarily 11628 // forgetting the partially-substituted parameter pack. 11629 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11630 11631 TypeLocBuilder TLB; 11632 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11633 11634 QualType To = getDerived().TransformType(TLB, PatternTL); 11635 if (To.isNull()) 11636 return ExprError(); 11637 11638 To = getDerived().RebuildPackExpansionType(To, 11639 PatternTL.getSourceRange(), 11640 ExpansionTL.getEllipsisLoc(), 11641 NumExpansions); 11642 if (To.isNull()) 11643 return ExprError(); 11644 11645 PackExpansionTypeLoc ToExpansionTL 11646 = TLB.push<PackExpansionTypeLoc>(To); 11647 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11648 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11649 } 11650 11651 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11652 return E; 11653 11654 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 11655 E->getEndLoc()); 11656 } 11657 11658 template<typename Derived> 11659 ExprResult 11660 TreeTransform<Derived>::TransformConceptSpecializationExpr( 11661 ConceptSpecializationExpr *E) { 11662 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 11663 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 11664 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11665 Old->NumTemplateArgs, TransArgs)) 11666 return ExprError(); 11667 11668 return getDerived().RebuildConceptSpecializationExpr( 11669 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 11670 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 11671 &TransArgs); 11672 } 11673 11674 template<typename Derived> 11675 ExprResult 11676 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 11677 SmallVector<ParmVarDecl*, 4> TransParams; 11678 SmallVector<QualType, 4> TransParamTypes; 11679 Sema::ExtParameterInfoBuilder ExtParamInfos; 11680 11681 // C++2a [expr.prim.req]p2 11682 // Expressions appearing within a requirement-body are unevaluated operands. 11683 EnterExpressionEvaluationContext Ctx( 11684 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11685 11686 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 11687 getSema().Context, getSema().CurContext, 11688 E->getBody()->getBeginLoc()); 11689 11690 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 11691 11692 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 11693 E->getLocalParameters(), 11694 /*ParamTypes=*/nullptr, 11695 /*ParamInfos=*/nullptr, 11696 TransParamTypes, &TransParams, 11697 ExtParamInfos)) 11698 return ExprError(); 11699 11700 for (ParmVarDecl *Param : TransParams) 11701 Param->setDeclContext(Body); 11702 11703 SmallVector<concepts::Requirement *, 4> TransReqs; 11704 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 11705 TransReqs)) 11706 return ExprError(); 11707 11708 for (concepts::Requirement *Req : TransReqs) { 11709 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 11710 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 11711 ER->getReturnTypeRequirement() 11712 .getTypeConstraintTemplateParameterList()->getParam(0) 11713 ->setDeclContext(Body); 11714 } 11715 } 11716 } 11717 11718 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 11719 TransParams, TransReqs, 11720 E->getRBraceLoc()); 11721 } 11722 11723 template<typename Derived> 11724 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 11725 ArrayRef<concepts::Requirement *> Reqs, 11726 SmallVectorImpl<concepts::Requirement *> &Transformed) { 11727 for (concepts::Requirement *Req : Reqs) { 11728 concepts::Requirement *TransReq = nullptr; 11729 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 11730 TransReq = getDerived().TransformTypeRequirement(TypeReq); 11731 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 11732 TransReq = getDerived().TransformExprRequirement(ExprReq); 11733 else 11734 TransReq = getDerived().TransformNestedRequirement( 11735 cast<concepts::NestedRequirement>(Req)); 11736 if (!TransReq) 11737 return true; 11738 Transformed.push_back(TransReq); 11739 } 11740 return false; 11741 } 11742 11743 template<typename Derived> 11744 concepts::TypeRequirement * 11745 TreeTransform<Derived>::TransformTypeRequirement( 11746 concepts::TypeRequirement *Req) { 11747 if (Req->isSubstitutionFailure()) { 11748 if (getDerived().AlwaysRebuild()) 11749 return getDerived().RebuildTypeRequirement( 11750 Req->getSubstitutionDiagnostic()); 11751 return Req; 11752 } 11753 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 11754 if (!TransType) 11755 return nullptr; 11756 return getDerived().RebuildTypeRequirement(TransType); 11757 } 11758 11759 template<typename Derived> 11760 concepts::ExprRequirement * 11761 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 11762 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 11763 if (Req->isExprSubstitutionFailure()) 11764 TransExpr = Req->getExprSubstitutionDiagnostic(); 11765 else { 11766 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 11767 if (TransExprRes.isInvalid()) 11768 return nullptr; 11769 TransExpr = TransExprRes.get(); 11770 } 11771 11772 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 11773 const auto &RetReq = Req->getReturnTypeRequirement(); 11774 if (RetReq.isEmpty()) 11775 TransRetReq.emplace(); 11776 else if (RetReq.isSubstitutionFailure()) 11777 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 11778 else if (RetReq.isTypeConstraint()) { 11779 TemplateParameterList *OrigTPL = 11780 RetReq.getTypeConstraintTemplateParameterList(); 11781 TemplateParameterList *TPL = 11782 getDerived().TransformTemplateParameterList(OrigTPL); 11783 if (!TPL) 11784 return nullptr; 11785 TransRetReq.emplace(TPL); 11786 } 11787 assert(TransRetReq.hasValue() && 11788 "All code paths leading here must set TransRetReq"); 11789 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 11790 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 11791 Req->getNoexceptLoc(), 11792 std::move(*TransRetReq)); 11793 return getDerived().RebuildExprRequirement( 11794 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 11795 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 11796 } 11797 11798 template<typename Derived> 11799 concepts::NestedRequirement * 11800 TreeTransform<Derived>::TransformNestedRequirement( 11801 concepts::NestedRequirement *Req) { 11802 if (Req->isSubstitutionFailure()) { 11803 if (getDerived().AlwaysRebuild()) 11804 return getDerived().RebuildNestedRequirement( 11805 Req->getSubstitutionDiagnostic()); 11806 return Req; 11807 } 11808 ExprResult TransConstraint = 11809 getDerived().TransformExpr(Req->getConstraintExpr()); 11810 if (TransConstraint.isInvalid()) 11811 return nullptr; 11812 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 11813 } 11814 11815 template<typename Derived> 11816 ExprResult 11817 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 11818 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 11819 if (!T) 11820 return ExprError(); 11821 11822 if (!getDerived().AlwaysRebuild() && 11823 T == E->getQueriedTypeSourceInfo()) 11824 return E; 11825 11826 ExprResult SubExpr; 11827 { 11828 EnterExpressionEvaluationContext Unevaluated( 11829 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11830 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 11831 if (SubExpr.isInvalid()) 11832 return ExprError(); 11833 11834 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 11835 return E; 11836 } 11837 11838 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 11839 SubExpr.get(), E->getEndLoc()); 11840 } 11841 11842 template<typename Derived> 11843 ExprResult 11844 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 11845 ExprResult SubExpr; 11846 { 11847 EnterExpressionEvaluationContext Unevaluated( 11848 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11849 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 11850 if (SubExpr.isInvalid()) 11851 return ExprError(); 11852 11853 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 11854 return E; 11855 } 11856 11857 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 11858 SubExpr.get(), E->getEndLoc()); 11859 } 11860 11861 template <typename Derived> 11862 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 11863 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 11864 TypeSourceInfo **RecoveryTSI) { 11865 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 11866 DRE, AddrTaken, RecoveryTSI); 11867 11868 // Propagate both errors and recovered types, which return ExprEmpty. 11869 if (!NewDRE.isUsable()) 11870 return NewDRE; 11871 11872 // We got an expr, wrap it up in parens. 11873 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 11874 return PE; 11875 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 11876 PE->getRParen()); 11877 } 11878 11879 template <typename Derived> 11880 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 11881 DependentScopeDeclRefExpr *E) { 11882 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 11883 nullptr); 11884 } 11885 11886 template<typename Derived> 11887 ExprResult 11888 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 11889 DependentScopeDeclRefExpr *E, 11890 bool IsAddressOfOperand, 11891 TypeSourceInfo **RecoveryTSI) { 11892 assert(E->getQualifierLoc()); 11893 NestedNameSpecifierLoc QualifierLoc 11894 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 11895 if (!QualifierLoc) 11896 return ExprError(); 11897 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11898 11899 // TODO: If this is a conversion-function-id, verify that the 11900 // destination type name (if present) resolves the same way after 11901 // instantiation as it did in the local scope. 11902 11903 DeclarationNameInfo NameInfo 11904 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 11905 if (!NameInfo.getName()) 11906 return ExprError(); 11907 11908 if (!E->hasExplicitTemplateArgs()) { 11909 if (!getDerived().AlwaysRebuild() && 11910 QualifierLoc == E->getQualifierLoc() && 11911 // Note: it is sufficient to compare the Name component of NameInfo: 11912 // if name has not changed, DNLoc has not changed either. 11913 NameInfo.getName() == E->getDeclName()) 11914 return E; 11915 11916 return getDerived().RebuildDependentScopeDeclRefExpr( 11917 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 11918 IsAddressOfOperand, RecoveryTSI); 11919 } 11920 11921 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11922 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11923 E->getNumTemplateArgs(), 11924 TransArgs)) 11925 return ExprError(); 11926 11927 return getDerived().RebuildDependentScopeDeclRefExpr( 11928 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 11929 RecoveryTSI); 11930 } 11931 11932 template<typename Derived> 11933 ExprResult 11934 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 11935 // CXXConstructExprs other than for list-initialization and 11936 // CXXTemporaryObjectExpr are always implicit, so when we have 11937 // a 1-argument construction we just transform that argument. 11938 if (getDerived().AllowSkippingCXXConstructExpr() && 11939 ((E->getNumArgs() == 1 || 11940 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 11941 (!getDerived().DropCallArgument(E->getArg(0))) && 11942 !E->isListInitialization())) 11943 return getDerived().TransformExpr(E->getArg(0)); 11944 11945 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 11946 11947 QualType T = getDerived().TransformType(E->getType()); 11948 if (T.isNull()) 11949 return ExprError(); 11950 11951 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11952 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11953 if (!Constructor) 11954 return ExprError(); 11955 11956 bool ArgumentChanged = false; 11957 SmallVector<Expr*, 8> Args; 11958 { 11959 EnterExpressionEvaluationContext Context( 11960 getSema(), EnterExpressionEvaluationContext::InitList, 11961 E->isListInitialization()); 11962 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11963 &ArgumentChanged)) 11964 return ExprError(); 11965 } 11966 11967 if (!getDerived().AlwaysRebuild() && 11968 T == E->getType() && 11969 Constructor == E->getConstructor() && 11970 !ArgumentChanged) { 11971 // Mark the constructor as referenced. 11972 // FIXME: Instantiation-specific 11973 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11974 return E; 11975 } 11976 11977 return getDerived().RebuildCXXConstructExpr( 11978 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 11979 E->hadMultipleCandidates(), E->isListInitialization(), 11980 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 11981 E->getConstructionKind(), E->getParenOrBraceRange()); 11982 } 11983 11984 template<typename Derived> 11985 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 11986 CXXInheritedCtorInitExpr *E) { 11987 QualType T = getDerived().TransformType(E->getType()); 11988 if (T.isNull()) 11989 return ExprError(); 11990 11991 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11992 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11993 if (!Constructor) 11994 return ExprError(); 11995 11996 if (!getDerived().AlwaysRebuild() && 11997 T == E->getType() && 11998 Constructor == E->getConstructor()) { 11999 // Mark the constructor as referenced. 12000 // FIXME: Instantiation-specific 12001 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12002 return E; 12003 } 12004 12005 return getDerived().RebuildCXXInheritedCtorInitExpr( 12006 T, E->getLocation(), Constructor, 12007 E->constructsVBase(), E->inheritedFromVBase()); 12008 } 12009 12010 /// Transform a C++ temporary-binding expression. 12011 /// 12012 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12013 /// transform the subexpression and return that. 12014 template<typename Derived> 12015 ExprResult 12016 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12017 return getDerived().TransformExpr(E->getSubExpr()); 12018 } 12019 12020 /// Transform a C++ expression that contains cleanups that should 12021 /// be run after the expression is evaluated. 12022 /// 12023 /// Since ExprWithCleanups nodes are implicitly generated, we 12024 /// just transform the subexpression and return that. 12025 template<typename Derived> 12026 ExprResult 12027 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12028 return getDerived().TransformExpr(E->getSubExpr()); 12029 } 12030 12031 template<typename Derived> 12032 ExprResult 12033 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12034 CXXTemporaryObjectExpr *E) { 12035 TypeSourceInfo *T = 12036 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12037 if (!T) 12038 return ExprError(); 12039 12040 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12041 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12042 if (!Constructor) 12043 return ExprError(); 12044 12045 bool ArgumentChanged = false; 12046 SmallVector<Expr*, 8> Args; 12047 Args.reserve(E->getNumArgs()); 12048 { 12049 EnterExpressionEvaluationContext Context( 12050 getSema(), EnterExpressionEvaluationContext::InitList, 12051 E->isListInitialization()); 12052 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12053 &ArgumentChanged)) 12054 return ExprError(); 12055 } 12056 12057 if (!getDerived().AlwaysRebuild() && 12058 T == E->getTypeSourceInfo() && 12059 Constructor == E->getConstructor() && 12060 !ArgumentChanged) { 12061 // FIXME: Instantiation-specific 12062 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12063 return SemaRef.MaybeBindToTemporary(E); 12064 } 12065 12066 // FIXME: We should just pass E->isListInitialization(), but we're not 12067 // prepared to handle list-initialization without a child InitListExpr. 12068 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12069 return getDerived().RebuildCXXTemporaryObjectExpr( 12070 T, LParenLoc, Args, E->getEndLoc(), 12071 /*ListInitialization=*/LParenLoc.isInvalid()); 12072 } 12073 12074 template<typename Derived> 12075 ExprResult 12076 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12077 // Transform any init-capture expressions before entering the scope of the 12078 // lambda body, because they are not semantically within that scope. 12079 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12080 struct TransformedInitCapture { 12081 // The location of the ... if the result is retaining a pack expansion. 12082 SourceLocation EllipsisLoc; 12083 // Zero or more expansions of the init-capture. 12084 SmallVector<InitCaptureInfoTy, 4> Expansions; 12085 }; 12086 SmallVector<TransformedInitCapture, 4> InitCaptures; 12087 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12088 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12089 CEnd = E->capture_end(); 12090 C != CEnd; ++C) { 12091 if (!E->isInitCapture(C)) 12092 continue; 12093 12094 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12095 VarDecl *OldVD = C->getCapturedVar(); 12096 12097 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12098 Optional<unsigned> NumExpansions) { 12099 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12100 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12101 12102 if (NewExprInitResult.isInvalid()) { 12103 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12104 return; 12105 } 12106 Expr *NewExprInit = NewExprInitResult.get(); 12107 12108 QualType NewInitCaptureType = 12109 getSema().buildLambdaInitCaptureInitialization( 12110 C->getLocation(), OldVD->getType()->isReferenceType(), 12111 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12112 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12113 NewExprInit); 12114 Result.Expansions.push_back( 12115 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12116 }; 12117 12118 // If this is an init-capture pack, consider expanding the pack now. 12119 if (OldVD->isParameterPack()) { 12120 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12121 ->getTypeLoc() 12122 .castAs<PackExpansionTypeLoc>(); 12123 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12124 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12125 12126 // Determine whether the set of unexpanded parameter packs can and should 12127 // be expanded. 12128 bool Expand = true; 12129 bool RetainExpansion = false; 12130 Optional<unsigned> OrigNumExpansions = 12131 ExpansionTL.getTypePtr()->getNumExpansions(); 12132 Optional<unsigned> NumExpansions = OrigNumExpansions; 12133 if (getDerived().TryExpandParameterPacks( 12134 ExpansionTL.getEllipsisLoc(), 12135 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12136 RetainExpansion, NumExpansions)) 12137 return ExprError(); 12138 if (Expand) { 12139 for (unsigned I = 0; I != *NumExpansions; ++I) { 12140 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12141 SubstInitCapture(SourceLocation(), None); 12142 } 12143 } 12144 if (!Expand || RetainExpansion) { 12145 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12146 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12147 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12148 } 12149 } else { 12150 SubstInitCapture(SourceLocation(), None); 12151 } 12152 } 12153 12154 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12155 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12156 12157 // Transform the template parameters, and add them to the current 12158 // instantiation scope. The null case is handled correctly. 12159 auto TPL = getDerived().TransformTemplateParameterList( 12160 E->getTemplateParameterList()); 12161 LSI->GLTemplateParameterList = TPL; 12162 12163 // Transform the type of the original lambda's call operator. 12164 // The transformation MUST be done in the CurrentInstantiationScope since 12165 // it introduces a mapping of the original to the newly created 12166 // transformed parameters. 12167 TypeSourceInfo *NewCallOpTSI = nullptr; 12168 { 12169 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12170 FunctionProtoTypeLoc OldCallOpFPTL = 12171 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12172 12173 TypeLocBuilder NewCallOpTLBuilder; 12174 SmallVector<QualType, 4> ExceptionStorage; 12175 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12176 QualType NewCallOpType = TransformFunctionProtoType( 12177 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12178 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12179 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12180 ExceptionStorage, Changed); 12181 }); 12182 if (NewCallOpType.isNull()) 12183 return ExprError(); 12184 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12185 NewCallOpType); 12186 } 12187 12188 // Transform the trailing requires clause 12189 ExprResult NewTrailingRequiresClause; 12190 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12191 // FIXME: Concepts: Substitution into requires clause should only happen 12192 // when checking satisfaction. 12193 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12194 12195 // Create the local class that will describe the lambda. 12196 // FIXME: KnownDependent below is wrong when substituting inside a templated 12197 // context that isn't a DeclContext (such as a variable template). 12198 CXXRecordDecl *OldClass = E->getLambdaClass(); 12199 CXXRecordDecl *Class 12200 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12201 NewCallOpTSI, 12202 /*KnownDependent=*/false, 12203 E->getCaptureDefault()); 12204 getDerived().transformedLocalDecl(OldClass, {Class}); 12205 12206 Optional<std::tuple<unsigned, bool, Decl *>> Mangling; 12207 if (getDerived().ReplacingOriginal()) 12208 Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(), 12209 OldClass->hasKnownLambdaInternalLinkage(), 12210 OldClass->getLambdaContextDecl()); 12211 12212 // Build the call operator. 12213 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12214 Class, E->getIntroducerRange(), NewCallOpTSI, 12215 E->getCallOperator()->getEndLoc(), 12216 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12217 E->getCallOperator()->getConstexprKind(), 12218 NewTrailingRequiresClause.get()); 12219 12220 LSI->CallOperator = NewCallOperator; 12221 12222 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 12223 I != NumParams; ++I) { 12224 auto *P = NewCallOperator->getParamDecl(I); 12225 if (P->hasUninstantiatedDefaultArg()) { 12226 EnterExpressionEvaluationContext Eval( 12227 getSema(), 12228 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 12229 ExprResult R = getDerived().TransformExpr( 12230 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 12231 P->setDefaultArg(R.get()); 12232 } 12233 } 12234 12235 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12236 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12237 12238 // Number the lambda for linkage purposes if necessary. 12239 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12240 12241 // Introduce the context of the call operator. 12242 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12243 /*NewThisContext*/false); 12244 12245 // Enter the scope of the lambda. 12246 getSema().buildLambdaScope(LSI, NewCallOperator, 12247 E->getIntroducerRange(), 12248 E->getCaptureDefault(), 12249 E->getCaptureDefaultLoc(), 12250 E->hasExplicitParameters(), 12251 E->hasExplicitResultType(), 12252 E->isMutable()); 12253 12254 bool Invalid = false; 12255 12256 // Transform captures. 12257 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12258 CEnd = E->capture_end(); 12259 C != CEnd; ++C) { 12260 // When we hit the first implicit capture, tell Sema that we've finished 12261 // the list of explicit captures. 12262 if (C->isImplicit()) 12263 break; 12264 12265 // Capturing 'this' is trivial. 12266 if (C->capturesThis()) { 12267 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12268 /*BuildAndDiagnose*/ true, nullptr, 12269 C->getCaptureKind() == LCK_StarThis); 12270 continue; 12271 } 12272 // Captured expression will be recaptured during captured variables 12273 // rebuilding. 12274 if (C->capturesVLAType()) 12275 continue; 12276 12277 // Rebuild init-captures, including the implied field declaration. 12278 if (E->isInitCapture(C)) { 12279 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12280 12281 VarDecl *OldVD = C->getCapturedVar(); 12282 llvm::SmallVector<Decl*, 4> NewVDs; 12283 12284 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12285 ExprResult Init = Info.first; 12286 QualType InitQualType = Info.second; 12287 if (Init.isInvalid() || InitQualType.isNull()) { 12288 Invalid = true; 12289 break; 12290 } 12291 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12292 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12293 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12294 if (!NewVD) { 12295 Invalid = true; 12296 break; 12297 } 12298 NewVDs.push_back(NewVD); 12299 getSema().addInitCapture(LSI, NewVD); 12300 } 12301 12302 if (Invalid) 12303 break; 12304 12305 getDerived().transformedLocalDecl(OldVD, NewVDs); 12306 continue; 12307 } 12308 12309 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12310 12311 // Determine the capture kind for Sema. 12312 Sema::TryCaptureKind Kind 12313 = C->isImplicit()? Sema::TryCapture_Implicit 12314 : C->getCaptureKind() == LCK_ByCopy 12315 ? Sema::TryCapture_ExplicitByVal 12316 : Sema::TryCapture_ExplicitByRef; 12317 SourceLocation EllipsisLoc; 12318 if (C->isPackExpansion()) { 12319 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12320 bool ShouldExpand = false; 12321 bool RetainExpansion = false; 12322 Optional<unsigned> NumExpansions; 12323 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12324 C->getLocation(), 12325 Unexpanded, 12326 ShouldExpand, RetainExpansion, 12327 NumExpansions)) { 12328 Invalid = true; 12329 continue; 12330 } 12331 12332 if (ShouldExpand) { 12333 // The transform has determined that we should perform an expansion; 12334 // transform and capture each of the arguments. 12335 // expansion of the pattern. Do so. 12336 VarDecl *Pack = C->getCapturedVar(); 12337 for (unsigned I = 0; I != *NumExpansions; ++I) { 12338 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12339 VarDecl *CapturedVar 12340 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12341 Pack)); 12342 if (!CapturedVar) { 12343 Invalid = true; 12344 continue; 12345 } 12346 12347 // Capture the transformed variable. 12348 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12349 } 12350 12351 // FIXME: Retain a pack expansion if RetainExpansion is true. 12352 12353 continue; 12354 } 12355 12356 EllipsisLoc = C->getEllipsisLoc(); 12357 } 12358 12359 // Transform the captured variable. 12360 VarDecl *CapturedVar 12361 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12362 C->getCapturedVar())); 12363 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12364 Invalid = true; 12365 continue; 12366 } 12367 12368 // Capture the transformed variable. 12369 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12370 EllipsisLoc); 12371 } 12372 getSema().finishLambdaExplicitCaptures(LSI); 12373 12374 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12375 // evaluation context even if we're not transforming the function body. 12376 getSema().PushExpressionEvaluationContext( 12377 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12378 12379 // Instantiate the body of the lambda expression. 12380 StmtResult Body = 12381 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12382 12383 // ActOnLambda* will pop the function scope for us. 12384 FuncScopeCleanup.disable(); 12385 12386 if (Body.isInvalid()) { 12387 SavedContext.pop(); 12388 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12389 /*IsInstantiation=*/true); 12390 return ExprError(); 12391 } 12392 12393 // Copy the LSI before ActOnFinishFunctionBody removes it. 12394 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12395 // the call operator. 12396 auto LSICopy = *LSI; 12397 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12398 /*IsInstantiation*/ true); 12399 SavedContext.pop(); 12400 12401 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12402 &LSICopy); 12403 } 12404 12405 template<typename Derived> 12406 StmtResult 12407 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12408 return TransformStmt(S); 12409 } 12410 12411 template<typename Derived> 12412 StmtResult 12413 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12414 // Transform captures. 12415 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12416 CEnd = E->capture_end(); 12417 C != CEnd; ++C) { 12418 // When we hit the first implicit capture, tell Sema that we've finished 12419 // the list of explicit captures. 12420 if (!C->isImplicit()) 12421 continue; 12422 12423 // Capturing 'this' is trivial. 12424 if (C->capturesThis()) { 12425 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12426 /*BuildAndDiagnose*/ true, nullptr, 12427 C->getCaptureKind() == LCK_StarThis); 12428 continue; 12429 } 12430 // Captured expression will be recaptured during captured variables 12431 // rebuilding. 12432 if (C->capturesVLAType()) 12433 continue; 12434 12435 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12436 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12437 12438 // Transform the captured variable. 12439 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12440 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12441 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12442 return StmtError(); 12443 12444 // Capture the transformed variable. 12445 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12446 } 12447 12448 return S; 12449 } 12450 12451 template<typename Derived> 12452 ExprResult 12453 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12454 CXXUnresolvedConstructExpr *E) { 12455 TypeSourceInfo *T = 12456 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12457 if (!T) 12458 return ExprError(); 12459 12460 bool ArgumentChanged = false; 12461 SmallVector<Expr*, 8> Args; 12462 Args.reserve(E->arg_size()); 12463 { 12464 EnterExpressionEvaluationContext Context( 12465 getSema(), EnterExpressionEvaluationContext::InitList, 12466 E->isListInitialization()); 12467 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 12468 &ArgumentChanged)) 12469 return ExprError(); 12470 } 12471 12472 if (!getDerived().AlwaysRebuild() && 12473 T == E->getTypeSourceInfo() && 12474 !ArgumentChanged) 12475 return E; 12476 12477 // FIXME: we're faking the locations of the commas 12478 return getDerived().RebuildCXXUnresolvedConstructExpr( 12479 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12480 } 12481 12482 template<typename Derived> 12483 ExprResult 12484 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12485 CXXDependentScopeMemberExpr *E) { 12486 // Transform the base of the expression. 12487 ExprResult Base((Expr*) nullptr); 12488 Expr *OldBase; 12489 QualType BaseType; 12490 QualType ObjectType; 12491 if (!E->isImplicitAccess()) { 12492 OldBase = E->getBase(); 12493 Base = getDerived().TransformExpr(OldBase); 12494 if (Base.isInvalid()) 12495 return ExprError(); 12496 12497 // Start the member reference and compute the object's type. 12498 ParsedType ObjectTy; 12499 bool MayBePseudoDestructor = false; 12500 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12501 E->getOperatorLoc(), 12502 E->isArrow()? tok::arrow : tok::period, 12503 ObjectTy, 12504 MayBePseudoDestructor); 12505 if (Base.isInvalid()) 12506 return ExprError(); 12507 12508 ObjectType = ObjectTy.get(); 12509 BaseType = ((Expr*) Base.get())->getType(); 12510 } else { 12511 OldBase = nullptr; 12512 BaseType = getDerived().TransformType(E->getBaseType()); 12513 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12514 } 12515 12516 // Transform the first part of the nested-name-specifier that qualifies 12517 // the member name. 12518 NamedDecl *FirstQualifierInScope 12519 = getDerived().TransformFirstQualifierInScope( 12520 E->getFirstQualifierFoundInScope(), 12521 E->getQualifierLoc().getBeginLoc()); 12522 12523 NestedNameSpecifierLoc QualifierLoc; 12524 if (E->getQualifier()) { 12525 QualifierLoc 12526 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12527 ObjectType, 12528 FirstQualifierInScope); 12529 if (!QualifierLoc) 12530 return ExprError(); 12531 } 12532 12533 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12534 12535 // TODO: If this is a conversion-function-id, verify that the 12536 // destination type name (if present) resolves the same way after 12537 // instantiation as it did in the local scope. 12538 12539 DeclarationNameInfo NameInfo 12540 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12541 if (!NameInfo.getName()) 12542 return ExprError(); 12543 12544 if (!E->hasExplicitTemplateArgs()) { 12545 // This is a reference to a member without an explicitly-specified 12546 // template argument list. Optimize for this common case. 12547 if (!getDerived().AlwaysRebuild() && 12548 Base.get() == OldBase && 12549 BaseType == E->getBaseType() && 12550 QualifierLoc == E->getQualifierLoc() && 12551 NameInfo.getName() == E->getMember() && 12552 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12553 return E; 12554 12555 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12556 BaseType, 12557 E->isArrow(), 12558 E->getOperatorLoc(), 12559 QualifierLoc, 12560 TemplateKWLoc, 12561 FirstQualifierInScope, 12562 NameInfo, 12563 /*TemplateArgs*/nullptr); 12564 } 12565 12566 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12567 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12568 E->getNumTemplateArgs(), 12569 TransArgs)) 12570 return ExprError(); 12571 12572 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12573 BaseType, 12574 E->isArrow(), 12575 E->getOperatorLoc(), 12576 QualifierLoc, 12577 TemplateKWLoc, 12578 FirstQualifierInScope, 12579 NameInfo, 12580 &TransArgs); 12581 } 12582 12583 template<typename Derived> 12584 ExprResult 12585 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 12586 // Transform the base of the expression. 12587 ExprResult Base((Expr*) nullptr); 12588 QualType BaseType; 12589 if (!Old->isImplicitAccess()) { 12590 Base = getDerived().TransformExpr(Old->getBase()); 12591 if (Base.isInvalid()) 12592 return ExprError(); 12593 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 12594 Old->isArrow()); 12595 if (Base.isInvalid()) 12596 return ExprError(); 12597 BaseType = Base.get()->getType(); 12598 } else { 12599 BaseType = getDerived().TransformType(Old->getBaseType()); 12600 } 12601 12602 NestedNameSpecifierLoc QualifierLoc; 12603 if (Old->getQualifierLoc()) { 12604 QualifierLoc 12605 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12606 if (!QualifierLoc) 12607 return ExprError(); 12608 } 12609 12610 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12611 12612 LookupResult R(SemaRef, Old->getMemberNameInfo(), 12613 Sema::LookupOrdinaryName); 12614 12615 // Transform the declaration set. 12616 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 12617 return ExprError(); 12618 12619 // Determine the naming class. 12620 if (Old->getNamingClass()) { 12621 CXXRecordDecl *NamingClass 12622 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12623 Old->getMemberLoc(), 12624 Old->getNamingClass())); 12625 if (!NamingClass) 12626 return ExprError(); 12627 12628 R.setNamingClass(NamingClass); 12629 } 12630 12631 TemplateArgumentListInfo TransArgs; 12632 if (Old->hasExplicitTemplateArgs()) { 12633 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 12634 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 12635 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12636 Old->getNumTemplateArgs(), 12637 TransArgs)) 12638 return ExprError(); 12639 } 12640 12641 // FIXME: to do this check properly, we will need to preserve the 12642 // first-qualifier-in-scope here, just in case we had a dependent 12643 // base (and therefore couldn't do the check) and a 12644 // nested-name-qualifier (and therefore could do the lookup). 12645 NamedDecl *FirstQualifierInScope = nullptr; 12646 12647 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 12648 BaseType, 12649 Old->getOperatorLoc(), 12650 Old->isArrow(), 12651 QualifierLoc, 12652 TemplateKWLoc, 12653 FirstQualifierInScope, 12654 R, 12655 (Old->hasExplicitTemplateArgs() 12656 ? &TransArgs : nullptr)); 12657 } 12658 12659 template<typename Derived> 12660 ExprResult 12661 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 12662 EnterExpressionEvaluationContext Unevaluated( 12663 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12664 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 12665 if (SubExpr.isInvalid()) 12666 return ExprError(); 12667 12668 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 12669 return E; 12670 12671 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 12672 } 12673 12674 template<typename Derived> 12675 ExprResult 12676 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 12677 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 12678 if (Pattern.isInvalid()) 12679 return ExprError(); 12680 12681 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 12682 return E; 12683 12684 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 12685 E->getNumExpansions()); 12686 } 12687 12688 template<typename Derived> 12689 ExprResult 12690 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 12691 // If E is not value-dependent, then nothing will change when we transform it. 12692 // Note: This is an instantiation-centric view. 12693 if (!E->isValueDependent()) 12694 return E; 12695 12696 EnterExpressionEvaluationContext Unevaluated( 12697 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 12698 12699 ArrayRef<TemplateArgument> PackArgs; 12700 TemplateArgument ArgStorage; 12701 12702 // Find the argument list to transform. 12703 if (E->isPartiallySubstituted()) { 12704 PackArgs = E->getPartialArguments(); 12705 } else if (E->isValueDependent()) { 12706 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 12707 bool ShouldExpand = false; 12708 bool RetainExpansion = false; 12709 Optional<unsigned> NumExpansions; 12710 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 12711 Unexpanded, 12712 ShouldExpand, RetainExpansion, 12713 NumExpansions)) 12714 return ExprError(); 12715 12716 // If we need to expand the pack, build a template argument from it and 12717 // expand that. 12718 if (ShouldExpand) { 12719 auto *Pack = E->getPack(); 12720 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 12721 ArgStorage = getSema().Context.getPackExpansionType( 12722 getSema().Context.getTypeDeclType(TTPD), None); 12723 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 12724 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 12725 } else { 12726 auto *VD = cast<ValueDecl>(Pack); 12727 ExprResult DRE = getSema().BuildDeclRefExpr( 12728 VD, VD->getType().getNonLValueExprType(getSema().Context), 12729 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 12730 E->getPackLoc()); 12731 if (DRE.isInvalid()) 12732 return ExprError(); 12733 ArgStorage = new (getSema().Context) PackExpansionExpr( 12734 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 12735 } 12736 PackArgs = ArgStorage; 12737 } 12738 } 12739 12740 // If we're not expanding the pack, just transform the decl. 12741 if (!PackArgs.size()) { 12742 auto *Pack = cast_or_null<NamedDecl>( 12743 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 12744 if (!Pack) 12745 return ExprError(); 12746 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 12747 E->getPackLoc(), 12748 E->getRParenLoc(), None, None); 12749 } 12750 12751 // Try to compute the result without performing a partial substitution. 12752 Optional<unsigned> Result = 0; 12753 for (const TemplateArgument &Arg : PackArgs) { 12754 if (!Arg.isPackExpansion()) { 12755 Result = *Result + 1; 12756 continue; 12757 } 12758 12759 TemplateArgumentLoc ArgLoc; 12760 InventTemplateArgumentLoc(Arg, ArgLoc); 12761 12762 // Find the pattern of the pack expansion. 12763 SourceLocation Ellipsis; 12764 Optional<unsigned> OrigNumExpansions; 12765 TemplateArgumentLoc Pattern = 12766 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 12767 OrigNumExpansions); 12768 12769 // Substitute under the pack expansion. Do not expand the pack (yet). 12770 TemplateArgumentLoc OutPattern; 12771 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12772 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 12773 /*Uneval*/ true)) 12774 return true; 12775 12776 // See if we can determine the number of arguments from the result. 12777 Optional<unsigned> NumExpansions = 12778 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 12779 if (!NumExpansions) { 12780 // No: we must be in an alias template expansion, and we're going to need 12781 // to actually expand the packs. 12782 Result = None; 12783 break; 12784 } 12785 12786 Result = *Result + *NumExpansions; 12787 } 12788 12789 // Common case: we could determine the number of expansions without 12790 // substituting. 12791 if (Result) 12792 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12793 E->getPackLoc(), 12794 E->getRParenLoc(), *Result, None); 12795 12796 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 12797 E->getPackLoc()); 12798 { 12799 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 12800 typedef TemplateArgumentLocInventIterator< 12801 Derived, const TemplateArgument*> PackLocIterator; 12802 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 12803 PackLocIterator(*this, PackArgs.end()), 12804 TransformedPackArgs, /*Uneval*/true)) 12805 return ExprError(); 12806 } 12807 12808 // Check whether we managed to fully-expand the pack. 12809 // FIXME: Is it possible for us to do so and not hit the early exit path? 12810 SmallVector<TemplateArgument, 8> Args; 12811 bool PartialSubstitution = false; 12812 for (auto &Loc : TransformedPackArgs.arguments()) { 12813 Args.push_back(Loc.getArgument()); 12814 if (Loc.getArgument().isPackExpansion()) 12815 PartialSubstitution = true; 12816 } 12817 12818 if (PartialSubstitution) 12819 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12820 E->getPackLoc(), 12821 E->getRParenLoc(), None, Args); 12822 12823 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12824 E->getPackLoc(), E->getRParenLoc(), 12825 Args.size(), None); 12826 } 12827 12828 template<typename Derived> 12829 ExprResult 12830 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 12831 SubstNonTypeTemplateParmPackExpr *E) { 12832 // Default behavior is to do nothing with this transformation. 12833 return E; 12834 } 12835 12836 template<typename Derived> 12837 ExprResult 12838 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 12839 SubstNonTypeTemplateParmExpr *E) { 12840 // Default behavior is to do nothing with this transformation. 12841 return E; 12842 } 12843 12844 template<typename Derived> 12845 ExprResult 12846 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 12847 // Default behavior is to do nothing with this transformation. 12848 return E; 12849 } 12850 12851 template<typename Derived> 12852 ExprResult 12853 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 12854 MaterializeTemporaryExpr *E) { 12855 return getDerived().TransformExpr(E->getSubExpr()); 12856 } 12857 12858 template<typename Derived> 12859 ExprResult 12860 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 12861 Expr *Pattern = E->getPattern(); 12862 12863 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12864 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 12865 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 12866 12867 // Determine whether the set of unexpanded parameter packs can and should 12868 // be expanded. 12869 bool Expand = true; 12870 bool RetainExpansion = false; 12871 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 12872 NumExpansions = OrigNumExpansions; 12873 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 12874 Pattern->getSourceRange(), 12875 Unexpanded, 12876 Expand, RetainExpansion, 12877 NumExpansions)) 12878 return true; 12879 12880 if (!Expand) { 12881 // Do not expand any packs here, just transform and rebuild a fold 12882 // expression. 12883 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12884 12885 ExprResult LHS = 12886 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 12887 if (LHS.isInvalid()) 12888 return true; 12889 12890 ExprResult RHS = 12891 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 12892 if (RHS.isInvalid()) 12893 return true; 12894 12895 if (!getDerived().AlwaysRebuild() && 12896 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 12897 return E; 12898 12899 return getDerived().RebuildCXXFoldExpr( 12900 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 12901 RHS.get(), E->getEndLoc(), NumExpansions); 12902 } 12903 12904 // The transform has determined that we should perform an elementwise 12905 // expansion of the pattern. Do so. 12906 ExprResult Result = getDerived().TransformExpr(E->getInit()); 12907 if (Result.isInvalid()) 12908 return true; 12909 bool LeftFold = E->isLeftFold(); 12910 12911 // If we're retaining an expansion for a right fold, it is the innermost 12912 // component and takes the init (if any). 12913 if (!LeftFold && RetainExpansion) { 12914 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12915 12916 ExprResult Out = getDerived().TransformExpr(Pattern); 12917 if (Out.isInvalid()) 12918 return true; 12919 12920 Result = getDerived().RebuildCXXFoldExpr( 12921 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 12922 Result.get(), E->getEndLoc(), OrigNumExpansions); 12923 if (Result.isInvalid()) 12924 return true; 12925 } 12926 12927 for (unsigned I = 0; I != *NumExpansions; ++I) { 12928 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 12929 getSema(), LeftFold ? I : *NumExpansions - I - 1); 12930 ExprResult Out = getDerived().TransformExpr(Pattern); 12931 if (Out.isInvalid()) 12932 return true; 12933 12934 if (Out.get()->containsUnexpandedParameterPack()) { 12935 // We still have a pack; retain a pack expansion for this slice. 12936 Result = getDerived().RebuildCXXFoldExpr( 12937 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 12938 E->getOperator(), E->getEllipsisLoc(), 12939 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 12940 OrigNumExpansions); 12941 } else if (Result.isUsable()) { 12942 // We've got down to a single element; build a binary operator. 12943 Result = getDerived().RebuildBinaryOperator( 12944 E->getEllipsisLoc(), E->getOperator(), 12945 LeftFold ? Result.get() : Out.get(), 12946 LeftFold ? Out.get() : Result.get()); 12947 } else 12948 Result = Out; 12949 12950 if (Result.isInvalid()) 12951 return true; 12952 } 12953 12954 // If we're retaining an expansion for a left fold, it is the outermost 12955 // component and takes the complete expansion so far as its init (if any). 12956 if (LeftFold && RetainExpansion) { 12957 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12958 12959 ExprResult Out = getDerived().TransformExpr(Pattern); 12960 if (Out.isInvalid()) 12961 return true; 12962 12963 Result = getDerived().RebuildCXXFoldExpr( 12964 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 12965 Out.get(), E->getEndLoc(), OrigNumExpansions); 12966 if (Result.isInvalid()) 12967 return true; 12968 } 12969 12970 // If we had no init and an empty pack, and we're not retaining an expansion, 12971 // then produce a fallback value or error. 12972 if (Result.isUnset()) 12973 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 12974 E->getOperator()); 12975 12976 return Result; 12977 } 12978 12979 template<typename Derived> 12980 ExprResult 12981 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 12982 CXXStdInitializerListExpr *E) { 12983 return getDerived().TransformExpr(E->getSubExpr()); 12984 } 12985 12986 template<typename Derived> 12987 ExprResult 12988 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 12989 return SemaRef.MaybeBindToTemporary(E); 12990 } 12991 12992 template<typename Derived> 12993 ExprResult 12994 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 12995 return E; 12996 } 12997 12998 template<typename Derived> 12999 ExprResult 13000 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13001 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13002 if (SubExpr.isInvalid()) 13003 return ExprError(); 13004 13005 if (!getDerived().AlwaysRebuild() && 13006 SubExpr.get() == E->getSubExpr()) 13007 return E; 13008 13009 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13010 } 13011 13012 template<typename Derived> 13013 ExprResult 13014 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13015 // Transform each of the elements. 13016 SmallVector<Expr *, 8> Elements; 13017 bool ArgChanged = false; 13018 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13019 /*IsCall=*/false, Elements, &ArgChanged)) 13020 return ExprError(); 13021 13022 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13023 return SemaRef.MaybeBindToTemporary(E); 13024 13025 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13026 Elements.data(), 13027 Elements.size()); 13028 } 13029 13030 template<typename Derived> 13031 ExprResult 13032 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13033 ObjCDictionaryLiteral *E) { 13034 // Transform each of the elements. 13035 SmallVector<ObjCDictionaryElement, 8> Elements; 13036 bool ArgChanged = false; 13037 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13038 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13039 13040 if (OrigElement.isPackExpansion()) { 13041 // This key/value element is a pack expansion. 13042 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13043 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13044 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13045 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13046 13047 // Determine whether the set of unexpanded parameter packs can 13048 // and should be expanded. 13049 bool Expand = true; 13050 bool RetainExpansion = false; 13051 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13052 Optional<unsigned> NumExpansions = OrigNumExpansions; 13053 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13054 OrigElement.Value->getEndLoc()); 13055 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13056 PatternRange, Unexpanded, Expand, 13057 RetainExpansion, NumExpansions)) 13058 return ExprError(); 13059 13060 if (!Expand) { 13061 // The transform has determined that we should perform a simple 13062 // transformation on the pack expansion, producing another pack 13063 // expansion. 13064 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13065 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13066 if (Key.isInvalid()) 13067 return ExprError(); 13068 13069 if (Key.get() != OrigElement.Key) 13070 ArgChanged = true; 13071 13072 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13073 if (Value.isInvalid()) 13074 return ExprError(); 13075 13076 if (Value.get() != OrigElement.Value) 13077 ArgChanged = true; 13078 13079 ObjCDictionaryElement Expansion = { 13080 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13081 }; 13082 Elements.push_back(Expansion); 13083 continue; 13084 } 13085 13086 // Record right away that the argument was changed. This needs 13087 // to happen even if the array expands to nothing. 13088 ArgChanged = true; 13089 13090 // The transform has determined that we should perform an elementwise 13091 // expansion of the pattern. Do so. 13092 for (unsigned I = 0; I != *NumExpansions; ++I) { 13093 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13094 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13095 if (Key.isInvalid()) 13096 return ExprError(); 13097 13098 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13099 if (Value.isInvalid()) 13100 return ExprError(); 13101 13102 ObjCDictionaryElement Element = { 13103 Key.get(), Value.get(), SourceLocation(), NumExpansions 13104 }; 13105 13106 // If any unexpanded parameter packs remain, we still have a 13107 // pack expansion. 13108 // FIXME: Can this really happen? 13109 if (Key.get()->containsUnexpandedParameterPack() || 13110 Value.get()->containsUnexpandedParameterPack()) 13111 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13112 13113 Elements.push_back(Element); 13114 } 13115 13116 // FIXME: Retain a pack expansion if RetainExpansion is true. 13117 13118 // We've finished with this pack expansion. 13119 continue; 13120 } 13121 13122 // Transform and check key. 13123 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13124 if (Key.isInvalid()) 13125 return ExprError(); 13126 13127 if (Key.get() != OrigElement.Key) 13128 ArgChanged = true; 13129 13130 // Transform and check value. 13131 ExprResult Value 13132 = getDerived().TransformExpr(OrigElement.Value); 13133 if (Value.isInvalid()) 13134 return ExprError(); 13135 13136 if (Value.get() != OrigElement.Value) 13137 ArgChanged = true; 13138 13139 ObjCDictionaryElement Element = { 13140 Key.get(), Value.get(), SourceLocation(), None 13141 }; 13142 Elements.push_back(Element); 13143 } 13144 13145 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13146 return SemaRef.MaybeBindToTemporary(E); 13147 13148 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13149 Elements); 13150 } 13151 13152 template<typename Derived> 13153 ExprResult 13154 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13155 TypeSourceInfo *EncodedTypeInfo 13156 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13157 if (!EncodedTypeInfo) 13158 return ExprError(); 13159 13160 if (!getDerived().AlwaysRebuild() && 13161 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13162 return E; 13163 13164 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13165 EncodedTypeInfo, 13166 E->getRParenLoc()); 13167 } 13168 13169 template<typename Derived> 13170 ExprResult TreeTransform<Derived>:: 13171 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13172 // This is a kind of implicit conversion, and it needs to get dropped 13173 // and recomputed for the same general reasons that ImplicitCastExprs 13174 // do, as well a more specific one: this expression is only valid when 13175 // it appears *immediately* as an argument expression. 13176 return getDerived().TransformExpr(E->getSubExpr()); 13177 } 13178 13179 template<typename Derived> 13180 ExprResult TreeTransform<Derived>:: 13181 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13182 TypeSourceInfo *TSInfo 13183 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13184 if (!TSInfo) 13185 return ExprError(); 13186 13187 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13188 if (Result.isInvalid()) 13189 return ExprError(); 13190 13191 if (!getDerived().AlwaysRebuild() && 13192 TSInfo == E->getTypeInfoAsWritten() && 13193 Result.get() == E->getSubExpr()) 13194 return E; 13195 13196 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13197 E->getBridgeKeywordLoc(), TSInfo, 13198 Result.get()); 13199 } 13200 13201 template <typename Derived> 13202 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13203 ObjCAvailabilityCheckExpr *E) { 13204 return E; 13205 } 13206 13207 template<typename Derived> 13208 ExprResult 13209 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13210 // Transform arguments. 13211 bool ArgChanged = false; 13212 SmallVector<Expr*, 8> Args; 13213 Args.reserve(E->getNumArgs()); 13214 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13215 &ArgChanged)) 13216 return ExprError(); 13217 13218 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13219 // Class message: transform the receiver type. 13220 TypeSourceInfo *ReceiverTypeInfo 13221 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13222 if (!ReceiverTypeInfo) 13223 return ExprError(); 13224 13225 // If nothing changed, just retain the existing message send. 13226 if (!getDerived().AlwaysRebuild() && 13227 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13228 return SemaRef.MaybeBindToTemporary(E); 13229 13230 // Build a new class message send. 13231 SmallVector<SourceLocation, 16> SelLocs; 13232 E->getSelectorLocs(SelLocs); 13233 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13234 E->getSelector(), 13235 SelLocs, 13236 E->getMethodDecl(), 13237 E->getLeftLoc(), 13238 Args, 13239 E->getRightLoc()); 13240 } 13241 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13242 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13243 if (!E->getMethodDecl()) 13244 return ExprError(); 13245 13246 // Build a new class message send to 'super'. 13247 SmallVector<SourceLocation, 16> SelLocs; 13248 E->getSelectorLocs(SelLocs); 13249 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13250 E->getSelector(), 13251 SelLocs, 13252 E->getReceiverType(), 13253 E->getMethodDecl(), 13254 E->getLeftLoc(), 13255 Args, 13256 E->getRightLoc()); 13257 } 13258 13259 // Instance message: transform the receiver 13260 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13261 "Only class and instance messages may be instantiated"); 13262 ExprResult Receiver 13263 = getDerived().TransformExpr(E->getInstanceReceiver()); 13264 if (Receiver.isInvalid()) 13265 return ExprError(); 13266 13267 // If nothing changed, just retain the existing message send. 13268 if (!getDerived().AlwaysRebuild() && 13269 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13270 return SemaRef.MaybeBindToTemporary(E); 13271 13272 // Build a new instance message send. 13273 SmallVector<SourceLocation, 16> SelLocs; 13274 E->getSelectorLocs(SelLocs); 13275 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13276 E->getSelector(), 13277 SelLocs, 13278 E->getMethodDecl(), 13279 E->getLeftLoc(), 13280 Args, 13281 E->getRightLoc()); 13282 } 13283 13284 template<typename Derived> 13285 ExprResult 13286 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13287 return E; 13288 } 13289 13290 template<typename Derived> 13291 ExprResult 13292 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13293 return E; 13294 } 13295 13296 template<typename Derived> 13297 ExprResult 13298 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13299 // Transform the base expression. 13300 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13301 if (Base.isInvalid()) 13302 return ExprError(); 13303 13304 // We don't need to transform the ivar; it will never change. 13305 13306 // If nothing changed, just retain the existing expression. 13307 if (!getDerived().AlwaysRebuild() && 13308 Base.get() == E->getBase()) 13309 return E; 13310 13311 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13312 E->getLocation(), 13313 E->isArrow(), E->isFreeIvar()); 13314 } 13315 13316 template<typename Derived> 13317 ExprResult 13318 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13319 // 'super' and types never change. Property never changes. Just 13320 // retain the existing expression. 13321 if (!E->isObjectReceiver()) 13322 return E; 13323 13324 // Transform the base expression. 13325 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13326 if (Base.isInvalid()) 13327 return ExprError(); 13328 13329 // We don't need to transform the property; it will never change. 13330 13331 // If nothing changed, just retain the existing expression. 13332 if (!getDerived().AlwaysRebuild() && 13333 Base.get() == E->getBase()) 13334 return E; 13335 13336 if (E->isExplicitProperty()) 13337 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13338 E->getExplicitProperty(), 13339 E->getLocation()); 13340 13341 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13342 SemaRef.Context.PseudoObjectTy, 13343 E->getImplicitPropertyGetter(), 13344 E->getImplicitPropertySetter(), 13345 E->getLocation()); 13346 } 13347 13348 template<typename Derived> 13349 ExprResult 13350 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13351 // Transform the base expression. 13352 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13353 if (Base.isInvalid()) 13354 return ExprError(); 13355 13356 // Transform the key expression. 13357 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13358 if (Key.isInvalid()) 13359 return ExprError(); 13360 13361 // If nothing changed, just retain the existing expression. 13362 if (!getDerived().AlwaysRebuild() && 13363 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13364 return E; 13365 13366 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13367 Base.get(), Key.get(), 13368 E->getAtIndexMethodDecl(), 13369 E->setAtIndexMethodDecl()); 13370 } 13371 13372 template<typename Derived> 13373 ExprResult 13374 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13375 // Transform the base expression. 13376 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13377 if (Base.isInvalid()) 13378 return ExprError(); 13379 13380 // If nothing changed, just retain the existing expression. 13381 if (!getDerived().AlwaysRebuild() && 13382 Base.get() == E->getBase()) 13383 return E; 13384 13385 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13386 E->getOpLoc(), 13387 E->isArrow()); 13388 } 13389 13390 template<typename Derived> 13391 ExprResult 13392 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13393 bool ArgumentChanged = false; 13394 SmallVector<Expr*, 8> SubExprs; 13395 SubExprs.reserve(E->getNumSubExprs()); 13396 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13397 SubExprs, &ArgumentChanged)) 13398 return ExprError(); 13399 13400 if (!getDerived().AlwaysRebuild() && 13401 !ArgumentChanged) 13402 return E; 13403 13404 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13405 SubExprs, 13406 E->getRParenLoc()); 13407 } 13408 13409 template<typename Derived> 13410 ExprResult 13411 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13412 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13413 if (SrcExpr.isInvalid()) 13414 return ExprError(); 13415 13416 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13417 if (!Type) 13418 return ExprError(); 13419 13420 if (!getDerived().AlwaysRebuild() && 13421 Type == E->getTypeSourceInfo() && 13422 SrcExpr.get() == E->getSrcExpr()) 13423 return E; 13424 13425 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13426 SrcExpr.get(), Type, 13427 E->getRParenLoc()); 13428 } 13429 13430 template<typename Derived> 13431 ExprResult 13432 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13433 BlockDecl *oldBlock = E->getBlockDecl(); 13434 13435 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13436 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13437 13438 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13439 blockScope->TheDecl->setBlockMissingReturnType( 13440 oldBlock->blockMissingReturnType()); 13441 13442 SmallVector<ParmVarDecl*, 4> params; 13443 SmallVector<QualType, 4> paramTypes; 13444 13445 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13446 13447 // Parameter substitution. 13448 Sema::ExtParameterInfoBuilder extParamInfos; 13449 if (getDerived().TransformFunctionTypeParams( 13450 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13451 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13452 extParamInfos)) { 13453 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13454 return ExprError(); 13455 } 13456 13457 QualType exprResultType = 13458 getDerived().TransformType(exprFunctionType->getReturnType()); 13459 13460 auto epi = exprFunctionType->getExtProtoInfo(); 13461 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13462 13463 QualType functionType = 13464 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13465 blockScope->FunctionType = functionType; 13466 13467 // Set the parameters on the block decl. 13468 if (!params.empty()) 13469 blockScope->TheDecl->setParams(params); 13470 13471 if (!oldBlock->blockMissingReturnType()) { 13472 blockScope->HasImplicitReturnType = false; 13473 blockScope->ReturnType = exprResultType; 13474 } 13475 13476 // Transform the body 13477 StmtResult body = getDerived().TransformStmt(E->getBody()); 13478 if (body.isInvalid()) { 13479 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13480 return ExprError(); 13481 } 13482 13483 #ifndef NDEBUG 13484 // In builds with assertions, make sure that we captured everything we 13485 // captured before. 13486 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13487 for (const auto &I : oldBlock->captures()) { 13488 VarDecl *oldCapture = I.getVariable(); 13489 13490 // Ignore parameter packs. 13491 if (oldCapture->isParameterPack()) 13492 continue; 13493 13494 VarDecl *newCapture = 13495 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13496 oldCapture)); 13497 assert(blockScope->CaptureMap.count(newCapture)); 13498 } 13499 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13500 } 13501 #endif 13502 13503 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13504 /*Scope=*/nullptr); 13505 } 13506 13507 template<typename Derived> 13508 ExprResult 13509 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13510 llvm_unreachable("Cannot transform asType expressions yet"); 13511 } 13512 13513 template<typename Derived> 13514 ExprResult 13515 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13516 bool ArgumentChanged = false; 13517 SmallVector<Expr*, 8> SubExprs; 13518 SubExprs.reserve(E->getNumSubExprs()); 13519 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13520 SubExprs, &ArgumentChanged)) 13521 return ExprError(); 13522 13523 if (!getDerived().AlwaysRebuild() && 13524 !ArgumentChanged) 13525 return E; 13526 13527 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13528 E->getOp(), E->getRParenLoc()); 13529 } 13530 13531 //===----------------------------------------------------------------------===// 13532 // Type reconstruction 13533 //===----------------------------------------------------------------------===// 13534 13535 template<typename Derived> 13536 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 13537 SourceLocation Star) { 13538 return SemaRef.BuildPointerType(PointeeType, Star, 13539 getDerived().getBaseEntity()); 13540 } 13541 13542 template<typename Derived> 13543 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 13544 SourceLocation Star) { 13545 return SemaRef.BuildBlockPointerType(PointeeType, Star, 13546 getDerived().getBaseEntity()); 13547 } 13548 13549 template<typename Derived> 13550 QualType 13551 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 13552 bool WrittenAsLValue, 13553 SourceLocation Sigil) { 13554 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 13555 Sigil, getDerived().getBaseEntity()); 13556 } 13557 13558 template<typename Derived> 13559 QualType 13560 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 13561 QualType ClassType, 13562 SourceLocation Sigil) { 13563 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 13564 getDerived().getBaseEntity()); 13565 } 13566 13567 template<typename Derived> 13568 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 13569 const ObjCTypeParamDecl *Decl, 13570 SourceLocation ProtocolLAngleLoc, 13571 ArrayRef<ObjCProtocolDecl *> Protocols, 13572 ArrayRef<SourceLocation> ProtocolLocs, 13573 SourceLocation ProtocolRAngleLoc) { 13574 return SemaRef.BuildObjCTypeParamType(Decl, 13575 ProtocolLAngleLoc, Protocols, 13576 ProtocolLocs, ProtocolRAngleLoc, 13577 /*FailOnError=*/true); 13578 } 13579 13580 template<typename Derived> 13581 QualType TreeTransform<Derived>::RebuildObjCObjectType( 13582 QualType BaseType, 13583 SourceLocation Loc, 13584 SourceLocation TypeArgsLAngleLoc, 13585 ArrayRef<TypeSourceInfo *> TypeArgs, 13586 SourceLocation TypeArgsRAngleLoc, 13587 SourceLocation ProtocolLAngleLoc, 13588 ArrayRef<ObjCProtocolDecl *> Protocols, 13589 ArrayRef<SourceLocation> ProtocolLocs, 13590 SourceLocation ProtocolRAngleLoc) { 13591 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 13592 TypeArgs, TypeArgsRAngleLoc, 13593 ProtocolLAngleLoc, Protocols, ProtocolLocs, 13594 ProtocolRAngleLoc, 13595 /*FailOnError=*/true); 13596 } 13597 13598 template<typename Derived> 13599 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 13600 QualType PointeeType, 13601 SourceLocation Star) { 13602 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 13603 } 13604 13605 template<typename Derived> 13606 QualType 13607 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 13608 ArrayType::ArraySizeModifier SizeMod, 13609 const llvm::APInt *Size, 13610 Expr *SizeExpr, 13611 unsigned IndexTypeQuals, 13612 SourceRange BracketsRange) { 13613 if (SizeExpr || !Size) 13614 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 13615 IndexTypeQuals, BracketsRange, 13616 getDerived().getBaseEntity()); 13617 13618 QualType Types[] = { 13619 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 13620 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 13621 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 13622 }; 13623 const unsigned NumTypes = llvm::array_lengthof(Types); 13624 QualType SizeType; 13625 for (unsigned I = 0; I != NumTypes; ++I) 13626 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 13627 SizeType = Types[I]; 13628 break; 13629 } 13630 13631 // Note that we can return a VariableArrayType here in the case where 13632 // the element type was a dependent VariableArrayType. 13633 IntegerLiteral *ArraySize 13634 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 13635 /*FIXME*/BracketsRange.getBegin()); 13636 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 13637 IndexTypeQuals, BracketsRange, 13638 getDerived().getBaseEntity()); 13639 } 13640 13641 template<typename Derived> 13642 QualType 13643 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 13644 ArrayType::ArraySizeModifier SizeMod, 13645 const llvm::APInt &Size, 13646 Expr *SizeExpr, 13647 unsigned IndexTypeQuals, 13648 SourceRange BracketsRange) { 13649 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 13650 IndexTypeQuals, BracketsRange); 13651 } 13652 13653 template<typename Derived> 13654 QualType 13655 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 13656 ArrayType::ArraySizeModifier SizeMod, 13657 unsigned IndexTypeQuals, 13658 SourceRange BracketsRange) { 13659 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 13660 IndexTypeQuals, BracketsRange); 13661 } 13662 13663 template<typename Derived> 13664 QualType 13665 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 13666 ArrayType::ArraySizeModifier SizeMod, 13667 Expr *SizeExpr, 13668 unsigned IndexTypeQuals, 13669 SourceRange BracketsRange) { 13670 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13671 SizeExpr, 13672 IndexTypeQuals, BracketsRange); 13673 } 13674 13675 template<typename Derived> 13676 QualType 13677 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 13678 ArrayType::ArraySizeModifier SizeMod, 13679 Expr *SizeExpr, 13680 unsigned IndexTypeQuals, 13681 SourceRange BracketsRange) { 13682 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13683 SizeExpr, 13684 IndexTypeQuals, BracketsRange); 13685 } 13686 13687 template <typename Derived> 13688 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 13689 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 13690 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 13691 AttributeLoc); 13692 } 13693 13694 template <typename Derived> 13695 QualType 13696 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 13697 unsigned NumElements, 13698 VectorType::VectorKind VecKind) { 13699 // FIXME: semantic checking! 13700 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 13701 } 13702 13703 template <typename Derived> 13704 QualType TreeTransform<Derived>::RebuildDependentVectorType( 13705 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 13706 VectorType::VectorKind VecKind) { 13707 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 13708 } 13709 13710 template<typename Derived> 13711 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 13712 unsigned NumElements, 13713 SourceLocation AttributeLoc) { 13714 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 13715 NumElements, true); 13716 IntegerLiteral *VectorSize 13717 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 13718 AttributeLoc); 13719 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 13720 } 13721 13722 template<typename Derived> 13723 QualType 13724 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 13725 Expr *SizeExpr, 13726 SourceLocation AttributeLoc) { 13727 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 13728 } 13729 13730 template<typename Derived> 13731 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 13732 QualType T, 13733 MutableArrayRef<QualType> ParamTypes, 13734 const FunctionProtoType::ExtProtoInfo &EPI) { 13735 return SemaRef.BuildFunctionType(T, ParamTypes, 13736 getDerived().getBaseLocation(), 13737 getDerived().getBaseEntity(), 13738 EPI); 13739 } 13740 13741 template<typename Derived> 13742 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 13743 return SemaRef.Context.getFunctionNoProtoType(T); 13744 } 13745 13746 template<typename Derived> 13747 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 13748 Decl *D) { 13749 assert(D && "no decl found"); 13750 if (D->isInvalidDecl()) return QualType(); 13751 13752 // FIXME: Doesn't account for ObjCInterfaceDecl! 13753 TypeDecl *Ty; 13754 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 13755 // A valid resolved using typename pack expansion decl can have multiple 13756 // UsingDecls, but they must each have exactly one type, and it must be 13757 // the same type in every case. But we must have at least one expansion! 13758 if (UPD->expansions().empty()) { 13759 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 13760 << UPD->isCXXClassMember() << UPD; 13761 return QualType(); 13762 } 13763 13764 // We might still have some unresolved types. Try to pick a resolved type 13765 // if we can. The final instantiation will check that the remaining 13766 // unresolved types instantiate to the type we pick. 13767 QualType FallbackT; 13768 QualType T; 13769 for (auto *E : UPD->expansions()) { 13770 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 13771 if (ThisT.isNull()) 13772 continue; 13773 else if (ThisT->getAs<UnresolvedUsingType>()) 13774 FallbackT = ThisT; 13775 else if (T.isNull()) 13776 T = ThisT; 13777 else 13778 assert(getSema().Context.hasSameType(ThisT, T) && 13779 "mismatched resolved types in using pack expansion"); 13780 } 13781 return T.isNull() ? FallbackT : T; 13782 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 13783 assert(Using->hasTypename() && 13784 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 13785 13786 // A valid resolved using typename decl points to exactly one type decl. 13787 assert(++Using->shadow_begin() == Using->shadow_end()); 13788 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 13789 } else { 13790 assert(isa<UnresolvedUsingTypenameDecl>(D) && 13791 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 13792 Ty = cast<UnresolvedUsingTypenameDecl>(D); 13793 } 13794 13795 return SemaRef.Context.getTypeDeclType(Ty); 13796 } 13797 13798 template<typename Derived> 13799 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 13800 SourceLocation Loc) { 13801 return SemaRef.BuildTypeofExprType(E, Loc); 13802 } 13803 13804 template<typename Derived> 13805 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 13806 return SemaRef.Context.getTypeOfType(Underlying); 13807 } 13808 13809 template<typename Derived> 13810 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 13811 SourceLocation Loc) { 13812 return SemaRef.BuildDecltypeType(E, Loc); 13813 } 13814 13815 template<typename Derived> 13816 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 13817 UnaryTransformType::UTTKind UKind, 13818 SourceLocation Loc) { 13819 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 13820 } 13821 13822 template<typename Derived> 13823 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 13824 TemplateName Template, 13825 SourceLocation TemplateNameLoc, 13826 TemplateArgumentListInfo &TemplateArgs) { 13827 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 13828 } 13829 13830 template<typename Derived> 13831 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 13832 SourceLocation KWLoc) { 13833 return SemaRef.BuildAtomicType(ValueType, KWLoc); 13834 } 13835 13836 template<typename Derived> 13837 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 13838 SourceLocation KWLoc, 13839 bool isReadPipe) { 13840 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 13841 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 13842 } 13843 13844 template <typename Derived> 13845 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 13846 unsigned NumBits, 13847 SourceLocation Loc) { 13848 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 13849 NumBits, true); 13850 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 13851 SemaRef.Context.IntTy, Loc); 13852 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 13853 } 13854 13855 template <typename Derived> 13856 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 13857 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 13858 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 13859 } 13860 13861 template<typename Derived> 13862 TemplateName 13863 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13864 bool TemplateKW, 13865 TemplateDecl *Template) { 13866 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 13867 Template); 13868 } 13869 13870 template<typename Derived> 13871 TemplateName 13872 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13873 SourceLocation TemplateKWLoc, 13874 const IdentifierInfo &Name, 13875 SourceLocation NameLoc, 13876 QualType ObjectType, 13877 NamedDecl *FirstQualifierInScope, 13878 bool AllowInjectedClassName) { 13879 UnqualifiedId TemplateName; 13880 TemplateName.setIdentifier(&Name, NameLoc); 13881 Sema::TemplateTy Template; 13882 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 13883 TemplateName, ParsedType::make(ObjectType), 13884 /*EnteringContext=*/false, Template, 13885 AllowInjectedClassName); 13886 return Template.get(); 13887 } 13888 13889 template<typename Derived> 13890 TemplateName 13891 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13892 SourceLocation TemplateKWLoc, 13893 OverloadedOperatorKind Operator, 13894 SourceLocation NameLoc, 13895 QualType ObjectType, 13896 bool AllowInjectedClassName) { 13897 UnqualifiedId Name; 13898 // FIXME: Bogus location information. 13899 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 13900 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 13901 Sema::TemplateTy Template; 13902 getSema().ActOnTemplateName( 13903 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 13904 /*EnteringContext=*/false, Template, AllowInjectedClassName); 13905 return Template.get(); 13906 } 13907 13908 template<typename Derived> 13909 ExprResult 13910 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 13911 SourceLocation OpLoc, 13912 Expr *OrigCallee, 13913 Expr *First, 13914 Expr *Second) { 13915 Expr *Callee = OrigCallee->IgnoreParenCasts(); 13916 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 13917 13918 if (First->getObjectKind() == OK_ObjCProperty) { 13919 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13920 if (BinaryOperator::isAssignmentOp(Opc)) 13921 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 13922 First, Second); 13923 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 13924 if (Result.isInvalid()) 13925 return ExprError(); 13926 First = Result.get(); 13927 } 13928 13929 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 13930 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 13931 if (Result.isInvalid()) 13932 return ExprError(); 13933 Second = Result.get(); 13934 } 13935 13936 // Determine whether this should be a builtin operation. 13937 if (Op == OO_Subscript) { 13938 if (!First->getType()->isOverloadableType() && 13939 !Second->getType()->isOverloadableType()) 13940 return getSema().CreateBuiltinArraySubscriptExpr( 13941 First, Callee->getBeginLoc(), Second, OpLoc); 13942 } else if (Op == OO_Arrow) { 13943 // -> is never a builtin operation. 13944 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 13945 } else if (Second == nullptr || isPostIncDec) { 13946 if (!First->getType()->isOverloadableType() || 13947 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 13948 // The argument is not of overloadable type, or this is an expression 13949 // of the form &Class::member, so try to create a built-in unary 13950 // operation. 13951 UnaryOperatorKind Opc 13952 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 13953 13954 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 13955 } 13956 } else { 13957 if (!First->getType()->isOverloadableType() && 13958 !Second->getType()->isOverloadableType()) { 13959 // Neither of the arguments is an overloadable type, so try to 13960 // create a built-in binary operation. 13961 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13962 ExprResult Result 13963 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 13964 if (Result.isInvalid()) 13965 return ExprError(); 13966 13967 return Result; 13968 } 13969 } 13970 13971 // Compute the transformed set of functions (and function templates) to be 13972 // used during overload resolution. 13973 UnresolvedSet<16> Functions; 13974 bool RequiresADL; 13975 13976 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 13977 Functions.append(ULE->decls_begin(), ULE->decls_end()); 13978 // If the overload could not be resolved in the template definition 13979 // (because we had a dependent argument), ADL is performed as part of 13980 // template instantiation. 13981 RequiresADL = ULE->requiresADL(); 13982 } else { 13983 // If we've resolved this to a particular non-member function, just call 13984 // that function. If we resolved it to a member function, 13985 // CreateOverloaded* will find that function for us. 13986 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 13987 if (!isa<CXXMethodDecl>(ND)) 13988 Functions.addDecl(ND); 13989 RequiresADL = false; 13990 } 13991 13992 // Add any functions found via argument-dependent lookup. 13993 Expr *Args[2] = { First, Second }; 13994 unsigned NumArgs = 1 + (Second != nullptr); 13995 13996 // Create the overloaded operator invocation for unary operators. 13997 if (NumArgs == 1 || isPostIncDec) { 13998 UnaryOperatorKind Opc 13999 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14000 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14001 RequiresADL); 14002 } 14003 14004 if (Op == OO_Subscript) { 14005 SourceLocation LBrace; 14006 SourceLocation RBrace; 14007 14008 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14009 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14010 LBrace = SourceLocation::getFromRawEncoding( 14011 NameLoc.CXXOperatorName.BeginOpNameLoc); 14012 RBrace = SourceLocation::getFromRawEncoding( 14013 NameLoc.CXXOperatorName.EndOpNameLoc); 14014 } else { 14015 LBrace = Callee->getBeginLoc(); 14016 RBrace = OpLoc; 14017 } 14018 14019 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14020 First, Second); 14021 } 14022 14023 // Create the overloaded operator invocation for binary operators. 14024 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14025 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14026 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14027 if (Result.isInvalid()) 14028 return ExprError(); 14029 14030 return Result; 14031 } 14032 14033 template<typename Derived> 14034 ExprResult 14035 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14036 SourceLocation OperatorLoc, 14037 bool isArrow, 14038 CXXScopeSpec &SS, 14039 TypeSourceInfo *ScopeType, 14040 SourceLocation CCLoc, 14041 SourceLocation TildeLoc, 14042 PseudoDestructorTypeStorage Destroyed) { 14043 QualType BaseType = Base->getType(); 14044 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14045 (!isArrow && !BaseType->getAs<RecordType>()) || 14046 (isArrow && BaseType->getAs<PointerType>() && 14047 !BaseType->castAs<PointerType>()->getPointeeType() 14048 ->template getAs<RecordType>())){ 14049 // This pseudo-destructor expression is still a pseudo-destructor. 14050 return SemaRef.BuildPseudoDestructorExpr( 14051 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14052 CCLoc, TildeLoc, Destroyed); 14053 } 14054 14055 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14056 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14057 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14058 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14059 NameInfo.setNamedTypeInfo(DestroyedType); 14060 14061 // The scope type is now known to be a valid nested name specifier 14062 // component. Tack it on to the end of the nested name specifier. 14063 if (ScopeType) { 14064 if (!ScopeType->getType()->getAs<TagType>()) { 14065 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14066 diag::err_expected_class_or_namespace) 14067 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14068 return ExprError(); 14069 } 14070 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14071 CCLoc); 14072 } 14073 14074 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14075 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14076 OperatorLoc, isArrow, 14077 SS, TemplateKWLoc, 14078 /*FIXME: FirstQualifier*/ nullptr, 14079 NameInfo, 14080 /*TemplateArgs*/ nullptr, 14081 /*S*/nullptr); 14082 } 14083 14084 template<typename Derived> 14085 StmtResult 14086 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14087 SourceLocation Loc = S->getBeginLoc(); 14088 CapturedDecl *CD = S->getCapturedDecl(); 14089 unsigned NumParams = CD->getNumParams(); 14090 unsigned ContextParamPos = CD->getContextParamPosition(); 14091 SmallVector<Sema::CapturedParamNameType, 4> Params; 14092 for (unsigned I = 0; I < NumParams; ++I) { 14093 if (I != ContextParamPos) { 14094 Params.push_back( 14095 std::make_pair( 14096 CD->getParam(I)->getName(), 14097 getDerived().TransformType(CD->getParam(I)->getType()))); 14098 } else { 14099 Params.push_back(std::make_pair(StringRef(), QualType())); 14100 } 14101 } 14102 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14103 S->getCapturedRegionKind(), Params); 14104 StmtResult Body; 14105 { 14106 Sema::CompoundScopeRAII CompoundScope(getSema()); 14107 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14108 } 14109 14110 if (Body.isInvalid()) { 14111 getSema().ActOnCapturedRegionError(); 14112 return StmtError(); 14113 } 14114 14115 return getSema().ActOnCapturedRegionEnd(Body.get()); 14116 } 14117 14118 } // end namespace clang 14119 14120 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14121