1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 17 #include "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprConcepts.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/OpenMPClause.h" 27 #include "clang/AST/Stmt.h" 28 #include "clang/AST/StmtCXX.h" 29 #include "clang/AST/StmtObjC.h" 30 #include "clang/AST/StmtOpenMP.h" 31 #include "clang/Basic/DiagnosticParse.h" 32 #include "clang/Basic/OpenMPKinds.h" 33 #include "clang/Sema/Designator.h" 34 #include "clang/Sema/Lookup.h" 35 #include "clang/Sema/Ownership.h" 36 #include "clang/Sema/ParsedTemplate.h" 37 #include "clang/Sema/ScopeInfo.h" 38 #include "clang/Sema/SemaDiagnostic.h" 39 #include "clang/Sema/SemaInternal.h" 40 #include "llvm/ADT/ArrayRef.h" 41 #include "llvm/Support/ErrorHandling.h" 42 #include <algorithm> 43 44 using namespace llvm::omp; 45 46 namespace clang { 47 using namespace sema; 48 49 /// A semantic tree transformation that allows one to transform one 50 /// abstract syntax tree into another. 51 /// 52 /// A new tree transformation is defined by creating a new subclass \c X of 53 /// \c TreeTransform<X> and then overriding certain operations to provide 54 /// behavior specific to that transformation. For example, template 55 /// instantiation is implemented as a tree transformation where the 56 /// transformation of TemplateTypeParmType nodes involves substituting the 57 /// template arguments for their corresponding template parameters; a similar 58 /// transformation is performed for non-type template parameters and 59 /// template template parameters. 60 /// 61 /// This tree-transformation template uses static polymorphism to allow 62 /// subclasses to customize any of its operations. Thus, a subclass can 63 /// override any of the transformation or rebuild operators by providing an 64 /// operation with the same signature as the default implementation. The 65 /// overriding function should not be virtual. 66 /// 67 /// Semantic tree transformations are split into two stages, either of which 68 /// can be replaced by a subclass. The "transform" step transforms an AST node 69 /// or the parts of an AST node using the various transformation functions, 70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 71 /// node of the appropriate kind from the pieces. The default transformation 72 /// routines recursively transform the operands to composite AST nodes (e.g., 73 /// the pointee type of a PointerType node) and, if any of those operand nodes 74 /// were changed by the transformation, invokes the rebuild operation to create 75 /// a new AST node. 76 /// 77 /// Subclasses can customize the transformation at various levels. The 78 /// most coarse-grained transformations involve replacing TransformType(), 79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 81 /// new implementations. 82 /// 83 /// For more fine-grained transformations, subclasses can replace any of the 84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 86 /// replacing TransformTemplateTypeParmType() allows template instantiation 87 /// to substitute template arguments for their corresponding template 88 /// parameters. Additionally, subclasses can override the \c RebuildXXX 89 /// functions to control how AST nodes are rebuilt when their operands change. 90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 92 /// be able to use more efficient rebuild steps. 93 /// 94 /// There are a handful of other functions that can be overridden, allowing one 95 /// to avoid traversing nodes that don't need any transformation 96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 97 /// operands have not changed (\c AlwaysRebuild()), and customize the 98 /// default locations and entity names used for type-checking 99 /// (\c getBaseLocation(), \c getBaseEntity()). 100 template<typename Derived> 101 class TreeTransform { 102 /// Private RAII object that helps us forget and then re-remember 103 /// the template argument corresponding to a partially-substituted parameter 104 /// pack. 105 class ForgetPartiallySubstitutedPackRAII { 106 Derived &Self; 107 TemplateArgument Old; 108 109 public: 110 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 111 Old = Self.ForgetPartiallySubstitutedPack(); 112 } 113 114 ~ForgetPartiallySubstitutedPackRAII() { 115 Self.RememberPartiallySubstitutedPack(Old); 116 } 117 }; 118 119 protected: 120 Sema &SemaRef; 121 122 /// The set of local declarations that have been transformed, for 123 /// cases where we are forced to build new declarations within the transformer 124 /// rather than in the subclass (e.g., lambda closure types). 125 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 126 127 public: 128 /// Initializes a new tree transformer. 129 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 130 131 /// Retrieves a reference to the derived class. 132 Derived &getDerived() { return static_cast<Derived&>(*this); } 133 134 /// Retrieves a reference to the derived class. 135 const Derived &getDerived() const { 136 return static_cast<const Derived&>(*this); 137 } 138 139 static inline ExprResult Owned(Expr *E) { return E; } 140 static inline StmtResult Owned(Stmt *S) { return S; } 141 142 /// Retrieves a reference to the semantic analysis object used for 143 /// this tree transform. 144 Sema &getSema() const { return SemaRef; } 145 146 /// Whether the transformation should always rebuild AST nodes, even 147 /// if none of the children have changed. 148 /// 149 /// Subclasses may override this function to specify when the transformation 150 /// should rebuild all AST nodes. 151 /// 152 /// We must always rebuild all AST nodes when performing variadic template 153 /// pack expansion, in order to avoid violating the AST invariant that each 154 /// statement node appears at most once in its containing declaration. 155 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 156 157 /// Whether the transformation is forming an expression or statement that 158 /// replaces the original. In this case, we'll reuse mangling numbers from 159 /// existing lambdas. 160 bool ReplacingOriginal() { return false; } 161 162 /// Wether CXXConstructExpr can be skipped when they are implicit. 163 /// They will be reconstructed when used if needed. 164 /// This is usefull when the user that cause rebuilding of the 165 /// CXXConstructExpr is outside of the expression at which the TreeTransform 166 /// started. 167 bool AllowSkippingCXXConstructExpr() { return true; } 168 169 /// Returns the location of the entity being transformed, if that 170 /// information was not available elsewhere in the AST. 171 /// 172 /// By default, returns no source-location information. Subclasses can 173 /// provide an alternative implementation that provides better location 174 /// information. 175 SourceLocation getBaseLocation() { return SourceLocation(); } 176 177 /// Returns the name of the entity being transformed, if that 178 /// information was not available elsewhere in the AST. 179 /// 180 /// By default, returns an empty name. Subclasses can provide an alternative 181 /// implementation with a more precise name. 182 DeclarationName getBaseEntity() { return DeclarationName(); } 183 184 /// Sets the "base" location and entity when that 185 /// information is known based on another transformation. 186 /// 187 /// By default, the source location and entity are ignored. Subclasses can 188 /// override this function to provide a customized implementation. 189 void setBase(SourceLocation Loc, DeclarationName Entity) { } 190 191 /// RAII object that temporarily sets the base location and entity 192 /// used for reporting diagnostics in types. 193 class TemporaryBase { 194 TreeTransform &Self; 195 SourceLocation OldLocation; 196 DeclarationName OldEntity; 197 198 public: 199 TemporaryBase(TreeTransform &Self, SourceLocation Location, 200 DeclarationName Entity) : Self(Self) { 201 OldLocation = Self.getDerived().getBaseLocation(); 202 OldEntity = Self.getDerived().getBaseEntity(); 203 204 if (Location.isValid()) 205 Self.getDerived().setBase(Location, Entity); 206 } 207 208 ~TemporaryBase() { 209 Self.getDerived().setBase(OldLocation, OldEntity); 210 } 211 }; 212 213 /// Determine whether the given type \p T has already been 214 /// transformed. 215 /// 216 /// Subclasses can provide an alternative implementation of this routine 217 /// to short-circuit evaluation when it is known that a given type will 218 /// not change. For example, template instantiation need not traverse 219 /// non-dependent types. 220 bool AlreadyTransformed(QualType T) { 221 return T.isNull(); 222 } 223 224 /// Transform a template parameter depth level. 225 /// 226 /// During a transformation that transforms template parameters, this maps 227 /// an old template parameter depth to a new depth. 228 unsigned TransformTemplateDepth(unsigned Depth) { 229 return Depth; 230 } 231 232 /// Determine whether the given call argument should be dropped, e.g., 233 /// because it is a default argument. 234 /// 235 /// Subclasses can provide an alternative implementation of this routine to 236 /// determine which kinds of call arguments get dropped. By default, 237 /// CXXDefaultArgument nodes are dropped (prior to transformation). 238 bool DropCallArgument(Expr *E) { 239 return E->isDefaultArgument(); 240 } 241 242 /// Determine whether we should expand a pack expansion with the 243 /// given set of parameter packs into separate arguments by repeatedly 244 /// transforming the pattern. 245 /// 246 /// By default, the transformer never tries to expand pack expansions. 247 /// Subclasses can override this routine to provide different behavior. 248 /// 249 /// \param EllipsisLoc The location of the ellipsis that identifies the 250 /// pack expansion. 251 /// 252 /// \param PatternRange The source range that covers the entire pattern of 253 /// the pack expansion. 254 /// 255 /// \param Unexpanded The set of unexpanded parameter packs within the 256 /// pattern. 257 /// 258 /// \param ShouldExpand Will be set to \c true if the transformer should 259 /// expand the corresponding pack expansions into separate arguments. When 260 /// set, \c NumExpansions must also be set. 261 /// 262 /// \param RetainExpansion Whether the caller should add an unexpanded 263 /// pack expansion after all of the expanded arguments. This is used 264 /// when extending explicitly-specified template argument packs per 265 /// C++0x [temp.arg.explicit]p9. 266 /// 267 /// \param NumExpansions The number of separate arguments that will be in 268 /// the expanded form of the corresponding pack expansion. This is both an 269 /// input and an output parameter, which can be set by the caller if the 270 /// number of expansions is known a priori (e.g., due to a prior substitution) 271 /// and will be set by the callee when the number of expansions is known. 272 /// The callee must set this value when \c ShouldExpand is \c true; it may 273 /// set this value in other cases. 274 /// 275 /// \returns true if an error occurred (e.g., because the parameter packs 276 /// are to be instantiated with arguments of different lengths), false 277 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 278 /// must be set. 279 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 280 SourceRange PatternRange, 281 ArrayRef<UnexpandedParameterPack> Unexpanded, 282 bool &ShouldExpand, 283 bool &RetainExpansion, 284 Optional<unsigned> &NumExpansions) { 285 ShouldExpand = false; 286 return false; 287 } 288 289 /// "Forget" about the partially-substituted pack template argument, 290 /// when performing an instantiation that must preserve the parameter pack 291 /// use. 292 /// 293 /// This routine is meant to be overridden by the template instantiator. 294 TemplateArgument ForgetPartiallySubstitutedPack() { 295 return TemplateArgument(); 296 } 297 298 /// "Remember" the partially-substituted pack template argument 299 /// after performing an instantiation that must preserve the parameter pack 300 /// use. 301 /// 302 /// This routine is meant to be overridden by the template instantiator. 303 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 304 305 /// Note to the derived class when a function parameter pack is 306 /// being expanded. 307 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 308 309 /// Transforms the given type into another type. 310 /// 311 /// By default, this routine transforms a type by creating a 312 /// TypeSourceInfo for it and delegating to the appropriate 313 /// function. This is expensive, but we don't mind, because 314 /// this method is deprecated anyway; all users should be 315 /// switched to storing TypeSourceInfos. 316 /// 317 /// \returns the transformed type. 318 QualType TransformType(QualType T); 319 320 /// Transforms the given type-with-location into a new 321 /// type-with-location. 322 /// 323 /// By default, this routine transforms a type by delegating to the 324 /// appropriate TransformXXXType to build a new type. Subclasses 325 /// may override this function (to take over all type 326 /// transformations) or some set of the TransformXXXType functions 327 /// to alter the transformation. 328 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 329 330 /// Transform the given type-with-location into a new 331 /// type, collecting location information in the given builder 332 /// as necessary. 333 /// 334 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 335 336 /// Transform a type that is permitted to produce a 337 /// DeducedTemplateSpecializationType. 338 /// 339 /// This is used in the (relatively rare) contexts where it is acceptable 340 /// for transformation to produce a class template type with deduced 341 /// template arguments. 342 /// @{ 343 QualType TransformTypeWithDeducedTST(QualType T); 344 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 345 /// @} 346 347 /// The reason why the value of a statement is not discarded, if any. 348 enum StmtDiscardKind { 349 SDK_Discarded, 350 SDK_NotDiscarded, 351 SDK_StmtExprResult, 352 }; 353 354 /// Transform the given statement. 355 /// 356 /// By default, this routine transforms a statement by delegating to the 357 /// appropriate TransformXXXStmt function to transform a specific kind of 358 /// statement or the TransformExpr() function to transform an expression. 359 /// Subclasses may override this function to transform statements using some 360 /// other mechanism. 361 /// 362 /// \returns the transformed statement. 363 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 364 365 /// Transform the given statement. 366 /// 367 /// By default, this routine transforms a statement by delegating to the 368 /// appropriate TransformOMPXXXClause function to transform a specific kind 369 /// of clause. Subclasses may override this function to transform statements 370 /// using some other mechanism. 371 /// 372 /// \returns the transformed OpenMP clause. 373 OMPClause *TransformOMPClause(OMPClause *S); 374 375 /// Transform the given attribute. 376 /// 377 /// By default, this routine transforms a statement by delegating to the 378 /// appropriate TransformXXXAttr function to transform a specific kind 379 /// of attribute. Subclasses may override this function to transform 380 /// attributed statements using some other mechanism. 381 /// 382 /// \returns the transformed attribute 383 const Attr *TransformAttr(const Attr *S); 384 385 /// Transform the specified attribute. 386 /// 387 /// Subclasses should override the transformation of attributes with a pragma 388 /// spelling to transform expressions stored within the attribute. 389 /// 390 /// \returns the transformed attribute. 391 #define ATTR(X) 392 #define PRAGMA_SPELLING_ATTR(X) \ 393 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 394 #include "clang/Basic/AttrList.inc" 395 396 /// Transform the given expression. 397 /// 398 /// By default, this routine transforms an expression by delegating to the 399 /// appropriate TransformXXXExpr function to build a new expression. 400 /// Subclasses may override this function to transform expressions using some 401 /// other mechanism. 402 /// 403 /// \returns the transformed expression. 404 ExprResult TransformExpr(Expr *E); 405 406 /// Transform the given initializer. 407 /// 408 /// By default, this routine transforms an initializer by stripping off the 409 /// semantic nodes added by initialization, then passing the result to 410 /// TransformExpr or TransformExprs. 411 /// 412 /// \returns the transformed initializer. 413 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 414 415 /// Transform the given list of expressions. 416 /// 417 /// This routine transforms a list of expressions by invoking 418 /// \c TransformExpr() for each subexpression. However, it also provides 419 /// support for variadic templates by expanding any pack expansions (if the 420 /// derived class permits such expansion) along the way. When pack expansions 421 /// are present, the number of outputs may not equal the number of inputs. 422 /// 423 /// \param Inputs The set of expressions to be transformed. 424 /// 425 /// \param NumInputs The number of expressions in \c Inputs. 426 /// 427 /// \param IsCall If \c true, then this transform is being performed on 428 /// function-call arguments, and any arguments that should be dropped, will 429 /// be. 430 /// 431 /// \param Outputs The transformed input expressions will be added to this 432 /// vector. 433 /// 434 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 435 /// due to transformation. 436 /// 437 /// \returns true if an error occurred, false otherwise. 438 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 439 SmallVectorImpl<Expr *> &Outputs, 440 bool *ArgChanged = nullptr); 441 442 /// Transform the given declaration, which is referenced from a type 443 /// or expression. 444 /// 445 /// By default, acts as the identity function on declarations, unless the 446 /// transformer has had to transform the declaration itself. Subclasses 447 /// may override this function to provide alternate behavior. 448 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 449 llvm::DenseMap<Decl *, Decl *>::iterator Known 450 = TransformedLocalDecls.find(D); 451 if (Known != TransformedLocalDecls.end()) 452 return Known->second; 453 454 return D; 455 } 456 457 /// Transform the specified condition. 458 /// 459 /// By default, this transforms the variable and expression and rebuilds 460 /// the condition. 461 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 462 Expr *Expr, 463 Sema::ConditionKind Kind); 464 465 /// Transform the attributes associated with the given declaration and 466 /// place them on the new declaration. 467 /// 468 /// By default, this operation does nothing. Subclasses may override this 469 /// behavior to transform attributes. 470 void transformAttrs(Decl *Old, Decl *New) { } 471 472 /// Note that a local declaration has been transformed by this 473 /// transformer. 474 /// 475 /// Local declarations are typically transformed via a call to 476 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 477 /// the transformer itself has to transform the declarations. This routine 478 /// can be overridden by a subclass that keeps track of such mappings. 479 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 480 assert(New.size() == 1 && 481 "must override transformedLocalDecl if performing pack expansion"); 482 TransformedLocalDecls[Old] = New.front(); 483 } 484 485 /// Transform the definition of the given declaration. 486 /// 487 /// By default, invokes TransformDecl() to transform the declaration. 488 /// Subclasses may override this function to provide alternate behavior. 489 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 490 return getDerived().TransformDecl(Loc, D); 491 } 492 493 /// Transform the given declaration, which was the first part of a 494 /// nested-name-specifier in a member access expression. 495 /// 496 /// This specific declaration transformation only applies to the first 497 /// identifier in a nested-name-specifier of a member access expression, e.g., 498 /// the \c T in \c x->T::member 499 /// 500 /// By default, invokes TransformDecl() to transform the declaration. 501 /// Subclasses may override this function to provide alternate behavior. 502 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 503 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 504 } 505 506 /// Transform the set of declarations in an OverloadExpr. 507 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 508 LookupResult &R); 509 510 /// Transform the given nested-name-specifier with source-location 511 /// information. 512 /// 513 /// By default, transforms all of the types and declarations within the 514 /// nested-name-specifier. Subclasses may override this function to provide 515 /// alternate behavior. 516 NestedNameSpecifierLoc 517 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 518 QualType ObjectType = QualType(), 519 NamedDecl *FirstQualifierInScope = nullptr); 520 521 /// Transform the given declaration name. 522 /// 523 /// By default, transforms the types of conversion function, constructor, 524 /// and destructor names and then (if needed) rebuilds the declaration name. 525 /// Identifiers and selectors are returned unmodified. Sublcasses may 526 /// override this function to provide alternate behavior. 527 DeclarationNameInfo 528 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 529 530 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 531 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 532 concepts::TypeRequirement * 533 TransformTypeRequirement(concepts::TypeRequirement *Req); 534 concepts::ExprRequirement * 535 TransformExprRequirement(concepts::ExprRequirement *Req); 536 concepts::NestedRequirement * 537 TransformNestedRequirement(concepts::NestedRequirement *Req); 538 539 /// Transform the given template name. 540 /// 541 /// \param SS The nested-name-specifier that qualifies the template 542 /// name. This nested-name-specifier must already have been transformed. 543 /// 544 /// \param Name The template name to transform. 545 /// 546 /// \param NameLoc The source location of the template name. 547 /// 548 /// \param ObjectType If we're translating a template name within a member 549 /// access expression, this is the type of the object whose member template 550 /// is being referenced. 551 /// 552 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 553 /// also refers to a name within the current (lexical) scope, this is the 554 /// declaration it refers to. 555 /// 556 /// By default, transforms the template name by transforming the declarations 557 /// and nested-name-specifiers that occur within the template name. 558 /// Subclasses may override this function to provide alternate behavior. 559 TemplateName 560 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 561 SourceLocation NameLoc, 562 QualType ObjectType = QualType(), 563 NamedDecl *FirstQualifierInScope = nullptr, 564 bool AllowInjectedClassName = false); 565 566 /// Transform the given template argument. 567 /// 568 /// By default, this operation transforms the type, expression, or 569 /// declaration stored within the template argument and constructs a 570 /// new template argument from the transformed result. Subclasses may 571 /// override this function to provide alternate behavior. 572 /// 573 /// Returns true if there was an error. 574 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 575 TemplateArgumentLoc &Output, 576 bool Uneval = false); 577 578 /// Transform the given set of template arguments. 579 /// 580 /// By default, this operation transforms all of the template arguments 581 /// in the input set using \c TransformTemplateArgument(), and appends 582 /// the transformed arguments to the output list. 583 /// 584 /// Note that this overload of \c TransformTemplateArguments() is merely 585 /// a convenience function. Subclasses that wish to override this behavior 586 /// should override the iterator-based member template version. 587 /// 588 /// \param Inputs The set of template arguments to be transformed. 589 /// 590 /// \param NumInputs The number of template arguments in \p Inputs. 591 /// 592 /// \param Outputs The set of transformed template arguments output by this 593 /// routine. 594 /// 595 /// Returns true if an error occurred. 596 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 597 unsigned NumInputs, 598 TemplateArgumentListInfo &Outputs, 599 bool Uneval = false) { 600 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 601 Uneval); 602 } 603 604 /// Transform the given set of template arguments. 605 /// 606 /// By default, this operation transforms all of the template arguments 607 /// in the input set using \c TransformTemplateArgument(), and appends 608 /// the transformed arguments to the output list. 609 /// 610 /// \param First An iterator to the first template argument. 611 /// 612 /// \param Last An iterator one step past the last template argument. 613 /// 614 /// \param Outputs The set of transformed template arguments output by this 615 /// routine. 616 /// 617 /// Returns true if an error occurred. 618 template<typename InputIterator> 619 bool TransformTemplateArguments(InputIterator First, 620 InputIterator Last, 621 TemplateArgumentListInfo &Outputs, 622 bool Uneval = false); 623 624 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 625 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 626 TemplateArgumentLoc &ArgLoc); 627 628 /// Fakes up a TypeSourceInfo for a type. 629 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 630 return SemaRef.Context.getTrivialTypeSourceInfo(T, 631 getDerived().getBaseLocation()); 632 } 633 634 #define ABSTRACT_TYPELOC(CLASS, PARENT) 635 #define TYPELOC(CLASS, PARENT) \ 636 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 637 #include "clang/AST/TypeLocNodes.def" 638 639 template<typename Fn> 640 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 641 FunctionProtoTypeLoc TL, 642 CXXRecordDecl *ThisContext, 643 Qualifiers ThisTypeQuals, 644 Fn TransformExceptionSpec); 645 646 bool TransformExceptionSpec(SourceLocation Loc, 647 FunctionProtoType::ExceptionSpecInfo &ESI, 648 SmallVectorImpl<QualType> &Exceptions, 649 bool &Changed); 650 651 StmtResult TransformSEHHandler(Stmt *Handler); 652 653 QualType 654 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 655 TemplateSpecializationTypeLoc TL, 656 TemplateName Template); 657 658 QualType 659 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 660 DependentTemplateSpecializationTypeLoc TL, 661 TemplateName Template, 662 CXXScopeSpec &SS); 663 664 QualType TransformDependentTemplateSpecializationType( 665 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 666 NestedNameSpecifierLoc QualifierLoc); 667 668 /// Transforms the parameters of a function type into the 669 /// given vectors. 670 /// 671 /// The result vectors should be kept in sync; null entries in the 672 /// variables vector are acceptable. 673 /// 674 /// Return true on error. 675 bool TransformFunctionTypeParams( 676 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 677 const QualType *ParamTypes, 678 const FunctionProtoType::ExtParameterInfo *ParamInfos, 679 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 680 Sema::ExtParameterInfoBuilder &PInfos); 681 682 /// Transforms a single function-type parameter. Return null 683 /// on error. 684 /// 685 /// \param indexAdjustment - A number to add to the parameter's 686 /// scope index; can be negative 687 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 688 int indexAdjustment, 689 Optional<unsigned> NumExpansions, 690 bool ExpectParameterPack); 691 692 /// Transform the body of a lambda-expression. 693 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 694 /// Alternative implementation of TransformLambdaBody that skips transforming 695 /// the body. 696 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 697 698 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 699 700 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 701 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 702 703 TemplateParameterList *TransformTemplateParameterList( 704 TemplateParameterList *TPL) { 705 return TPL; 706 } 707 708 ExprResult TransformAddressOfOperand(Expr *E); 709 710 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 711 bool IsAddressOfOperand, 712 TypeSourceInfo **RecoveryTSI); 713 714 ExprResult TransformParenDependentScopeDeclRefExpr( 715 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 716 TypeSourceInfo **RecoveryTSI); 717 718 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 719 720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 721 // amount of stack usage with clang. 722 #define STMT(Node, Parent) \ 723 LLVM_ATTRIBUTE_NOINLINE \ 724 StmtResult Transform##Node(Node *S); 725 #define VALUESTMT(Node, Parent) \ 726 LLVM_ATTRIBUTE_NOINLINE \ 727 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 728 #define EXPR(Node, Parent) \ 729 LLVM_ATTRIBUTE_NOINLINE \ 730 ExprResult Transform##Node(Node *E); 731 #define ABSTRACT_STMT(Stmt) 732 #include "clang/AST/StmtNodes.inc" 733 734 #define GEN_CLANG_CLAUSE_CLASS 735 #define CLAUSE_CLASS(Enum, Str, Class) \ 736 LLVM_ATTRIBUTE_NOINLINE \ 737 OMPClause *Transform##Class(Class *S); 738 #include "llvm/Frontend/OpenMP/OMP.inc" 739 740 /// Build a new qualified type given its unqualified type and type location. 741 /// 742 /// By default, this routine adds type qualifiers only to types that can 743 /// have qualifiers, and silently suppresses those qualifiers that are not 744 /// permitted. Subclasses may override this routine to provide different 745 /// behavior. 746 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 747 748 /// Build a new pointer type given its pointee type. 749 /// 750 /// By default, performs semantic analysis when building the pointer type. 751 /// Subclasses may override this routine to provide different behavior. 752 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 753 754 /// Build a new block pointer type given its pointee type. 755 /// 756 /// By default, performs semantic analysis when building the block pointer 757 /// type. Subclasses may override this routine to provide different behavior. 758 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 759 760 /// Build a new reference type given the type it references. 761 /// 762 /// By default, performs semantic analysis when building the 763 /// reference type. Subclasses may override this routine to provide 764 /// different behavior. 765 /// 766 /// \param LValue whether the type was written with an lvalue sigil 767 /// or an rvalue sigil. 768 QualType RebuildReferenceType(QualType ReferentType, 769 bool LValue, 770 SourceLocation Sigil); 771 772 /// Build a new member pointer type given the pointee type and the 773 /// class type it refers into. 774 /// 775 /// By default, performs semantic analysis when building the member pointer 776 /// type. Subclasses may override this routine to provide different behavior. 777 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 778 SourceLocation Sigil); 779 780 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 781 SourceLocation ProtocolLAngleLoc, 782 ArrayRef<ObjCProtocolDecl *> Protocols, 783 ArrayRef<SourceLocation> ProtocolLocs, 784 SourceLocation ProtocolRAngleLoc); 785 786 /// Build an Objective-C object type. 787 /// 788 /// By default, performs semantic analysis when building the object type. 789 /// Subclasses may override this routine to provide different behavior. 790 QualType RebuildObjCObjectType(QualType BaseType, 791 SourceLocation Loc, 792 SourceLocation TypeArgsLAngleLoc, 793 ArrayRef<TypeSourceInfo *> TypeArgs, 794 SourceLocation TypeArgsRAngleLoc, 795 SourceLocation ProtocolLAngleLoc, 796 ArrayRef<ObjCProtocolDecl *> Protocols, 797 ArrayRef<SourceLocation> ProtocolLocs, 798 SourceLocation ProtocolRAngleLoc); 799 800 /// Build a new Objective-C object pointer type given the pointee type. 801 /// 802 /// By default, directly builds the pointer type, with no additional semantic 803 /// analysis. 804 QualType RebuildObjCObjectPointerType(QualType PointeeType, 805 SourceLocation Star); 806 807 /// Build a new array type given the element type, size 808 /// modifier, size of the array (if known), size expression, and index type 809 /// qualifiers. 810 /// 811 /// By default, performs semantic analysis when building the array type. 812 /// Subclasses may override this routine to provide different behavior. 813 /// Also by default, all of the other Rebuild*Array 814 QualType RebuildArrayType(QualType ElementType, 815 ArrayType::ArraySizeModifier SizeMod, 816 const llvm::APInt *Size, 817 Expr *SizeExpr, 818 unsigned IndexTypeQuals, 819 SourceRange BracketsRange); 820 821 /// Build a new constant array type given the element type, size 822 /// modifier, (known) size of the array, and index type qualifiers. 823 /// 824 /// By default, performs semantic analysis when building the array type. 825 /// Subclasses may override this routine to provide different behavior. 826 QualType RebuildConstantArrayType(QualType ElementType, 827 ArrayType::ArraySizeModifier SizeMod, 828 const llvm::APInt &Size, 829 Expr *SizeExpr, 830 unsigned IndexTypeQuals, 831 SourceRange BracketsRange); 832 833 /// Build a new incomplete array type given the element type, size 834 /// modifier, and index type qualifiers. 835 /// 836 /// By default, performs semantic analysis when building the array type. 837 /// Subclasses may override this routine to provide different behavior. 838 QualType RebuildIncompleteArrayType(QualType ElementType, 839 ArrayType::ArraySizeModifier SizeMod, 840 unsigned IndexTypeQuals, 841 SourceRange BracketsRange); 842 843 /// Build a new variable-length array type given the element type, 844 /// size modifier, size expression, and index type qualifiers. 845 /// 846 /// By default, performs semantic analysis when building the array type. 847 /// Subclasses may override this routine to provide different behavior. 848 QualType RebuildVariableArrayType(QualType ElementType, 849 ArrayType::ArraySizeModifier SizeMod, 850 Expr *SizeExpr, 851 unsigned IndexTypeQuals, 852 SourceRange BracketsRange); 853 854 /// Build a new dependent-sized array type given the element type, 855 /// size modifier, size expression, and index type qualifiers. 856 /// 857 /// By default, performs semantic analysis when building the array type. 858 /// Subclasses may override this routine to provide different behavior. 859 QualType RebuildDependentSizedArrayType(QualType ElementType, 860 ArrayType::ArraySizeModifier SizeMod, 861 Expr *SizeExpr, 862 unsigned IndexTypeQuals, 863 SourceRange BracketsRange); 864 865 /// Build a new vector type given the element type and 866 /// number of elements. 867 /// 868 /// By default, performs semantic analysis when building the vector type. 869 /// Subclasses may override this routine to provide different behavior. 870 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 871 VectorType::VectorKind VecKind); 872 873 /// Build a new potentially dependently-sized extended vector type 874 /// given the element type and number of elements. 875 /// 876 /// By default, performs semantic analysis when building the vector type. 877 /// Subclasses may override this routine to provide different behavior. 878 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 879 SourceLocation AttributeLoc, 880 VectorType::VectorKind); 881 882 /// Build a new extended vector type given the element type and 883 /// number of elements. 884 /// 885 /// By default, performs semantic analysis when building the vector type. 886 /// Subclasses may override this routine to provide different behavior. 887 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 888 SourceLocation AttributeLoc); 889 890 /// Build a new potentially dependently-sized extended vector type 891 /// given the element type and number of elements. 892 /// 893 /// By default, performs semantic analysis when building the vector type. 894 /// Subclasses may override this routine to provide different behavior. 895 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 896 Expr *SizeExpr, 897 SourceLocation AttributeLoc); 898 899 /// Build a new matrix type given the element type and dimensions. 900 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 901 unsigned NumColumns); 902 903 /// Build a new matrix type given the type and dependently-defined 904 /// dimensions. 905 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 906 Expr *ColumnExpr, 907 SourceLocation AttributeLoc); 908 909 /// Build a new DependentAddressSpaceType or return the pointee 910 /// type variable with the correct address space (retrieved from 911 /// AddrSpaceExpr) applied to it. The former will be returned in cases 912 /// where the address space remains dependent. 913 /// 914 /// By default, performs semantic analysis when building the type with address 915 /// space applied. Subclasses may override this routine to provide different 916 /// behavior. 917 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 918 Expr *AddrSpaceExpr, 919 SourceLocation AttributeLoc); 920 921 /// Build a new function type. 922 /// 923 /// By default, performs semantic analysis when building the function type. 924 /// Subclasses may override this routine to provide different behavior. 925 QualType RebuildFunctionProtoType(QualType T, 926 MutableArrayRef<QualType> ParamTypes, 927 const FunctionProtoType::ExtProtoInfo &EPI); 928 929 /// Build a new unprototyped function type. 930 QualType RebuildFunctionNoProtoType(QualType ResultType); 931 932 /// Rebuild an unresolved typename type, given the decl that 933 /// the UnresolvedUsingTypenameDecl was transformed to. 934 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 935 936 /// Build a new typedef type. 937 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 938 return SemaRef.Context.getTypeDeclType(Typedef); 939 } 940 941 /// Build a new MacroDefined type. 942 QualType RebuildMacroQualifiedType(QualType T, 943 const IdentifierInfo *MacroII) { 944 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 945 } 946 947 /// Build a new class/struct/union type. 948 QualType RebuildRecordType(RecordDecl *Record) { 949 return SemaRef.Context.getTypeDeclType(Record); 950 } 951 952 /// Build a new Enum type. 953 QualType RebuildEnumType(EnumDecl *Enum) { 954 return SemaRef.Context.getTypeDeclType(Enum); 955 } 956 957 /// Build a new typeof(expr) type. 958 /// 959 /// By default, performs semantic analysis when building the typeof type. 960 /// Subclasses may override this routine to provide different behavior. 961 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 962 963 /// Build a new typeof(type) type. 964 /// 965 /// By default, builds a new TypeOfType with the given underlying type. 966 QualType RebuildTypeOfType(QualType Underlying); 967 968 /// Build a new unary transform type. 969 QualType RebuildUnaryTransformType(QualType BaseType, 970 UnaryTransformType::UTTKind UKind, 971 SourceLocation Loc); 972 973 /// Build a new C++11 decltype type. 974 /// 975 /// By default, performs semantic analysis when building the decltype type. 976 /// Subclasses may override this routine to provide different behavior. 977 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 978 979 /// Build a new C++11 auto type. 980 /// 981 /// By default, builds a new AutoType with the given deduced type. 982 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 983 ConceptDecl *TypeConstraintConcept, 984 ArrayRef<TemplateArgument> TypeConstraintArgs) { 985 // Note, IsDependent is always false here: we implicitly convert an 'auto' 986 // which has been deduced to a dependent type into an undeduced 'auto', so 987 // that we'll retry deduction after the transformation. 988 return SemaRef.Context.getAutoType(Deduced, Keyword, 989 /*IsDependent*/ false, /*IsPack=*/false, 990 TypeConstraintConcept, 991 TypeConstraintArgs); 992 } 993 994 /// By default, builds a new DeducedTemplateSpecializationType with the given 995 /// deduced type. 996 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 997 QualType Deduced) { 998 return SemaRef.Context.getDeducedTemplateSpecializationType( 999 Template, Deduced, /*IsDependent*/ false); 1000 } 1001 1002 /// Build a new template specialization type. 1003 /// 1004 /// By default, performs semantic analysis when building the template 1005 /// specialization type. Subclasses may override this routine to provide 1006 /// different behavior. 1007 QualType RebuildTemplateSpecializationType(TemplateName Template, 1008 SourceLocation TemplateLoc, 1009 TemplateArgumentListInfo &Args); 1010 1011 /// Build a new parenthesized type. 1012 /// 1013 /// By default, builds a new ParenType type from the inner type. 1014 /// Subclasses may override this routine to provide different behavior. 1015 QualType RebuildParenType(QualType InnerType) { 1016 return SemaRef.BuildParenType(InnerType); 1017 } 1018 1019 /// Build a new qualified name type. 1020 /// 1021 /// By default, builds a new ElaboratedType type from the keyword, 1022 /// the nested-name-specifier and the named type. 1023 /// Subclasses may override this routine to provide different behavior. 1024 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1025 ElaboratedTypeKeyword Keyword, 1026 NestedNameSpecifierLoc QualifierLoc, 1027 QualType Named) { 1028 return SemaRef.Context.getElaboratedType(Keyword, 1029 QualifierLoc.getNestedNameSpecifier(), 1030 Named); 1031 } 1032 1033 /// Build a new typename type that refers to a template-id. 1034 /// 1035 /// By default, builds a new DependentNameType type from the 1036 /// nested-name-specifier and the given type. Subclasses may override 1037 /// this routine to provide different behavior. 1038 QualType RebuildDependentTemplateSpecializationType( 1039 ElaboratedTypeKeyword Keyword, 1040 NestedNameSpecifierLoc QualifierLoc, 1041 SourceLocation TemplateKWLoc, 1042 const IdentifierInfo *Name, 1043 SourceLocation NameLoc, 1044 TemplateArgumentListInfo &Args, 1045 bool AllowInjectedClassName) { 1046 // Rebuild the template name. 1047 // TODO: avoid TemplateName abstraction 1048 CXXScopeSpec SS; 1049 SS.Adopt(QualifierLoc); 1050 TemplateName InstName = getDerived().RebuildTemplateName( 1051 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1052 AllowInjectedClassName); 1053 1054 if (InstName.isNull()) 1055 return QualType(); 1056 1057 // If it's still dependent, make a dependent specialization. 1058 if (InstName.getAsDependentTemplateName()) 1059 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1060 QualifierLoc.getNestedNameSpecifier(), 1061 Name, 1062 Args); 1063 1064 // Otherwise, make an elaborated type wrapping a non-dependent 1065 // specialization. 1066 QualType T = 1067 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1068 if (T.isNull()) return QualType(); 1069 1070 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1071 return T; 1072 1073 return SemaRef.Context.getElaboratedType(Keyword, 1074 QualifierLoc.getNestedNameSpecifier(), 1075 T); 1076 } 1077 1078 /// Build a new typename type that refers to an identifier. 1079 /// 1080 /// By default, performs semantic analysis when building the typename type 1081 /// (or elaborated type). Subclasses may override this routine to provide 1082 /// different behavior. 1083 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1084 SourceLocation KeywordLoc, 1085 NestedNameSpecifierLoc QualifierLoc, 1086 const IdentifierInfo *Id, 1087 SourceLocation IdLoc, 1088 bool DeducedTSTContext) { 1089 CXXScopeSpec SS; 1090 SS.Adopt(QualifierLoc); 1091 1092 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1093 // If the name is still dependent, just build a new dependent name type. 1094 if (!SemaRef.computeDeclContext(SS)) 1095 return SemaRef.Context.getDependentNameType(Keyword, 1096 QualifierLoc.getNestedNameSpecifier(), 1097 Id); 1098 } 1099 1100 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1101 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1102 *Id, IdLoc, DeducedTSTContext); 1103 } 1104 1105 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1106 1107 // We had a dependent elaborated-type-specifier that has been transformed 1108 // into a non-dependent elaborated-type-specifier. Find the tag we're 1109 // referring to. 1110 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1111 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1112 if (!DC) 1113 return QualType(); 1114 1115 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1116 return QualType(); 1117 1118 TagDecl *Tag = nullptr; 1119 SemaRef.LookupQualifiedName(Result, DC); 1120 switch (Result.getResultKind()) { 1121 case LookupResult::NotFound: 1122 case LookupResult::NotFoundInCurrentInstantiation: 1123 break; 1124 1125 case LookupResult::Found: 1126 Tag = Result.getAsSingle<TagDecl>(); 1127 break; 1128 1129 case LookupResult::FoundOverloaded: 1130 case LookupResult::FoundUnresolvedValue: 1131 llvm_unreachable("Tag lookup cannot find non-tags"); 1132 1133 case LookupResult::Ambiguous: 1134 // Let the LookupResult structure handle ambiguities. 1135 return QualType(); 1136 } 1137 1138 if (!Tag) { 1139 // Check where the name exists but isn't a tag type and use that to emit 1140 // better diagnostics. 1141 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1142 SemaRef.LookupQualifiedName(Result, DC); 1143 switch (Result.getResultKind()) { 1144 case LookupResult::Found: 1145 case LookupResult::FoundOverloaded: 1146 case LookupResult::FoundUnresolvedValue: { 1147 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1148 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1149 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1150 << NTK << Kind; 1151 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1152 break; 1153 } 1154 default: 1155 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1156 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1157 break; 1158 } 1159 return QualType(); 1160 } 1161 1162 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1163 IdLoc, Id)) { 1164 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1165 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1166 return QualType(); 1167 } 1168 1169 // Build the elaborated-type-specifier type. 1170 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1171 return SemaRef.Context.getElaboratedType(Keyword, 1172 QualifierLoc.getNestedNameSpecifier(), 1173 T); 1174 } 1175 1176 /// Build a new pack expansion type. 1177 /// 1178 /// By default, builds a new PackExpansionType type from the given pattern. 1179 /// Subclasses may override this routine to provide different behavior. 1180 QualType RebuildPackExpansionType(QualType Pattern, 1181 SourceRange PatternRange, 1182 SourceLocation EllipsisLoc, 1183 Optional<unsigned> NumExpansions) { 1184 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1185 NumExpansions); 1186 } 1187 1188 /// Build a new atomic type given its value type. 1189 /// 1190 /// By default, performs semantic analysis when building the atomic type. 1191 /// Subclasses may override this routine to provide different behavior. 1192 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1193 1194 /// Build a new pipe type given its value type. 1195 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1196 bool isReadPipe); 1197 1198 /// Build an extended int given its value type. 1199 QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits, 1200 SourceLocation Loc); 1201 1202 /// Build a dependent extended int given its value type. 1203 QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr, 1204 SourceLocation Loc); 1205 1206 /// Build a new template name given a nested name specifier, a flag 1207 /// indicating whether the "template" keyword was provided, and the template 1208 /// that the template name refers to. 1209 /// 1210 /// By default, builds the new template name directly. Subclasses may override 1211 /// this routine to provide different behavior. 1212 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1213 bool TemplateKW, 1214 TemplateDecl *Template); 1215 1216 /// Build a new template name given a nested name specifier and the 1217 /// name that is referred to as a template. 1218 /// 1219 /// By default, performs semantic analysis to determine whether the name can 1220 /// be resolved to a specific template, then builds the appropriate kind of 1221 /// template name. Subclasses may override this routine to provide different 1222 /// behavior. 1223 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1224 SourceLocation TemplateKWLoc, 1225 const IdentifierInfo &Name, 1226 SourceLocation NameLoc, QualType ObjectType, 1227 NamedDecl *FirstQualifierInScope, 1228 bool AllowInjectedClassName); 1229 1230 /// Build a new template name given a nested name specifier and the 1231 /// overloaded operator name that is referred to as a template. 1232 /// 1233 /// By default, performs semantic analysis to determine whether the name can 1234 /// be resolved to a specific template, then builds the appropriate kind of 1235 /// template name. Subclasses may override this routine to provide different 1236 /// behavior. 1237 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1238 SourceLocation TemplateKWLoc, 1239 OverloadedOperatorKind Operator, 1240 SourceLocation NameLoc, QualType ObjectType, 1241 bool AllowInjectedClassName); 1242 1243 /// Build a new template name given a template template parameter pack 1244 /// and the 1245 /// 1246 /// By default, performs semantic analysis to determine whether the name can 1247 /// be resolved to a specific template, then builds the appropriate kind of 1248 /// template name. Subclasses may override this routine to provide different 1249 /// behavior. 1250 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1251 const TemplateArgument &ArgPack) { 1252 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1253 } 1254 1255 /// Build a new compound statement. 1256 /// 1257 /// By default, performs semantic analysis to build the new statement. 1258 /// Subclasses may override this routine to provide different behavior. 1259 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1260 MultiStmtArg Statements, 1261 SourceLocation RBraceLoc, 1262 bool IsStmtExpr) { 1263 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1264 IsStmtExpr); 1265 } 1266 1267 /// Build a new case statement. 1268 /// 1269 /// By default, performs semantic analysis to build the new statement. 1270 /// Subclasses may override this routine to provide different behavior. 1271 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1272 Expr *LHS, 1273 SourceLocation EllipsisLoc, 1274 Expr *RHS, 1275 SourceLocation ColonLoc) { 1276 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1277 ColonLoc); 1278 } 1279 1280 /// Attach the body to a new case statement. 1281 /// 1282 /// By default, performs semantic analysis to build the new statement. 1283 /// Subclasses may override this routine to provide different behavior. 1284 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1285 getSema().ActOnCaseStmtBody(S, Body); 1286 return S; 1287 } 1288 1289 /// Build a new default statement. 1290 /// 1291 /// By default, performs semantic analysis to build the new statement. 1292 /// Subclasses may override this routine to provide different behavior. 1293 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1294 SourceLocation ColonLoc, 1295 Stmt *SubStmt) { 1296 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1297 /*CurScope=*/nullptr); 1298 } 1299 1300 /// Build a new label statement. 1301 /// 1302 /// By default, performs semantic analysis to build the new statement. 1303 /// Subclasses may override this routine to provide different behavior. 1304 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1305 SourceLocation ColonLoc, Stmt *SubStmt) { 1306 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1307 } 1308 1309 /// Build a new attributed statement. 1310 /// 1311 /// By default, performs semantic analysis to build the new statement. 1312 /// Subclasses may override this routine to provide different behavior. 1313 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1314 ArrayRef<const Attr*> Attrs, 1315 Stmt *SubStmt) { 1316 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1317 } 1318 1319 /// Build a new "if" statement. 1320 /// 1321 /// By default, performs semantic analysis to build the new statement. 1322 /// Subclasses may override this routine to provide different behavior. 1323 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1324 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1325 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1326 SourceLocation ElseLoc, Stmt *Else) { 1327 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond, 1328 RParenLoc, Then, ElseLoc, Else); 1329 } 1330 1331 /// Start building a new switch statement. 1332 /// 1333 /// By default, performs semantic analysis to build the new statement. 1334 /// Subclasses may override this routine to provide different behavior. 1335 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1336 SourceLocation LParenLoc, Stmt *Init, 1337 Sema::ConditionResult Cond, 1338 SourceLocation RParenLoc) { 1339 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1340 RParenLoc); 1341 } 1342 1343 /// Attach the body to the switch statement. 1344 /// 1345 /// By default, performs semantic analysis to build the new statement. 1346 /// Subclasses may override this routine to provide different behavior. 1347 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1348 Stmt *Switch, Stmt *Body) { 1349 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1350 } 1351 1352 /// Build a new while statement. 1353 /// 1354 /// By default, performs semantic analysis to build the new statement. 1355 /// Subclasses may override this routine to provide different behavior. 1356 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1357 Sema::ConditionResult Cond, 1358 SourceLocation RParenLoc, Stmt *Body) { 1359 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1360 } 1361 1362 /// Build a new do-while statement. 1363 /// 1364 /// By default, performs semantic analysis to build the new statement. 1365 /// Subclasses may override this routine to provide different behavior. 1366 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1367 SourceLocation WhileLoc, SourceLocation LParenLoc, 1368 Expr *Cond, SourceLocation RParenLoc) { 1369 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1370 Cond, RParenLoc); 1371 } 1372 1373 /// Build a new for statement. 1374 /// 1375 /// By default, performs semantic analysis to build the new statement. 1376 /// Subclasses may override this routine to provide different behavior. 1377 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1378 Stmt *Init, Sema::ConditionResult Cond, 1379 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1380 Stmt *Body) { 1381 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1382 Inc, RParenLoc, Body); 1383 } 1384 1385 /// Build a new goto statement. 1386 /// 1387 /// By default, performs semantic analysis to build the new statement. 1388 /// Subclasses may override this routine to provide different behavior. 1389 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1390 LabelDecl *Label) { 1391 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1392 } 1393 1394 /// Build a new indirect goto statement. 1395 /// 1396 /// By default, performs semantic analysis to build the new statement. 1397 /// Subclasses may override this routine to provide different behavior. 1398 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1399 SourceLocation StarLoc, 1400 Expr *Target) { 1401 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1402 } 1403 1404 /// Build a new return statement. 1405 /// 1406 /// By default, performs semantic analysis to build the new statement. 1407 /// Subclasses may override this routine to provide different behavior. 1408 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1409 return getSema().BuildReturnStmt(ReturnLoc, Result); 1410 } 1411 1412 /// Build a new declaration statement. 1413 /// 1414 /// By default, performs semantic analysis to build the new statement. 1415 /// Subclasses may override this routine to provide different behavior. 1416 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1417 SourceLocation StartLoc, SourceLocation EndLoc) { 1418 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1419 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1420 } 1421 1422 /// Build a new inline asm statement. 1423 /// 1424 /// By default, performs semantic analysis to build the new statement. 1425 /// Subclasses may override this routine to provide different behavior. 1426 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1427 bool IsVolatile, unsigned NumOutputs, 1428 unsigned NumInputs, IdentifierInfo **Names, 1429 MultiExprArg Constraints, MultiExprArg Exprs, 1430 Expr *AsmString, MultiExprArg Clobbers, 1431 unsigned NumLabels, 1432 SourceLocation RParenLoc) { 1433 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1434 NumInputs, Names, Constraints, Exprs, 1435 AsmString, Clobbers, NumLabels, RParenLoc); 1436 } 1437 1438 /// Build a new MS style inline asm statement. 1439 /// 1440 /// By default, performs semantic analysis to build the new statement. 1441 /// Subclasses may override this routine to provide different behavior. 1442 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1443 ArrayRef<Token> AsmToks, 1444 StringRef AsmString, 1445 unsigned NumOutputs, unsigned NumInputs, 1446 ArrayRef<StringRef> Constraints, 1447 ArrayRef<StringRef> Clobbers, 1448 ArrayRef<Expr*> Exprs, 1449 SourceLocation EndLoc) { 1450 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1451 NumOutputs, NumInputs, 1452 Constraints, Clobbers, Exprs, EndLoc); 1453 } 1454 1455 /// Build a new co_return statement. 1456 /// 1457 /// By default, performs semantic analysis to build the new statement. 1458 /// Subclasses may override this routine to provide different behavior. 1459 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1460 bool IsImplicit) { 1461 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1462 } 1463 1464 /// Build a new co_await expression. 1465 /// 1466 /// By default, performs semantic analysis to build the new expression. 1467 /// Subclasses may override this routine to provide different behavior. 1468 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1469 bool IsImplicit) { 1470 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1471 } 1472 1473 /// Build a new co_await expression. 1474 /// 1475 /// By default, performs semantic analysis to build the new expression. 1476 /// Subclasses may override this routine to provide different behavior. 1477 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1478 Expr *Result, 1479 UnresolvedLookupExpr *Lookup) { 1480 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1481 } 1482 1483 /// Build a new co_yield expression. 1484 /// 1485 /// By default, performs semantic analysis to build the new expression. 1486 /// Subclasses may override this routine to provide different behavior. 1487 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1488 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1489 } 1490 1491 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1492 return getSema().BuildCoroutineBodyStmt(Args); 1493 } 1494 1495 /// Build a new Objective-C \@try statement. 1496 /// 1497 /// By default, performs semantic analysis to build the new statement. 1498 /// Subclasses may override this routine to provide different behavior. 1499 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1500 Stmt *TryBody, 1501 MultiStmtArg CatchStmts, 1502 Stmt *Finally) { 1503 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1504 Finally); 1505 } 1506 1507 /// Rebuild an Objective-C exception declaration. 1508 /// 1509 /// By default, performs semantic analysis to build the new declaration. 1510 /// Subclasses may override this routine to provide different behavior. 1511 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1512 TypeSourceInfo *TInfo, QualType T) { 1513 return getSema().BuildObjCExceptionDecl(TInfo, T, 1514 ExceptionDecl->getInnerLocStart(), 1515 ExceptionDecl->getLocation(), 1516 ExceptionDecl->getIdentifier()); 1517 } 1518 1519 /// Build a new Objective-C \@catch statement. 1520 /// 1521 /// By default, performs semantic analysis to build the new statement. 1522 /// Subclasses may override this routine to provide different behavior. 1523 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1524 SourceLocation RParenLoc, 1525 VarDecl *Var, 1526 Stmt *Body) { 1527 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1528 Var, Body); 1529 } 1530 1531 /// Build a new Objective-C \@finally statement. 1532 /// 1533 /// By default, performs semantic analysis to build the new statement. 1534 /// Subclasses may override this routine to provide different behavior. 1535 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1536 Stmt *Body) { 1537 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1538 } 1539 1540 /// Build a new Objective-C \@throw statement. 1541 /// 1542 /// By default, performs semantic analysis to build the new statement. 1543 /// Subclasses may override this routine to provide different behavior. 1544 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1545 Expr *Operand) { 1546 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1547 } 1548 1549 /// Build a new OpenMP Canonical loop. 1550 /// 1551 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1552 /// OMPCanonicalLoop. 1553 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1554 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1555 } 1556 1557 /// Build a new OpenMP executable directive. 1558 /// 1559 /// By default, performs semantic analysis to build the new statement. 1560 /// Subclasses may override this routine to provide different behavior. 1561 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1562 DeclarationNameInfo DirName, 1563 OpenMPDirectiveKind CancelRegion, 1564 ArrayRef<OMPClause *> Clauses, 1565 Stmt *AStmt, SourceLocation StartLoc, 1566 SourceLocation EndLoc) { 1567 return getSema().ActOnOpenMPExecutableDirective( 1568 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1569 } 1570 1571 /// Build a new OpenMP 'if' clause. 1572 /// 1573 /// By default, performs semantic analysis to build the new OpenMP clause. 1574 /// Subclasses may override this routine to provide different behavior. 1575 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1576 Expr *Condition, SourceLocation StartLoc, 1577 SourceLocation LParenLoc, 1578 SourceLocation NameModifierLoc, 1579 SourceLocation ColonLoc, 1580 SourceLocation EndLoc) { 1581 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1582 LParenLoc, NameModifierLoc, ColonLoc, 1583 EndLoc); 1584 } 1585 1586 /// Build a new OpenMP 'final' clause. 1587 /// 1588 /// By default, performs semantic analysis to build the new OpenMP clause. 1589 /// Subclasses may override this routine to provide different behavior. 1590 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1591 SourceLocation LParenLoc, 1592 SourceLocation EndLoc) { 1593 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1594 EndLoc); 1595 } 1596 1597 /// Build a new OpenMP 'num_threads' clause. 1598 /// 1599 /// By default, performs semantic analysis to build the new OpenMP clause. 1600 /// Subclasses may override this routine to provide different behavior. 1601 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1602 SourceLocation StartLoc, 1603 SourceLocation LParenLoc, 1604 SourceLocation EndLoc) { 1605 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1606 LParenLoc, EndLoc); 1607 } 1608 1609 /// Build a new OpenMP 'safelen' clause. 1610 /// 1611 /// By default, performs semantic analysis to build the new OpenMP clause. 1612 /// Subclasses may override this routine to provide different behavior. 1613 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1614 SourceLocation LParenLoc, 1615 SourceLocation EndLoc) { 1616 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1617 } 1618 1619 /// Build a new OpenMP 'simdlen' clause. 1620 /// 1621 /// By default, performs semantic analysis to build the new OpenMP clause. 1622 /// Subclasses may override this routine to provide different behavior. 1623 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1624 SourceLocation LParenLoc, 1625 SourceLocation EndLoc) { 1626 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1627 } 1628 1629 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1630 SourceLocation StartLoc, 1631 SourceLocation LParenLoc, 1632 SourceLocation EndLoc) { 1633 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1634 } 1635 1636 /// Build a new OpenMP 'allocator' clause. 1637 /// 1638 /// By default, performs semantic analysis to build the new OpenMP clause. 1639 /// Subclasses may override this routine to provide different behavior. 1640 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1641 SourceLocation LParenLoc, 1642 SourceLocation EndLoc) { 1643 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1644 } 1645 1646 /// Build a new OpenMP 'collapse' clause. 1647 /// 1648 /// By default, performs semantic analysis to build the new OpenMP clause. 1649 /// Subclasses may override this routine to provide different behavior. 1650 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1651 SourceLocation LParenLoc, 1652 SourceLocation EndLoc) { 1653 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1654 EndLoc); 1655 } 1656 1657 /// Build a new OpenMP 'default' clause. 1658 /// 1659 /// By default, performs semantic analysis to build the new OpenMP clause. 1660 /// Subclasses may override this routine to provide different behavior. 1661 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1662 SourceLocation StartLoc, 1663 SourceLocation LParenLoc, 1664 SourceLocation EndLoc) { 1665 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1666 StartLoc, LParenLoc, EndLoc); 1667 } 1668 1669 /// Build a new OpenMP 'proc_bind' clause. 1670 /// 1671 /// By default, performs semantic analysis to build the new OpenMP clause. 1672 /// Subclasses may override this routine to provide different behavior. 1673 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1674 SourceLocation KindKwLoc, 1675 SourceLocation StartLoc, 1676 SourceLocation LParenLoc, 1677 SourceLocation EndLoc) { 1678 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1679 StartLoc, LParenLoc, EndLoc); 1680 } 1681 1682 /// Build a new OpenMP 'schedule' clause. 1683 /// 1684 /// By default, performs semantic analysis to build the new OpenMP clause. 1685 /// Subclasses may override this routine to provide different behavior. 1686 OMPClause *RebuildOMPScheduleClause( 1687 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1688 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1689 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1690 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1691 return getSema().ActOnOpenMPScheduleClause( 1692 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1693 CommaLoc, EndLoc); 1694 } 1695 1696 /// Build a new OpenMP 'ordered' clause. 1697 /// 1698 /// By default, performs semantic analysis to build the new OpenMP clause. 1699 /// Subclasses may override this routine to provide different behavior. 1700 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1701 SourceLocation EndLoc, 1702 SourceLocation LParenLoc, Expr *Num) { 1703 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1704 } 1705 1706 /// Build a new OpenMP 'private' clause. 1707 /// 1708 /// By default, performs semantic analysis to build the new OpenMP clause. 1709 /// Subclasses may override this routine to provide different behavior. 1710 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1711 SourceLocation StartLoc, 1712 SourceLocation LParenLoc, 1713 SourceLocation EndLoc) { 1714 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1715 EndLoc); 1716 } 1717 1718 /// Build a new OpenMP 'firstprivate' clause. 1719 /// 1720 /// By default, performs semantic analysis to build the new OpenMP clause. 1721 /// Subclasses may override this routine to provide different behavior. 1722 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1723 SourceLocation StartLoc, 1724 SourceLocation LParenLoc, 1725 SourceLocation EndLoc) { 1726 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1727 EndLoc); 1728 } 1729 1730 /// Build a new OpenMP 'lastprivate' clause. 1731 /// 1732 /// By default, performs semantic analysis to build the new OpenMP clause. 1733 /// Subclasses may override this routine to provide different behavior. 1734 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1735 OpenMPLastprivateModifier LPKind, 1736 SourceLocation LPKindLoc, 1737 SourceLocation ColonLoc, 1738 SourceLocation StartLoc, 1739 SourceLocation LParenLoc, 1740 SourceLocation EndLoc) { 1741 return getSema().ActOnOpenMPLastprivateClause( 1742 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1743 } 1744 1745 /// Build a new OpenMP 'shared' clause. 1746 /// 1747 /// By default, performs semantic analysis to build the new OpenMP clause. 1748 /// Subclasses may override this routine to provide different behavior. 1749 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1750 SourceLocation StartLoc, 1751 SourceLocation LParenLoc, 1752 SourceLocation EndLoc) { 1753 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1754 EndLoc); 1755 } 1756 1757 /// Build a new OpenMP 'reduction' clause. 1758 /// 1759 /// By default, performs semantic analysis to build the new statement. 1760 /// Subclasses may override this routine to provide different behavior. 1761 OMPClause *RebuildOMPReductionClause( 1762 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1763 SourceLocation StartLoc, SourceLocation LParenLoc, 1764 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1765 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1766 const DeclarationNameInfo &ReductionId, 1767 ArrayRef<Expr *> UnresolvedReductions) { 1768 return getSema().ActOnOpenMPReductionClause( 1769 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1770 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1771 } 1772 1773 /// Build a new OpenMP 'task_reduction' clause. 1774 /// 1775 /// By default, performs semantic analysis to build the new statement. 1776 /// Subclasses may override this routine to provide different behavior. 1777 OMPClause *RebuildOMPTaskReductionClause( 1778 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1779 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1780 CXXScopeSpec &ReductionIdScopeSpec, 1781 const DeclarationNameInfo &ReductionId, 1782 ArrayRef<Expr *> UnresolvedReductions) { 1783 return getSema().ActOnOpenMPTaskReductionClause( 1784 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1785 ReductionId, UnresolvedReductions); 1786 } 1787 1788 /// Build a new OpenMP 'in_reduction' clause. 1789 /// 1790 /// By default, performs semantic analysis to build the new statement. 1791 /// Subclasses may override this routine to provide different behavior. 1792 OMPClause * 1793 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1794 SourceLocation LParenLoc, SourceLocation ColonLoc, 1795 SourceLocation EndLoc, 1796 CXXScopeSpec &ReductionIdScopeSpec, 1797 const DeclarationNameInfo &ReductionId, 1798 ArrayRef<Expr *> UnresolvedReductions) { 1799 return getSema().ActOnOpenMPInReductionClause( 1800 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1801 ReductionId, UnresolvedReductions); 1802 } 1803 1804 /// Build a new OpenMP 'linear' clause. 1805 /// 1806 /// By default, performs semantic analysis to build the new OpenMP clause. 1807 /// Subclasses may override this routine to provide different behavior. 1808 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1809 SourceLocation StartLoc, 1810 SourceLocation LParenLoc, 1811 OpenMPLinearClauseKind Modifier, 1812 SourceLocation ModifierLoc, 1813 SourceLocation ColonLoc, 1814 SourceLocation EndLoc) { 1815 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1816 Modifier, ModifierLoc, ColonLoc, 1817 EndLoc); 1818 } 1819 1820 /// Build a new OpenMP 'aligned' clause. 1821 /// 1822 /// By default, performs semantic analysis to build the new OpenMP clause. 1823 /// Subclasses may override this routine to provide different behavior. 1824 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1825 SourceLocation StartLoc, 1826 SourceLocation LParenLoc, 1827 SourceLocation ColonLoc, 1828 SourceLocation EndLoc) { 1829 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1830 LParenLoc, ColonLoc, EndLoc); 1831 } 1832 1833 /// Build a new OpenMP 'copyin' clause. 1834 /// 1835 /// By default, performs semantic analysis to build the new OpenMP clause. 1836 /// Subclasses may override this routine to provide different behavior. 1837 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1838 SourceLocation StartLoc, 1839 SourceLocation LParenLoc, 1840 SourceLocation EndLoc) { 1841 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1842 EndLoc); 1843 } 1844 1845 /// Build a new OpenMP 'copyprivate' clause. 1846 /// 1847 /// By default, performs semantic analysis to build the new OpenMP clause. 1848 /// Subclasses may override this routine to provide different behavior. 1849 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1850 SourceLocation StartLoc, 1851 SourceLocation LParenLoc, 1852 SourceLocation EndLoc) { 1853 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1854 EndLoc); 1855 } 1856 1857 /// Build a new OpenMP 'flush' pseudo clause. 1858 /// 1859 /// By default, performs semantic analysis to build the new OpenMP clause. 1860 /// Subclasses may override this routine to provide different behavior. 1861 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1862 SourceLocation StartLoc, 1863 SourceLocation LParenLoc, 1864 SourceLocation EndLoc) { 1865 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1866 EndLoc); 1867 } 1868 1869 /// Build a new OpenMP 'depobj' pseudo clause. 1870 /// 1871 /// By default, performs semantic analysis to build the new OpenMP clause. 1872 /// Subclasses may override this routine to provide different behavior. 1873 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1874 SourceLocation LParenLoc, 1875 SourceLocation EndLoc) { 1876 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1877 EndLoc); 1878 } 1879 1880 /// Build a new OpenMP 'depend' pseudo clause. 1881 /// 1882 /// By default, performs semantic analysis to build the new OpenMP clause. 1883 /// Subclasses may override this routine to provide different behavior. 1884 OMPClause * 1885 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1886 SourceLocation DepLoc, SourceLocation ColonLoc, 1887 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1888 SourceLocation LParenLoc, SourceLocation EndLoc) { 1889 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1890 ColonLoc, VarList, StartLoc, 1891 LParenLoc, EndLoc); 1892 } 1893 1894 /// Build a new OpenMP 'device' clause. 1895 /// 1896 /// By default, performs semantic analysis to build the new statement. 1897 /// Subclasses may override this routine to provide different behavior. 1898 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1899 Expr *Device, SourceLocation StartLoc, 1900 SourceLocation LParenLoc, 1901 SourceLocation ModifierLoc, 1902 SourceLocation EndLoc) { 1903 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1904 LParenLoc, ModifierLoc, EndLoc); 1905 } 1906 1907 /// Build a new OpenMP 'map' clause. 1908 /// 1909 /// By default, performs semantic analysis to build the new OpenMP clause. 1910 /// Subclasses may override this routine to provide different behavior. 1911 OMPClause *RebuildOMPMapClause( 1912 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1913 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1914 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1915 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1916 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1917 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1918 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1919 MapperIdScopeSpec, MapperId, MapType, 1920 IsMapTypeImplicit, MapLoc, ColonLoc, 1921 VarList, Locs, UnresolvedMappers); 1922 } 1923 1924 /// Build a new OpenMP 'allocate' clause. 1925 /// 1926 /// By default, performs semantic analysis to build the new OpenMP clause. 1927 /// Subclasses may override this routine to provide different behavior. 1928 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1929 SourceLocation StartLoc, 1930 SourceLocation LParenLoc, 1931 SourceLocation ColonLoc, 1932 SourceLocation EndLoc) { 1933 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1934 LParenLoc, ColonLoc, EndLoc); 1935 } 1936 1937 /// Build a new OpenMP 'num_teams' clause. 1938 /// 1939 /// By default, performs semantic analysis to build the new statement. 1940 /// Subclasses may override this routine to provide different behavior. 1941 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1942 SourceLocation LParenLoc, 1943 SourceLocation EndLoc) { 1944 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1945 EndLoc); 1946 } 1947 1948 /// Build a new OpenMP 'thread_limit' clause. 1949 /// 1950 /// By default, performs semantic analysis to build the new statement. 1951 /// Subclasses may override this routine to provide different behavior. 1952 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1953 SourceLocation StartLoc, 1954 SourceLocation LParenLoc, 1955 SourceLocation EndLoc) { 1956 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1957 LParenLoc, EndLoc); 1958 } 1959 1960 /// Build a new OpenMP 'priority' clause. 1961 /// 1962 /// By default, performs semantic analysis to build the new statement. 1963 /// Subclasses may override this routine to provide different behavior. 1964 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1965 SourceLocation LParenLoc, 1966 SourceLocation EndLoc) { 1967 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1968 EndLoc); 1969 } 1970 1971 /// Build a new OpenMP 'grainsize' clause. 1972 /// 1973 /// By default, performs semantic analysis to build the new statement. 1974 /// Subclasses may override this routine to provide different behavior. 1975 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1976 SourceLocation LParenLoc, 1977 SourceLocation EndLoc) { 1978 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1979 EndLoc); 1980 } 1981 1982 /// Build a new OpenMP 'num_tasks' clause. 1983 /// 1984 /// By default, performs semantic analysis to build the new statement. 1985 /// Subclasses may override this routine to provide different behavior. 1986 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1987 SourceLocation LParenLoc, 1988 SourceLocation EndLoc) { 1989 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1990 EndLoc); 1991 } 1992 1993 /// Build a new OpenMP 'hint' clause. 1994 /// 1995 /// By default, performs semantic analysis to build the new statement. 1996 /// Subclasses may override this routine to provide different behavior. 1997 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1998 SourceLocation LParenLoc, 1999 SourceLocation EndLoc) { 2000 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2001 } 2002 2003 /// Build a new OpenMP 'detach' clause. 2004 /// 2005 /// By default, performs semantic analysis to build the new statement. 2006 /// Subclasses may override this routine to provide different behavior. 2007 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2008 SourceLocation LParenLoc, 2009 SourceLocation EndLoc) { 2010 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2011 } 2012 2013 /// Build a new OpenMP 'dist_schedule' clause. 2014 /// 2015 /// By default, performs semantic analysis to build the new OpenMP clause. 2016 /// Subclasses may override this routine to provide different behavior. 2017 OMPClause * 2018 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2019 Expr *ChunkSize, SourceLocation StartLoc, 2020 SourceLocation LParenLoc, SourceLocation KindLoc, 2021 SourceLocation CommaLoc, SourceLocation EndLoc) { 2022 return getSema().ActOnOpenMPDistScheduleClause( 2023 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2024 } 2025 2026 /// Build a new OpenMP 'to' clause. 2027 /// 2028 /// By default, performs semantic analysis to build the new statement. 2029 /// Subclasses may override this routine to provide different behavior. 2030 OMPClause * 2031 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2032 ArrayRef<SourceLocation> MotionModifiersLoc, 2033 CXXScopeSpec &MapperIdScopeSpec, 2034 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2035 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2036 ArrayRef<Expr *> UnresolvedMappers) { 2037 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2038 MapperIdScopeSpec, MapperId, ColonLoc, 2039 VarList, Locs, UnresolvedMappers); 2040 } 2041 2042 /// Build a new OpenMP 'from' clause. 2043 /// 2044 /// By default, performs semantic analysis to build the new statement. 2045 /// Subclasses may override this routine to provide different behavior. 2046 OMPClause * 2047 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2048 ArrayRef<SourceLocation> MotionModifiersLoc, 2049 CXXScopeSpec &MapperIdScopeSpec, 2050 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2051 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2052 ArrayRef<Expr *> UnresolvedMappers) { 2053 return getSema().ActOnOpenMPFromClause( 2054 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2055 ColonLoc, VarList, Locs, UnresolvedMappers); 2056 } 2057 2058 /// Build a new OpenMP 'use_device_ptr' clause. 2059 /// 2060 /// By default, performs semantic analysis to build the new OpenMP clause. 2061 /// Subclasses may override this routine to provide different behavior. 2062 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2063 const OMPVarListLocTy &Locs) { 2064 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2065 } 2066 2067 /// Build a new OpenMP 'use_device_addr' clause. 2068 /// 2069 /// By default, performs semantic analysis to build the new OpenMP clause. 2070 /// Subclasses may override this routine to provide different behavior. 2071 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2072 const OMPVarListLocTy &Locs) { 2073 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2074 } 2075 2076 /// Build a new OpenMP 'is_device_ptr' clause. 2077 /// 2078 /// By default, performs semantic analysis to build the new OpenMP clause. 2079 /// Subclasses may override this routine to provide different behavior. 2080 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2081 const OMPVarListLocTy &Locs) { 2082 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2083 } 2084 2085 /// Build a new OpenMP 'defaultmap' clause. 2086 /// 2087 /// By default, performs semantic analysis to build the new OpenMP clause. 2088 /// Subclasses may override this routine to provide different behavior. 2089 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2090 OpenMPDefaultmapClauseKind Kind, 2091 SourceLocation StartLoc, 2092 SourceLocation LParenLoc, 2093 SourceLocation MLoc, 2094 SourceLocation KindLoc, 2095 SourceLocation EndLoc) { 2096 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2097 MLoc, KindLoc, EndLoc); 2098 } 2099 2100 /// Build a new OpenMP 'nontemporal' clause. 2101 /// 2102 /// By default, performs semantic analysis to build the new OpenMP clause. 2103 /// Subclasses may override this routine to provide different behavior. 2104 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2105 SourceLocation StartLoc, 2106 SourceLocation LParenLoc, 2107 SourceLocation EndLoc) { 2108 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2109 EndLoc); 2110 } 2111 2112 /// Build a new OpenMP 'inclusive' clause. 2113 /// 2114 /// By default, performs semantic analysis to build the new OpenMP clause. 2115 /// Subclasses may override this routine to provide different behavior. 2116 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2117 SourceLocation StartLoc, 2118 SourceLocation LParenLoc, 2119 SourceLocation EndLoc) { 2120 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2121 EndLoc); 2122 } 2123 2124 /// Build a new OpenMP 'exclusive' clause. 2125 /// 2126 /// By default, performs semantic analysis to build the new OpenMP clause. 2127 /// Subclasses may override this routine to provide different behavior. 2128 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2129 SourceLocation StartLoc, 2130 SourceLocation LParenLoc, 2131 SourceLocation EndLoc) { 2132 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2133 EndLoc); 2134 } 2135 2136 /// Build a new OpenMP 'uses_allocators' clause. 2137 /// 2138 /// By default, performs semantic analysis to build the new OpenMP clause. 2139 /// Subclasses may override this routine to provide different behavior. 2140 OMPClause *RebuildOMPUsesAllocatorsClause( 2141 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2142 SourceLocation LParenLoc, SourceLocation EndLoc) { 2143 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2144 Data); 2145 } 2146 2147 /// Build a new OpenMP 'affinity' clause. 2148 /// 2149 /// By default, performs semantic analysis to build the new OpenMP clause. 2150 /// Subclasses may override this routine to provide different behavior. 2151 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2152 SourceLocation LParenLoc, 2153 SourceLocation ColonLoc, 2154 SourceLocation EndLoc, Expr *Modifier, 2155 ArrayRef<Expr *> Locators) { 2156 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2157 EndLoc, Modifier, Locators); 2158 } 2159 2160 /// Build a new OpenMP 'order' clause. 2161 /// 2162 /// By default, performs semantic analysis to build the new OpenMP clause. 2163 /// Subclasses may override this routine to provide different behavior. 2164 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2165 SourceLocation KindKwLoc, 2166 SourceLocation StartLoc, 2167 SourceLocation LParenLoc, 2168 SourceLocation EndLoc) { 2169 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2170 LParenLoc, EndLoc); 2171 } 2172 2173 /// Build a new OpenMP 'init' clause. 2174 /// 2175 /// By default, performs semantic analysis to build the new OpenMP clause. 2176 /// Subclasses may override this routine to provide different behavior. 2177 OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2178 bool IsTarget, bool IsTargetSync, 2179 SourceLocation StartLoc, 2180 SourceLocation LParenLoc, 2181 SourceLocation VarLoc, 2182 SourceLocation EndLoc) { 2183 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2184 IsTargetSync, StartLoc, LParenLoc, 2185 VarLoc, EndLoc); 2186 } 2187 2188 /// Build a new OpenMP 'use' clause. 2189 /// 2190 /// By default, performs semantic analysis to build the new OpenMP clause. 2191 /// Subclasses may override this routine to provide different behavior. 2192 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2193 SourceLocation LParenLoc, 2194 SourceLocation VarLoc, SourceLocation EndLoc) { 2195 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2196 VarLoc, EndLoc); 2197 } 2198 2199 /// Build a new OpenMP 'destroy' clause. 2200 /// 2201 /// By default, performs semantic analysis to build the new OpenMP clause. 2202 /// Subclasses may override this routine to provide different behavior. 2203 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2204 SourceLocation LParenLoc, 2205 SourceLocation VarLoc, 2206 SourceLocation EndLoc) { 2207 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2208 VarLoc, EndLoc); 2209 } 2210 2211 /// Build a new OpenMP 'novariants' clause. 2212 /// 2213 /// By default, performs semantic analysis to build the new OpenMP clause. 2214 /// Subclasses may override this routine to provide different behavior. 2215 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2216 SourceLocation StartLoc, 2217 SourceLocation LParenLoc, 2218 SourceLocation EndLoc) { 2219 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2220 EndLoc); 2221 } 2222 2223 /// Rebuild the operand to an Objective-C \@synchronized statement. 2224 /// 2225 /// By default, performs semantic analysis to build the new statement. 2226 /// Subclasses may override this routine to provide different behavior. 2227 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2228 Expr *object) { 2229 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2230 } 2231 2232 /// Build a new Objective-C \@synchronized statement. 2233 /// 2234 /// By default, performs semantic analysis to build the new statement. 2235 /// Subclasses may override this routine to provide different behavior. 2236 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2237 Expr *Object, Stmt *Body) { 2238 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2239 } 2240 2241 /// Build a new Objective-C \@autoreleasepool statement. 2242 /// 2243 /// By default, performs semantic analysis to build the new statement. 2244 /// Subclasses may override this routine to provide different behavior. 2245 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2246 Stmt *Body) { 2247 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2248 } 2249 2250 /// Build a new Objective-C fast enumeration statement. 2251 /// 2252 /// By default, performs semantic analysis to build the new statement. 2253 /// Subclasses may override this routine to provide different behavior. 2254 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2255 Stmt *Element, 2256 Expr *Collection, 2257 SourceLocation RParenLoc, 2258 Stmt *Body) { 2259 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2260 Element, 2261 Collection, 2262 RParenLoc); 2263 if (ForEachStmt.isInvalid()) 2264 return StmtError(); 2265 2266 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2267 } 2268 2269 /// Build a new C++ exception declaration. 2270 /// 2271 /// By default, performs semantic analysis to build the new decaration. 2272 /// Subclasses may override this routine to provide different behavior. 2273 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2274 TypeSourceInfo *Declarator, 2275 SourceLocation StartLoc, 2276 SourceLocation IdLoc, 2277 IdentifierInfo *Id) { 2278 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2279 StartLoc, IdLoc, Id); 2280 if (Var) 2281 getSema().CurContext->addDecl(Var); 2282 return Var; 2283 } 2284 2285 /// Build a new C++ catch statement. 2286 /// 2287 /// By default, performs semantic analysis to build the new statement. 2288 /// Subclasses may override this routine to provide different behavior. 2289 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2290 VarDecl *ExceptionDecl, 2291 Stmt *Handler) { 2292 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2293 Handler)); 2294 } 2295 2296 /// Build a new C++ try statement. 2297 /// 2298 /// By default, performs semantic analysis to build the new statement. 2299 /// Subclasses may override this routine to provide different behavior. 2300 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2301 ArrayRef<Stmt *> Handlers) { 2302 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2303 } 2304 2305 /// Build a new C++0x range-based for statement. 2306 /// 2307 /// By default, performs semantic analysis to build the new statement. 2308 /// Subclasses may override this routine to provide different behavior. 2309 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2310 SourceLocation CoawaitLoc, Stmt *Init, 2311 SourceLocation ColonLoc, Stmt *Range, 2312 Stmt *Begin, Stmt *End, Expr *Cond, 2313 Expr *Inc, Stmt *LoopVar, 2314 SourceLocation RParenLoc) { 2315 // If we've just learned that the range is actually an Objective-C 2316 // collection, treat this as an Objective-C fast enumeration loop. 2317 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2318 if (RangeStmt->isSingleDecl()) { 2319 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2320 if (RangeVar->isInvalidDecl()) 2321 return StmtError(); 2322 2323 Expr *RangeExpr = RangeVar->getInit(); 2324 if (!RangeExpr->isTypeDependent() && 2325 RangeExpr->getType()->isObjCObjectPointerType()) { 2326 // FIXME: Support init-statements in Objective-C++20 ranged for 2327 // statement. 2328 if (Init) { 2329 return SemaRef.Diag(Init->getBeginLoc(), 2330 diag::err_objc_for_range_init_stmt) 2331 << Init->getSourceRange(); 2332 } 2333 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2334 RangeExpr, RParenLoc); 2335 } 2336 } 2337 } 2338 } 2339 2340 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2341 Range, Begin, End, Cond, Inc, LoopVar, 2342 RParenLoc, Sema::BFRK_Rebuild); 2343 } 2344 2345 /// Build a new C++0x range-based for statement. 2346 /// 2347 /// By default, performs semantic analysis to build the new statement. 2348 /// Subclasses may override this routine to provide different behavior. 2349 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2350 bool IsIfExists, 2351 NestedNameSpecifierLoc QualifierLoc, 2352 DeclarationNameInfo NameInfo, 2353 Stmt *Nested) { 2354 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2355 QualifierLoc, NameInfo, Nested); 2356 } 2357 2358 /// Attach body to a C++0x range-based for statement. 2359 /// 2360 /// By default, performs semantic analysis to finish the new statement. 2361 /// Subclasses may override this routine to provide different behavior. 2362 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2363 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2364 } 2365 2366 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2367 Stmt *TryBlock, Stmt *Handler) { 2368 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2369 } 2370 2371 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2372 Stmt *Block) { 2373 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2374 } 2375 2376 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2377 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2378 } 2379 2380 /// Build a new predefined expression. 2381 /// 2382 /// By default, performs semantic analysis to build the new expression. 2383 /// Subclasses may override this routine to provide different behavior. 2384 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2385 PredefinedExpr::IdentKind IK) { 2386 return getSema().BuildPredefinedExpr(Loc, IK); 2387 } 2388 2389 /// Build a new expression that references a declaration. 2390 /// 2391 /// By default, performs semantic analysis to build the new expression. 2392 /// Subclasses may override this routine to provide different behavior. 2393 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2394 LookupResult &R, 2395 bool RequiresADL) { 2396 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2397 } 2398 2399 2400 /// Build a new expression that references a declaration. 2401 /// 2402 /// By default, performs semantic analysis to build the new expression. 2403 /// Subclasses may override this routine to provide different behavior. 2404 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2405 ValueDecl *VD, 2406 const DeclarationNameInfo &NameInfo, 2407 NamedDecl *Found, 2408 TemplateArgumentListInfo *TemplateArgs) { 2409 CXXScopeSpec SS; 2410 SS.Adopt(QualifierLoc); 2411 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2412 TemplateArgs); 2413 } 2414 2415 /// Build a new expression in parentheses. 2416 /// 2417 /// By default, performs semantic analysis to build the new expression. 2418 /// Subclasses may override this routine to provide different behavior. 2419 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2420 SourceLocation RParen) { 2421 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2422 } 2423 2424 /// Build a new pseudo-destructor expression. 2425 /// 2426 /// By default, performs semantic analysis to build the new expression. 2427 /// Subclasses may override this routine to provide different behavior. 2428 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2429 SourceLocation OperatorLoc, 2430 bool isArrow, 2431 CXXScopeSpec &SS, 2432 TypeSourceInfo *ScopeType, 2433 SourceLocation CCLoc, 2434 SourceLocation TildeLoc, 2435 PseudoDestructorTypeStorage Destroyed); 2436 2437 /// Build a new unary operator expression. 2438 /// 2439 /// By default, performs semantic analysis to build the new expression. 2440 /// Subclasses may override this routine to provide different behavior. 2441 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2442 UnaryOperatorKind Opc, 2443 Expr *SubExpr) { 2444 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2445 } 2446 2447 /// Build a new builtin offsetof expression. 2448 /// 2449 /// By default, performs semantic analysis to build the new expression. 2450 /// Subclasses may override this routine to provide different behavior. 2451 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2452 TypeSourceInfo *Type, 2453 ArrayRef<Sema::OffsetOfComponent> Components, 2454 SourceLocation RParenLoc) { 2455 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2456 RParenLoc); 2457 } 2458 2459 /// Build a new sizeof, alignof or vec_step expression with a 2460 /// type argument. 2461 /// 2462 /// By default, performs semantic analysis to build the new expression. 2463 /// Subclasses may override this routine to provide different behavior. 2464 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2465 SourceLocation OpLoc, 2466 UnaryExprOrTypeTrait ExprKind, 2467 SourceRange R) { 2468 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2469 } 2470 2471 /// Build a new sizeof, alignof or vec step expression with an 2472 /// expression argument. 2473 /// 2474 /// By default, performs semantic analysis to build the new expression. 2475 /// Subclasses may override this routine to provide different behavior. 2476 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2477 UnaryExprOrTypeTrait ExprKind, 2478 SourceRange R) { 2479 ExprResult Result 2480 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2481 if (Result.isInvalid()) 2482 return ExprError(); 2483 2484 return Result; 2485 } 2486 2487 /// Build a new array subscript expression. 2488 /// 2489 /// By default, performs semantic analysis to build the new expression. 2490 /// Subclasses may override this routine to provide different behavior. 2491 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2492 SourceLocation LBracketLoc, 2493 Expr *RHS, 2494 SourceLocation RBracketLoc) { 2495 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2496 LBracketLoc, RHS, 2497 RBracketLoc); 2498 } 2499 2500 /// Build a new matrix subscript expression. 2501 /// 2502 /// By default, performs semantic analysis to build the new expression. 2503 /// Subclasses may override this routine to provide different behavior. 2504 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2505 Expr *ColumnIdx, 2506 SourceLocation RBracketLoc) { 2507 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2508 RBracketLoc); 2509 } 2510 2511 /// Build a new array section expression. 2512 /// 2513 /// By default, performs semantic analysis to build the new expression. 2514 /// Subclasses may override this routine to provide different behavior. 2515 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2516 Expr *LowerBound, 2517 SourceLocation ColonLocFirst, 2518 SourceLocation ColonLocSecond, 2519 Expr *Length, Expr *Stride, 2520 SourceLocation RBracketLoc) { 2521 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2522 ColonLocFirst, ColonLocSecond, 2523 Length, Stride, RBracketLoc); 2524 } 2525 2526 /// Build a new array shaping expression. 2527 /// 2528 /// By default, performs semantic analysis to build the new expression. 2529 /// Subclasses may override this routine to provide different behavior. 2530 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2531 SourceLocation RParenLoc, 2532 ArrayRef<Expr *> Dims, 2533 ArrayRef<SourceRange> BracketsRanges) { 2534 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2535 BracketsRanges); 2536 } 2537 2538 /// Build a new iterator expression. 2539 /// 2540 /// By default, performs semantic analysis to build the new expression. 2541 /// Subclasses may override this routine to provide different behavior. 2542 ExprResult RebuildOMPIteratorExpr( 2543 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2544 ArrayRef<Sema::OMPIteratorData> Data) { 2545 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2546 LLoc, RLoc, Data); 2547 } 2548 2549 /// Build a new call expression. 2550 /// 2551 /// By default, performs semantic analysis to build the new expression. 2552 /// Subclasses may override this routine to provide different behavior. 2553 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2554 MultiExprArg Args, 2555 SourceLocation RParenLoc, 2556 Expr *ExecConfig = nullptr) { 2557 return getSema().ActOnCallExpr( 2558 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2559 } 2560 2561 /// Build a new member access expression. 2562 /// 2563 /// By default, performs semantic analysis to build the new expression. 2564 /// Subclasses may override this routine to provide different behavior. 2565 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2566 bool isArrow, 2567 NestedNameSpecifierLoc QualifierLoc, 2568 SourceLocation TemplateKWLoc, 2569 const DeclarationNameInfo &MemberNameInfo, 2570 ValueDecl *Member, 2571 NamedDecl *FoundDecl, 2572 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2573 NamedDecl *FirstQualifierInScope) { 2574 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2575 isArrow); 2576 if (!Member->getDeclName()) { 2577 // We have a reference to an unnamed field. This is always the 2578 // base of an anonymous struct/union member access, i.e. the 2579 // field is always of record type. 2580 assert(Member->getType()->isRecordType() && 2581 "unnamed member not of record type?"); 2582 2583 BaseResult = 2584 getSema().PerformObjectMemberConversion(BaseResult.get(), 2585 QualifierLoc.getNestedNameSpecifier(), 2586 FoundDecl, Member); 2587 if (BaseResult.isInvalid()) 2588 return ExprError(); 2589 Base = BaseResult.get(); 2590 2591 CXXScopeSpec EmptySS; 2592 return getSema().BuildFieldReferenceExpr( 2593 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2594 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2595 } 2596 2597 CXXScopeSpec SS; 2598 SS.Adopt(QualifierLoc); 2599 2600 Base = BaseResult.get(); 2601 QualType BaseType = Base->getType(); 2602 2603 if (isArrow && !BaseType->isPointerType()) 2604 return ExprError(); 2605 2606 // FIXME: this involves duplicating earlier analysis in a lot of 2607 // cases; we should avoid this when possible. 2608 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2609 R.addDecl(FoundDecl); 2610 R.resolveKind(); 2611 2612 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2613 SS, TemplateKWLoc, 2614 FirstQualifierInScope, 2615 R, ExplicitTemplateArgs, 2616 /*S*/nullptr); 2617 } 2618 2619 /// Build a new binary operator expression. 2620 /// 2621 /// By default, performs semantic analysis to build the new expression. 2622 /// Subclasses may override this routine to provide different behavior. 2623 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2624 BinaryOperatorKind Opc, 2625 Expr *LHS, Expr *RHS) { 2626 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2627 } 2628 2629 /// Build a new rewritten operator expression. 2630 /// 2631 /// By default, performs semantic analysis to build the new expression. 2632 /// Subclasses may override this routine to provide different behavior. 2633 ExprResult RebuildCXXRewrittenBinaryOperator( 2634 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2635 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2636 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2637 RHS, /*RequiresADL*/false); 2638 } 2639 2640 /// Build a new conditional operator expression. 2641 /// 2642 /// By default, performs semantic analysis to build the new expression. 2643 /// Subclasses may override this routine to provide different behavior. 2644 ExprResult RebuildConditionalOperator(Expr *Cond, 2645 SourceLocation QuestionLoc, 2646 Expr *LHS, 2647 SourceLocation ColonLoc, 2648 Expr *RHS) { 2649 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2650 LHS, RHS); 2651 } 2652 2653 /// Build a new C-style cast 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 RebuildCStyleCastExpr(SourceLocation LParenLoc, 2658 TypeSourceInfo *TInfo, 2659 SourceLocation RParenLoc, 2660 Expr *SubExpr) { 2661 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2662 SubExpr); 2663 } 2664 2665 /// Build a new compound literal expression. 2666 /// 2667 /// By default, performs semantic analysis to build the new expression. 2668 /// Subclasses may override this routine to provide different behavior. 2669 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2670 TypeSourceInfo *TInfo, 2671 SourceLocation RParenLoc, 2672 Expr *Init) { 2673 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2674 Init); 2675 } 2676 2677 /// Build a new extended vector element access expression. 2678 /// 2679 /// By default, performs semantic analysis to build the new expression. 2680 /// Subclasses may override this routine to provide different behavior. 2681 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2682 SourceLocation OpLoc, 2683 SourceLocation AccessorLoc, 2684 IdentifierInfo &Accessor) { 2685 2686 CXXScopeSpec SS; 2687 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2688 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2689 OpLoc, /*IsArrow*/ false, 2690 SS, SourceLocation(), 2691 /*FirstQualifierInScope*/ nullptr, 2692 NameInfo, 2693 /* TemplateArgs */ nullptr, 2694 /*S*/ nullptr); 2695 } 2696 2697 /// Build a new initializer list expression. 2698 /// 2699 /// By default, performs semantic analysis to build the new expression. 2700 /// Subclasses may override this routine to provide different behavior. 2701 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2702 MultiExprArg Inits, 2703 SourceLocation RBraceLoc) { 2704 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2705 } 2706 2707 /// Build a new designated initializer expression. 2708 /// 2709 /// By default, performs semantic analysis to build the new expression. 2710 /// Subclasses may override this routine to provide different behavior. 2711 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2712 MultiExprArg ArrayExprs, 2713 SourceLocation EqualOrColonLoc, 2714 bool GNUSyntax, 2715 Expr *Init) { 2716 ExprResult Result 2717 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2718 Init); 2719 if (Result.isInvalid()) 2720 return ExprError(); 2721 2722 return Result; 2723 } 2724 2725 /// Build a new value-initialized expression. 2726 /// 2727 /// By default, builds the implicit value initialization without performing 2728 /// any semantic analysis. Subclasses may override this routine to provide 2729 /// different behavior. 2730 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2731 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2732 } 2733 2734 /// Build a new \c va_arg expression. 2735 /// 2736 /// By default, performs semantic analysis to build the new expression. 2737 /// Subclasses may override this routine to provide different behavior. 2738 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2739 Expr *SubExpr, TypeSourceInfo *TInfo, 2740 SourceLocation RParenLoc) { 2741 return getSema().BuildVAArgExpr(BuiltinLoc, 2742 SubExpr, TInfo, 2743 RParenLoc); 2744 } 2745 2746 /// Build a new expression list in parentheses. 2747 /// 2748 /// By default, performs semantic analysis to build the new expression. 2749 /// Subclasses may override this routine to provide different behavior. 2750 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2751 MultiExprArg SubExprs, 2752 SourceLocation RParenLoc) { 2753 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2754 } 2755 2756 /// Build a new address-of-label expression. 2757 /// 2758 /// By default, performs semantic analysis, using the name of the label 2759 /// rather than attempting to map the label statement itself. 2760 /// Subclasses may override this routine to provide different behavior. 2761 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2762 SourceLocation LabelLoc, LabelDecl *Label) { 2763 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2764 } 2765 2766 /// Build a new GNU statement expression. 2767 /// 2768 /// By default, performs semantic analysis to build the new expression. 2769 /// Subclasses may override this routine to provide different behavior. 2770 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2771 SourceLocation RParenLoc, unsigned TemplateDepth) { 2772 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2773 TemplateDepth); 2774 } 2775 2776 /// Build a new __builtin_choose_expr expression. 2777 /// 2778 /// By default, performs semantic analysis to build the new expression. 2779 /// Subclasses may override this routine to provide different behavior. 2780 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2781 Expr *Cond, Expr *LHS, Expr *RHS, 2782 SourceLocation RParenLoc) { 2783 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2784 Cond, LHS, RHS, 2785 RParenLoc); 2786 } 2787 2788 /// Build a new generic selection expression. 2789 /// 2790 /// By default, performs semantic analysis to build the new expression. 2791 /// Subclasses may override this routine to provide different behavior. 2792 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2793 SourceLocation DefaultLoc, 2794 SourceLocation RParenLoc, 2795 Expr *ControllingExpr, 2796 ArrayRef<TypeSourceInfo *> Types, 2797 ArrayRef<Expr *> Exprs) { 2798 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2799 ControllingExpr, Types, Exprs); 2800 } 2801 2802 /// Build a new overloaded operator call expression. 2803 /// 2804 /// By default, performs semantic analysis to build the new expression. 2805 /// The semantic analysis provides the behavior of template instantiation, 2806 /// copying with transformations that turn what looks like an overloaded 2807 /// operator call into a use of a builtin operator, performing 2808 /// argument-dependent lookup, etc. Subclasses may override this routine to 2809 /// provide different behavior. 2810 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2811 SourceLocation OpLoc, 2812 Expr *Callee, 2813 Expr *First, 2814 Expr *Second); 2815 2816 /// Build a new C++ "named" cast expression, such as static_cast or 2817 /// reinterpret_cast. 2818 /// 2819 /// By default, this routine dispatches to one of the more-specific routines 2820 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2821 /// Subclasses may override this routine to provide different behavior. 2822 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2823 Stmt::StmtClass Class, 2824 SourceLocation LAngleLoc, 2825 TypeSourceInfo *TInfo, 2826 SourceLocation RAngleLoc, 2827 SourceLocation LParenLoc, 2828 Expr *SubExpr, 2829 SourceLocation RParenLoc) { 2830 switch (Class) { 2831 case Stmt::CXXStaticCastExprClass: 2832 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2833 RAngleLoc, LParenLoc, 2834 SubExpr, RParenLoc); 2835 2836 case Stmt::CXXDynamicCastExprClass: 2837 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2838 RAngleLoc, LParenLoc, 2839 SubExpr, RParenLoc); 2840 2841 case Stmt::CXXReinterpretCastExprClass: 2842 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2843 RAngleLoc, LParenLoc, 2844 SubExpr, 2845 RParenLoc); 2846 2847 case Stmt::CXXConstCastExprClass: 2848 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2849 RAngleLoc, LParenLoc, 2850 SubExpr, RParenLoc); 2851 2852 case Stmt::CXXAddrspaceCastExprClass: 2853 return getDerived().RebuildCXXAddrspaceCastExpr( 2854 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2855 2856 default: 2857 llvm_unreachable("Invalid C++ named cast"); 2858 } 2859 } 2860 2861 /// Build a new C++ static_cast expression. 2862 /// 2863 /// By default, performs semantic analysis to build the new expression. 2864 /// Subclasses may override this routine to provide different behavior. 2865 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2866 SourceLocation LAngleLoc, 2867 TypeSourceInfo *TInfo, 2868 SourceLocation RAngleLoc, 2869 SourceLocation LParenLoc, 2870 Expr *SubExpr, 2871 SourceLocation RParenLoc) { 2872 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2873 TInfo, SubExpr, 2874 SourceRange(LAngleLoc, RAngleLoc), 2875 SourceRange(LParenLoc, RParenLoc)); 2876 } 2877 2878 /// Build a new C++ dynamic_cast expression. 2879 /// 2880 /// By default, performs semantic analysis to build the new expression. 2881 /// Subclasses may override this routine to provide different behavior. 2882 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2883 SourceLocation LAngleLoc, 2884 TypeSourceInfo *TInfo, 2885 SourceLocation RAngleLoc, 2886 SourceLocation LParenLoc, 2887 Expr *SubExpr, 2888 SourceLocation RParenLoc) { 2889 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2890 TInfo, SubExpr, 2891 SourceRange(LAngleLoc, RAngleLoc), 2892 SourceRange(LParenLoc, RParenLoc)); 2893 } 2894 2895 /// Build a new C++ reinterpret_cast expression. 2896 /// 2897 /// By default, performs semantic analysis to build the new expression. 2898 /// Subclasses may override this routine to provide different behavior. 2899 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2900 SourceLocation LAngleLoc, 2901 TypeSourceInfo *TInfo, 2902 SourceLocation RAngleLoc, 2903 SourceLocation LParenLoc, 2904 Expr *SubExpr, 2905 SourceLocation RParenLoc) { 2906 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2907 TInfo, SubExpr, 2908 SourceRange(LAngleLoc, RAngleLoc), 2909 SourceRange(LParenLoc, RParenLoc)); 2910 } 2911 2912 /// Build a new C++ const_cast expression. 2913 /// 2914 /// By default, performs semantic analysis to build the new expression. 2915 /// Subclasses may override this routine to provide different behavior. 2916 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2917 SourceLocation LAngleLoc, 2918 TypeSourceInfo *TInfo, 2919 SourceLocation RAngleLoc, 2920 SourceLocation LParenLoc, 2921 Expr *SubExpr, 2922 SourceLocation RParenLoc) { 2923 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2924 TInfo, SubExpr, 2925 SourceRange(LAngleLoc, RAngleLoc), 2926 SourceRange(LParenLoc, RParenLoc)); 2927 } 2928 2929 ExprResult 2930 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2931 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2932 SourceLocation LParenLoc, Expr *SubExpr, 2933 SourceLocation RParenLoc) { 2934 return getSema().BuildCXXNamedCast( 2935 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2936 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2937 } 2938 2939 /// Build a new C++ functional-style cast expression. 2940 /// 2941 /// By default, performs semantic analysis to build the new expression. 2942 /// Subclasses may override this routine to provide different behavior. 2943 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2944 SourceLocation LParenLoc, 2945 Expr *Sub, 2946 SourceLocation RParenLoc, 2947 bool ListInitialization) { 2948 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2949 MultiExprArg(&Sub, 1), RParenLoc, 2950 ListInitialization); 2951 } 2952 2953 /// Build a new C++ __builtin_bit_cast expression. 2954 /// 2955 /// By default, performs semantic analysis to build the new expression. 2956 /// Subclasses may override this routine to provide different behavior. 2957 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2958 TypeSourceInfo *TSI, Expr *Sub, 2959 SourceLocation RParenLoc) { 2960 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2961 } 2962 2963 /// Build a new C++ typeid(type) expression. 2964 /// 2965 /// By default, performs semantic analysis to build the new expression. 2966 /// Subclasses may override this routine to provide different behavior. 2967 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2968 SourceLocation TypeidLoc, 2969 TypeSourceInfo *Operand, 2970 SourceLocation RParenLoc) { 2971 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2972 RParenLoc); 2973 } 2974 2975 2976 /// Build a new C++ typeid(expr) expression. 2977 /// 2978 /// By default, performs semantic analysis to build the new expression. 2979 /// Subclasses may override this routine to provide different behavior. 2980 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2981 SourceLocation TypeidLoc, 2982 Expr *Operand, 2983 SourceLocation RParenLoc) { 2984 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2985 RParenLoc); 2986 } 2987 2988 /// Build a new C++ __uuidof(type) expression. 2989 /// 2990 /// By default, performs semantic analysis to build the new expression. 2991 /// Subclasses may override this routine to provide different behavior. 2992 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2993 TypeSourceInfo *Operand, 2994 SourceLocation RParenLoc) { 2995 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2996 } 2997 2998 /// Build a new C++ __uuidof(expr) expression. 2999 /// 3000 /// By default, performs semantic analysis to build the new expression. 3001 /// Subclasses may override this routine to provide different behavior. 3002 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3003 Expr *Operand, SourceLocation RParenLoc) { 3004 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3005 } 3006 3007 /// Build a new C++ "this" expression. 3008 /// 3009 /// By default, builds a new "this" expression without performing any 3010 /// semantic analysis. Subclasses may override this routine to provide 3011 /// different behavior. 3012 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3013 QualType ThisType, 3014 bool isImplicit) { 3015 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3016 } 3017 3018 /// Build a new C++ throw expression. 3019 /// 3020 /// By default, performs semantic analysis to build the new expression. 3021 /// Subclasses may override this routine to provide different behavior. 3022 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3023 bool IsThrownVariableInScope) { 3024 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3025 } 3026 3027 /// Build a new C++ default-argument expression. 3028 /// 3029 /// By default, builds a new default-argument expression, which does not 3030 /// require any semantic analysis. Subclasses may override this routine to 3031 /// provide different behavior. 3032 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3033 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3034 getSema().CurContext); 3035 } 3036 3037 /// Build a new C++11 default-initialization expression. 3038 /// 3039 /// By default, builds a new default field initialization expression, which 3040 /// does not require any semantic analysis. Subclasses may override this 3041 /// routine to provide different behavior. 3042 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3043 FieldDecl *Field) { 3044 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3045 getSema().CurContext); 3046 } 3047 3048 /// Build a new C++ zero-initialization expression. 3049 /// 3050 /// By default, performs semantic analysis to build the new expression. 3051 /// Subclasses may override this routine to provide different behavior. 3052 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3053 SourceLocation LParenLoc, 3054 SourceLocation RParenLoc) { 3055 return getSema().BuildCXXTypeConstructExpr( 3056 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3057 } 3058 3059 /// Build a new C++ "new" expression. 3060 /// 3061 /// By default, performs semantic analysis to build the new expression. 3062 /// Subclasses may override this routine to provide different behavior. 3063 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3064 bool UseGlobal, 3065 SourceLocation PlacementLParen, 3066 MultiExprArg PlacementArgs, 3067 SourceLocation PlacementRParen, 3068 SourceRange TypeIdParens, 3069 QualType AllocatedType, 3070 TypeSourceInfo *AllocatedTypeInfo, 3071 Optional<Expr *> ArraySize, 3072 SourceRange DirectInitRange, 3073 Expr *Initializer) { 3074 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3075 PlacementLParen, 3076 PlacementArgs, 3077 PlacementRParen, 3078 TypeIdParens, 3079 AllocatedType, 3080 AllocatedTypeInfo, 3081 ArraySize, 3082 DirectInitRange, 3083 Initializer); 3084 } 3085 3086 /// Build a new C++ "delete" expression. 3087 /// 3088 /// By default, performs semantic analysis to build the new expression. 3089 /// Subclasses may override this routine to provide different behavior. 3090 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3091 bool IsGlobalDelete, 3092 bool IsArrayForm, 3093 Expr *Operand) { 3094 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3095 Operand); 3096 } 3097 3098 /// Build a new type trait expression. 3099 /// 3100 /// By default, performs semantic analysis to build the new expression. 3101 /// Subclasses may override this routine to provide different behavior. 3102 ExprResult RebuildTypeTrait(TypeTrait Trait, 3103 SourceLocation StartLoc, 3104 ArrayRef<TypeSourceInfo *> Args, 3105 SourceLocation RParenLoc) { 3106 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3107 } 3108 3109 /// Build a new array type trait expression. 3110 /// 3111 /// By default, performs semantic analysis to build the new expression. 3112 /// Subclasses may override this routine to provide different behavior. 3113 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3114 SourceLocation StartLoc, 3115 TypeSourceInfo *TSInfo, 3116 Expr *DimExpr, 3117 SourceLocation RParenLoc) { 3118 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3119 } 3120 3121 /// Build a new expression trait expression. 3122 /// 3123 /// By default, performs semantic analysis to build the new expression. 3124 /// Subclasses may override this routine to provide different behavior. 3125 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3126 SourceLocation StartLoc, 3127 Expr *Queried, 3128 SourceLocation RParenLoc) { 3129 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3130 } 3131 3132 /// Build a new (previously unresolved) declaration reference 3133 /// expression. 3134 /// 3135 /// By default, performs semantic analysis to build the new expression. 3136 /// Subclasses may override this routine to provide different behavior. 3137 ExprResult RebuildDependentScopeDeclRefExpr( 3138 NestedNameSpecifierLoc QualifierLoc, 3139 SourceLocation TemplateKWLoc, 3140 const DeclarationNameInfo &NameInfo, 3141 const TemplateArgumentListInfo *TemplateArgs, 3142 bool IsAddressOfOperand, 3143 TypeSourceInfo **RecoveryTSI) { 3144 CXXScopeSpec SS; 3145 SS.Adopt(QualifierLoc); 3146 3147 if (TemplateArgs || TemplateKWLoc.isValid()) 3148 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3149 TemplateArgs); 3150 3151 return getSema().BuildQualifiedDeclarationNameExpr( 3152 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3153 } 3154 3155 /// Build a new template-id expression. 3156 /// 3157 /// By default, performs semantic analysis to build the new expression. 3158 /// Subclasses may override this routine to provide different behavior. 3159 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3160 SourceLocation TemplateKWLoc, 3161 LookupResult &R, 3162 bool RequiresADL, 3163 const TemplateArgumentListInfo *TemplateArgs) { 3164 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3165 TemplateArgs); 3166 } 3167 3168 /// Build a new object-construction expression. 3169 /// 3170 /// By default, performs semantic analysis to build the new expression. 3171 /// Subclasses may override this routine to provide different behavior. 3172 ExprResult RebuildCXXConstructExpr(QualType T, 3173 SourceLocation Loc, 3174 CXXConstructorDecl *Constructor, 3175 bool IsElidable, 3176 MultiExprArg Args, 3177 bool HadMultipleCandidates, 3178 bool ListInitialization, 3179 bool StdInitListInitialization, 3180 bool RequiresZeroInit, 3181 CXXConstructExpr::ConstructionKind ConstructKind, 3182 SourceRange ParenRange) { 3183 // Reconstruct the constructor we originally found, which might be 3184 // different if this is a call to an inherited constructor. 3185 CXXConstructorDecl *FoundCtor = Constructor; 3186 if (Constructor->isInheritingConstructor()) 3187 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3188 3189 SmallVector<Expr *, 8> ConvertedArgs; 3190 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3191 ConvertedArgs)) 3192 return ExprError(); 3193 3194 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3195 IsElidable, 3196 ConvertedArgs, 3197 HadMultipleCandidates, 3198 ListInitialization, 3199 StdInitListInitialization, 3200 RequiresZeroInit, ConstructKind, 3201 ParenRange); 3202 } 3203 3204 /// Build a new implicit construction via inherited constructor 3205 /// expression. 3206 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3207 CXXConstructorDecl *Constructor, 3208 bool ConstructsVBase, 3209 bool InheritedFromVBase) { 3210 return new (getSema().Context) CXXInheritedCtorInitExpr( 3211 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3212 } 3213 3214 /// Build a new object-construction expression. 3215 /// 3216 /// By default, performs semantic analysis to build the new expression. 3217 /// Subclasses may override this routine to provide different behavior. 3218 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3219 SourceLocation LParenOrBraceLoc, 3220 MultiExprArg Args, 3221 SourceLocation RParenOrBraceLoc, 3222 bool ListInitialization) { 3223 return getSema().BuildCXXTypeConstructExpr( 3224 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3225 } 3226 3227 /// Build a new object-construction expression. 3228 /// 3229 /// By default, performs semantic analysis to build the new expression. 3230 /// Subclasses may override this routine to provide different behavior. 3231 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3232 SourceLocation LParenLoc, 3233 MultiExprArg Args, 3234 SourceLocation RParenLoc, 3235 bool ListInitialization) { 3236 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3237 RParenLoc, ListInitialization); 3238 } 3239 3240 /// Build a new member reference expression. 3241 /// 3242 /// By default, performs semantic analysis to build the new expression. 3243 /// Subclasses may override this routine to provide different behavior. 3244 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3245 QualType BaseType, 3246 bool IsArrow, 3247 SourceLocation OperatorLoc, 3248 NestedNameSpecifierLoc QualifierLoc, 3249 SourceLocation TemplateKWLoc, 3250 NamedDecl *FirstQualifierInScope, 3251 const DeclarationNameInfo &MemberNameInfo, 3252 const TemplateArgumentListInfo *TemplateArgs) { 3253 CXXScopeSpec SS; 3254 SS.Adopt(QualifierLoc); 3255 3256 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3257 OperatorLoc, IsArrow, 3258 SS, TemplateKWLoc, 3259 FirstQualifierInScope, 3260 MemberNameInfo, 3261 TemplateArgs, /*S*/nullptr); 3262 } 3263 3264 /// Build a new member reference expression. 3265 /// 3266 /// By default, performs semantic analysis to build the new expression. 3267 /// Subclasses may override this routine to provide different behavior. 3268 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3269 SourceLocation OperatorLoc, 3270 bool IsArrow, 3271 NestedNameSpecifierLoc QualifierLoc, 3272 SourceLocation TemplateKWLoc, 3273 NamedDecl *FirstQualifierInScope, 3274 LookupResult &R, 3275 const TemplateArgumentListInfo *TemplateArgs) { 3276 CXXScopeSpec SS; 3277 SS.Adopt(QualifierLoc); 3278 3279 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3280 OperatorLoc, IsArrow, 3281 SS, TemplateKWLoc, 3282 FirstQualifierInScope, 3283 R, TemplateArgs, /*S*/nullptr); 3284 } 3285 3286 /// Build a new noexcept expression. 3287 /// 3288 /// By default, performs semantic analysis to build the new expression. 3289 /// Subclasses may override this routine to provide different behavior. 3290 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3291 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3292 } 3293 3294 /// Build a new expression to compute the length of a parameter pack. 3295 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3296 NamedDecl *Pack, 3297 SourceLocation PackLoc, 3298 SourceLocation RParenLoc, 3299 Optional<unsigned> Length, 3300 ArrayRef<TemplateArgument> PartialArgs) { 3301 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3302 RParenLoc, Length, PartialArgs); 3303 } 3304 3305 /// Build a new expression representing a call to a source location 3306 /// builtin. 3307 /// 3308 /// By default, performs semantic analysis to build the new expression. 3309 /// Subclasses may override this routine to provide different behavior. 3310 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3311 SourceLocation BuiltinLoc, 3312 SourceLocation RPLoc, 3313 DeclContext *ParentContext) { 3314 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3315 } 3316 3317 /// Build a new Objective-C boxed expression. 3318 /// 3319 /// By default, performs semantic analysis to build the new expression. 3320 /// Subclasses may override this routine to provide different behavior. 3321 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3322 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3323 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3324 TemplateArgumentListInfo *TALI) { 3325 CXXScopeSpec SS; 3326 SS.Adopt(NNS); 3327 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3328 ConceptNameInfo, 3329 FoundDecl, 3330 NamedConcept, TALI); 3331 if (Result.isInvalid()) 3332 return ExprError(); 3333 return Result; 3334 } 3335 3336 /// \brief Build a new requires expression. 3337 /// 3338 /// By default, performs semantic analysis to build the new expression. 3339 /// Subclasses may override this routine to provide different behavior. 3340 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3341 RequiresExprBodyDecl *Body, 3342 ArrayRef<ParmVarDecl *> LocalParameters, 3343 ArrayRef<concepts::Requirement *> Requirements, 3344 SourceLocation ClosingBraceLoc) { 3345 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3346 LocalParameters, Requirements, ClosingBraceLoc); 3347 } 3348 3349 concepts::TypeRequirement * 3350 RebuildTypeRequirement( 3351 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3352 return SemaRef.BuildTypeRequirement(SubstDiag); 3353 } 3354 3355 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3356 return SemaRef.BuildTypeRequirement(T); 3357 } 3358 3359 concepts::ExprRequirement * 3360 RebuildExprRequirement( 3361 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3362 SourceLocation NoexceptLoc, 3363 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3364 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3365 std::move(Ret)); 3366 } 3367 3368 concepts::ExprRequirement * 3369 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3370 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3371 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3372 std::move(Ret)); 3373 } 3374 3375 concepts::NestedRequirement * 3376 RebuildNestedRequirement( 3377 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3378 return SemaRef.BuildNestedRequirement(SubstDiag); 3379 } 3380 3381 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3382 return SemaRef.BuildNestedRequirement(Constraint); 3383 } 3384 3385 /// \brief Build a new Objective-C boxed expression. 3386 /// 3387 /// By default, performs semantic analysis to build the new expression. 3388 /// Subclasses may override this routine to provide different behavior. 3389 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3390 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3391 } 3392 3393 /// Build a new Objective-C array literal. 3394 /// 3395 /// By default, performs semantic analysis to build the new expression. 3396 /// Subclasses may override this routine to provide different behavior. 3397 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3398 Expr **Elements, unsigned NumElements) { 3399 return getSema().BuildObjCArrayLiteral(Range, 3400 MultiExprArg(Elements, NumElements)); 3401 } 3402 3403 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3404 Expr *Base, Expr *Key, 3405 ObjCMethodDecl *getterMethod, 3406 ObjCMethodDecl *setterMethod) { 3407 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3408 getterMethod, setterMethod); 3409 } 3410 3411 /// Build a new Objective-C dictionary literal. 3412 /// 3413 /// By default, performs semantic analysis to build the new expression. 3414 /// Subclasses may override this routine to provide different behavior. 3415 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3416 MutableArrayRef<ObjCDictionaryElement> Elements) { 3417 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3418 } 3419 3420 /// Build a new Objective-C \@encode expression. 3421 /// 3422 /// By default, performs semantic analysis to build the new expression. 3423 /// Subclasses may override this routine to provide different behavior. 3424 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3425 TypeSourceInfo *EncodeTypeInfo, 3426 SourceLocation RParenLoc) { 3427 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3428 } 3429 3430 /// Build a new Objective-C class message. 3431 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3432 Selector Sel, 3433 ArrayRef<SourceLocation> SelectorLocs, 3434 ObjCMethodDecl *Method, 3435 SourceLocation LBracLoc, 3436 MultiExprArg Args, 3437 SourceLocation RBracLoc) { 3438 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3439 ReceiverTypeInfo->getType(), 3440 /*SuperLoc=*/SourceLocation(), 3441 Sel, Method, LBracLoc, SelectorLocs, 3442 RBracLoc, Args); 3443 } 3444 3445 /// Build a new Objective-C instance message. 3446 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3447 Selector Sel, 3448 ArrayRef<SourceLocation> SelectorLocs, 3449 ObjCMethodDecl *Method, 3450 SourceLocation LBracLoc, 3451 MultiExprArg Args, 3452 SourceLocation RBracLoc) { 3453 return SemaRef.BuildInstanceMessage(Receiver, 3454 Receiver->getType(), 3455 /*SuperLoc=*/SourceLocation(), 3456 Sel, Method, LBracLoc, SelectorLocs, 3457 RBracLoc, Args); 3458 } 3459 3460 /// Build a new Objective-C instance/class message to 'super'. 3461 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3462 Selector Sel, 3463 ArrayRef<SourceLocation> SelectorLocs, 3464 QualType SuperType, 3465 ObjCMethodDecl *Method, 3466 SourceLocation LBracLoc, 3467 MultiExprArg Args, 3468 SourceLocation RBracLoc) { 3469 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3470 SuperType, 3471 SuperLoc, 3472 Sel, Method, LBracLoc, SelectorLocs, 3473 RBracLoc, Args) 3474 : SemaRef.BuildClassMessage(nullptr, 3475 SuperType, 3476 SuperLoc, 3477 Sel, Method, LBracLoc, SelectorLocs, 3478 RBracLoc, Args); 3479 3480 3481 } 3482 3483 /// Build a new Objective-C ivar reference expression. 3484 /// 3485 /// By default, performs semantic analysis to build the new expression. 3486 /// Subclasses may override this routine to provide different behavior. 3487 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3488 SourceLocation IvarLoc, 3489 bool IsArrow, bool IsFreeIvar) { 3490 CXXScopeSpec SS; 3491 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3492 ExprResult Result = getSema().BuildMemberReferenceExpr( 3493 BaseArg, BaseArg->getType(), 3494 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3495 /*FirstQualifierInScope=*/nullptr, NameInfo, 3496 /*TemplateArgs=*/nullptr, 3497 /*S=*/nullptr); 3498 if (IsFreeIvar && Result.isUsable()) 3499 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3500 return Result; 3501 } 3502 3503 /// Build a new Objective-C property reference expression. 3504 /// 3505 /// By default, performs semantic analysis to build the new expression. 3506 /// Subclasses may override this routine to provide different behavior. 3507 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3508 ObjCPropertyDecl *Property, 3509 SourceLocation PropertyLoc) { 3510 CXXScopeSpec SS; 3511 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3512 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3513 /*FIXME:*/PropertyLoc, 3514 /*IsArrow=*/false, 3515 SS, SourceLocation(), 3516 /*FirstQualifierInScope=*/nullptr, 3517 NameInfo, 3518 /*TemplateArgs=*/nullptr, 3519 /*S=*/nullptr); 3520 } 3521 3522 /// Build a new Objective-C property reference expression. 3523 /// 3524 /// By default, performs semantic analysis to build the new expression. 3525 /// Subclasses may override this routine to provide different behavior. 3526 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3527 ObjCMethodDecl *Getter, 3528 ObjCMethodDecl *Setter, 3529 SourceLocation PropertyLoc) { 3530 // Since these expressions can only be value-dependent, we do not 3531 // need to perform semantic analysis again. 3532 return Owned( 3533 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3534 VK_LValue, OK_ObjCProperty, 3535 PropertyLoc, Base)); 3536 } 3537 3538 /// Build a new Objective-C "isa" expression. 3539 /// 3540 /// By default, performs semantic analysis to build the new expression. 3541 /// Subclasses may override this routine to provide different behavior. 3542 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3543 SourceLocation OpLoc, bool IsArrow) { 3544 CXXScopeSpec SS; 3545 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3546 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3547 OpLoc, IsArrow, 3548 SS, SourceLocation(), 3549 /*FirstQualifierInScope=*/nullptr, 3550 NameInfo, 3551 /*TemplateArgs=*/nullptr, 3552 /*S=*/nullptr); 3553 } 3554 3555 /// Build a new shuffle vector expression. 3556 /// 3557 /// By default, performs semantic analysis to build the new expression. 3558 /// Subclasses may override this routine to provide different behavior. 3559 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3560 MultiExprArg SubExprs, 3561 SourceLocation RParenLoc) { 3562 // Find the declaration for __builtin_shufflevector 3563 const IdentifierInfo &Name 3564 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3565 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3566 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3567 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3568 3569 // Build a reference to the __builtin_shufflevector builtin 3570 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3571 Expr *Callee = new (SemaRef.Context) 3572 DeclRefExpr(SemaRef.Context, Builtin, false, 3573 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3574 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3575 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3576 CK_BuiltinFnToFnPtr).get(); 3577 3578 // Build the CallExpr 3579 ExprResult TheCall = CallExpr::Create( 3580 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3581 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3582 FPOptionsOverride()); 3583 3584 // Type-check the __builtin_shufflevector expression. 3585 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3586 } 3587 3588 /// Build a new convert vector expression. 3589 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3590 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3591 SourceLocation RParenLoc) { 3592 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3593 BuiltinLoc, RParenLoc); 3594 } 3595 3596 /// Build a new template argument pack expansion. 3597 /// 3598 /// By default, performs semantic analysis to build a new pack expansion 3599 /// for a template argument. Subclasses may override this routine to provide 3600 /// different behavior. 3601 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3602 SourceLocation EllipsisLoc, 3603 Optional<unsigned> NumExpansions) { 3604 switch (Pattern.getArgument().getKind()) { 3605 case TemplateArgument::Expression: { 3606 ExprResult Result 3607 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3608 EllipsisLoc, NumExpansions); 3609 if (Result.isInvalid()) 3610 return TemplateArgumentLoc(); 3611 3612 return TemplateArgumentLoc(Result.get(), Result.get()); 3613 } 3614 3615 case TemplateArgument::Template: 3616 return TemplateArgumentLoc( 3617 SemaRef.Context, 3618 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3619 NumExpansions), 3620 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3621 EllipsisLoc); 3622 3623 case TemplateArgument::Null: 3624 case TemplateArgument::Integral: 3625 case TemplateArgument::Declaration: 3626 case TemplateArgument::Pack: 3627 case TemplateArgument::TemplateExpansion: 3628 case TemplateArgument::NullPtr: 3629 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3630 3631 case TemplateArgument::Type: 3632 if (TypeSourceInfo *Expansion 3633 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3634 EllipsisLoc, 3635 NumExpansions)) 3636 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3637 Expansion); 3638 break; 3639 } 3640 3641 return TemplateArgumentLoc(); 3642 } 3643 3644 /// Build a new expression pack expansion. 3645 /// 3646 /// By default, performs semantic analysis to build a new pack expansion 3647 /// for an expression. Subclasses may override this routine to provide 3648 /// different behavior. 3649 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3650 Optional<unsigned> NumExpansions) { 3651 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3652 } 3653 3654 /// Build a new C++1z fold-expression. 3655 /// 3656 /// By default, performs semantic analysis in order to build a new fold 3657 /// expression. 3658 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3659 SourceLocation LParenLoc, Expr *LHS, 3660 BinaryOperatorKind Operator, 3661 SourceLocation EllipsisLoc, Expr *RHS, 3662 SourceLocation RParenLoc, 3663 Optional<unsigned> NumExpansions) { 3664 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3665 EllipsisLoc, RHS, RParenLoc, 3666 NumExpansions); 3667 } 3668 3669 /// Build an empty C++1z fold-expression with the given operator. 3670 /// 3671 /// By default, produces the fallback value for the fold-expression, or 3672 /// produce an error if there is no fallback value. 3673 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3674 BinaryOperatorKind Operator) { 3675 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3676 } 3677 3678 /// Build a new atomic operation expression. 3679 /// 3680 /// By default, performs semantic analysis to build the new expression. 3681 /// Subclasses may override this routine to provide different behavior. 3682 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3683 AtomicExpr::AtomicOp Op, 3684 SourceLocation RParenLoc) { 3685 // Use this for all of the locations, since we don't know the difference 3686 // between the call and the expr at this point. 3687 SourceRange Range{BuiltinLoc, RParenLoc}; 3688 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3689 Sema::AtomicArgumentOrder::AST); 3690 } 3691 3692 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3693 ArrayRef<Expr *> SubExprs, QualType Type) { 3694 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3695 } 3696 3697 private: 3698 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3699 QualType ObjectType, 3700 NamedDecl *FirstQualifierInScope, 3701 CXXScopeSpec &SS); 3702 3703 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3704 QualType ObjectType, 3705 NamedDecl *FirstQualifierInScope, 3706 CXXScopeSpec &SS); 3707 3708 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3709 NamedDecl *FirstQualifierInScope, 3710 CXXScopeSpec &SS); 3711 3712 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3713 DependentNameTypeLoc TL, 3714 bool DeducibleTSTContext); 3715 }; 3716 3717 template <typename Derived> 3718 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3719 if (!S) 3720 return S; 3721 3722 switch (S->getStmtClass()) { 3723 case Stmt::NoStmtClass: break; 3724 3725 // Transform individual statement nodes 3726 // Pass SDK into statements that can produce a value 3727 #define STMT(Node, Parent) \ 3728 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3729 #define VALUESTMT(Node, Parent) \ 3730 case Stmt::Node##Class: \ 3731 return getDerived().Transform##Node(cast<Node>(S), SDK); 3732 #define ABSTRACT_STMT(Node) 3733 #define EXPR(Node, Parent) 3734 #include "clang/AST/StmtNodes.inc" 3735 3736 // Transform expressions by calling TransformExpr. 3737 #define STMT(Node, Parent) 3738 #define ABSTRACT_STMT(Stmt) 3739 #define EXPR(Node, Parent) case Stmt::Node##Class: 3740 #include "clang/AST/StmtNodes.inc" 3741 { 3742 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3743 3744 if (SDK == SDK_StmtExprResult) 3745 E = getSema().ActOnStmtExprResult(E); 3746 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3747 } 3748 } 3749 3750 return S; 3751 } 3752 3753 template<typename Derived> 3754 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3755 if (!S) 3756 return S; 3757 3758 switch (S->getClauseKind()) { 3759 default: break; 3760 // Transform individual clause nodes 3761 #define GEN_CLANG_CLAUSE_CLASS 3762 #define CLAUSE_CLASS(Enum, Str, Class) \ 3763 case Enum: \ 3764 return getDerived().Transform##Class(cast<Class>(S)); 3765 #include "llvm/Frontend/OpenMP/OMP.inc" 3766 } 3767 3768 return S; 3769 } 3770 3771 3772 template<typename Derived> 3773 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3774 if (!E) 3775 return E; 3776 3777 switch (E->getStmtClass()) { 3778 case Stmt::NoStmtClass: break; 3779 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3780 #define ABSTRACT_STMT(Stmt) 3781 #define EXPR(Node, Parent) \ 3782 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3783 #include "clang/AST/StmtNodes.inc" 3784 } 3785 3786 return E; 3787 } 3788 3789 template<typename Derived> 3790 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3791 bool NotCopyInit) { 3792 // Initializers are instantiated like expressions, except that various outer 3793 // layers are stripped. 3794 if (!Init) 3795 return Init; 3796 3797 if (auto *FE = dyn_cast<FullExpr>(Init)) 3798 Init = FE->getSubExpr(); 3799 3800 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3801 Init = AIL->getCommonExpr(); 3802 3803 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3804 Init = MTE->getSubExpr(); 3805 3806 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3807 Init = Binder->getSubExpr(); 3808 3809 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3810 Init = ICE->getSubExprAsWritten(); 3811 3812 if (CXXStdInitializerListExpr *ILE = 3813 dyn_cast<CXXStdInitializerListExpr>(Init)) 3814 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3815 3816 // If this is copy-initialization, we only need to reconstruct 3817 // InitListExprs. Other forms of copy-initialization will be a no-op if 3818 // the initializer is already the right type. 3819 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3820 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3821 return getDerived().TransformExpr(Init); 3822 3823 // Revert value-initialization back to empty parens. 3824 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3825 SourceRange Parens = VIE->getSourceRange(); 3826 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3827 Parens.getEnd()); 3828 } 3829 3830 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3831 if (isa<ImplicitValueInitExpr>(Init)) 3832 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3833 SourceLocation()); 3834 3835 // Revert initialization by constructor back to a parenthesized or braced list 3836 // of expressions. Any other form of initializer can just be reused directly. 3837 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3838 return getDerived().TransformExpr(Init); 3839 3840 // If the initialization implicitly converted an initializer list to a 3841 // std::initializer_list object, unwrap the std::initializer_list too. 3842 if (Construct && Construct->isStdInitListInitialization()) 3843 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3844 3845 // Enter a list-init context if this was list initialization. 3846 EnterExpressionEvaluationContext Context( 3847 getSema(), EnterExpressionEvaluationContext::InitList, 3848 Construct->isListInitialization()); 3849 3850 SmallVector<Expr*, 8> NewArgs; 3851 bool ArgChanged = false; 3852 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3853 /*IsCall*/true, NewArgs, &ArgChanged)) 3854 return ExprError(); 3855 3856 // If this was list initialization, revert to syntactic list form. 3857 if (Construct->isListInitialization()) 3858 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3859 Construct->getEndLoc()); 3860 3861 // Build a ParenListExpr to represent anything else. 3862 SourceRange Parens = Construct->getParenOrBraceRange(); 3863 if (Parens.isInvalid()) { 3864 // This was a variable declaration's initialization for which no initializer 3865 // was specified. 3866 assert(NewArgs.empty() && 3867 "no parens or braces but have direct init with arguments?"); 3868 return ExprEmpty(); 3869 } 3870 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3871 Parens.getEnd()); 3872 } 3873 3874 template<typename Derived> 3875 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3876 unsigned NumInputs, 3877 bool IsCall, 3878 SmallVectorImpl<Expr *> &Outputs, 3879 bool *ArgChanged) { 3880 for (unsigned I = 0; I != NumInputs; ++I) { 3881 // If requested, drop call arguments that need to be dropped. 3882 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3883 if (ArgChanged) 3884 *ArgChanged = true; 3885 3886 break; 3887 } 3888 3889 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3890 Expr *Pattern = Expansion->getPattern(); 3891 3892 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3893 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3894 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3895 3896 // Determine whether the set of unexpanded parameter packs can and should 3897 // be expanded. 3898 bool Expand = true; 3899 bool RetainExpansion = false; 3900 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3901 Optional<unsigned> NumExpansions = OrigNumExpansions; 3902 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3903 Pattern->getSourceRange(), 3904 Unexpanded, 3905 Expand, RetainExpansion, 3906 NumExpansions)) 3907 return true; 3908 3909 if (!Expand) { 3910 // The transform has determined that we should perform a simple 3911 // transformation on the pack expansion, producing another pack 3912 // expansion. 3913 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3914 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3915 if (OutPattern.isInvalid()) 3916 return true; 3917 3918 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3919 Expansion->getEllipsisLoc(), 3920 NumExpansions); 3921 if (Out.isInvalid()) 3922 return true; 3923 3924 if (ArgChanged) 3925 *ArgChanged = true; 3926 Outputs.push_back(Out.get()); 3927 continue; 3928 } 3929 3930 // Record right away that the argument was changed. This needs 3931 // to happen even if the array expands to nothing. 3932 if (ArgChanged) *ArgChanged = true; 3933 3934 // The transform has determined that we should perform an elementwise 3935 // expansion of the pattern. Do so. 3936 for (unsigned I = 0; I != *NumExpansions; ++I) { 3937 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3938 ExprResult Out = getDerived().TransformExpr(Pattern); 3939 if (Out.isInvalid()) 3940 return true; 3941 3942 if (Out.get()->containsUnexpandedParameterPack()) { 3943 Out = getDerived().RebuildPackExpansion( 3944 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3945 if (Out.isInvalid()) 3946 return true; 3947 } 3948 3949 Outputs.push_back(Out.get()); 3950 } 3951 3952 // If we're supposed to retain a pack expansion, do so by temporarily 3953 // forgetting the partially-substituted parameter pack. 3954 if (RetainExpansion) { 3955 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3956 3957 ExprResult Out = getDerived().TransformExpr(Pattern); 3958 if (Out.isInvalid()) 3959 return true; 3960 3961 Out = getDerived().RebuildPackExpansion( 3962 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3963 if (Out.isInvalid()) 3964 return true; 3965 3966 Outputs.push_back(Out.get()); 3967 } 3968 3969 continue; 3970 } 3971 3972 ExprResult Result = 3973 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3974 : getDerived().TransformExpr(Inputs[I]); 3975 if (Result.isInvalid()) 3976 return true; 3977 3978 if (Result.get() != Inputs[I] && ArgChanged) 3979 *ArgChanged = true; 3980 3981 Outputs.push_back(Result.get()); 3982 } 3983 3984 return false; 3985 } 3986 3987 template <typename Derived> 3988 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3989 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3990 if (Var) { 3991 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3992 getDerived().TransformDefinition(Var->getLocation(), Var)); 3993 3994 if (!ConditionVar) 3995 return Sema::ConditionError(); 3996 3997 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3998 } 3999 4000 if (Expr) { 4001 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4002 4003 if (CondExpr.isInvalid()) 4004 return Sema::ConditionError(); 4005 4006 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 4007 } 4008 4009 return Sema::ConditionResult(); 4010 } 4011 4012 template<typename Derived> 4013 NestedNameSpecifierLoc 4014 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4015 NestedNameSpecifierLoc NNS, 4016 QualType ObjectType, 4017 NamedDecl *FirstQualifierInScope) { 4018 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4019 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4020 Qualifier = Qualifier.getPrefix()) 4021 Qualifiers.push_back(Qualifier); 4022 4023 CXXScopeSpec SS; 4024 while (!Qualifiers.empty()) { 4025 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4026 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4027 4028 switch (QNNS->getKind()) { 4029 case NestedNameSpecifier::Identifier: { 4030 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4031 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 4032 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4033 SS, FirstQualifierInScope, false)) 4034 return NestedNameSpecifierLoc(); 4035 } 4036 break; 4037 4038 case NestedNameSpecifier::Namespace: { 4039 NamespaceDecl *NS 4040 = cast_or_null<NamespaceDecl>( 4041 getDerived().TransformDecl( 4042 Q.getLocalBeginLoc(), 4043 QNNS->getAsNamespace())); 4044 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4045 break; 4046 } 4047 4048 case NestedNameSpecifier::NamespaceAlias: { 4049 NamespaceAliasDecl *Alias 4050 = cast_or_null<NamespaceAliasDecl>( 4051 getDerived().TransformDecl(Q.getLocalBeginLoc(), 4052 QNNS->getAsNamespaceAlias())); 4053 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4054 Q.getLocalEndLoc()); 4055 break; 4056 } 4057 4058 case NestedNameSpecifier::Global: 4059 // There is no meaningful transformation that one could perform on the 4060 // global scope. 4061 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4062 break; 4063 4064 case NestedNameSpecifier::Super: { 4065 CXXRecordDecl *RD = 4066 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4067 SourceLocation(), QNNS->getAsRecordDecl())); 4068 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4069 break; 4070 } 4071 4072 case NestedNameSpecifier::TypeSpecWithTemplate: 4073 case NestedNameSpecifier::TypeSpec: { 4074 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4075 FirstQualifierInScope, SS); 4076 4077 if (!TL) 4078 return NestedNameSpecifierLoc(); 4079 4080 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4081 (SemaRef.getLangOpts().CPlusPlus11 && 4082 TL.getType()->isEnumeralType())) { 4083 assert(!TL.getType().hasLocalQualifiers() && 4084 "Can't get cv-qualifiers here"); 4085 if (TL.getType()->isEnumeralType()) 4086 SemaRef.Diag(TL.getBeginLoc(), 4087 diag::warn_cxx98_compat_enum_nested_name_spec); 4088 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 4089 Q.getLocalEndLoc()); 4090 break; 4091 } 4092 // If the nested-name-specifier is an invalid type def, don't emit an 4093 // error because a previous error should have already been emitted. 4094 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4095 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4096 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4097 << TL.getType() << SS.getRange(); 4098 } 4099 return NestedNameSpecifierLoc(); 4100 } 4101 } 4102 4103 // The qualifier-in-scope and object type only apply to the leftmost entity. 4104 FirstQualifierInScope = nullptr; 4105 ObjectType = QualType(); 4106 } 4107 4108 // Don't rebuild the nested-name-specifier if we don't have to. 4109 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4110 !getDerived().AlwaysRebuild()) 4111 return NNS; 4112 4113 // If we can re-use the source-location data from the original 4114 // nested-name-specifier, do so. 4115 if (SS.location_size() == NNS.getDataLength() && 4116 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4117 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4118 4119 // Allocate new nested-name-specifier location information. 4120 return SS.getWithLocInContext(SemaRef.Context); 4121 } 4122 4123 template<typename Derived> 4124 DeclarationNameInfo 4125 TreeTransform<Derived> 4126 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4127 DeclarationName Name = NameInfo.getName(); 4128 if (!Name) 4129 return DeclarationNameInfo(); 4130 4131 switch (Name.getNameKind()) { 4132 case DeclarationName::Identifier: 4133 case DeclarationName::ObjCZeroArgSelector: 4134 case DeclarationName::ObjCOneArgSelector: 4135 case DeclarationName::ObjCMultiArgSelector: 4136 case DeclarationName::CXXOperatorName: 4137 case DeclarationName::CXXLiteralOperatorName: 4138 case DeclarationName::CXXUsingDirective: 4139 return NameInfo; 4140 4141 case DeclarationName::CXXDeductionGuideName: { 4142 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4143 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4144 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4145 if (!NewTemplate) 4146 return DeclarationNameInfo(); 4147 4148 DeclarationNameInfo NewNameInfo(NameInfo); 4149 NewNameInfo.setName( 4150 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4151 return NewNameInfo; 4152 } 4153 4154 case DeclarationName::CXXConstructorName: 4155 case DeclarationName::CXXDestructorName: 4156 case DeclarationName::CXXConversionFunctionName: { 4157 TypeSourceInfo *NewTInfo; 4158 CanQualType NewCanTy; 4159 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4160 NewTInfo = getDerived().TransformType(OldTInfo); 4161 if (!NewTInfo) 4162 return DeclarationNameInfo(); 4163 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4164 } 4165 else { 4166 NewTInfo = nullptr; 4167 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4168 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4169 if (NewT.isNull()) 4170 return DeclarationNameInfo(); 4171 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4172 } 4173 4174 DeclarationName NewName 4175 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4176 NewCanTy); 4177 DeclarationNameInfo NewNameInfo(NameInfo); 4178 NewNameInfo.setName(NewName); 4179 NewNameInfo.setNamedTypeInfo(NewTInfo); 4180 return NewNameInfo; 4181 } 4182 } 4183 4184 llvm_unreachable("Unknown name kind."); 4185 } 4186 4187 template<typename Derived> 4188 TemplateName 4189 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4190 TemplateName Name, 4191 SourceLocation NameLoc, 4192 QualType ObjectType, 4193 NamedDecl *FirstQualifierInScope, 4194 bool AllowInjectedClassName) { 4195 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4196 TemplateDecl *Template = QTN->getTemplateDecl(); 4197 assert(Template && "qualified template name must refer to a template"); 4198 4199 TemplateDecl *TransTemplate 4200 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4201 Template)); 4202 if (!TransTemplate) 4203 return TemplateName(); 4204 4205 if (!getDerived().AlwaysRebuild() && 4206 SS.getScopeRep() == QTN->getQualifier() && 4207 TransTemplate == Template) 4208 return Name; 4209 4210 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4211 TransTemplate); 4212 } 4213 4214 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4215 if (SS.getScopeRep()) { 4216 // These apply to the scope specifier, not the template. 4217 ObjectType = QualType(); 4218 FirstQualifierInScope = nullptr; 4219 } 4220 4221 if (!getDerived().AlwaysRebuild() && 4222 SS.getScopeRep() == DTN->getQualifier() && 4223 ObjectType.isNull()) 4224 return Name; 4225 4226 // FIXME: Preserve the location of the "template" keyword. 4227 SourceLocation TemplateKWLoc = NameLoc; 4228 4229 if (DTN->isIdentifier()) { 4230 return getDerived().RebuildTemplateName(SS, 4231 TemplateKWLoc, 4232 *DTN->getIdentifier(), 4233 NameLoc, 4234 ObjectType, 4235 FirstQualifierInScope, 4236 AllowInjectedClassName); 4237 } 4238 4239 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4240 DTN->getOperator(), NameLoc, 4241 ObjectType, AllowInjectedClassName); 4242 } 4243 4244 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4245 TemplateDecl *TransTemplate 4246 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4247 Template)); 4248 if (!TransTemplate) 4249 return TemplateName(); 4250 4251 if (!getDerived().AlwaysRebuild() && 4252 TransTemplate == Template) 4253 return Name; 4254 4255 return TemplateName(TransTemplate); 4256 } 4257 4258 if (SubstTemplateTemplateParmPackStorage *SubstPack 4259 = Name.getAsSubstTemplateTemplateParmPack()) { 4260 TemplateTemplateParmDecl *TransParam 4261 = cast_or_null<TemplateTemplateParmDecl>( 4262 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4263 if (!TransParam) 4264 return TemplateName(); 4265 4266 if (!getDerived().AlwaysRebuild() && 4267 TransParam == SubstPack->getParameterPack()) 4268 return Name; 4269 4270 return getDerived().RebuildTemplateName(TransParam, 4271 SubstPack->getArgumentPack()); 4272 } 4273 4274 // These should be getting filtered out before they reach the AST. 4275 llvm_unreachable("overloaded function decl survived to here"); 4276 } 4277 4278 template<typename Derived> 4279 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4280 const TemplateArgument &Arg, 4281 TemplateArgumentLoc &Output) { 4282 Output = getSema().getTrivialTemplateArgumentLoc( 4283 Arg, QualType(), getDerived().getBaseLocation()); 4284 } 4285 4286 template<typename Derived> 4287 bool TreeTransform<Derived>::TransformTemplateArgument( 4288 const TemplateArgumentLoc &Input, 4289 TemplateArgumentLoc &Output, bool Uneval) { 4290 const TemplateArgument &Arg = Input.getArgument(); 4291 switch (Arg.getKind()) { 4292 case TemplateArgument::Null: 4293 case TemplateArgument::Pack: 4294 llvm_unreachable("Unexpected TemplateArgument"); 4295 4296 case TemplateArgument::Integral: 4297 case TemplateArgument::NullPtr: 4298 case TemplateArgument::Declaration: { 4299 // Transform a resolved template argument straight to a resolved template 4300 // argument. We get here when substituting into an already-substituted 4301 // template type argument during concept satisfaction checking. 4302 QualType T = Arg.getNonTypeTemplateArgumentType(); 4303 QualType NewT = getDerived().TransformType(T); 4304 if (NewT.isNull()) 4305 return true; 4306 4307 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4308 ? Arg.getAsDecl() 4309 : nullptr; 4310 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4311 getDerived().getBaseLocation(), D)) 4312 : nullptr; 4313 if (D && !NewD) 4314 return true; 4315 4316 if (NewT == T && D == NewD) 4317 Output = Input; 4318 else if (Arg.getKind() == TemplateArgument::Integral) 4319 Output = TemplateArgumentLoc( 4320 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4321 TemplateArgumentLocInfo()); 4322 else if (Arg.getKind() == TemplateArgument::NullPtr) 4323 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4324 TemplateArgumentLocInfo()); 4325 else 4326 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4327 TemplateArgumentLocInfo()); 4328 4329 return false; 4330 } 4331 4332 case TemplateArgument::Type: { 4333 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4334 if (!DI) 4335 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4336 4337 DI = getDerived().TransformType(DI); 4338 if (!DI) return true; 4339 4340 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4341 return false; 4342 } 4343 4344 case TemplateArgument::Template: { 4345 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4346 if (QualifierLoc) { 4347 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4348 if (!QualifierLoc) 4349 return true; 4350 } 4351 4352 CXXScopeSpec SS; 4353 SS.Adopt(QualifierLoc); 4354 TemplateName Template 4355 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4356 Input.getTemplateNameLoc()); 4357 if (Template.isNull()) 4358 return true; 4359 4360 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4361 QualifierLoc, Input.getTemplateNameLoc()); 4362 return false; 4363 } 4364 4365 case TemplateArgument::TemplateExpansion: 4366 llvm_unreachable("Caller should expand pack expansions"); 4367 4368 case TemplateArgument::Expression: { 4369 // Template argument expressions are constant expressions. 4370 EnterExpressionEvaluationContext Unevaluated( 4371 getSema(), 4372 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4373 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4374 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4375 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4376 4377 Expr *InputExpr = Input.getSourceExpression(); 4378 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4379 4380 ExprResult E = getDerived().TransformExpr(InputExpr); 4381 E = SemaRef.ActOnConstantExpression(E); 4382 if (E.isInvalid()) return true; 4383 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4384 return false; 4385 } 4386 } 4387 4388 // Work around bogus GCC warning 4389 return true; 4390 } 4391 4392 /// Iterator adaptor that invents template argument location information 4393 /// for each of the template arguments in its underlying iterator. 4394 template<typename Derived, typename InputIterator> 4395 class TemplateArgumentLocInventIterator { 4396 TreeTransform<Derived> &Self; 4397 InputIterator Iter; 4398 4399 public: 4400 typedef TemplateArgumentLoc value_type; 4401 typedef TemplateArgumentLoc reference; 4402 typedef typename std::iterator_traits<InputIterator>::difference_type 4403 difference_type; 4404 typedef std::input_iterator_tag iterator_category; 4405 4406 class pointer { 4407 TemplateArgumentLoc Arg; 4408 4409 public: 4410 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4411 4412 const TemplateArgumentLoc *operator->() const { return &Arg; } 4413 }; 4414 4415 TemplateArgumentLocInventIterator() { } 4416 4417 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4418 InputIterator Iter) 4419 : Self(Self), Iter(Iter) { } 4420 4421 TemplateArgumentLocInventIterator &operator++() { 4422 ++Iter; 4423 return *this; 4424 } 4425 4426 TemplateArgumentLocInventIterator operator++(int) { 4427 TemplateArgumentLocInventIterator Old(*this); 4428 ++(*this); 4429 return Old; 4430 } 4431 4432 reference operator*() const { 4433 TemplateArgumentLoc Result; 4434 Self.InventTemplateArgumentLoc(*Iter, Result); 4435 return Result; 4436 } 4437 4438 pointer operator->() const { return pointer(**this); } 4439 4440 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4441 const TemplateArgumentLocInventIterator &Y) { 4442 return X.Iter == Y.Iter; 4443 } 4444 4445 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4446 const TemplateArgumentLocInventIterator &Y) { 4447 return X.Iter != Y.Iter; 4448 } 4449 }; 4450 4451 template<typename Derived> 4452 template<typename InputIterator> 4453 bool TreeTransform<Derived>::TransformTemplateArguments( 4454 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4455 bool Uneval) { 4456 for (; First != Last; ++First) { 4457 TemplateArgumentLoc Out; 4458 TemplateArgumentLoc In = *First; 4459 4460 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4461 // Unpack argument packs, which we translate them into separate 4462 // arguments. 4463 // FIXME: We could do much better if we could guarantee that the 4464 // TemplateArgumentLocInfo for the pack expansion would be usable for 4465 // all of the template arguments in the argument pack. 4466 typedef TemplateArgumentLocInventIterator<Derived, 4467 TemplateArgument::pack_iterator> 4468 PackLocIterator; 4469 if (TransformTemplateArguments(PackLocIterator(*this, 4470 In.getArgument().pack_begin()), 4471 PackLocIterator(*this, 4472 In.getArgument().pack_end()), 4473 Outputs, Uneval)) 4474 return true; 4475 4476 continue; 4477 } 4478 4479 if (In.getArgument().isPackExpansion()) { 4480 // We have a pack expansion, for which we will be substituting into 4481 // the pattern. 4482 SourceLocation Ellipsis; 4483 Optional<unsigned> OrigNumExpansions; 4484 TemplateArgumentLoc Pattern 4485 = getSema().getTemplateArgumentPackExpansionPattern( 4486 In, Ellipsis, OrigNumExpansions); 4487 4488 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4489 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4490 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4491 4492 // Determine whether the set of unexpanded parameter packs can and should 4493 // be expanded. 4494 bool Expand = true; 4495 bool RetainExpansion = false; 4496 Optional<unsigned> NumExpansions = OrigNumExpansions; 4497 if (getDerived().TryExpandParameterPacks(Ellipsis, 4498 Pattern.getSourceRange(), 4499 Unexpanded, 4500 Expand, 4501 RetainExpansion, 4502 NumExpansions)) 4503 return true; 4504 4505 if (!Expand) { 4506 // The transform has determined that we should perform a simple 4507 // transformation on the pack expansion, producing another pack 4508 // expansion. 4509 TemplateArgumentLoc OutPattern; 4510 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4511 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4512 return true; 4513 4514 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4515 NumExpansions); 4516 if (Out.getArgument().isNull()) 4517 return true; 4518 4519 Outputs.addArgument(Out); 4520 continue; 4521 } 4522 4523 // The transform has determined that we should perform an elementwise 4524 // expansion of the pattern. Do so. 4525 for (unsigned I = 0; I != *NumExpansions; ++I) { 4526 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4527 4528 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4529 return true; 4530 4531 if (Out.getArgument().containsUnexpandedParameterPack()) { 4532 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4533 OrigNumExpansions); 4534 if (Out.getArgument().isNull()) 4535 return true; 4536 } 4537 4538 Outputs.addArgument(Out); 4539 } 4540 4541 // If we're supposed to retain a pack expansion, do so by temporarily 4542 // forgetting the partially-substituted parameter pack. 4543 if (RetainExpansion) { 4544 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4545 4546 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4547 return true; 4548 4549 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4550 OrigNumExpansions); 4551 if (Out.getArgument().isNull()) 4552 return true; 4553 4554 Outputs.addArgument(Out); 4555 } 4556 4557 continue; 4558 } 4559 4560 // The simple case: 4561 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4562 return true; 4563 4564 Outputs.addArgument(Out); 4565 } 4566 4567 return false; 4568 4569 } 4570 4571 //===----------------------------------------------------------------------===// 4572 // Type transformation 4573 //===----------------------------------------------------------------------===// 4574 4575 template<typename Derived> 4576 QualType TreeTransform<Derived>::TransformType(QualType T) { 4577 if (getDerived().AlreadyTransformed(T)) 4578 return T; 4579 4580 // Temporary workaround. All of these transformations should 4581 // eventually turn into transformations on TypeLocs. 4582 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4583 getDerived().getBaseLocation()); 4584 4585 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4586 4587 if (!NewDI) 4588 return QualType(); 4589 4590 return NewDI->getType(); 4591 } 4592 4593 template<typename Derived> 4594 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4595 // Refine the base location to the type's location. 4596 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4597 getDerived().getBaseEntity()); 4598 if (getDerived().AlreadyTransformed(DI->getType())) 4599 return DI; 4600 4601 TypeLocBuilder TLB; 4602 4603 TypeLoc TL = DI->getTypeLoc(); 4604 TLB.reserve(TL.getFullDataSize()); 4605 4606 QualType Result = getDerived().TransformType(TLB, TL); 4607 if (Result.isNull()) 4608 return nullptr; 4609 4610 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4611 } 4612 4613 template<typename Derived> 4614 QualType 4615 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4616 switch (T.getTypeLocClass()) { 4617 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4618 #define TYPELOC(CLASS, PARENT) \ 4619 case TypeLoc::CLASS: \ 4620 return getDerived().Transform##CLASS##Type(TLB, \ 4621 T.castAs<CLASS##TypeLoc>()); 4622 #include "clang/AST/TypeLocNodes.def" 4623 } 4624 4625 llvm_unreachable("unhandled type loc!"); 4626 } 4627 4628 template<typename Derived> 4629 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4630 if (!isa<DependentNameType>(T)) 4631 return TransformType(T); 4632 4633 if (getDerived().AlreadyTransformed(T)) 4634 return T; 4635 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4636 getDerived().getBaseLocation()); 4637 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4638 return NewDI ? NewDI->getType() : QualType(); 4639 } 4640 4641 template<typename Derived> 4642 TypeSourceInfo * 4643 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4644 if (!isa<DependentNameType>(DI->getType())) 4645 return TransformType(DI); 4646 4647 // Refine the base location to the type's location. 4648 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4649 getDerived().getBaseEntity()); 4650 if (getDerived().AlreadyTransformed(DI->getType())) 4651 return DI; 4652 4653 TypeLocBuilder TLB; 4654 4655 TypeLoc TL = DI->getTypeLoc(); 4656 TLB.reserve(TL.getFullDataSize()); 4657 4658 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4659 if (QTL) 4660 TL = QTL.getUnqualifiedLoc(); 4661 4662 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4663 4664 QualType Result = getDerived().TransformDependentNameType( 4665 TLB, DNTL, /*DeducedTSTContext*/true); 4666 if (Result.isNull()) 4667 return nullptr; 4668 4669 if (QTL) { 4670 Result = getDerived().RebuildQualifiedType(Result, QTL); 4671 if (Result.isNull()) 4672 return nullptr; 4673 TLB.TypeWasModifiedSafely(Result); 4674 } 4675 4676 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4677 } 4678 4679 template<typename Derived> 4680 QualType 4681 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4682 QualifiedTypeLoc T) { 4683 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4684 if (Result.isNull()) 4685 return QualType(); 4686 4687 Result = getDerived().RebuildQualifiedType(Result, T); 4688 4689 if (Result.isNull()) 4690 return QualType(); 4691 4692 // RebuildQualifiedType might have updated the type, but not in a way 4693 // that invalidates the TypeLoc. (There's no location information for 4694 // qualifiers.) 4695 TLB.TypeWasModifiedSafely(Result); 4696 4697 return Result; 4698 } 4699 4700 template <typename Derived> 4701 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4702 QualifiedTypeLoc TL) { 4703 4704 SourceLocation Loc = TL.getBeginLoc(); 4705 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4706 4707 if (((T.getAddressSpace() != LangAS::Default && 4708 Quals.getAddressSpace() != LangAS::Default)) && 4709 T.getAddressSpace() != Quals.getAddressSpace()) { 4710 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4711 << TL.getType() << T; 4712 return QualType(); 4713 } 4714 4715 // C++ [dcl.fct]p7: 4716 // [When] adding cv-qualifications on top of the function type [...] the 4717 // cv-qualifiers are ignored. 4718 if (T->isFunctionType()) { 4719 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4720 Quals.getAddressSpace()); 4721 return T; 4722 } 4723 4724 // C++ [dcl.ref]p1: 4725 // when the cv-qualifiers are introduced through the use of a typedef-name 4726 // or decltype-specifier [...] the cv-qualifiers are ignored. 4727 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4728 // applied to a reference type. 4729 if (T->isReferenceType()) { 4730 // The only qualifier that applies to a reference type is restrict. 4731 if (!Quals.hasRestrict()) 4732 return T; 4733 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4734 } 4735 4736 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4737 // resulting type. 4738 if (Quals.hasObjCLifetime()) { 4739 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4740 Quals.removeObjCLifetime(); 4741 else if (T.getObjCLifetime()) { 4742 // Objective-C ARC: 4743 // A lifetime qualifier applied to a substituted template parameter 4744 // overrides the lifetime qualifier from the template argument. 4745 const AutoType *AutoTy; 4746 if (const SubstTemplateTypeParmType *SubstTypeParam 4747 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4748 QualType Replacement = SubstTypeParam->getReplacementType(); 4749 Qualifiers Qs = Replacement.getQualifiers(); 4750 Qs.removeObjCLifetime(); 4751 Replacement = SemaRef.Context.getQualifiedType( 4752 Replacement.getUnqualifiedType(), Qs); 4753 T = SemaRef.Context.getSubstTemplateTypeParmType( 4754 SubstTypeParam->getReplacedParameter(), Replacement); 4755 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4756 // 'auto' types behave the same way as template parameters. 4757 QualType Deduced = AutoTy->getDeducedType(); 4758 Qualifiers Qs = Deduced.getQualifiers(); 4759 Qs.removeObjCLifetime(); 4760 Deduced = 4761 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4762 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4763 AutoTy->isDependentType(), 4764 /*isPack=*/false, 4765 AutoTy->getTypeConstraintConcept(), 4766 AutoTy->getTypeConstraintArguments()); 4767 } else { 4768 // Otherwise, complain about the addition of a qualifier to an 4769 // already-qualified type. 4770 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4771 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4772 Quals.removeObjCLifetime(); 4773 } 4774 } 4775 } 4776 4777 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4778 } 4779 4780 template<typename Derived> 4781 TypeLoc 4782 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4783 QualType ObjectType, 4784 NamedDecl *UnqualLookup, 4785 CXXScopeSpec &SS) { 4786 if (getDerived().AlreadyTransformed(TL.getType())) 4787 return TL; 4788 4789 TypeSourceInfo *TSI = 4790 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4791 if (TSI) 4792 return TSI->getTypeLoc(); 4793 return TypeLoc(); 4794 } 4795 4796 template<typename Derived> 4797 TypeSourceInfo * 4798 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4799 QualType ObjectType, 4800 NamedDecl *UnqualLookup, 4801 CXXScopeSpec &SS) { 4802 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4803 return TSInfo; 4804 4805 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4806 UnqualLookup, SS); 4807 } 4808 4809 template <typename Derived> 4810 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4811 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4812 CXXScopeSpec &SS) { 4813 QualType T = TL.getType(); 4814 assert(!getDerived().AlreadyTransformed(T)); 4815 4816 TypeLocBuilder TLB; 4817 QualType Result; 4818 4819 if (isa<TemplateSpecializationType>(T)) { 4820 TemplateSpecializationTypeLoc SpecTL = 4821 TL.castAs<TemplateSpecializationTypeLoc>(); 4822 4823 TemplateName Template = getDerived().TransformTemplateName( 4824 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4825 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4826 if (Template.isNull()) 4827 return nullptr; 4828 4829 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4830 Template); 4831 } else if (isa<DependentTemplateSpecializationType>(T)) { 4832 DependentTemplateSpecializationTypeLoc SpecTL = 4833 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4834 4835 TemplateName Template 4836 = getDerived().RebuildTemplateName(SS, 4837 SpecTL.getTemplateKeywordLoc(), 4838 *SpecTL.getTypePtr()->getIdentifier(), 4839 SpecTL.getTemplateNameLoc(), 4840 ObjectType, UnqualLookup, 4841 /*AllowInjectedClassName*/true); 4842 if (Template.isNull()) 4843 return nullptr; 4844 4845 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4846 SpecTL, 4847 Template, 4848 SS); 4849 } else { 4850 // Nothing special needs to be done for these. 4851 Result = getDerived().TransformType(TLB, TL); 4852 } 4853 4854 if (Result.isNull()) 4855 return nullptr; 4856 4857 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4858 } 4859 4860 template <class TyLoc> static inline 4861 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4862 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4863 NewT.setNameLoc(T.getNameLoc()); 4864 return T.getType(); 4865 } 4866 4867 template<typename Derived> 4868 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4869 BuiltinTypeLoc T) { 4870 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4871 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4872 if (T.needsExtraLocalData()) 4873 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4874 return T.getType(); 4875 } 4876 4877 template<typename Derived> 4878 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4879 ComplexTypeLoc T) { 4880 // FIXME: recurse? 4881 return TransformTypeSpecType(TLB, T); 4882 } 4883 4884 template <typename Derived> 4885 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4886 AdjustedTypeLoc TL) { 4887 // Adjustments applied during transformation are handled elsewhere. 4888 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4889 } 4890 4891 template<typename Derived> 4892 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4893 DecayedTypeLoc TL) { 4894 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4895 if (OriginalType.isNull()) 4896 return QualType(); 4897 4898 QualType Result = TL.getType(); 4899 if (getDerived().AlwaysRebuild() || 4900 OriginalType != TL.getOriginalLoc().getType()) 4901 Result = SemaRef.Context.getDecayedType(OriginalType); 4902 TLB.push<DecayedTypeLoc>(Result); 4903 // Nothing to set for DecayedTypeLoc. 4904 return Result; 4905 } 4906 4907 template<typename Derived> 4908 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4909 PointerTypeLoc TL) { 4910 QualType PointeeType 4911 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4912 if (PointeeType.isNull()) 4913 return QualType(); 4914 4915 QualType Result = TL.getType(); 4916 if (PointeeType->getAs<ObjCObjectType>()) { 4917 // A dependent pointer type 'T *' has is being transformed such 4918 // that an Objective-C class type is being replaced for 'T'. The 4919 // resulting pointer type is an ObjCObjectPointerType, not a 4920 // PointerType. 4921 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4922 4923 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4924 NewT.setStarLoc(TL.getStarLoc()); 4925 return Result; 4926 } 4927 4928 if (getDerived().AlwaysRebuild() || 4929 PointeeType != TL.getPointeeLoc().getType()) { 4930 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4931 if (Result.isNull()) 4932 return QualType(); 4933 } 4934 4935 // Objective-C ARC can add lifetime qualifiers to the type that we're 4936 // pointing to. 4937 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4938 4939 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4940 NewT.setSigilLoc(TL.getSigilLoc()); 4941 return Result; 4942 } 4943 4944 template<typename Derived> 4945 QualType 4946 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4947 BlockPointerTypeLoc TL) { 4948 QualType PointeeType 4949 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4950 if (PointeeType.isNull()) 4951 return QualType(); 4952 4953 QualType Result = TL.getType(); 4954 if (getDerived().AlwaysRebuild() || 4955 PointeeType != TL.getPointeeLoc().getType()) { 4956 Result = getDerived().RebuildBlockPointerType(PointeeType, 4957 TL.getSigilLoc()); 4958 if (Result.isNull()) 4959 return QualType(); 4960 } 4961 4962 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4963 NewT.setSigilLoc(TL.getSigilLoc()); 4964 return Result; 4965 } 4966 4967 /// Transforms a reference type. Note that somewhat paradoxically we 4968 /// don't care whether the type itself is an l-value type or an r-value 4969 /// type; we only care if the type was *written* as an l-value type 4970 /// or an r-value type. 4971 template<typename Derived> 4972 QualType 4973 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4974 ReferenceTypeLoc TL) { 4975 const ReferenceType *T = TL.getTypePtr(); 4976 4977 // Note that this works with the pointee-as-written. 4978 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4979 if (PointeeType.isNull()) 4980 return QualType(); 4981 4982 QualType Result = TL.getType(); 4983 if (getDerived().AlwaysRebuild() || 4984 PointeeType != T->getPointeeTypeAsWritten()) { 4985 Result = getDerived().RebuildReferenceType(PointeeType, 4986 T->isSpelledAsLValue(), 4987 TL.getSigilLoc()); 4988 if (Result.isNull()) 4989 return QualType(); 4990 } 4991 4992 // Objective-C ARC can add lifetime qualifiers to the type that we're 4993 // referring to. 4994 TLB.TypeWasModifiedSafely( 4995 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4996 4997 // r-value references can be rebuilt as l-value references. 4998 ReferenceTypeLoc NewTL; 4999 if (isa<LValueReferenceType>(Result)) 5000 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5001 else 5002 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5003 NewTL.setSigilLoc(TL.getSigilLoc()); 5004 5005 return Result; 5006 } 5007 5008 template<typename Derived> 5009 QualType 5010 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5011 LValueReferenceTypeLoc TL) { 5012 return TransformReferenceType(TLB, TL); 5013 } 5014 5015 template<typename Derived> 5016 QualType 5017 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5018 RValueReferenceTypeLoc TL) { 5019 return TransformReferenceType(TLB, TL); 5020 } 5021 5022 template<typename Derived> 5023 QualType 5024 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5025 MemberPointerTypeLoc TL) { 5026 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5027 if (PointeeType.isNull()) 5028 return QualType(); 5029 5030 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5031 TypeSourceInfo *NewClsTInfo = nullptr; 5032 if (OldClsTInfo) { 5033 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5034 if (!NewClsTInfo) 5035 return QualType(); 5036 } 5037 5038 const MemberPointerType *T = TL.getTypePtr(); 5039 QualType OldClsType = QualType(T->getClass(), 0); 5040 QualType NewClsType; 5041 if (NewClsTInfo) 5042 NewClsType = NewClsTInfo->getType(); 5043 else { 5044 NewClsType = getDerived().TransformType(OldClsType); 5045 if (NewClsType.isNull()) 5046 return QualType(); 5047 } 5048 5049 QualType Result = TL.getType(); 5050 if (getDerived().AlwaysRebuild() || 5051 PointeeType != T->getPointeeType() || 5052 NewClsType != OldClsType) { 5053 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5054 TL.getStarLoc()); 5055 if (Result.isNull()) 5056 return QualType(); 5057 } 5058 5059 // If we had to adjust the pointee type when building a member pointer, make 5060 // sure to push TypeLoc info for it. 5061 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5062 if (MPT && PointeeType != MPT->getPointeeType()) { 5063 assert(isa<AdjustedType>(MPT->getPointeeType())); 5064 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5065 } 5066 5067 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5068 NewTL.setSigilLoc(TL.getSigilLoc()); 5069 NewTL.setClassTInfo(NewClsTInfo); 5070 5071 return Result; 5072 } 5073 5074 template<typename Derived> 5075 QualType 5076 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5077 ConstantArrayTypeLoc TL) { 5078 const ConstantArrayType *T = TL.getTypePtr(); 5079 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5080 if (ElementType.isNull()) 5081 return QualType(); 5082 5083 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5084 Expr *OldSize = TL.getSizeExpr(); 5085 if (!OldSize) 5086 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5087 Expr *NewSize = nullptr; 5088 if (OldSize) { 5089 EnterExpressionEvaluationContext Unevaluated( 5090 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5091 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5092 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5093 } 5094 5095 QualType Result = TL.getType(); 5096 if (getDerived().AlwaysRebuild() || 5097 ElementType != T->getElementType() || 5098 (T->getSizeExpr() && NewSize != OldSize)) { 5099 Result = getDerived().RebuildConstantArrayType(ElementType, 5100 T->getSizeModifier(), 5101 T->getSize(), NewSize, 5102 T->getIndexTypeCVRQualifiers(), 5103 TL.getBracketsRange()); 5104 if (Result.isNull()) 5105 return QualType(); 5106 } 5107 5108 // We might have either a ConstantArrayType or a VariableArrayType now: 5109 // a ConstantArrayType is allowed to have an element type which is a 5110 // VariableArrayType if the type is dependent. Fortunately, all array 5111 // types have the same location layout. 5112 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5113 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5114 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5115 NewTL.setSizeExpr(NewSize); 5116 5117 return Result; 5118 } 5119 5120 template<typename Derived> 5121 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5122 TypeLocBuilder &TLB, 5123 IncompleteArrayTypeLoc TL) { 5124 const IncompleteArrayType *T = TL.getTypePtr(); 5125 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5126 if (ElementType.isNull()) 5127 return QualType(); 5128 5129 QualType Result = TL.getType(); 5130 if (getDerived().AlwaysRebuild() || 5131 ElementType != T->getElementType()) { 5132 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5133 T->getSizeModifier(), 5134 T->getIndexTypeCVRQualifiers(), 5135 TL.getBracketsRange()); 5136 if (Result.isNull()) 5137 return QualType(); 5138 } 5139 5140 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5141 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5142 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5143 NewTL.setSizeExpr(nullptr); 5144 5145 return Result; 5146 } 5147 5148 template<typename Derived> 5149 QualType 5150 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5151 VariableArrayTypeLoc TL) { 5152 const VariableArrayType *T = TL.getTypePtr(); 5153 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5154 if (ElementType.isNull()) 5155 return QualType(); 5156 5157 ExprResult SizeResult; 5158 { 5159 EnterExpressionEvaluationContext Context( 5160 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5161 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5162 } 5163 if (SizeResult.isInvalid()) 5164 return QualType(); 5165 SizeResult = 5166 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5167 if (SizeResult.isInvalid()) 5168 return QualType(); 5169 5170 Expr *Size = SizeResult.get(); 5171 5172 QualType Result = TL.getType(); 5173 if (getDerived().AlwaysRebuild() || 5174 ElementType != T->getElementType() || 5175 Size != T->getSizeExpr()) { 5176 Result = getDerived().RebuildVariableArrayType(ElementType, 5177 T->getSizeModifier(), 5178 Size, 5179 T->getIndexTypeCVRQualifiers(), 5180 TL.getBracketsRange()); 5181 if (Result.isNull()) 5182 return QualType(); 5183 } 5184 5185 // We might have constant size array now, but fortunately it has the same 5186 // location layout. 5187 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5188 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5189 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5190 NewTL.setSizeExpr(Size); 5191 5192 return Result; 5193 } 5194 5195 template<typename Derived> 5196 QualType 5197 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5198 DependentSizedArrayTypeLoc TL) { 5199 const DependentSizedArrayType *T = TL.getTypePtr(); 5200 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5201 if (ElementType.isNull()) 5202 return QualType(); 5203 5204 // Array bounds are constant expressions. 5205 EnterExpressionEvaluationContext Unevaluated( 5206 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5207 5208 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5209 Expr *origSize = TL.getSizeExpr(); 5210 if (!origSize) origSize = T->getSizeExpr(); 5211 5212 ExprResult sizeResult 5213 = getDerived().TransformExpr(origSize); 5214 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5215 if (sizeResult.isInvalid()) 5216 return QualType(); 5217 5218 Expr *size = sizeResult.get(); 5219 5220 QualType Result = TL.getType(); 5221 if (getDerived().AlwaysRebuild() || 5222 ElementType != T->getElementType() || 5223 size != origSize) { 5224 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5225 T->getSizeModifier(), 5226 size, 5227 T->getIndexTypeCVRQualifiers(), 5228 TL.getBracketsRange()); 5229 if (Result.isNull()) 5230 return QualType(); 5231 } 5232 5233 // We might have any sort of array type now, but fortunately they 5234 // all have the same location layout. 5235 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5236 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5237 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5238 NewTL.setSizeExpr(size); 5239 5240 return Result; 5241 } 5242 5243 template <typename Derived> 5244 QualType TreeTransform<Derived>::TransformDependentVectorType( 5245 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5246 const DependentVectorType *T = TL.getTypePtr(); 5247 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5248 if (ElementType.isNull()) 5249 return QualType(); 5250 5251 EnterExpressionEvaluationContext Unevaluated( 5252 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5253 5254 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5255 Size = SemaRef.ActOnConstantExpression(Size); 5256 if (Size.isInvalid()) 5257 return QualType(); 5258 5259 QualType Result = TL.getType(); 5260 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5261 Size.get() != T->getSizeExpr()) { 5262 Result = getDerived().RebuildDependentVectorType( 5263 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5264 if (Result.isNull()) 5265 return QualType(); 5266 } 5267 5268 // Result might be dependent or not. 5269 if (isa<DependentVectorType>(Result)) { 5270 DependentVectorTypeLoc NewTL = 5271 TLB.push<DependentVectorTypeLoc>(Result); 5272 NewTL.setNameLoc(TL.getNameLoc()); 5273 } else { 5274 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5275 NewTL.setNameLoc(TL.getNameLoc()); 5276 } 5277 5278 return Result; 5279 } 5280 5281 template<typename Derived> 5282 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5283 TypeLocBuilder &TLB, 5284 DependentSizedExtVectorTypeLoc TL) { 5285 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5286 5287 // FIXME: ext vector locs should be nested 5288 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5289 if (ElementType.isNull()) 5290 return QualType(); 5291 5292 // Vector sizes are constant expressions. 5293 EnterExpressionEvaluationContext Unevaluated( 5294 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5295 5296 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5297 Size = SemaRef.ActOnConstantExpression(Size); 5298 if (Size.isInvalid()) 5299 return QualType(); 5300 5301 QualType Result = TL.getType(); 5302 if (getDerived().AlwaysRebuild() || 5303 ElementType != T->getElementType() || 5304 Size.get() != T->getSizeExpr()) { 5305 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5306 Size.get(), 5307 T->getAttributeLoc()); 5308 if (Result.isNull()) 5309 return QualType(); 5310 } 5311 5312 // Result might be dependent or not. 5313 if (isa<DependentSizedExtVectorType>(Result)) { 5314 DependentSizedExtVectorTypeLoc NewTL 5315 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5316 NewTL.setNameLoc(TL.getNameLoc()); 5317 } else { 5318 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5319 NewTL.setNameLoc(TL.getNameLoc()); 5320 } 5321 5322 return Result; 5323 } 5324 5325 template <typename Derived> 5326 QualType 5327 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5328 ConstantMatrixTypeLoc TL) { 5329 const ConstantMatrixType *T = TL.getTypePtr(); 5330 QualType ElementType = getDerived().TransformType(T->getElementType()); 5331 if (ElementType.isNull()) 5332 return QualType(); 5333 5334 QualType Result = TL.getType(); 5335 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5336 Result = getDerived().RebuildConstantMatrixType( 5337 ElementType, T->getNumRows(), T->getNumColumns()); 5338 if (Result.isNull()) 5339 return QualType(); 5340 } 5341 5342 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5343 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5344 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5345 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5346 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5347 5348 return Result; 5349 } 5350 5351 template <typename Derived> 5352 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5353 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5354 const DependentSizedMatrixType *T = TL.getTypePtr(); 5355 5356 QualType ElementType = getDerived().TransformType(T->getElementType()); 5357 if (ElementType.isNull()) { 5358 return QualType(); 5359 } 5360 5361 // Matrix dimensions are constant expressions. 5362 EnterExpressionEvaluationContext Unevaluated( 5363 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5364 5365 Expr *origRows = TL.getAttrRowOperand(); 5366 if (!origRows) 5367 origRows = T->getRowExpr(); 5368 Expr *origColumns = TL.getAttrColumnOperand(); 5369 if (!origColumns) 5370 origColumns = T->getColumnExpr(); 5371 5372 ExprResult rowResult = getDerived().TransformExpr(origRows); 5373 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5374 if (rowResult.isInvalid()) 5375 return QualType(); 5376 5377 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5378 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5379 if (columnResult.isInvalid()) 5380 return QualType(); 5381 5382 Expr *rows = rowResult.get(); 5383 Expr *columns = columnResult.get(); 5384 5385 QualType Result = TL.getType(); 5386 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5387 rows != origRows || columns != origColumns) { 5388 Result = getDerived().RebuildDependentSizedMatrixType( 5389 ElementType, rows, columns, T->getAttributeLoc()); 5390 5391 if (Result.isNull()) 5392 return QualType(); 5393 } 5394 5395 // We might have any sort of matrix type now, but fortunately they 5396 // all have the same location layout. 5397 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5398 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5399 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5400 NewTL.setAttrRowOperand(rows); 5401 NewTL.setAttrColumnOperand(columns); 5402 return Result; 5403 } 5404 5405 template <typename Derived> 5406 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5407 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5408 const DependentAddressSpaceType *T = TL.getTypePtr(); 5409 5410 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5411 5412 if (pointeeType.isNull()) 5413 return QualType(); 5414 5415 // Address spaces are constant expressions. 5416 EnterExpressionEvaluationContext Unevaluated( 5417 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5418 5419 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5420 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5421 if (AddrSpace.isInvalid()) 5422 return QualType(); 5423 5424 QualType Result = TL.getType(); 5425 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5426 AddrSpace.get() != T->getAddrSpaceExpr()) { 5427 Result = getDerived().RebuildDependentAddressSpaceType( 5428 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5429 if (Result.isNull()) 5430 return QualType(); 5431 } 5432 5433 // Result might be dependent or not. 5434 if (isa<DependentAddressSpaceType>(Result)) { 5435 DependentAddressSpaceTypeLoc NewTL = 5436 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5437 5438 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5439 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5440 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5441 5442 } else { 5443 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5444 Result, getDerived().getBaseLocation()); 5445 TransformType(TLB, DI->getTypeLoc()); 5446 } 5447 5448 return Result; 5449 } 5450 5451 template <typename Derived> 5452 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5453 VectorTypeLoc TL) { 5454 const VectorType *T = TL.getTypePtr(); 5455 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5456 if (ElementType.isNull()) 5457 return QualType(); 5458 5459 QualType Result = TL.getType(); 5460 if (getDerived().AlwaysRebuild() || 5461 ElementType != T->getElementType()) { 5462 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5463 T->getVectorKind()); 5464 if (Result.isNull()) 5465 return QualType(); 5466 } 5467 5468 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5469 NewTL.setNameLoc(TL.getNameLoc()); 5470 5471 return Result; 5472 } 5473 5474 template<typename Derived> 5475 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5476 ExtVectorTypeLoc TL) { 5477 const VectorType *T = TL.getTypePtr(); 5478 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5479 if (ElementType.isNull()) 5480 return QualType(); 5481 5482 QualType Result = TL.getType(); 5483 if (getDerived().AlwaysRebuild() || 5484 ElementType != T->getElementType()) { 5485 Result = getDerived().RebuildExtVectorType(ElementType, 5486 T->getNumElements(), 5487 /*FIXME*/ SourceLocation()); 5488 if (Result.isNull()) 5489 return QualType(); 5490 } 5491 5492 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5493 NewTL.setNameLoc(TL.getNameLoc()); 5494 5495 return Result; 5496 } 5497 5498 template <typename Derived> 5499 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5500 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5501 bool ExpectParameterPack) { 5502 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5503 TypeSourceInfo *NewDI = nullptr; 5504 5505 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5506 // If we're substituting into a pack expansion type and we know the 5507 // length we want to expand to, just substitute for the pattern. 5508 TypeLoc OldTL = OldDI->getTypeLoc(); 5509 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5510 5511 TypeLocBuilder TLB; 5512 TypeLoc NewTL = OldDI->getTypeLoc(); 5513 TLB.reserve(NewTL.getFullDataSize()); 5514 5515 QualType Result = getDerived().TransformType(TLB, 5516 OldExpansionTL.getPatternLoc()); 5517 if (Result.isNull()) 5518 return nullptr; 5519 5520 Result = RebuildPackExpansionType(Result, 5521 OldExpansionTL.getPatternLoc().getSourceRange(), 5522 OldExpansionTL.getEllipsisLoc(), 5523 NumExpansions); 5524 if (Result.isNull()) 5525 return nullptr; 5526 5527 PackExpansionTypeLoc NewExpansionTL 5528 = TLB.push<PackExpansionTypeLoc>(Result); 5529 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5530 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5531 } else 5532 NewDI = getDerived().TransformType(OldDI); 5533 if (!NewDI) 5534 return nullptr; 5535 5536 if (NewDI == OldDI && indexAdjustment == 0) 5537 return OldParm; 5538 5539 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5540 OldParm->getDeclContext(), 5541 OldParm->getInnerLocStart(), 5542 OldParm->getLocation(), 5543 OldParm->getIdentifier(), 5544 NewDI->getType(), 5545 NewDI, 5546 OldParm->getStorageClass(), 5547 /* DefArg */ nullptr); 5548 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5549 OldParm->getFunctionScopeIndex() + indexAdjustment); 5550 transformedLocalDecl(OldParm, {newParm}); 5551 return newParm; 5552 } 5553 5554 template <typename Derived> 5555 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5556 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5557 const QualType *ParamTypes, 5558 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5559 SmallVectorImpl<QualType> &OutParamTypes, 5560 SmallVectorImpl<ParmVarDecl *> *PVars, 5561 Sema::ExtParameterInfoBuilder &PInfos) { 5562 int indexAdjustment = 0; 5563 5564 unsigned NumParams = Params.size(); 5565 for (unsigned i = 0; i != NumParams; ++i) { 5566 if (ParmVarDecl *OldParm = Params[i]) { 5567 assert(OldParm->getFunctionScopeIndex() == i); 5568 5569 Optional<unsigned> NumExpansions; 5570 ParmVarDecl *NewParm = nullptr; 5571 if (OldParm->isParameterPack()) { 5572 // We have a function parameter pack that may need to be expanded. 5573 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5574 5575 // Find the parameter packs that could be expanded. 5576 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5577 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5578 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5579 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5580 5581 // Determine whether we should expand the parameter packs. 5582 bool ShouldExpand = false; 5583 bool RetainExpansion = false; 5584 Optional<unsigned> OrigNumExpansions; 5585 if (Unexpanded.size() > 0) { 5586 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5587 NumExpansions = OrigNumExpansions; 5588 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5589 Pattern.getSourceRange(), 5590 Unexpanded, 5591 ShouldExpand, 5592 RetainExpansion, 5593 NumExpansions)) { 5594 return true; 5595 } 5596 } else { 5597 #ifndef NDEBUG 5598 const AutoType *AT = 5599 Pattern.getType().getTypePtr()->getContainedAutoType(); 5600 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5601 "Could not find parameter packs or undeduced auto type!"); 5602 #endif 5603 } 5604 5605 if (ShouldExpand) { 5606 // Expand the function parameter pack into multiple, separate 5607 // parameters. 5608 getDerived().ExpandingFunctionParameterPack(OldParm); 5609 for (unsigned I = 0; I != *NumExpansions; ++I) { 5610 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5611 ParmVarDecl *NewParm 5612 = getDerived().TransformFunctionTypeParam(OldParm, 5613 indexAdjustment++, 5614 OrigNumExpansions, 5615 /*ExpectParameterPack=*/false); 5616 if (!NewParm) 5617 return true; 5618 5619 if (ParamInfos) 5620 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5621 OutParamTypes.push_back(NewParm->getType()); 5622 if (PVars) 5623 PVars->push_back(NewParm); 5624 } 5625 5626 // If we're supposed to retain a pack expansion, do so by temporarily 5627 // forgetting the partially-substituted parameter pack. 5628 if (RetainExpansion) { 5629 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5630 ParmVarDecl *NewParm 5631 = getDerived().TransformFunctionTypeParam(OldParm, 5632 indexAdjustment++, 5633 OrigNumExpansions, 5634 /*ExpectParameterPack=*/false); 5635 if (!NewParm) 5636 return true; 5637 5638 if (ParamInfos) 5639 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5640 OutParamTypes.push_back(NewParm->getType()); 5641 if (PVars) 5642 PVars->push_back(NewParm); 5643 } 5644 5645 // The next parameter should have the same adjustment as the 5646 // last thing we pushed, but we post-incremented indexAdjustment 5647 // on every push. Also, if we push nothing, the adjustment should 5648 // go down by one. 5649 indexAdjustment--; 5650 5651 // We're done with the pack expansion. 5652 continue; 5653 } 5654 5655 // We'll substitute the parameter now without expanding the pack 5656 // expansion. 5657 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5658 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5659 indexAdjustment, 5660 NumExpansions, 5661 /*ExpectParameterPack=*/true); 5662 assert(NewParm->isParameterPack() && 5663 "Parameter pack no longer a parameter pack after " 5664 "transformation."); 5665 } else { 5666 NewParm = getDerived().TransformFunctionTypeParam( 5667 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5668 } 5669 5670 if (!NewParm) 5671 return true; 5672 5673 if (ParamInfos) 5674 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5675 OutParamTypes.push_back(NewParm->getType()); 5676 if (PVars) 5677 PVars->push_back(NewParm); 5678 continue; 5679 } 5680 5681 // Deal with the possibility that we don't have a parameter 5682 // declaration for this parameter. 5683 QualType OldType = ParamTypes[i]; 5684 bool IsPackExpansion = false; 5685 Optional<unsigned> NumExpansions; 5686 QualType NewType; 5687 if (const PackExpansionType *Expansion 5688 = dyn_cast<PackExpansionType>(OldType)) { 5689 // We have a function parameter pack that may need to be expanded. 5690 QualType Pattern = Expansion->getPattern(); 5691 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5692 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5693 5694 // Determine whether we should expand the parameter packs. 5695 bool ShouldExpand = false; 5696 bool RetainExpansion = false; 5697 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5698 Unexpanded, 5699 ShouldExpand, 5700 RetainExpansion, 5701 NumExpansions)) { 5702 return true; 5703 } 5704 5705 if (ShouldExpand) { 5706 // Expand the function parameter pack into multiple, separate 5707 // parameters. 5708 for (unsigned I = 0; I != *NumExpansions; ++I) { 5709 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5710 QualType NewType = getDerived().TransformType(Pattern); 5711 if (NewType.isNull()) 5712 return true; 5713 5714 if (NewType->containsUnexpandedParameterPack()) { 5715 NewType = 5716 getSema().getASTContext().getPackExpansionType(NewType, None); 5717 5718 if (NewType.isNull()) 5719 return true; 5720 } 5721 5722 if (ParamInfos) 5723 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5724 OutParamTypes.push_back(NewType); 5725 if (PVars) 5726 PVars->push_back(nullptr); 5727 } 5728 5729 // We're done with the pack expansion. 5730 continue; 5731 } 5732 5733 // If we're supposed to retain a pack expansion, do so by temporarily 5734 // forgetting the partially-substituted parameter pack. 5735 if (RetainExpansion) { 5736 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5737 QualType NewType = getDerived().TransformType(Pattern); 5738 if (NewType.isNull()) 5739 return true; 5740 5741 if (ParamInfos) 5742 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5743 OutParamTypes.push_back(NewType); 5744 if (PVars) 5745 PVars->push_back(nullptr); 5746 } 5747 5748 // We'll substitute the parameter now without expanding the pack 5749 // expansion. 5750 OldType = Expansion->getPattern(); 5751 IsPackExpansion = true; 5752 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5753 NewType = getDerived().TransformType(OldType); 5754 } else { 5755 NewType = getDerived().TransformType(OldType); 5756 } 5757 5758 if (NewType.isNull()) 5759 return true; 5760 5761 if (IsPackExpansion) 5762 NewType = getSema().Context.getPackExpansionType(NewType, 5763 NumExpansions); 5764 5765 if (ParamInfos) 5766 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5767 OutParamTypes.push_back(NewType); 5768 if (PVars) 5769 PVars->push_back(nullptr); 5770 } 5771 5772 #ifndef NDEBUG 5773 if (PVars) { 5774 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5775 if (ParmVarDecl *parm = (*PVars)[i]) 5776 assert(parm->getFunctionScopeIndex() == i); 5777 } 5778 #endif 5779 5780 return false; 5781 } 5782 5783 template<typename Derived> 5784 QualType 5785 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5786 FunctionProtoTypeLoc TL) { 5787 SmallVector<QualType, 4> ExceptionStorage; 5788 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5789 return getDerived().TransformFunctionProtoType( 5790 TLB, TL, nullptr, Qualifiers(), 5791 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5792 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5793 ExceptionStorage, Changed); 5794 }); 5795 } 5796 5797 template<typename Derived> template<typename Fn> 5798 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5799 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5800 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5801 5802 // Transform the parameters and return type. 5803 // 5804 // We are required to instantiate the params and return type in source order. 5805 // When the function has a trailing return type, we instantiate the 5806 // parameters before the return type, since the return type can then refer 5807 // to the parameters themselves (via decltype, sizeof, etc.). 5808 // 5809 SmallVector<QualType, 4> ParamTypes; 5810 SmallVector<ParmVarDecl*, 4> ParamDecls; 5811 Sema::ExtParameterInfoBuilder ExtParamInfos; 5812 const FunctionProtoType *T = TL.getTypePtr(); 5813 5814 QualType ResultType; 5815 5816 if (T->hasTrailingReturn()) { 5817 if (getDerived().TransformFunctionTypeParams( 5818 TL.getBeginLoc(), TL.getParams(), 5819 TL.getTypePtr()->param_type_begin(), 5820 T->getExtParameterInfosOrNull(), 5821 ParamTypes, &ParamDecls, ExtParamInfos)) 5822 return QualType(); 5823 5824 { 5825 // C++11 [expr.prim.general]p3: 5826 // If a declaration declares a member function or member function 5827 // template of a class X, the expression this is a prvalue of type 5828 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5829 // and the end of the function-definition, member-declarator, or 5830 // declarator. 5831 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5832 5833 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5834 if (ResultType.isNull()) 5835 return QualType(); 5836 } 5837 } 5838 else { 5839 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5840 if (ResultType.isNull()) 5841 return QualType(); 5842 5843 if (getDerived().TransformFunctionTypeParams( 5844 TL.getBeginLoc(), TL.getParams(), 5845 TL.getTypePtr()->param_type_begin(), 5846 T->getExtParameterInfosOrNull(), 5847 ParamTypes, &ParamDecls, ExtParamInfos)) 5848 return QualType(); 5849 } 5850 5851 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5852 5853 bool EPIChanged = false; 5854 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5855 return QualType(); 5856 5857 // Handle extended parameter information. 5858 if (auto NewExtParamInfos = 5859 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5860 if (!EPI.ExtParameterInfos || 5861 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5862 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5863 EPIChanged = true; 5864 } 5865 EPI.ExtParameterInfos = NewExtParamInfos; 5866 } else if (EPI.ExtParameterInfos) { 5867 EPIChanged = true; 5868 EPI.ExtParameterInfos = nullptr; 5869 } 5870 5871 QualType Result = TL.getType(); 5872 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5873 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5874 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5875 if (Result.isNull()) 5876 return QualType(); 5877 } 5878 5879 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5880 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5881 NewTL.setLParenLoc(TL.getLParenLoc()); 5882 NewTL.setRParenLoc(TL.getRParenLoc()); 5883 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5884 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5885 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5886 NewTL.setParam(i, ParamDecls[i]); 5887 5888 return Result; 5889 } 5890 5891 template<typename Derived> 5892 bool TreeTransform<Derived>::TransformExceptionSpec( 5893 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5894 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5895 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5896 5897 // Instantiate a dynamic noexcept expression, if any. 5898 if (isComputedNoexcept(ESI.Type)) { 5899 EnterExpressionEvaluationContext Unevaluated( 5900 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5901 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5902 if (NoexceptExpr.isInvalid()) 5903 return true; 5904 5905 ExceptionSpecificationType EST = ESI.Type; 5906 NoexceptExpr = 5907 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5908 if (NoexceptExpr.isInvalid()) 5909 return true; 5910 5911 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5912 Changed = true; 5913 ESI.NoexceptExpr = NoexceptExpr.get(); 5914 ESI.Type = EST; 5915 } 5916 5917 if (ESI.Type != EST_Dynamic) 5918 return false; 5919 5920 // Instantiate a dynamic exception specification's type. 5921 for (QualType T : ESI.Exceptions) { 5922 if (const PackExpansionType *PackExpansion = 5923 T->getAs<PackExpansionType>()) { 5924 Changed = true; 5925 5926 // We have a pack expansion. Instantiate it. 5927 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5928 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5929 Unexpanded); 5930 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5931 5932 // Determine whether the set of unexpanded parameter packs can and 5933 // should 5934 // be expanded. 5935 bool Expand = false; 5936 bool RetainExpansion = false; 5937 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5938 // FIXME: Track the location of the ellipsis (and track source location 5939 // information for the types in the exception specification in general). 5940 if (getDerived().TryExpandParameterPacks( 5941 Loc, SourceRange(), Unexpanded, Expand, 5942 RetainExpansion, NumExpansions)) 5943 return true; 5944 5945 if (!Expand) { 5946 // We can't expand this pack expansion into separate arguments yet; 5947 // just substitute into the pattern and create a new pack expansion 5948 // type. 5949 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5950 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5951 if (U.isNull()) 5952 return true; 5953 5954 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5955 Exceptions.push_back(U); 5956 continue; 5957 } 5958 5959 // Substitute into the pack expansion pattern for each slice of the 5960 // pack. 5961 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5962 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5963 5964 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5965 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5966 return true; 5967 5968 Exceptions.push_back(U); 5969 } 5970 } else { 5971 QualType U = getDerived().TransformType(T); 5972 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5973 return true; 5974 if (T != U) 5975 Changed = true; 5976 5977 Exceptions.push_back(U); 5978 } 5979 } 5980 5981 ESI.Exceptions = Exceptions; 5982 if (ESI.Exceptions.empty()) 5983 ESI.Type = EST_DynamicNone; 5984 return false; 5985 } 5986 5987 template<typename Derived> 5988 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5989 TypeLocBuilder &TLB, 5990 FunctionNoProtoTypeLoc TL) { 5991 const FunctionNoProtoType *T = TL.getTypePtr(); 5992 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5993 if (ResultType.isNull()) 5994 return QualType(); 5995 5996 QualType Result = TL.getType(); 5997 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5998 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5999 6000 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6001 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6002 NewTL.setLParenLoc(TL.getLParenLoc()); 6003 NewTL.setRParenLoc(TL.getRParenLoc()); 6004 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6005 6006 return Result; 6007 } 6008 6009 template<typename Derived> QualType 6010 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 6011 UnresolvedUsingTypeLoc TL) { 6012 const UnresolvedUsingType *T = TL.getTypePtr(); 6013 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6014 if (!D) 6015 return QualType(); 6016 6017 QualType Result = TL.getType(); 6018 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6019 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6020 if (Result.isNull()) 6021 return QualType(); 6022 } 6023 6024 // We might get an arbitrary type spec type back. We should at 6025 // least always get a type spec type, though. 6026 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6027 NewTL.setNameLoc(TL.getNameLoc()); 6028 6029 return Result; 6030 } 6031 6032 template<typename Derived> 6033 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6034 TypedefTypeLoc TL) { 6035 const TypedefType *T = TL.getTypePtr(); 6036 TypedefNameDecl *Typedef 6037 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6038 T->getDecl())); 6039 if (!Typedef) 6040 return QualType(); 6041 6042 QualType Result = TL.getType(); 6043 if (getDerived().AlwaysRebuild() || 6044 Typedef != T->getDecl()) { 6045 Result = getDerived().RebuildTypedefType(Typedef); 6046 if (Result.isNull()) 6047 return QualType(); 6048 } 6049 6050 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6051 NewTL.setNameLoc(TL.getNameLoc()); 6052 6053 return Result; 6054 } 6055 6056 template<typename Derived> 6057 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6058 TypeOfExprTypeLoc TL) { 6059 // typeof expressions are not potentially evaluated contexts 6060 EnterExpressionEvaluationContext Unevaluated( 6061 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6062 Sema::ReuseLambdaContextDecl); 6063 6064 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6065 if (E.isInvalid()) 6066 return QualType(); 6067 6068 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6069 if (E.isInvalid()) 6070 return QualType(); 6071 6072 QualType Result = TL.getType(); 6073 if (getDerived().AlwaysRebuild() || 6074 E.get() != TL.getUnderlyingExpr()) { 6075 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6076 if (Result.isNull()) 6077 return QualType(); 6078 } 6079 else E.get(); 6080 6081 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6082 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6083 NewTL.setLParenLoc(TL.getLParenLoc()); 6084 NewTL.setRParenLoc(TL.getRParenLoc()); 6085 6086 return Result; 6087 } 6088 6089 template<typename Derived> 6090 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6091 TypeOfTypeLoc TL) { 6092 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6093 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6094 if (!New_Under_TI) 6095 return QualType(); 6096 6097 QualType Result = TL.getType(); 6098 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6099 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6100 if (Result.isNull()) 6101 return QualType(); 6102 } 6103 6104 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6105 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6106 NewTL.setLParenLoc(TL.getLParenLoc()); 6107 NewTL.setRParenLoc(TL.getRParenLoc()); 6108 NewTL.setUnderlyingTInfo(New_Under_TI); 6109 6110 return Result; 6111 } 6112 6113 template<typename Derived> 6114 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6115 DecltypeTypeLoc TL) { 6116 const DecltypeType *T = TL.getTypePtr(); 6117 6118 // decltype expressions are not potentially evaluated contexts 6119 EnterExpressionEvaluationContext Unevaluated( 6120 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6121 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6122 6123 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6124 if (E.isInvalid()) 6125 return QualType(); 6126 6127 E = getSema().ActOnDecltypeExpression(E.get()); 6128 if (E.isInvalid()) 6129 return QualType(); 6130 6131 QualType Result = TL.getType(); 6132 if (getDerived().AlwaysRebuild() || 6133 E.get() != T->getUnderlyingExpr()) { 6134 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6135 if (Result.isNull()) 6136 return QualType(); 6137 } 6138 else E.get(); 6139 6140 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6141 NewTL.setNameLoc(TL.getNameLoc()); 6142 6143 return Result; 6144 } 6145 6146 template<typename Derived> 6147 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6148 TypeLocBuilder &TLB, 6149 UnaryTransformTypeLoc TL) { 6150 QualType Result = TL.getType(); 6151 if (Result->isDependentType()) { 6152 const UnaryTransformType *T = TL.getTypePtr(); 6153 QualType NewBase = 6154 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6155 Result = getDerived().RebuildUnaryTransformType(NewBase, 6156 T->getUTTKind(), 6157 TL.getKWLoc()); 6158 if (Result.isNull()) 6159 return QualType(); 6160 } 6161 6162 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6163 NewTL.setKWLoc(TL.getKWLoc()); 6164 NewTL.setParensRange(TL.getParensRange()); 6165 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6166 return Result; 6167 } 6168 6169 template<typename Derived> 6170 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6171 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6172 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6173 6174 CXXScopeSpec SS; 6175 TemplateName TemplateName = getDerived().TransformTemplateName( 6176 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6177 if (TemplateName.isNull()) 6178 return QualType(); 6179 6180 QualType OldDeduced = T->getDeducedType(); 6181 QualType NewDeduced; 6182 if (!OldDeduced.isNull()) { 6183 NewDeduced = getDerived().TransformType(OldDeduced); 6184 if (NewDeduced.isNull()) 6185 return QualType(); 6186 } 6187 6188 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6189 TemplateName, NewDeduced); 6190 if (Result.isNull()) 6191 return QualType(); 6192 6193 DeducedTemplateSpecializationTypeLoc NewTL = 6194 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6195 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6196 6197 return Result; 6198 } 6199 6200 template<typename Derived> 6201 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6202 RecordTypeLoc TL) { 6203 const RecordType *T = TL.getTypePtr(); 6204 RecordDecl *Record 6205 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6206 T->getDecl())); 6207 if (!Record) 6208 return QualType(); 6209 6210 QualType Result = TL.getType(); 6211 if (getDerived().AlwaysRebuild() || 6212 Record != T->getDecl()) { 6213 Result = getDerived().RebuildRecordType(Record); 6214 if (Result.isNull()) 6215 return QualType(); 6216 } 6217 6218 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6219 NewTL.setNameLoc(TL.getNameLoc()); 6220 6221 return Result; 6222 } 6223 6224 template<typename Derived> 6225 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6226 EnumTypeLoc TL) { 6227 const EnumType *T = TL.getTypePtr(); 6228 EnumDecl *Enum 6229 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6230 T->getDecl())); 6231 if (!Enum) 6232 return QualType(); 6233 6234 QualType Result = TL.getType(); 6235 if (getDerived().AlwaysRebuild() || 6236 Enum != T->getDecl()) { 6237 Result = getDerived().RebuildEnumType(Enum); 6238 if (Result.isNull()) 6239 return QualType(); 6240 } 6241 6242 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6243 NewTL.setNameLoc(TL.getNameLoc()); 6244 6245 return Result; 6246 } 6247 6248 template<typename Derived> 6249 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6250 TypeLocBuilder &TLB, 6251 InjectedClassNameTypeLoc TL) { 6252 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6253 TL.getTypePtr()->getDecl()); 6254 if (!D) return QualType(); 6255 6256 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6257 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6258 return T; 6259 } 6260 6261 template<typename Derived> 6262 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6263 TypeLocBuilder &TLB, 6264 TemplateTypeParmTypeLoc TL) { 6265 return TransformTypeSpecType(TLB, TL); 6266 } 6267 6268 template<typename Derived> 6269 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6270 TypeLocBuilder &TLB, 6271 SubstTemplateTypeParmTypeLoc TL) { 6272 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6273 6274 // Substitute into the replacement type, which itself might involve something 6275 // that needs to be transformed. This only tends to occur with default 6276 // template arguments of template template parameters. 6277 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6278 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6279 if (Replacement.isNull()) 6280 return QualType(); 6281 6282 // Always canonicalize the replacement type. 6283 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6284 QualType Result 6285 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6286 Replacement); 6287 6288 // Propagate type-source information. 6289 SubstTemplateTypeParmTypeLoc NewTL 6290 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6291 NewTL.setNameLoc(TL.getNameLoc()); 6292 return Result; 6293 6294 } 6295 6296 template<typename Derived> 6297 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6298 TypeLocBuilder &TLB, 6299 SubstTemplateTypeParmPackTypeLoc TL) { 6300 return TransformTypeSpecType(TLB, TL); 6301 } 6302 6303 template<typename Derived> 6304 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6305 TypeLocBuilder &TLB, 6306 TemplateSpecializationTypeLoc TL) { 6307 const TemplateSpecializationType *T = TL.getTypePtr(); 6308 6309 // The nested-name-specifier never matters in a TemplateSpecializationType, 6310 // because we can't have a dependent nested-name-specifier anyway. 6311 CXXScopeSpec SS; 6312 TemplateName Template 6313 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6314 TL.getTemplateNameLoc()); 6315 if (Template.isNull()) 6316 return QualType(); 6317 6318 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6319 } 6320 6321 template<typename Derived> 6322 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6323 AtomicTypeLoc TL) { 6324 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6325 if (ValueType.isNull()) 6326 return QualType(); 6327 6328 QualType Result = TL.getType(); 6329 if (getDerived().AlwaysRebuild() || 6330 ValueType != TL.getValueLoc().getType()) { 6331 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6332 if (Result.isNull()) 6333 return QualType(); 6334 } 6335 6336 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6337 NewTL.setKWLoc(TL.getKWLoc()); 6338 NewTL.setLParenLoc(TL.getLParenLoc()); 6339 NewTL.setRParenLoc(TL.getRParenLoc()); 6340 6341 return Result; 6342 } 6343 6344 template <typename Derived> 6345 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6346 PipeTypeLoc TL) { 6347 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6348 if (ValueType.isNull()) 6349 return QualType(); 6350 6351 QualType Result = TL.getType(); 6352 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6353 const PipeType *PT = Result->castAs<PipeType>(); 6354 bool isReadPipe = PT->isReadOnly(); 6355 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6356 if (Result.isNull()) 6357 return QualType(); 6358 } 6359 6360 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6361 NewTL.setKWLoc(TL.getKWLoc()); 6362 6363 return Result; 6364 } 6365 6366 template <typename Derived> 6367 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6368 ExtIntTypeLoc TL) { 6369 const ExtIntType *EIT = TL.getTypePtr(); 6370 QualType Result = TL.getType(); 6371 6372 if (getDerived().AlwaysRebuild()) { 6373 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6374 EIT->getNumBits(), TL.getNameLoc()); 6375 if (Result.isNull()) 6376 return QualType(); 6377 } 6378 6379 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6380 NewTL.setNameLoc(TL.getNameLoc()); 6381 return Result; 6382 } 6383 6384 template <typename Derived> 6385 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6386 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6387 const DependentExtIntType *EIT = TL.getTypePtr(); 6388 6389 EnterExpressionEvaluationContext Unevaluated( 6390 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6391 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6392 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6393 6394 if (BitsExpr.isInvalid()) 6395 return QualType(); 6396 6397 QualType Result = TL.getType(); 6398 6399 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6400 Result = getDerived().RebuildDependentExtIntType( 6401 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6402 6403 if (Result.isNull()) 6404 return QualType(); 6405 } 6406 6407 if (isa<DependentExtIntType>(Result)) { 6408 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6409 NewTL.setNameLoc(TL.getNameLoc()); 6410 } else { 6411 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6412 NewTL.setNameLoc(TL.getNameLoc()); 6413 } 6414 return Result; 6415 } 6416 6417 /// Simple iterator that traverses the template arguments in a 6418 /// container that provides a \c getArgLoc() member function. 6419 /// 6420 /// This iterator is intended to be used with the iterator form of 6421 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6422 template<typename ArgLocContainer> 6423 class TemplateArgumentLocContainerIterator { 6424 ArgLocContainer *Container; 6425 unsigned Index; 6426 6427 public: 6428 typedef TemplateArgumentLoc value_type; 6429 typedef TemplateArgumentLoc reference; 6430 typedef int difference_type; 6431 typedef std::input_iterator_tag iterator_category; 6432 6433 class pointer { 6434 TemplateArgumentLoc Arg; 6435 6436 public: 6437 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6438 6439 const TemplateArgumentLoc *operator->() const { 6440 return &Arg; 6441 } 6442 }; 6443 6444 6445 TemplateArgumentLocContainerIterator() {} 6446 6447 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6448 unsigned Index) 6449 : Container(&Container), Index(Index) { } 6450 6451 TemplateArgumentLocContainerIterator &operator++() { 6452 ++Index; 6453 return *this; 6454 } 6455 6456 TemplateArgumentLocContainerIterator operator++(int) { 6457 TemplateArgumentLocContainerIterator Old(*this); 6458 ++(*this); 6459 return Old; 6460 } 6461 6462 TemplateArgumentLoc operator*() const { 6463 return Container->getArgLoc(Index); 6464 } 6465 6466 pointer operator->() const { 6467 return pointer(Container->getArgLoc(Index)); 6468 } 6469 6470 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6471 const TemplateArgumentLocContainerIterator &Y) { 6472 return X.Container == Y.Container && X.Index == Y.Index; 6473 } 6474 6475 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6476 const TemplateArgumentLocContainerIterator &Y) { 6477 return !(X == Y); 6478 } 6479 }; 6480 6481 template<typename Derived> 6482 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6483 AutoTypeLoc TL) { 6484 const AutoType *T = TL.getTypePtr(); 6485 QualType OldDeduced = T->getDeducedType(); 6486 QualType NewDeduced; 6487 if (!OldDeduced.isNull()) { 6488 NewDeduced = getDerived().TransformType(OldDeduced); 6489 if (NewDeduced.isNull()) 6490 return QualType(); 6491 } 6492 6493 ConceptDecl *NewCD = nullptr; 6494 TemplateArgumentListInfo NewTemplateArgs; 6495 NestedNameSpecifierLoc NewNestedNameSpec; 6496 if (TL.getTypePtr()->isConstrained()) { 6497 NewCD = cast_or_null<ConceptDecl>( 6498 getDerived().TransformDecl( 6499 TL.getConceptNameLoc(), 6500 TL.getTypePtr()->getTypeConstraintConcept())); 6501 6502 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6503 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6504 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6505 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6506 ArgIterator(TL, 6507 TL.getNumArgs()), 6508 NewTemplateArgs)) 6509 return QualType(); 6510 6511 if (TL.getNestedNameSpecifierLoc()) { 6512 NewNestedNameSpec 6513 = getDerived().TransformNestedNameSpecifierLoc( 6514 TL.getNestedNameSpecifierLoc()); 6515 if (!NewNestedNameSpec) 6516 return QualType(); 6517 } 6518 } 6519 6520 QualType Result = TL.getType(); 6521 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6522 T->isDependentType()) { 6523 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6524 NewArgList.reserve(NewArgList.size()); 6525 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6526 NewArgList.push_back(ArgLoc.getArgument()); 6527 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6528 NewArgList); 6529 if (Result.isNull()) 6530 return QualType(); 6531 } 6532 6533 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6534 NewTL.setNameLoc(TL.getNameLoc()); 6535 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6536 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6537 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6538 NewTL.setFoundDecl(TL.getFoundDecl()); 6539 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6540 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6541 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6542 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6543 6544 return Result; 6545 } 6546 6547 template <typename Derived> 6548 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6549 TypeLocBuilder &TLB, 6550 TemplateSpecializationTypeLoc TL, 6551 TemplateName Template) { 6552 TemplateArgumentListInfo NewTemplateArgs; 6553 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6554 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6555 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6556 ArgIterator; 6557 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6558 ArgIterator(TL, TL.getNumArgs()), 6559 NewTemplateArgs)) 6560 return QualType(); 6561 6562 // FIXME: maybe don't rebuild if all the template arguments are the same. 6563 6564 QualType Result = 6565 getDerived().RebuildTemplateSpecializationType(Template, 6566 TL.getTemplateNameLoc(), 6567 NewTemplateArgs); 6568 6569 if (!Result.isNull()) { 6570 // Specializations of template template parameters are represented as 6571 // TemplateSpecializationTypes, and substitution of type alias templates 6572 // within a dependent context can transform them into 6573 // DependentTemplateSpecializationTypes. 6574 if (isa<DependentTemplateSpecializationType>(Result)) { 6575 DependentTemplateSpecializationTypeLoc NewTL 6576 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6577 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6578 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6579 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6580 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6581 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6582 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6583 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6584 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6585 return Result; 6586 } 6587 6588 TemplateSpecializationTypeLoc NewTL 6589 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6590 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6591 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6592 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6593 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6594 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6595 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6596 } 6597 6598 return Result; 6599 } 6600 6601 template <typename Derived> 6602 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6603 TypeLocBuilder &TLB, 6604 DependentTemplateSpecializationTypeLoc TL, 6605 TemplateName Template, 6606 CXXScopeSpec &SS) { 6607 TemplateArgumentListInfo NewTemplateArgs; 6608 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6609 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6610 typedef TemplateArgumentLocContainerIterator< 6611 DependentTemplateSpecializationTypeLoc> ArgIterator; 6612 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6613 ArgIterator(TL, TL.getNumArgs()), 6614 NewTemplateArgs)) 6615 return QualType(); 6616 6617 // FIXME: maybe don't rebuild if all the template arguments are the same. 6618 6619 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6620 QualType Result 6621 = getSema().Context.getDependentTemplateSpecializationType( 6622 TL.getTypePtr()->getKeyword(), 6623 DTN->getQualifier(), 6624 DTN->getIdentifier(), 6625 NewTemplateArgs); 6626 6627 DependentTemplateSpecializationTypeLoc NewTL 6628 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6629 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6630 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6631 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6632 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6633 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6634 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6635 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6636 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6637 return Result; 6638 } 6639 6640 QualType Result 6641 = getDerived().RebuildTemplateSpecializationType(Template, 6642 TL.getTemplateNameLoc(), 6643 NewTemplateArgs); 6644 6645 if (!Result.isNull()) { 6646 /// FIXME: Wrap this in an elaborated-type-specifier? 6647 TemplateSpecializationTypeLoc NewTL 6648 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6649 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6650 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6651 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6652 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6653 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6654 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6655 } 6656 6657 return Result; 6658 } 6659 6660 template<typename Derived> 6661 QualType 6662 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6663 ElaboratedTypeLoc TL) { 6664 const ElaboratedType *T = TL.getTypePtr(); 6665 6666 NestedNameSpecifierLoc QualifierLoc; 6667 // NOTE: the qualifier in an ElaboratedType is optional. 6668 if (TL.getQualifierLoc()) { 6669 QualifierLoc 6670 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6671 if (!QualifierLoc) 6672 return QualType(); 6673 } 6674 6675 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6676 if (NamedT.isNull()) 6677 return QualType(); 6678 6679 // C++0x [dcl.type.elab]p2: 6680 // If the identifier resolves to a typedef-name or the simple-template-id 6681 // resolves to an alias template specialization, the 6682 // elaborated-type-specifier is ill-formed. 6683 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6684 if (const TemplateSpecializationType *TST = 6685 NamedT->getAs<TemplateSpecializationType>()) { 6686 TemplateName Template = TST->getTemplateName(); 6687 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6688 Template.getAsTemplateDecl())) { 6689 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6690 diag::err_tag_reference_non_tag) 6691 << TAT << Sema::NTK_TypeAliasTemplate 6692 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6693 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6694 } 6695 } 6696 } 6697 6698 QualType Result = TL.getType(); 6699 if (getDerived().AlwaysRebuild() || 6700 QualifierLoc != TL.getQualifierLoc() || 6701 NamedT != T->getNamedType()) { 6702 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6703 T->getKeyword(), 6704 QualifierLoc, NamedT); 6705 if (Result.isNull()) 6706 return QualType(); 6707 } 6708 6709 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6710 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6711 NewTL.setQualifierLoc(QualifierLoc); 6712 return Result; 6713 } 6714 6715 template<typename Derived> 6716 QualType TreeTransform<Derived>::TransformAttributedType( 6717 TypeLocBuilder &TLB, 6718 AttributedTypeLoc TL) { 6719 const AttributedType *oldType = TL.getTypePtr(); 6720 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6721 if (modifiedType.isNull()) 6722 return QualType(); 6723 6724 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6725 const Attr *oldAttr = TL.getAttr(); 6726 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6727 if (oldAttr && !newAttr) 6728 return QualType(); 6729 6730 QualType result = TL.getType(); 6731 6732 // FIXME: dependent operand expressions? 6733 if (getDerived().AlwaysRebuild() || 6734 modifiedType != oldType->getModifiedType()) { 6735 // TODO: this is really lame; we should really be rebuilding the 6736 // equivalent type from first principles. 6737 QualType equivalentType 6738 = getDerived().TransformType(oldType->getEquivalentType()); 6739 if (equivalentType.isNull()) 6740 return QualType(); 6741 6742 // Check whether we can add nullability; it is only represented as 6743 // type sugar, and therefore cannot be diagnosed in any other way. 6744 if (auto nullability = oldType->getImmediateNullability()) { 6745 if (!modifiedType->canHaveNullability()) { 6746 SemaRef.Diag(TL.getAttr()->getLocation(), 6747 diag::err_nullability_nonpointer) 6748 << DiagNullabilityKind(*nullability, false) << modifiedType; 6749 return QualType(); 6750 } 6751 } 6752 6753 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6754 modifiedType, 6755 equivalentType); 6756 } 6757 6758 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6759 newTL.setAttr(newAttr); 6760 return result; 6761 } 6762 6763 template<typename Derived> 6764 QualType 6765 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6766 ParenTypeLoc TL) { 6767 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6768 if (Inner.isNull()) 6769 return QualType(); 6770 6771 QualType Result = TL.getType(); 6772 if (getDerived().AlwaysRebuild() || 6773 Inner != TL.getInnerLoc().getType()) { 6774 Result = getDerived().RebuildParenType(Inner); 6775 if (Result.isNull()) 6776 return QualType(); 6777 } 6778 6779 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6780 NewTL.setLParenLoc(TL.getLParenLoc()); 6781 NewTL.setRParenLoc(TL.getRParenLoc()); 6782 return Result; 6783 } 6784 6785 template <typename Derived> 6786 QualType 6787 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6788 MacroQualifiedTypeLoc TL) { 6789 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6790 if (Inner.isNull()) 6791 return QualType(); 6792 6793 QualType Result = TL.getType(); 6794 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6795 Result = 6796 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6797 if (Result.isNull()) 6798 return QualType(); 6799 } 6800 6801 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6802 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6803 return Result; 6804 } 6805 6806 template<typename Derived> 6807 QualType TreeTransform<Derived>::TransformDependentNameType( 6808 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6809 return TransformDependentNameType(TLB, TL, false); 6810 } 6811 6812 template<typename Derived> 6813 QualType TreeTransform<Derived>::TransformDependentNameType( 6814 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6815 const DependentNameType *T = TL.getTypePtr(); 6816 6817 NestedNameSpecifierLoc QualifierLoc 6818 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6819 if (!QualifierLoc) 6820 return QualType(); 6821 6822 QualType Result 6823 = getDerived().RebuildDependentNameType(T->getKeyword(), 6824 TL.getElaboratedKeywordLoc(), 6825 QualifierLoc, 6826 T->getIdentifier(), 6827 TL.getNameLoc(), 6828 DeducedTSTContext); 6829 if (Result.isNull()) 6830 return QualType(); 6831 6832 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6833 QualType NamedT = ElabT->getNamedType(); 6834 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6835 6836 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6837 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6838 NewTL.setQualifierLoc(QualifierLoc); 6839 } else { 6840 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6841 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6842 NewTL.setQualifierLoc(QualifierLoc); 6843 NewTL.setNameLoc(TL.getNameLoc()); 6844 } 6845 return Result; 6846 } 6847 6848 template<typename Derived> 6849 QualType TreeTransform<Derived>:: 6850 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6851 DependentTemplateSpecializationTypeLoc TL) { 6852 NestedNameSpecifierLoc QualifierLoc; 6853 if (TL.getQualifierLoc()) { 6854 QualifierLoc 6855 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6856 if (!QualifierLoc) 6857 return QualType(); 6858 } 6859 6860 return getDerived() 6861 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6862 } 6863 6864 template<typename Derived> 6865 QualType TreeTransform<Derived>:: 6866 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6867 DependentTemplateSpecializationTypeLoc TL, 6868 NestedNameSpecifierLoc QualifierLoc) { 6869 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6870 6871 TemplateArgumentListInfo NewTemplateArgs; 6872 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6873 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6874 6875 typedef TemplateArgumentLocContainerIterator< 6876 DependentTemplateSpecializationTypeLoc> ArgIterator; 6877 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6878 ArgIterator(TL, TL.getNumArgs()), 6879 NewTemplateArgs)) 6880 return QualType(); 6881 6882 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6883 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6884 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6885 /*AllowInjectedClassName*/ false); 6886 if (Result.isNull()) 6887 return QualType(); 6888 6889 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6890 QualType NamedT = ElabT->getNamedType(); 6891 6892 // Copy information relevant to the template specialization. 6893 TemplateSpecializationTypeLoc NamedTL 6894 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6895 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6896 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6897 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6898 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6899 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6900 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6901 6902 // Copy information relevant to the elaborated type. 6903 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6904 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6905 NewTL.setQualifierLoc(QualifierLoc); 6906 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6907 DependentTemplateSpecializationTypeLoc SpecTL 6908 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6909 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6910 SpecTL.setQualifierLoc(QualifierLoc); 6911 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6912 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6913 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6914 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6915 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6916 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6917 } else { 6918 TemplateSpecializationTypeLoc SpecTL 6919 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6920 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6921 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6922 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6923 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6924 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6925 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6926 } 6927 return Result; 6928 } 6929 6930 template<typename Derived> 6931 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6932 PackExpansionTypeLoc TL) { 6933 QualType Pattern 6934 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6935 if (Pattern.isNull()) 6936 return QualType(); 6937 6938 QualType Result = TL.getType(); 6939 if (getDerived().AlwaysRebuild() || 6940 Pattern != TL.getPatternLoc().getType()) { 6941 Result = getDerived().RebuildPackExpansionType(Pattern, 6942 TL.getPatternLoc().getSourceRange(), 6943 TL.getEllipsisLoc(), 6944 TL.getTypePtr()->getNumExpansions()); 6945 if (Result.isNull()) 6946 return QualType(); 6947 } 6948 6949 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6950 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6951 return Result; 6952 } 6953 6954 template<typename Derived> 6955 QualType 6956 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6957 ObjCInterfaceTypeLoc TL) { 6958 // ObjCInterfaceType is never dependent. 6959 TLB.pushFullCopy(TL); 6960 return TL.getType(); 6961 } 6962 6963 template<typename Derived> 6964 QualType 6965 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6966 ObjCTypeParamTypeLoc TL) { 6967 const ObjCTypeParamType *T = TL.getTypePtr(); 6968 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6969 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6970 if (!OTP) 6971 return QualType(); 6972 6973 QualType Result = TL.getType(); 6974 if (getDerived().AlwaysRebuild() || 6975 OTP != T->getDecl()) { 6976 Result = getDerived().RebuildObjCTypeParamType(OTP, 6977 TL.getProtocolLAngleLoc(), 6978 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6979 TL.getNumProtocols()), 6980 TL.getProtocolLocs(), 6981 TL.getProtocolRAngleLoc()); 6982 if (Result.isNull()) 6983 return QualType(); 6984 } 6985 6986 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6987 if (TL.getNumProtocols()) { 6988 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6989 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6990 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6991 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6992 } 6993 return Result; 6994 } 6995 6996 template<typename Derived> 6997 QualType 6998 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6999 ObjCObjectTypeLoc TL) { 7000 // Transform base type. 7001 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7002 if (BaseType.isNull()) 7003 return QualType(); 7004 7005 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7006 7007 // Transform type arguments. 7008 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7009 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7010 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7011 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7012 QualType TypeArg = TypeArgInfo->getType(); 7013 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7014 AnyChanged = true; 7015 7016 // We have a pack expansion. Instantiate it. 7017 const auto *PackExpansion = PackExpansionLoc.getType() 7018 ->castAs<PackExpansionType>(); 7019 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7020 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7021 Unexpanded); 7022 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7023 7024 // Determine whether the set of unexpanded parameter packs can 7025 // and should be expanded. 7026 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7027 bool Expand = false; 7028 bool RetainExpansion = false; 7029 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7030 if (getDerived().TryExpandParameterPacks( 7031 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7032 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7033 return QualType(); 7034 7035 if (!Expand) { 7036 // We can't expand this pack expansion into separate arguments yet; 7037 // just substitute into the pattern and create a new pack expansion 7038 // type. 7039 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7040 7041 TypeLocBuilder TypeArgBuilder; 7042 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7043 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7044 PatternLoc); 7045 if (NewPatternType.isNull()) 7046 return QualType(); 7047 7048 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7049 NewPatternType, NumExpansions); 7050 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7051 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7052 NewTypeArgInfos.push_back( 7053 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7054 continue; 7055 } 7056 7057 // Substitute into the pack expansion pattern for each slice of the 7058 // pack. 7059 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7060 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7061 7062 TypeLocBuilder TypeArgBuilder; 7063 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7064 7065 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7066 PatternLoc); 7067 if (NewTypeArg.isNull()) 7068 return QualType(); 7069 7070 NewTypeArgInfos.push_back( 7071 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7072 } 7073 7074 continue; 7075 } 7076 7077 TypeLocBuilder TypeArgBuilder; 7078 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7079 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7080 if (NewTypeArg.isNull()) 7081 return QualType(); 7082 7083 // If nothing changed, just keep the old TypeSourceInfo. 7084 if (NewTypeArg == TypeArg) { 7085 NewTypeArgInfos.push_back(TypeArgInfo); 7086 continue; 7087 } 7088 7089 NewTypeArgInfos.push_back( 7090 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7091 AnyChanged = true; 7092 } 7093 7094 QualType Result = TL.getType(); 7095 if (getDerived().AlwaysRebuild() || AnyChanged) { 7096 // Rebuild the type. 7097 Result = getDerived().RebuildObjCObjectType( 7098 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7099 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7100 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7101 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7102 7103 if (Result.isNull()) 7104 return QualType(); 7105 } 7106 7107 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7108 NewT.setHasBaseTypeAsWritten(true); 7109 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7110 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7111 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7112 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7113 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7114 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7115 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7116 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7117 return Result; 7118 } 7119 7120 template<typename Derived> 7121 QualType 7122 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7123 ObjCObjectPointerTypeLoc TL) { 7124 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7125 if (PointeeType.isNull()) 7126 return QualType(); 7127 7128 QualType Result = TL.getType(); 7129 if (getDerived().AlwaysRebuild() || 7130 PointeeType != TL.getPointeeLoc().getType()) { 7131 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7132 TL.getStarLoc()); 7133 if (Result.isNull()) 7134 return QualType(); 7135 } 7136 7137 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7138 NewT.setStarLoc(TL.getStarLoc()); 7139 return Result; 7140 } 7141 7142 //===----------------------------------------------------------------------===// 7143 // Statement transformation 7144 //===----------------------------------------------------------------------===// 7145 template<typename Derived> 7146 StmtResult 7147 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7148 return S; 7149 } 7150 7151 template<typename Derived> 7152 StmtResult 7153 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7154 return getDerived().TransformCompoundStmt(S, false); 7155 } 7156 7157 template<typename Derived> 7158 StmtResult 7159 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7160 bool IsStmtExpr) { 7161 Sema::CompoundScopeRAII CompoundScope(getSema()); 7162 7163 const Stmt *ExprResult = S->getStmtExprResult(); 7164 bool SubStmtInvalid = false; 7165 bool SubStmtChanged = false; 7166 SmallVector<Stmt*, 8> Statements; 7167 for (auto *B : S->body()) { 7168 StmtResult Result = getDerived().TransformStmt( 7169 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7170 7171 if (Result.isInvalid()) { 7172 // Immediately fail if this was a DeclStmt, since it's very 7173 // likely that this will cause problems for future statements. 7174 if (isa<DeclStmt>(B)) 7175 return StmtError(); 7176 7177 // Otherwise, just keep processing substatements and fail later. 7178 SubStmtInvalid = true; 7179 continue; 7180 } 7181 7182 SubStmtChanged = SubStmtChanged || Result.get() != B; 7183 Statements.push_back(Result.getAs<Stmt>()); 7184 } 7185 7186 if (SubStmtInvalid) 7187 return StmtError(); 7188 7189 if (!getDerived().AlwaysRebuild() && 7190 !SubStmtChanged) 7191 return S; 7192 7193 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7194 Statements, 7195 S->getRBracLoc(), 7196 IsStmtExpr); 7197 } 7198 7199 template<typename Derived> 7200 StmtResult 7201 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7202 ExprResult LHS, RHS; 7203 { 7204 EnterExpressionEvaluationContext Unevaluated( 7205 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7206 7207 // Transform the left-hand case value. 7208 LHS = getDerived().TransformExpr(S->getLHS()); 7209 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7210 if (LHS.isInvalid()) 7211 return StmtError(); 7212 7213 // Transform the right-hand case value (for the GNU case-range extension). 7214 RHS = getDerived().TransformExpr(S->getRHS()); 7215 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7216 if (RHS.isInvalid()) 7217 return StmtError(); 7218 } 7219 7220 // Build the case statement. 7221 // Case statements are always rebuilt so that they will attached to their 7222 // transformed switch statement. 7223 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7224 LHS.get(), 7225 S->getEllipsisLoc(), 7226 RHS.get(), 7227 S->getColonLoc()); 7228 if (Case.isInvalid()) 7229 return StmtError(); 7230 7231 // Transform the statement following the case 7232 StmtResult SubStmt = 7233 getDerived().TransformStmt(S->getSubStmt()); 7234 if (SubStmt.isInvalid()) 7235 return StmtError(); 7236 7237 // Attach the body to the case statement 7238 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7239 } 7240 7241 template <typename Derived> 7242 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7243 // Transform the statement following the default case 7244 StmtResult SubStmt = 7245 getDerived().TransformStmt(S->getSubStmt()); 7246 if (SubStmt.isInvalid()) 7247 return StmtError(); 7248 7249 // Default statements are always rebuilt 7250 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7251 SubStmt.get()); 7252 } 7253 7254 template<typename Derived> 7255 StmtResult 7256 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7257 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7258 if (SubStmt.isInvalid()) 7259 return StmtError(); 7260 7261 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7262 S->getDecl()); 7263 if (!LD) 7264 return StmtError(); 7265 7266 // If we're transforming "in-place" (we're not creating new local 7267 // declarations), assume we're replacing the old label statement 7268 // and clear out the reference to it. 7269 if (LD == S->getDecl()) 7270 S->getDecl()->setStmt(nullptr); 7271 7272 // FIXME: Pass the real colon location in. 7273 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7274 cast<LabelDecl>(LD), SourceLocation(), 7275 SubStmt.get()); 7276 } 7277 7278 template <typename Derived> 7279 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7280 if (!R) 7281 return R; 7282 7283 switch (R->getKind()) { 7284 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7285 #define ATTR(X) 7286 #define PRAGMA_SPELLING_ATTR(X) \ 7287 case attr::X: \ 7288 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7289 #include "clang/Basic/AttrList.inc" 7290 default: 7291 return R; 7292 } 7293 } 7294 7295 template <typename Derived> 7296 StmtResult 7297 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7298 StmtDiscardKind SDK) { 7299 bool AttrsChanged = false; 7300 SmallVector<const Attr *, 1> Attrs; 7301 7302 // Visit attributes and keep track if any are transformed. 7303 for (const auto *I : S->getAttrs()) { 7304 const Attr *R = getDerived().TransformAttr(I); 7305 AttrsChanged |= (I != R); 7306 Attrs.push_back(R); 7307 } 7308 7309 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7310 if (SubStmt.isInvalid()) 7311 return StmtError(); 7312 7313 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7314 return S; 7315 7316 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7317 SubStmt.get()); 7318 } 7319 7320 template<typename Derived> 7321 StmtResult 7322 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7323 // Transform the initialization statement 7324 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7325 if (Init.isInvalid()) 7326 return StmtError(); 7327 7328 // Transform the condition 7329 Sema::ConditionResult Cond = getDerived().TransformCondition( 7330 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7331 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7332 : Sema::ConditionKind::Boolean); 7333 if (Cond.isInvalid()) 7334 return StmtError(); 7335 7336 // If this is a constexpr if, determine which arm we should instantiate. 7337 llvm::Optional<bool> ConstexprConditionValue; 7338 if (S->isConstexpr()) 7339 ConstexprConditionValue = Cond.getKnownValue(); 7340 7341 // Transform the "then" branch. 7342 StmtResult Then; 7343 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7344 Then = getDerived().TransformStmt(S->getThen()); 7345 if (Then.isInvalid()) 7346 return StmtError(); 7347 } else { 7348 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7349 } 7350 7351 // Transform the "else" branch. 7352 StmtResult Else; 7353 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7354 Else = getDerived().TransformStmt(S->getElse()); 7355 if (Else.isInvalid()) 7356 return StmtError(); 7357 } 7358 7359 if (!getDerived().AlwaysRebuild() && 7360 Init.get() == S->getInit() && 7361 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7362 Then.get() == S->getThen() && 7363 Else.get() == S->getElse()) 7364 return S; 7365 7366 return getDerived().RebuildIfStmt( 7367 S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, 7368 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7369 } 7370 7371 template<typename Derived> 7372 StmtResult 7373 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7374 // Transform the initialization statement 7375 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7376 if (Init.isInvalid()) 7377 return StmtError(); 7378 7379 // Transform the condition. 7380 Sema::ConditionResult Cond = getDerived().TransformCondition( 7381 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7382 Sema::ConditionKind::Switch); 7383 if (Cond.isInvalid()) 7384 return StmtError(); 7385 7386 // Rebuild the switch statement. 7387 StmtResult Switch = 7388 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7389 Init.get(), Cond, S->getRParenLoc()); 7390 if (Switch.isInvalid()) 7391 return StmtError(); 7392 7393 // Transform the body of the switch statement. 7394 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7395 if (Body.isInvalid()) 7396 return StmtError(); 7397 7398 // Complete the switch statement. 7399 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7400 Body.get()); 7401 } 7402 7403 template<typename Derived> 7404 StmtResult 7405 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7406 // Transform the condition 7407 Sema::ConditionResult Cond = getDerived().TransformCondition( 7408 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7409 Sema::ConditionKind::Boolean); 7410 if (Cond.isInvalid()) 7411 return StmtError(); 7412 7413 // Transform the body 7414 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7415 if (Body.isInvalid()) 7416 return StmtError(); 7417 7418 if (!getDerived().AlwaysRebuild() && 7419 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7420 Body.get() == S->getBody()) 7421 return Owned(S); 7422 7423 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7424 Cond, S->getRParenLoc(), Body.get()); 7425 } 7426 7427 template<typename Derived> 7428 StmtResult 7429 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7430 // Transform the body 7431 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7432 if (Body.isInvalid()) 7433 return StmtError(); 7434 7435 // Transform the condition 7436 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7437 if (Cond.isInvalid()) 7438 return StmtError(); 7439 7440 if (!getDerived().AlwaysRebuild() && 7441 Cond.get() == S->getCond() && 7442 Body.get() == S->getBody()) 7443 return S; 7444 7445 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7446 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7447 S->getRParenLoc()); 7448 } 7449 7450 template<typename Derived> 7451 StmtResult 7452 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7453 if (getSema().getLangOpts().OpenMP) 7454 getSema().startOpenMPLoop(); 7455 7456 // Transform the initialization statement 7457 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7458 if (Init.isInvalid()) 7459 return StmtError(); 7460 7461 // In OpenMP loop region loop control variable must be captured and be 7462 // private. Perform analysis of first part (if any). 7463 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7464 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7465 7466 // Transform the condition 7467 Sema::ConditionResult Cond = getDerived().TransformCondition( 7468 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7469 Sema::ConditionKind::Boolean); 7470 if (Cond.isInvalid()) 7471 return StmtError(); 7472 7473 // Transform the increment 7474 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7475 if (Inc.isInvalid()) 7476 return StmtError(); 7477 7478 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7479 if (S->getInc() && !FullInc.get()) 7480 return StmtError(); 7481 7482 // Transform the body 7483 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7484 if (Body.isInvalid()) 7485 return StmtError(); 7486 7487 if (!getDerived().AlwaysRebuild() && 7488 Init.get() == S->getInit() && 7489 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7490 Inc.get() == S->getInc() && 7491 Body.get() == S->getBody()) 7492 return S; 7493 7494 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7495 Init.get(), Cond, FullInc, 7496 S->getRParenLoc(), Body.get()); 7497 } 7498 7499 template<typename Derived> 7500 StmtResult 7501 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7502 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7503 S->getLabel()); 7504 if (!LD) 7505 return StmtError(); 7506 7507 // Goto statements must always be rebuilt, to resolve the label. 7508 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7509 cast<LabelDecl>(LD)); 7510 } 7511 7512 template<typename Derived> 7513 StmtResult 7514 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7515 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7516 if (Target.isInvalid()) 7517 return StmtError(); 7518 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7519 7520 if (!getDerived().AlwaysRebuild() && 7521 Target.get() == S->getTarget()) 7522 return S; 7523 7524 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7525 Target.get()); 7526 } 7527 7528 template<typename Derived> 7529 StmtResult 7530 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7531 return S; 7532 } 7533 7534 template<typename Derived> 7535 StmtResult 7536 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7537 return S; 7538 } 7539 7540 template<typename Derived> 7541 StmtResult 7542 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7543 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7544 /*NotCopyInit*/false); 7545 if (Result.isInvalid()) 7546 return StmtError(); 7547 7548 // FIXME: We always rebuild the return statement because there is no way 7549 // to tell whether the return type of the function has changed. 7550 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7551 } 7552 7553 template<typename Derived> 7554 StmtResult 7555 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7556 bool DeclChanged = false; 7557 SmallVector<Decl *, 4> Decls; 7558 for (auto *D : S->decls()) { 7559 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7560 if (!Transformed) 7561 return StmtError(); 7562 7563 if (Transformed != D) 7564 DeclChanged = true; 7565 7566 Decls.push_back(Transformed); 7567 } 7568 7569 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7570 return S; 7571 7572 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7573 } 7574 7575 template<typename Derived> 7576 StmtResult 7577 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7578 7579 SmallVector<Expr*, 8> Constraints; 7580 SmallVector<Expr*, 8> Exprs; 7581 SmallVector<IdentifierInfo *, 4> Names; 7582 7583 ExprResult AsmString; 7584 SmallVector<Expr*, 8> Clobbers; 7585 7586 bool ExprsChanged = false; 7587 7588 // Go through the outputs. 7589 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7590 Names.push_back(S->getOutputIdentifier(I)); 7591 7592 // No need to transform the constraint literal. 7593 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7594 7595 // Transform the output expr. 7596 Expr *OutputExpr = S->getOutputExpr(I); 7597 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7598 if (Result.isInvalid()) 7599 return StmtError(); 7600 7601 ExprsChanged |= Result.get() != OutputExpr; 7602 7603 Exprs.push_back(Result.get()); 7604 } 7605 7606 // Go through the inputs. 7607 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7608 Names.push_back(S->getInputIdentifier(I)); 7609 7610 // No need to transform the constraint literal. 7611 Constraints.push_back(S->getInputConstraintLiteral(I)); 7612 7613 // Transform the input expr. 7614 Expr *InputExpr = S->getInputExpr(I); 7615 ExprResult Result = getDerived().TransformExpr(InputExpr); 7616 if (Result.isInvalid()) 7617 return StmtError(); 7618 7619 ExprsChanged |= Result.get() != InputExpr; 7620 7621 Exprs.push_back(Result.get()); 7622 } 7623 7624 // Go through the Labels. 7625 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7626 Names.push_back(S->getLabelIdentifier(I)); 7627 7628 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7629 if (Result.isInvalid()) 7630 return StmtError(); 7631 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7632 Exprs.push_back(Result.get()); 7633 } 7634 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7635 return S; 7636 7637 // Go through the clobbers. 7638 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7639 Clobbers.push_back(S->getClobberStringLiteral(I)); 7640 7641 // No need to transform the asm string literal. 7642 AsmString = S->getAsmString(); 7643 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7644 S->isVolatile(), S->getNumOutputs(), 7645 S->getNumInputs(), Names.data(), 7646 Constraints, Exprs, AsmString.get(), 7647 Clobbers, S->getNumLabels(), 7648 S->getRParenLoc()); 7649 } 7650 7651 template<typename Derived> 7652 StmtResult 7653 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7654 ArrayRef<Token> AsmToks = 7655 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7656 7657 bool HadError = false, HadChange = false; 7658 7659 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7660 SmallVector<Expr*, 8> TransformedExprs; 7661 TransformedExprs.reserve(SrcExprs.size()); 7662 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7663 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7664 if (!Result.isUsable()) { 7665 HadError = true; 7666 } else { 7667 HadChange |= (Result.get() != SrcExprs[i]); 7668 TransformedExprs.push_back(Result.get()); 7669 } 7670 } 7671 7672 if (HadError) return StmtError(); 7673 if (!HadChange && !getDerived().AlwaysRebuild()) 7674 return Owned(S); 7675 7676 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7677 AsmToks, S->getAsmString(), 7678 S->getNumOutputs(), S->getNumInputs(), 7679 S->getAllConstraints(), S->getClobbers(), 7680 TransformedExprs, S->getEndLoc()); 7681 } 7682 7683 // C++ Coroutines TS 7684 7685 template<typename Derived> 7686 StmtResult 7687 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7688 auto *ScopeInfo = SemaRef.getCurFunction(); 7689 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7690 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7691 ScopeInfo->NeedsCoroutineSuspends && 7692 ScopeInfo->CoroutineSuspends.first == nullptr && 7693 ScopeInfo->CoroutineSuspends.second == nullptr && 7694 "expected clean scope info"); 7695 7696 // Set that we have (possibly-invalid) suspend points before we do anything 7697 // that may fail. 7698 ScopeInfo->setNeedsCoroutineSuspends(false); 7699 7700 // We re-build the coroutine promise object (and the coroutine parameters its 7701 // type and constructor depend on) based on the types used in our current 7702 // function. We must do so, and set it on the current FunctionScopeInfo, 7703 // before attempting to transform the other parts of the coroutine body 7704 // statement, such as the implicit suspend statements (because those 7705 // statements reference the FunctionScopeInfo::CoroutinePromise). 7706 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7707 return StmtError(); 7708 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7709 if (!Promise) 7710 return StmtError(); 7711 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7712 ScopeInfo->CoroutinePromise = Promise; 7713 7714 // Transform the implicit coroutine statements constructed using dependent 7715 // types during the previous parse: initial and final suspensions, the return 7716 // object, and others. We also transform the coroutine function's body. 7717 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7718 if (InitSuspend.isInvalid()) 7719 return StmtError(); 7720 StmtResult FinalSuspend = 7721 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7722 if (FinalSuspend.isInvalid() || 7723 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7724 return StmtError(); 7725 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7726 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7727 7728 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7729 if (BodyRes.isInvalid()) 7730 return StmtError(); 7731 7732 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7733 if (Builder.isInvalid()) 7734 return StmtError(); 7735 7736 Expr *ReturnObject = S->getReturnValueInit(); 7737 assert(ReturnObject && "the return object is expected to be valid"); 7738 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7739 /*NoCopyInit*/ false); 7740 if (Res.isInvalid()) 7741 return StmtError(); 7742 Builder.ReturnValue = Res.get(); 7743 7744 // If during the previous parse the coroutine still had a dependent promise 7745 // statement, we may need to build some implicit coroutine statements 7746 // (such as exception and fallthrough handlers) for the first time. 7747 if (S->hasDependentPromiseType()) { 7748 // We can only build these statements, however, if the current promise type 7749 // is not dependent. 7750 if (!Promise->getType()->isDependentType()) { 7751 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7752 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7753 "these nodes should not have been built yet"); 7754 if (!Builder.buildDependentStatements()) 7755 return StmtError(); 7756 } 7757 } else { 7758 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7759 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7760 if (Res.isInvalid()) 7761 return StmtError(); 7762 Builder.OnFallthrough = Res.get(); 7763 } 7764 7765 if (auto *OnException = S->getExceptionHandler()) { 7766 StmtResult Res = getDerived().TransformStmt(OnException); 7767 if (Res.isInvalid()) 7768 return StmtError(); 7769 Builder.OnException = Res.get(); 7770 } 7771 7772 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7773 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7774 if (Res.isInvalid()) 7775 return StmtError(); 7776 Builder.ReturnStmtOnAllocFailure = Res.get(); 7777 } 7778 7779 // Transform any additional statements we may have already built 7780 assert(S->getAllocate() && S->getDeallocate() && 7781 "allocation and deallocation calls must already be built"); 7782 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7783 if (AllocRes.isInvalid()) 7784 return StmtError(); 7785 Builder.Allocate = AllocRes.get(); 7786 7787 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7788 if (DeallocRes.isInvalid()) 7789 return StmtError(); 7790 Builder.Deallocate = DeallocRes.get(); 7791 7792 assert(S->getResultDecl() && "ResultDecl must already be built"); 7793 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7794 if (ResultDecl.isInvalid()) 7795 return StmtError(); 7796 Builder.ResultDecl = ResultDecl.get(); 7797 7798 if (auto *ReturnStmt = S->getReturnStmt()) { 7799 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7800 if (Res.isInvalid()) 7801 return StmtError(); 7802 Builder.ReturnStmt = Res.get(); 7803 } 7804 } 7805 7806 return getDerived().RebuildCoroutineBodyStmt(Builder); 7807 } 7808 7809 template<typename Derived> 7810 StmtResult 7811 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7812 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7813 /*NotCopyInit*/false); 7814 if (Result.isInvalid()) 7815 return StmtError(); 7816 7817 // Always rebuild; we don't know if this needs to be injected into a new 7818 // context or if the promise type has changed. 7819 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7820 S->isImplicit()); 7821 } 7822 7823 template<typename Derived> 7824 ExprResult 7825 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7826 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7827 /*NotCopyInit*/false); 7828 if (Result.isInvalid()) 7829 return ExprError(); 7830 7831 // Always rebuild; we don't know if this needs to be injected into a new 7832 // context or if the promise type has changed. 7833 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7834 E->isImplicit()); 7835 } 7836 7837 template <typename Derived> 7838 ExprResult 7839 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7840 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7841 /*NotCopyInit*/ false); 7842 if (OperandResult.isInvalid()) 7843 return ExprError(); 7844 7845 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7846 E->getOperatorCoawaitLookup()); 7847 7848 if (LookupResult.isInvalid()) 7849 return ExprError(); 7850 7851 // Always rebuild; we don't know if this needs to be injected into a new 7852 // context or if the promise type has changed. 7853 return getDerived().RebuildDependentCoawaitExpr( 7854 E->getKeywordLoc(), OperandResult.get(), 7855 cast<UnresolvedLookupExpr>(LookupResult.get())); 7856 } 7857 7858 template<typename Derived> 7859 ExprResult 7860 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7861 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7862 /*NotCopyInit*/false); 7863 if (Result.isInvalid()) 7864 return ExprError(); 7865 7866 // Always rebuild; we don't know if this needs to be injected into a new 7867 // context or if the promise type has changed. 7868 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7869 } 7870 7871 // Objective-C Statements. 7872 7873 template<typename Derived> 7874 StmtResult 7875 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7876 // Transform the body of the @try. 7877 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7878 if (TryBody.isInvalid()) 7879 return StmtError(); 7880 7881 // Transform the @catch statements (if present). 7882 bool AnyCatchChanged = false; 7883 SmallVector<Stmt*, 8> CatchStmts; 7884 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7885 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7886 if (Catch.isInvalid()) 7887 return StmtError(); 7888 if (Catch.get() != S->getCatchStmt(I)) 7889 AnyCatchChanged = true; 7890 CatchStmts.push_back(Catch.get()); 7891 } 7892 7893 // Transform the @finally statement (if present). 7894 StmtResult Finally; 7895 if (S->getFinallyStmt()) { 7896 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7897 if (Finally.isInvalid()) 7898 return StmtError(); 7899 } 7900 7901 // If nothing changed, just retain this statement. 7902 if (!getDerived().AlwaysRebuild() && 7903 TryBody.get() == S->getTryBody() && 7904 !AnyCatchChanged && 7905 Finally.get() == S->getFinallyStmt()) 7906 return S; 7907 7908 // Build a new statement. 7909 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7910 CatchStmts, Finally.get()); 7911 } 7912 7913 template<typename Derived> 7914 StmtResult 7915 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7916 // Transform the @catch parameter, if there is one. 7917 VarDecl *Var = nullptr; 7918 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7919 TypeSourceInfo *TSInfo = nullptr; 7920 if (FromVar->getTypeSourceInfo()) { 7921 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7922 if (!TSInfo) 7923 return StmtError(); 7924 } 7925 7926 QualType T; 7927 if (TSInfo) 7928 T = TSInfo->getType(); 7929 else { 7930 T = getDerived().TransformType(FromVar->getType()); 7931 if (T.isNull()) 7932 return StmtError(); 7933 } 7934 7935 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7936 if (!Var) 7937 return StmtError(); 7938 } 7939 7940 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7941 if (Body.isInvalid()) 7942 return StmtError(); 7943 7944 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7945 S->getRParenLoc(), 7946 Var, Body.get()); 7947 } 7948 7949 template<typename Derived> 7950 StmtResult 7951 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7952 // Transform the body. 7953 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7954 if (Body.isInvalid()) 7955 return StmtError(); 7956 7957 // If nothing changed, just retain this statement. 7958 if (!getDerived().AlwaysRebuild() && 7959 Body.get() == S->getFinallyBody()) 7960 return S; 7961 7962 // Build a new statement. 7963 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7964 Body.get()); 7965 } 7966 7967 template<typename Derived> 7968 StmtResult 7969 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7970 ExprResult Operand; 7971 if (S->getThrowExpr()) { 7972 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7973 if (Operand.isInvalid()) 7974 return StmtError(); 7975 } 7976 7977 if (!getDerived().AlwaysRebuild() && 7978 Operand.get() == S->getThrowExpr()) 7979 return S; 7980 7981 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7982 } 7983 7984 template<typename Derived> 7985 StmtResult 7986 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7987 ObjCAtSynchronizedStmt *S) { 7988 // Transform the object we are locking. 7989 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7990 if (Object.isInvalid()) 7991 return StmtError(); 7992 Object = 7993 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7994 Object.get()); 7995 if (Object.isInvalid()) 7996 return StmtError(); 7997 7998 // Transform the body. 7999 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8000 if (Body.isInvalid()) 8001 return StmtError(); 8002 8003 // If nothing change, just retain the current statement. 8004 if (!getDerived().AlwaysRebuild() && 8005 Object.get() == S->getSynchExpr() && 8006 Body.get() == S->getSynchBody()) 8007 return S; 8008 8009 // Build a new statement. 8010 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8011 Object.get(), Body.get()); 8012 } 8013 8014 template<typename Derived> 8015 StmtResult 8016 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8017 ObjCAutoreleasePoolStmt *S) { 8018 // Transform the body. 8019 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8020 if (Body.isInvalid()) 8021 return StmtError(); 8022 8023 // If nothing changed, just retain this statement. 8024 if (!getDerived().AlwaysRebuild() && 8025 Body.get() == S->getSubStmt()) 8026 return S; 8027 8028 // Build a new statement. 8029 return getDerived().RebuildObjCAutoreleasePoolStmt( 8030 S->getAtLoc(), Body.get()); 8031 } 8032 8033 template<typename Derived> 8034 StmtResult 8035 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8036 ObjCForCollectionStmt *S) { 8037 // Transform the element statement. 8038 StmtResult Element = 8039 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8040 if (Element.isInvalid()) 8041 return StmtError(); 8042 8043 // Transform the collection expression. 8044 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8045 if (Collection.isInvalid()) 8046 return StmtError(); 8047 8048 // Transform the body. 8049 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8050 if (Body.isInvalid()) 8051 return StmtError(); 8052 8053 // If nothing changed, just retain this statement. 8054 if (!getDerived().AlwaysRebuild() && 8055 Element.get() == S->getElement() && 8056 Collection.get() == S->getCollection() && 8057 Body.get() == S->getBody()) 8058 return S; 8059 8060 // Build a new statement. 8061 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8062 Element.get(), 8063 Collection.get(), 8064 S->getRParenLoc(), 8065 Body.get()); 8066 } 8067 8068 template <typename Derived> 8069 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8070 // Transform the exception declaration, if any. 8071 VarDecl *Var = nullptr; 8072 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8073 TypeSourceInfo *T = 8074 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8075 if (!T) 8076 return StmtError(); 8077 8078 Var = getDerived().RebuildExceptionDecl( 8079 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8080 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8081 if (!Var || Var->isInvalidDecl()) 8082 return StmtError(); 8083 } 8084 8085 // Transform the actual exception handler. 8086 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8087 if (Handler.isInvalid()) 8088 return StmtError(); 8089 8090 if (!getDerived().AlwaysRebuild() && !Var && 8091 Handler.get() == S->getHandlerBlock()) 8092 return S; 8093 8094 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8095 } 8096 8097 template <typename Derived> 8098 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8099 // Transform the try block itself. 8100 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8101 if (TryBlock.isInvalid()) 8102 return StmtError(); 8103 8104 // Transform the handlers. 8105 bool HandlerChanged = false; 8106 SmallVector<Stmt *, 8> Handlers; 8107 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8108 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8109 if (Handler.isInvalid()) 8110 return StmtError(); 8111 8112 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8113 Handlers.push_back(Handler.getAs<Stmt>()); 8114 } 8115 8116 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8117 !HandlerChanged) 8118 return S; 8119 8120 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8121 Handlers); 8122 } 8123 8124 template<typename Derived> 8125 StmtResult 8126 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8127 StmtResult Init = 8128 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8129 if (Init.isInvalid()) 8130 return StmtError(); 8131 8132 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8133 if (Range.isInvalid()) 8134 return StmtError(); 8135 8136 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8137 if (Begin.isInvalid()) 8138 return StmtError(); 8139 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8140 if (End.isInvalid()) 8141 return StmtError(); 8142 8143 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8144 if (Cond.isInvalid()) 8145 return StmtError(); 8146 if (Cond.get()) 8147 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8148 if (Cond.isInvalid()) 8149 return StmtError(); 8150 if (Cond.get()) 8151 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8152 8153 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8154 if (Inc.isInvalid()) 8155 return StmtError(); 8156 if (Inc.get()) 8157 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8158 8159 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8160 if (LoopVar.isInvalid()) 8161 return StmtError(); 8162 8163 StmtResult NewStmt = S; 8164 if (getDerived().AlwaysRebuild() || 8165 Init.get() != S->getInit() || 8166 Range.get() != S->getRangeStmt() || 8167 Begin.get() != S->getBeginStmt() || 8168 End.get() != S->getEndStmt() || 8169 Cond.get() != S->getCond() || 8170 Inc.get() != S->getInc() || 8171 LoopVar.get() != S->getLoopVarStmt()) { 8172 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8173 S->getCoawaitLoc(), Init.get(), 8174 S->getColonLoc(), Range.get(), 8175 Begin.get(), End.get(), 8176 Cond.get(), 8177 Inc.get(), LoopVar.get(), 8178 S->getRParenLoc()); 8179 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8180 // Might not have attached any initializer to the loop variable. 8181 getSema().ActOnInitializerError( 8182 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8183 return StmtError(); 8184 } 8185 } 8186 8187 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8188 if (Body.isInvalid()) 8189 return StmtError(); 8190 8191 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8192 // it now so we have a new statement to attach the body to. 8193 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8194 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8195 S->getCoawaitLoc(), Init.get(), 8196 S->getColonLoc(), Range.get(), 8197 Begin.get(), End.get(), 8198 Cond.get(), 8199 Inc.get(), LoopVar.get(), 8200 S->getRParenLoc()); 8201 if (NewStmt.isInvalid()) 8202 return StmtError(); 8203 } 8204 8205 if (NewStmt.get() == S) 8206 return S; 8207 8208 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8209 } 8210 8211 template<typename Derived> 8212 StmtResult 8213 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8214 MSDependentExistsStmt *S) { 8215 // Transform the nested-name-specifier, if any. 8216 NestedNameSpecifierLoc QualifierLoc; 8217 if (S->getQualifierLoc()) { 8218 QualifierLoc 8219 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8220 if (!QualifierLoc) 8221 return StmtError(); 8222 } 8223 8224 // Transform the declaration name. 8225 DeclarationNameInfo NameInfo = S->getNameInfo(); 8226 if (NameInfo.getName()) { 8227 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8228 if (!NameInfo.getName()) 8229 return StmtError(); 8230 } 8231 8232 // Check whether anything changed. 8233 if (!getDerived().AlwaysRebuild() && 8234 QualifierLoc == S->getQualifierLoc() && 8235 NameInfo.getName() == S->getNameInfo().getName()) 8236 return S; 8237 8238 // Determine whether this name exists, if we can. 8239 CXXScopeSpec SS; 8240 SS.Adopt(QualifierLoc); 8241 bool Dependent = false; 8242 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8243 case Sema::IER_Exists: 8244 if (S->isIfExists()) 8245 break; 8246 8247 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8248 8249 case Sema::IER_DoesNotExist: 8250 if (S->isIfNotExists()) 8251 break; 8252 8253 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8254 8255 case Sema::IER_Dependent: 8256 Dependent = true; 8257 break; 8258 8259 case Sema::IER_Error: 8260 return StmtError(); 8261 } 8262 8263 // We need to continue with the instantiation, so do so now. 8264 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8265 if (SubStmt.isInvalid()) 8266 return StmtError(); 8267 8268 // If we have resolved the name, just transform to the substatement. 8269 if (!Dependent) 8270 return SubStmt; 8271 8272 // The name is still dependent, so build a dependent expression again. 8273 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8274 S->isIfExists(), 8275 QualifierLoc, 8276 NameInfo, 8277 SubStmt.get()); 8278 } 8279 8280 template<typename Derived> 8281 ExprResult 8282 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8283 NestedNameSpecifierLoc QualifierLoc; 8284 if (E->getQualifierLoc()) { 8285 QualifierLoc 8286 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8287 if (!QualifierLoc) 8288 return ExprError(); 8289 } 8290 8291 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8292 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8293 if (!PD) 8294 return ExprError(); 8295 8296 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8297 if (Base.isInvalid()) 8298 return ExprError(); 8299 8300 return new (SemaRef.getASTContext()) 8301 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8302 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8303 QualifierLoc, E->getMemberLoc()); 8304 } 8305 8306 template <typename Derived> 8307 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8308 MSPropertySubscriptExpr *E) { 8309 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8310 if (BaseRes.isInvalid()) 8311 return ExprError(); 8312 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8313 if (IdxRes.isInvalid()) 8314 return ExprError(); 8315 8316 if (!getDerived().AlwaysRebuild() && 8317 BaseRes.get() == E->getBase() && 8318 IdxRes.get() == E->getIdx()) 8319 return E; 8320 8321 return getDerived().RebuildArraySubscriptExpr( 8322 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8323 } 8324 8325 template <typename Derived> 8326 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8327 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8328 if (TryBlock.isInvalid()) 8329 return StmtError(); 8330 8331 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8332 if (Handler.isInvalid()) 8333 return StmtError(); 8334 8335 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8336 Handler.get() == S->getHandler()) 8337 return S; 8338 8339 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8340 TryBlock.get(), Handler.get()); 8341 } 8342 8343 template <typename Derived> 8344 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8345 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8346 if (Block.isInvalid()) 8347 return StmtError(); 8348 8349 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8350 } 8351 8352 template <typename Derived> 8353 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8354 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8355 if (FilterExpr.isInvalid()) 8356 return StmtError(); 8357 8358 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8359 if (Block.isInvalid()) 8360 return StmtError(); 8361 8362 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8363 Block.get()); 8364 } 8365 8366 template <typename Derived> 8367 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8368 if (isa<SEHFinallyStmt>(Handler)) 8369 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8370 else 8371 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8372 } 8373 8374 template<typename Derived> 8375 StmtResult 8376 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8377 return S; 8378 } 8379 8380 //===----------------------------------------------------------------------===// 8381 // OpenMP directive transformation 8382 //===----------------------------------------------------------------------===// 8383 8384 template <typename Derived> 8385 StmtResult 8386 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8387 // OMPCanonicalLoops are eliminated during transformation, since they will be 8388 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8389 // after transformation. 8390 return getDerived().TransformStmt(L->getLoopStmt()); 8391 } 8392 8393 template <typename Derived> 8394 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8395 OMPExecutableDirective *D) { 8396 8397 // Transform the clauses 8398 llvm::SmallVector<OMPClause *, 16> TClauses; 8399 ArrayRef<OMPClause *> Clauses = D->clauses(); 8400 TClauses.reserve(Clauses.size()); 8401 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8402 I != E; ++I) { 8403 if (*I) { 8404 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8405 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8406 getDerived().getSema().EndOpenMPClause(); 8407 if (Clause) 8408 TClauses.push_back(Clause); 8409 } else { 8410 TClauses.push_back(nullptr); 8411 } 8412 } 8413 StmtResult AssociatedStmt; 8414 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8415 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8416 /*CurScope=*/nullptr); 8417 StmtResult Body; 8418 { 8419 Sema::CompoundScopeRAII CompoundScope(getSema()); 8420 Stmt *CS; 8421 if (D->getDirectiveKind() == OMPD_atomic || 8422 D->getDirectiveKind() == OMPD_critical || 8423 D->getDirectiveKind() == OMPD_section || 8424 D->getDirectiveKind() == OMPD_master) 8425 CS = D->getAssociatedStmt(); 8426 else 8427 CS = D->getRawStmt(); 8428 Body = getDerived().TransformStmt(CS); 8429 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8430 getSema().getLangOpts().OpenMPIRBuilder) 8431 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8432 } 8433 AssociatedStmt = 8434 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8435 if (AssociatedStmt.isInvalid()) { 8436 return StmtError(); 8437 } 8438 } 8439 if (TClauses.size() != Clauses.size()) { 8440 return StmtError(); 8441 } 8442 8443 // Transform directive name for 'omp critical' directive. 8444 DeclarationNameInfo DirName; 8445 if (D->getDirectiveKind() == OMPD_critical) { 8446 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8447 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8448 } 8449 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8450 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8451 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8452 } else if (D->getDirectiveKind() == OMPD_cancel) { 8453 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8454 } 8455 8456 return getDerived().RebuildOMPExecutableDirective( 8457 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8458 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8459 } 8460 8461 template <typename Derived> 8462 StmtResult 8463 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8464 DeclarationNameInfo DirName; 8465 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8466 D->getBeginLoc()); 8467 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8468 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8469 return Res; 8470 } 8471 8472 template <typename Derived> 8473 StmtResult 8474 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8475 DeclarationNameInfo DirName; 8476 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8477 D->getBeginLoc()); 8478 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8479 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8480 return Res; 8481 } 8482 8483 template <typename Derived> 8484 StmtResult 8485 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8486 DeclarationNameInfo DirName; 8487 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8488 nullptr, D->getBeginLoc()); 8489 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8490 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8491 return Res; 8492 } 8493 8494 template <typename Derived> 8495 StmtResult 8496 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8497 DeclarationNameInfo DirName; 8498 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8499 D->getBeginLoc()); 8500 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8501 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8502 return Res; 8503 } 8504 8505 template <typename Derived> 8506 StmtResult 8507 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8508 DeclarationNameInfo DirName; 8509 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8510 D->getBeginLoc()); 8511 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8512 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8513 return Res; 8514 } 8515 8516 template <typename Derived> 8517 StmtResult 8518 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8519 DeclarationNameInfo DirName; 8520 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8521 D->getBeginLoc()); 8522 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8523 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8524 return Res; 8525 } 8526 8527 template <typename Derived> 8528 StmtResult 8529 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8530 DeclarationNameInfo DirName; 8531 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8532 D->getBeginLoc()); 8533 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8534 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8535 return Res; 8536 } 8537 8538 template <typename Derived> 8539 StmtResult 8540 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8541 DeclarationNameInfo DirName; 8542 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8543 D->getBeginLoc()); 8544 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8545 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8546 return Res; 8547 } 8548 8549 template <typename Derived> 8550 StmtResult 8551 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8552 DeclarationNameInfo DirName; 8553 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8554 D->getBeginLoc()); 8555 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8556 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8557 return Res; 8558 } 8559 8560 template <typename Derived> 8561 StmtResult 8562 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8563 getDerived().getSema().StartOpenMPDSABlock( 8564 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8565 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8566 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8567 return Res; 8568 } 8569 8570 template <typename Derived> 8571 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8572 OMPParallelForDirective *D) { 8573 DeclarationNameInfo DirName; 8574 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8575 nullptr, D->getBeginLoc()); 8576 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8577 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8578 return Res; 8579 } 8580 8581 template <typename Derived> 8582 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8583 OMPParallelForSimdDirective *D) { 8584 DeclarationNameInfo DirName; 8585 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8586 nullptr, D->getBeginLoc()); 8587 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8588 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8589 return Res; 8590 } 8591 8592 template <typename Derived> 8593 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8594 OMPParallelMasterDirective *D) { 8595 DeclarationNameInfo DirName; 8596 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8597 nullptr, D->getBeginLoc()); 8598 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8599 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8600 return Res; 8601 } 8602 8603 template <typename Derived> 8604 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8605 OMPParallelSectionsDirective *D) { 8606 DeclarationNameInfo DirName; 8607 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8608 nullptr, D->getBeginLoc()); 8609 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8610 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8611 return Res; 8612 } 8613 8614 template <typename Derived> 8615 StmtResult 8616 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8617 DeclarationNameInfo DirName; 8618 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8619 D->getBeginLoc()); 8620 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8621 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8622 return Res; 8623 } 8624 8625 template <typename Derived> 8626 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8627 OMPTaskyieldDirective *D) { 8628 DeclarationNameInfo DirName; 8629 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8630 D->getBeginLoc()); 8631 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8632 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8633 return Res; 8634 } 8635 8636 template <typename Derived> 8637 StmtResult 8638 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8639 DeclarationNameInfo DirName; 8640 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8641 D->getBeginLoc()); 8642 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8643 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8644 return Res; 8645 } 8646 8647 template <typename Derived> 8648 StmtResult 8649 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8650 DeclarationNameInfo DirName; 8651 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8652 D->getBeginLoc()); 8653 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8654 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8655 return Res; 8656 } 8657 8658 template <typename Derived> 8659 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8660 OMPTaskgroupDirective *D) { 8661 DeclarationNameInfo DirName; 8662 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8663 D->getBeginLoc()); 8664 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8665 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8666 return Res; 8667 } 8668 8669 template <typename Derived> 8670 StmtResult 8671 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8672 DeclarationNameInfo DirName; 8673 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8674 D->getBeginLoc()); 8675 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8676 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8677 return Res; 8678 } 8679 8680 template <typename Derived> 8681 StmtResult 8682 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8683 DeclarationNameInfo DirName; 8684 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8685 D->getBeginLoc()); 8686 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8687 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8688 return Res; 8689 } 8690 8691 template <typename Derived> 8692 StmtResult 8693 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8694 DeclarationNameInfo DirName; 8695 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8696 D->getBeginLoc()); 8697 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8698 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8699 return Res; 8700 } 8701 8702 template <typename Derived> 8703 StmtResult 8704 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8705 DeclarationNameInfo DirName; 8706 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8707 D->getBeginLoc()); 8708 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8709 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8710 return Res; 8711 } 8712 8713 template <typename Derived> 8714 StmtResult 8715 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8716 DeclarationNameInfo DirName; 8717 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8718 D->getBeginLoc()); 8719 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8720 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8721 return Res; 8722 } 8723 8724 template <typename Derived> 8725 StmtResult 8726 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8727 DeclarationNameInfo DirName; 8728 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8729 D->getBeginLoc()); 8730 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8731 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8732 return Res; 8733 } 8734 8735 template <typename Derived> 8736 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8737 OMPTargetDataDirective *D) { 8738 DeclarationNameInfo DirName; 8739 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8740 D->getBeginLoc()); 8741 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8742 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8743 return Res; 8744 } 8745 8746 template <typename Derived> 8747 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8748 OMPTargetEnterDataDirective *D) { 8749 DeclarationNameInfo DirName; 8750 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8751 nullptr, D->getBeginLoc()); 8752 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8753 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8754 return Res; 8755 } 8756 8757 template <typename Derived> 8758 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8759 OMPTargetExitDataDirective *D) { 8760 DeclarationNameInfo DirName; 8761 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8762 nullptr, D->getBeginLoc()); 8763 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8764 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8765 return Res; 8766 } 8767 8768 template <typename Derived> 8769 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8770 OMPTargetParallelDirective *D) { 8771 DeclarationNameInfo DirName; 8772 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8773 nullptr, D->getBeginLoc()); 8774 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8775 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8776 return Res; 8777 } 8778 8779 template <typename Derived> 8780 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8781 OMPTargetParallelForDirective *D) { 8782 DeclarationNameInfo DirName; 8783 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8784 nullptr, D->getBeginLoc()); 8785 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8786 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8787 return Res; 8788 } 8789 8790 template <typename Derived> 8791 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8792 OMPTargetUpdateDirective *D) { 8793 DeclarationNameInfo DirName; 8794 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8795 nullptr, D->getBeginLoc()); 8796 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8797 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8798 return Res; 8799 } 8800 8801 template <typename Derived> 8802 StmtResult 8803 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8804 DeclarationNameInfo DirName; 8805 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8806 D->getBeginLoc()); 8807 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8808 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8809 return Res; 8810 } 8811 8812 template <typename Derived> 8813 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8814 OMPCancellationPointDirective *D) { 8815 DeclarationNameInfo DirName; 8816 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8817 nullptr, D->getBeginLoc()); 8818 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8819 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8820 return Res; 8821 } 8822 8823 template <typename Derived> 8824 StmtResult 8825 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8826 DeclarationNameInfo DirName; 8827 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8828 D->getBeginLoc()); 8829 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8830 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8831 return Res; 8832 } 8833 8834 template <typename Derived> 8835 StmtResult 8836 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8837 DeclarationNameInfo DirName; 8838 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8839 D->getBeginLoc()); 8840 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8841 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8842 return Res; 8843 } 8844 8845 template <typename Derived> 8846 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8847 OMPTaskLoopSimdDirective *D) { 8848 DeclarationNameInfo DirName; 8849 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8850 nullptr, D->getBeginLoc()); 8851 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8852 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8853 return Res; 8854 } 8855 8856 template <typename Derived> 8857 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8858 OMPMasterTaskLoopDirective *D) { 8859 DeclarationNameInfo DirName; 8860 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8861 nullptr, D->getBeginLoc()); 8862 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8863 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8864 return Res; 8865 } 8866 8867 template <typename Derived> 8868 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8869 OMPMasterTaskLoopSimdDirective *D) { 8870 DeclarationNameInfo DirName; 8871 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8872 nullptr, D->getBeginLoc()); 8873 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8874 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8875 return Res; 8876 } 8877 8878 template <typename Derived> 8879 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8880 OMPParallelMasterTaskLoopDirective *D) { 8881 DeclarationNameInfo DirName; 8882 getDerived().getSema().StartOpenMPDSABlock( 8883 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8884 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8885 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8886 return Res; 8887 } 8888 8889 template <typename Derived> 8890 StmtResult 8891 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8892 OMPParallelMasterTaskLoopSimdDirective *D) { 8893 DeclarationNameInfo DirName; 8894 getDerived().getSema().StartOpenMPDSABlock( 8895 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8896 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8897 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8898 return Res; 8899 } 8900 8901 template <typename Derived> 8902 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8903 OMPDistributeDirective *D) { 8904 DeclarationNameInfo DirName; 8905 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8906 D->getBeginLoc()); 8907 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8908 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8909 return Res; 8910 } 8911 8912 template <typename Derived> 8913 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8914 OMPDistributeParallelForDirective *D) { 8915 DeclarationNameInfo DirName; 8916 getDerived().getSema().StartOpenMPDSABlock( 8917 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8918 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8919 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8920 return Res; 8921 } 8922 8923 template <typename Derived> 8924 StmtResult 8925 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8926 OMPDistributeParallelForSimdDirective *D) { 8927 DeclarationNameInfo DirName; 8928 getDerived().getSema().StartOpenMPDSABlock( 8929 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8930 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8931 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8932 return Res; 8933 } 8934 8935 template <typename Derived> 8936 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8937 OMPDistributeSimdDirective *D) { 8938 DeclarationNameInfo DirName; 8939 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8940 nullptr, D->getBeginLoc()); 8941 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8942 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8943 return Res; 8944 } 8945 8946 template <typename Derived> 8947 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8948 OMPTargetParallelForSimdDirective *D) { 8949 DeclarationNameInfo DirName; 8950 getDerived().getSema().StartOpenMPDSABlock( 8951 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8952 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8953 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8954 return Res; 8955 } 8956 8957 template <typename Derived> 8958 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8959 OMPTargetSimdDirective *D) { 8960 DeclarationNameInfo DirName; 8961 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8962 D->getBeginLoc()); 8963 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8964 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8965 return Res; 8966 } 8967 8968 template <typename Derived> 8969 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8970 OMPTeamsDistributeDirective *D) { 8971 DeclarationNameInfo DirName; 8972 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8973 nullptr, D->getBeginLoc()); 8974 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8975 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8976 return Res; 8977 } 8978 8979 template <typename Derived> 8980 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8981 OMPTeamsDistributeSimdDirective *D) { 8982 DeclarationNameInfo DirName; 8983 getDerived().getSema().StartOpenMPDSABlock( 8984 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8985 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8986 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8987 return Res; 8988 } 8989 8990 template <typename Derived> 8991 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8992 OMPTeamsDistributeParallelForSimdDirective *D) { 8993 DeclarationNameInfo DirName; 8994 getDerived().getSema().StartOpenMPDSABlock( 8995 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8996 D->getBeginLoc()); 8997 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8998 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8999 return Res; 9000 } 9001 9002 template <typename Derived> 9003 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9004 OMPTeamsDistributeParallelForDirective *D) { 9005 DeclarationNameInfo DirName; 9006 getDerived().getSema().StartOpenMPDSABlock( 9007 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9008 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9009 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9010 return Res; 9011 } 9012 9013 template <typename Derived> 9014 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9015 OMPTargetTeamsDirective *D) { 9016 DeclarationNameInfo DirName; 9017 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9018 nullptr, D->getBeginLoc()); 9019 auto Res = getDerived().TransformOMPExecutableDirective(D); 9020 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9021 return Res; 9022 } 9023 9024 template <typename Derived> 9025 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9026 OMPTargetTeamsDistributeDirective *D) { 9027 DeclarationNameInfo DirName; 9028 getDerived().getSema().StartOpenMPDSABlock( 9029 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9030 auto Res = getDerived().TransformOMPExecutableDirective(D); 9031 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9032 return Res; 9033 } 9034 9035 template <typename Derived> 9036 StmtResult 9037 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9038 OMPTargetTeamsDistributeParallelForDirective *D) { 9039 DeclarationNameInfo DirName; 9040 getDerived().getSema().StartOpenMPDSABlock( 9041 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9042 D->getBeginLoc()); 9043 auto Res = getDerived().TransformOMPExecutableDirective(D); 9044 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9045 return Res; 9046 } 9047 9048 template <typename Derived> 9049 StmtResult TreeTransform<Derived>:: 9050 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9051 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9052 DeclarationNameInfo DirName; 9053 getDerived().getSema().StartOpenMPDSABlock( 9054 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9055 D->getBeginLoc()); 9056 auto Res = getDerived().TransformOMPExecutableDirective(D); 9057 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9058 return Res; 9059 } 9060 9061 template <typename Derived> 9062 StmtResult 9063 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9064 OMPTargetTeamsDistributeSimdDirective *D) { 9065 DeclarationNameInfo DirName; 9066 getDerived().getSema().StartOpenMPDSABlock( 9067 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9068 auto Res = getDerived().TransformOMPExecutableDirective(D); 9069 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9070 return Res; 9071 } 9072 9073 template <typename Derived> 9074 StmtResult 9075 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9076 DeclarationNameInfo DirName; 9077 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9078 D->getBeginLoc()); 9079 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9080 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9081 return Res; 9082 } 9083 9084 template <typename Derived> 9085 StmtResult 9086 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9087 DeclarationNameInfo DirName; 9088 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9089 D->getBeginLoc()); 9090 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9091 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9092 return Res; 9093 } 9094 9095 //===----------------------------------------------------------------------===// 9096 // OpenMP clause transformation 9097 //===----------------------------------------------------------------------===// 9098 template <typename Derived> 9099 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9100 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9101 if (Cond.isInvalid()) 9102 return nullptr; 9103 return getDerived().RebuildOMPIfClause( 9104 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9105 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9106 } 9107 9108 template <typename Derived> 9109 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9110 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9111 if (Cond.isInvalid()) 9112 return nullptr; 9113 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9114 C->getLParenLoc(), C->getEndLoc()); 9115 } 9116 9117 template <typename Derived> 9118 OMPClause * 9119 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9120 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9121 if (NumThreads.isInvalid()) 9122 return nullptr; 9123 return getDerived().RebuildOMPNumThreadsClause( 9124 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9125 } 9126 9127 template <typename Derived> 9128 OMPClause * 9129 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9130 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9131 if (E.isInvalid()) 9132 return nullptr; 9133 return getDerived().RebuildOMPSafelenClause( 9134 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9135 } 9136 9137 template <typename Derived> 9138 OMPClause * 9139 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9140 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9141 if (E.isInvalid()) 9142 return nullptr; 9143 return getDerived().RebuildOMPAllocatorClause( 9144 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9145 } 9146 9147 template <typename Derived> 9148 OMPClause * 9149 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9150 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9151 if (E.isInvalid()) 9152 return nullptr; 9153 return getDerived().RebuildOMPSimdlenClause( 9154 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9155 } 9156 9157 template <typename Derived> 9158 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9159 SmallVector<Expr *, 4> TransformedSizes; 9160 TransformedSizes.reserve(C->getNumSizes()); 9161 bool Changed = false; 9162 for (Expr *E : C->getSizesRefs()) { 9163 if (!E) { 9164 TransformedSizes.push_back(nullptr); 9165 continue; 9166 } 9167 9168 ExprResult T = getDerived().TransformExpr(E); 9169 if (T.isInvalid()) 9170 return nullptr; 9171 if (E != T.get()) 9172 Changed = true; 9173 TransformedSizes.push_back(T.get()); 9174 } 9175 9176 if (!Changed && !getDerived().AlwaysRebuild()) 9177 return C; 9178 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9179 C->getLParenLoc(), C->getEndLoc()); 9180 } 9181 9182 template <typename Derived> 9183 OMPClause * 9184 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9185 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9186 if (E.isInvalid()) 9187 return nullptr; 9188 return getDerived().RebuildOMPCollapseClause( 9189 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9190 } 9191 9192 template <typename Derived> 9193 OMPClause * 9194 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9195 return getDerived().RebuildOMPDefaultClause( 9196 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9197 C->getLParenLoc(), C->getEndLoc()); 9198 } 9199 9200 template <typename Derived> 9201 OMPClause * 9202 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9203 return getDerived().RebuildOMPProcBindClause( 9204 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9205 C->getLParenLoc(), C->getEndLoc()); 9206 } 9207 9208 template <typename Derived> 9209 OMPClause * 9210 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9211 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9212 if (E.isInvalid()) 9213 return nullptr; 9214 return getDerived().RebuildOMPScheduleClause( 9215 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9216 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9217 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9218 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9219 } 9220 9221 template <typename Derived> 9222 OMPClause * 9223 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9224 ExprResult E; 9225 if (auto *Num = C->getNumForLoops()) { 9226 E = getDerived().TransformExpr(Num); 9227 if (E.isInvalid()) 9228 return nullptr; 9229 } 9230 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9231 C->getLParenLoc(), E.get()); 9232 } 9233 9234 template <typename Derived> 9235 OMPClause * 9236 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9237 ExprResult E; 9238 if (Expr *Evt = C->getEventHandler()) { 9239 E = getDerived().TransformExpr(Evt); 9240 if (E.isInvalid()) 9241 return nullptr; 9242 } 9243 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9244 C->getLParenLoc(), C->getEndLoc()); 9245 } 9246 9247 template <typename Derived> 9248 OMPClause * 9249 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9250 // No need to rebuild this clause, no template-dependent parameters. 9251 return C; 9252 } 9253 9254 template <typename Derived> 9255 OMPClause * 9256 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9257 // No need to rebuild this clause, no template-dependent parameters. 9258 return C; 9259 } 9260 9261 template <typename Derived> 9262 OMPClause * 9263 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9264 // No need to rebuild this clause, no template-dependent parameters. 9265 return C; 9266 } 9267 9268 template <typename Derived> 9269 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9270 // No need to rebuild this clause, no template-dependent parameters. 9271 return C; 9272 } 9273 9274 template <typename Derived> 9275 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9276 // No need to rebuild this clause, no template-dependent parameters. 9277 return C; 9278 } 9279 9280 template <typename Derived> 9281 OMPClause * 9282 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9283 // No need to rebuild this clause, no template-dependent parameters. 9284 return C; 9285 } 9286 9287 template <typename Derived> 9288 OMPClause * 9289 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9290 // No need to rebuild this clause, no template-dependent parameters. 9291 return C; 9292 } 9293 9294 template <typename Derived> 9295 OMPClause * 9296 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9297 // No need to rebuild this clause, no template-dependent parameters. 9298 return C; 9299 } 9300 9301 template <typename Derived> 9302 OMPClause * 9303 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9304 // No need to rebuild this clause, no template-dependent parameters. 9305 return C; 9306 } 9307 9308 template <typename Derived> 9309 OMPClause * 9310 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9311 // No need to rebuild this clause, no template-dependent parameters. 9312 return C; 9313 } 9314 9315 template <typename Derived> 9316 OMPClause * 9317 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9318 // No need to rebuild this clause, no template-dependent parameters. 9319 return C; 9320 } 9321 9322 template <typename Derived> 9323 OMPClause * 9324 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9325 // No need to rebuild this clause, no template-dependent parameters. 9326 return C; 9327 } 9328 9329 template <typename Derived> 9330 OMPClause * 9331 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9332 // No need to rebuild this clause, no template-dependent parameters. 9333 return C; 9334 } 9335 9336 template <typename Derived> 9337 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9338 // No need to rebuild this clause, no template-dependent parameters. 9339 return C; 9340 } 9341 9342 template <typename Derived> 9343 OMPClause * 9344 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9345 // No need to rebuild this clause, no template-dependent parameters. 9346 return C; 9347 } 9348 9349 template <typename Derived> 9350 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9351 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9352 if (IVR.isInvalid()) 9353 return nullptr; 9354 9355 llvm::SmallVector<Expr *, 8> PrefExprs; 9356 PrefExprs.reserve(C->varlist_size() - 1); 9357 for (Expr *E : llvm::drop_begin(C->varlists())) { 9358 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9359 if (ER.isInvalid()) 9360 return nullptr; 9361 PrefExprs.push_back(ER.get()); 9362 } 9363 return getDerived().RebuildOMPInitClause( 9364 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9365 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9366 } 9367 9368 template <typename Derived> 9369 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9370 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9371 if (ER.isInvalid()) 9372 return nullptr; 9373 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9374 C->getLParenLoc(), C->getVarLoc(), 9375 C->getEndLoc()); 9376 } 9377 9378 template <typename Derived> 9379 OMPClause * 9380 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9381 ExprResult ER; 9382 if (Expr *IV = C->getInteropVar()) { 9383 ER = getDerived().TransformExpr(IV); 9384 if (ER.isInvalid()) 9385 return nullptr; 9386 } 9387 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9388 C->getLParenLoc(), C->getVarLoc(), 9389 C->getEndLoc()); 9390 } 9391 9392 template <typename Derived> 9393 OMPClause * 9394 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9395 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9396 if (Cond.isInvalid()) 9397 return nullptr; 9398 return getDerived().RebuildOMPNovariantsClause( 9399 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9400 } 9401 9402 template <typename Derived> 9403 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9404 OMPUnifiedAddressClause *C) { 9405 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9406 } 9407 9408 template <typename Derived> 9409 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9410 OMPUnifiedSharedMemoryClause *C) { 9411 llvm_unreachable( 9412 "unified_shared_memory clause cannot appear in dependent context"); 9413 } 9414 9415 template <typename Derived> 9416 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9417 OMPReverseOffloadClause *C) { 9418 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9419 } 9420 9421 template <typename Derived> 9422 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9423 OMPDynamicAllocatorsClause *C) { 9424 llvm_unreachable( 9425 "dynamic_allocators clause cannot appear in dependent context"); 9426 } 9427 9428 template <typename Derived> 9429 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9430 OMPAtomicDefaultMemOrderClause *C) { 9431 llvm_unreachable( 9432 "atomic_default_mem_order clause cannot appear in dependent context"); 9433 } 9434 9435 template <typename Derived> 9436 OMPClause * 9437 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9438 llvm::SmallVector<Expr *, 16> Vars; 9439 Vars.reserve(C->varlist_size()); 9440 for (auto *VE : C->varlists()) { 9441 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9442 if (EVar.isInvalid()) 9443 return nullptr; 9444 Vars.push_back(EVar.get()); 9445 } 9446 return getDerived().RebuildOMPPrivateClause( 9447 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9448 } 9449 9450 template <typename Derived> 9451 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9452 OMPFirstprivateClause *C) { 9453 llvm::SmallVector<Expr *, 16> Vars; 9454 Vars.reserve(C->varlist_size()); 9455 for (auto *VE : C->varlists()) { 9456 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9457 if (EVar.isInvalid()) 9458 return nullptr; 9459 Vars.push_back(EVar.get()); 9460 } 9461 return getDerived().RebuildOMPFirstprivateClause( 9462 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9463 } 9464 9465 template <typename Derived> 9466 OMPClause * 9467 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9468 llvm::SmallVector<Expr *, 16> Vars; 9469 Vars.reserve(C->varlist_size()); 9470 for (auto *VE : C->varlists()) { 9471 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9472 if (EVar.isInvalid()) 9473 return nullptr; 9474 Vars.push_back(EVar.get()); 9475 } 9476 return getDerived().RebuildOMPLastprivateClause( 9477 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9478 C->getLParenLoc(), C->getEndLoc()); 9479 } 9480 9481 template <typename Derived> 9482 OMPClause * 9483 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9484 llvm::SmallVector<Expr *, 16> Vars; 9485 Vars.reserve(C->varlist_size()); 9486 for (auto *VE : C->varlists()) { 9487 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9488 if (EVar.isInvalid()) 9489 return nullptr; 9490 Vars.push_back(EVar.get()); 9491 } 9492 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9493 C->getLParenLoc(), C->getEndLoc()); 9494 } 9495 9496 template <typename Derived> 9497 OMPClause * 9498 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9499 llvm::SmallVector<Expr *, 16> Vars; 9500 Vars.reserve(C->varlist_size()); 9501 for (auto *VE : C->varlists()) { 9502 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9503 if (EVar.isInvalid()) 9504 return nullptr; 9505 Vars.push_back(EVar.get()); 9506 } 9507 CXXScopeSpec ReductionIdScopeSpec; 9508 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9509 9510 DeclarationNameInfo NameInfo = C->getNameInfo(); 9511 if (NameInfo.getName()) { 9512 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9513 if (!NameInfo.getName()) 9514 return nullptr; 9515 } 9516 // Build a list of all UDR decls with the same names ranged by the Scopes. 9517 // The Scope boundary is a duplication of the previous decl. 9518 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9519 for (auto *E : C->reduction_ops()) { 9520 // Transform all the decls. 9521 if (E) { 9522 auto *ULE = cast<UnresolvedLookupExpr>(E); 9523 UnresolvedSet<8> Decls; 9524 for (auto *D : ULE->decls()) { 9525 NamedDecl *InstD = 9526 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9527 Decls.addDecl(InstD, InstD->getAccess()); 9528 } 9529 UnresolvedReductions.push_back( 9530 UnresolvedLookupExpr::Create( 9531 SemaRef.Context, /*NamingClass=*/nullptr, 9532 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9533 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9534 Decls.begin(), Decls.end())); 9535 } else 9536 UnresolvedReductions.push_back(nullptr); 9537 } 9538 return getDerived().RebuildOMPReductionClause( 9539 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9540 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9541 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9542 } 9543 9544 template <typename Derived> 9545 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9546 OMPTaskReductionClause *C) { 9547 llvm::SmallVector<Expr *, 16> Vars; 9548 Vars.reserve(C->varlist_size()); 9549 for (auto *VE : C->varlists()) { 9550 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9551 if (EVar.isInvalid()) 9552 return nullptr; 9553 Vars.push_back(EVar.get()); 9554 } 9555 CXXScopeSpec ReductionIdScopeSpec; 9556 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9557 9558 DeclarationNameInfo NameInfo = C->getNameInfo(); 9559 if (NameInfo.getName()) { 9560 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9561 if (!NameInfo.getName()) 9562 return nullptr; 9563 } 9564 // Build a list of all UDR decls with the same names ranged by the Scopes. 9565 // The Scope boundary is a duplication of the previous decl. 9566 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9567 for (auto *E : C->reduction_ops()) { 9568 // Transform all the decls. 9569 if (E) { 9570 auto *ULE = cast<UnresolvedLookupExpr>(E); 9571 UnresolvedSet<8> Decls; 9572 for (auto *D : ULE->decls()) { 9573 NamedDecl *InstD = 9574 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9575 Decls.addDecl(InstD, InstD->getAccess()); 9576 } 9577 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9578 SemaRef.Context, /*NamingClass=*/nullptr, 9579 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9580 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9581 } else 9582 UnresolvedReductions.push_back(nullptr); 9583 } 9584 return getDerived().RebuildOMPTaskReductionClause( 9585 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9586 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9587 } 9588 9589 template <typename Derived> 9590 OMPClause * 9591 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9592 llvm::SmallVector<Expr *, 16> Vars; 9593 Vars.reserve(C->varlist_size()); 9594 for (auto *VE : C->varlists()) { 9595 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9596 if (EVar.isInvalid()) 9597 return nullptr; 9598 Vars.push_back(EVar.get()); 9599 } 9600 CXXScopeSpec ReductionIdScopeSpec; 9601 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9602 9603 DeclarationNameInfo NameInfo = C->getNameInfo(); 9604 if (NameInfo.getName()) { 9605 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9606 if (!NameInfo.getName()) 9607 return nullptr; 9608 } 9609 // Build a list of all UDR decls with the same names ranged by the Scopes. 9610 // The Scope boundary is a duplication of the previous decl. 9611 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9612 for (auto *E : C->reduction_ops()) { 9613 // Transform all the decls. 9614 if (E) { 9615 auto *ULE = cast<UnresolvedLookupExpr>(E); 9616 UnresolvedSet<8> Decls; 9617 for (auto *D : ULE->decls()) { 9618 NamedDecl *InstD = 9619 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9620 Decls.addDecl(InstD, InstD->getAccess()); 9621 } 9622 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9623 SemaRef.Context, /*NamingClass=*/nullptr, 9624 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9625 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9626 } else 9627 UnresolvedReductions.push_back(nullptr); 9628 } 9629 return getDerived().RebuildOMPInReductionClause( 9630 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9631 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9632 } 9633 9634 template <typename Derived> 9635 OMPClause * 9636 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9637 llvm::SmallVector<Expr *, 16> Vars; 9638 Vars.reserve(C->varlist_size()); 9639 for (auto *VE : C->varlists()) { 9640 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9641 if (EVar.isInvalid()) 9642 return nullptr; 9643 Vars.push_back(EVar.get()); 9644 } 9645 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9646 if (Step.isInvalid()) 9647 return nullptr; 9648 return getDerived().RebuildOMPLinearClause( 9649 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9650 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9651 } 9652 9653 template <typename Derived> 9654 OMPClause * 9655 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9656 llvm::SmallVector<Expr *, 16> Vars; 9657 Vars.reserve(C->varlist_size()); 9658 for (auto *VE : C->varlists()) { 9659 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9660 if (EVar.isInvalid()) 9661 return nullptr; 9662 Vars.push_back(EVar.get()); 9663 } 9664 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9665 if (Alignment.isInvalid()) 9666 return nullptr; 9667 return getDerived().RebuildOMPAlignedClause( 9668 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9669 C->getColonLoc(), C->getEndLoc()); 9670 } 9671 9672 template <typename Derived> 9673 OMPClause * 9674 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9675 llvm::SmallVector<Expr *, 16> Vars; 9676 Vars.reserve(C->varlist_size()); 9677 for (auto *VE : C->varlists()) { 9678 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9679 if (EVar.isInvalid()) 9680 return nullptr; 9681 Vars.push_back(EVar.get()); 9682 } 9683 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9684 C->getLParenLoc(), C->getEndLoc()); 9685 } 9686 9687 template <typename Derived> 9688 OMPClause * 9689 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9690 llvm::SmallVector<Expr *, 16> Vars; 9691 Vars.reserve(C->varlist_size()); 9692 for (auto *VE : C->varlists()) { 9693 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9694 if (EVar.isInvalid()) 9695 return nullptr; 9696 Vars.push_back(EVar.get()); 9697 } 9698 return getDerived().RebuildOMPCopyprivateClause( 9699 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9700 } 9701 9702 template <typename Derived> 9703 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9704 llvm::SmallVector<Expr *, 16> Vars; 9705 Vars.reserve(C->varlist_size()); 9706 for (auto *VE : C->varlists()) { 9707 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9708 if (EVar.isInvalid()) 9709 return nullptr; 9710 Vars.push_back(EVar.get()); 9711 } 9712 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9713 C->getLParenLoc(), C->getEndLoc()); 9714 } 9715 9716 template <typename Derived> 9717 OMPClause * 9718 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9719 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9720 if (E.isInvalid()) 9721 return nullptr; 9722 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9723 C->getLParenLoc(), C->getEndLoc()); 9724 } 9725 9726 template <typename Derived> 9727 OMPClause * 9728 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9729 llvm::SmallVector<Expr *, 16> Vars; 9730 Expr *DepModifier = C->getModifier(); 9731 if (DepModifier) { 9732 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9733 if (DepModRes.isInvalid()) 9734 return nullptr; 9735 DepModifier = DepModRes.get(); 9736 } 9737 Vars.reserve(C->varlist_size()); 9738 for (auto *VE : C->varlists()) { 9739 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9740 if (EVar.isInvalid()) 9741 return nullptr; 9742 Vars.push_back(EVar.get()); 9743 } 9744 return getDerived().RebuildOMPDependClause( 9745 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9746 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9747 C->getEndLoc()); 9748 } 9749 9750 template <typename Derived> 9751 OMPClause * 9752 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9753 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9754 if (E.isInvalid()) 9755 return nullptr; 9756 return getDerived().RebuildOMPDeviceClause( 9757 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9758 C->getModifierLoc(), C->getEndLoc()); 9759 } 9760 9761 template <typename Derived, class T> 9762 bool transformOMPMappableExprListClause( 9763 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9764 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9765 DeclarationNameInfo &MapperIdInfo, 9766 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9767 // Transform expressions in the list. 9768 Vars.reserve(C->varlist_size()); 9769 for (auto *VE : C->varlists()) { 9770 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9771 if (EVar.isInvalid()) 9772 return true; 9773 Vars.push_back(EVar.get()); 9774 } 9775 // Transform mapper scope specifier and identifier. 9776 NestedNameSpecifierLoc QualifierLoc; 9777 if (C->getMapperQualifierLoc()) { 9778 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9779 C->getMapperQualifierLoc()); 9780 if (!QualifierLoc) 9781 return true; 9782 } 9783 MapperIdScopeSpec.Adopt(QualifierLoc); 9784 MapperIdInfo = C->getMapperIdInfo(); 9785 if (MapperIdInfo.getName()) { 9786 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9787 if (!MapperIdInfo.getName()) 9788 return true; 9789 } 9790 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9791 // the previous user-defined mapper lookup in dependent environment. 9792 for (auto *E : C->mapperlists()) { 9793 // Transform all the decls. 9794 if (E) { 9795 auto *ULE = cast<UnresolvedLookupExpr>(E); 9796 UnresolvedSet<8> Decls; 9797 for (auto *D : ULE->decls()) { 9798 NamedDecl *InstD = 9799 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9800 Decls.addDecl(InstD, InstD->getAccess()); 9801 } 9802 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9803 TT.getSema().Context, /*NamingClass=*/nullptr, 9804 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9805 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9806 Decls.end())); 9807 } else { 9808 UnresolvedMappers.push_back(nullptr); 9809 } 9810 } 9811 return false; 9812 } 9813 9814 template <typename Derived> 9815 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9816 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9817 llvm::SmallVector<Expr *, 16> Vars; 9818 CXXScopeSpec MapperIdScopeSpec; 9819 DeclarationNameInfo MapperIdInfo; 9820 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9821 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9822 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9823 return nullptr; 9824 return getDerived().RebuildOMPMapClause( 9825 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9826 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9827 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9828 } 9829 9830 template <typename Derived> 9831 OMPClause * 9832 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9833 Expr *Allocator = C->getAllocator(); 9834 if (Allocator) { 9835 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9836 if (AllocatorRes.isInvalid()) 9837 return nullptr; 9838 Allocator = AllocatorRes.get(); 9839 } 9840 llvm::SmallVector<Expr *, 16> Vars; 9841 Vars.reserve(C->varlist_size()); 9842 for (auto *VE : C->varlists()) { 9843 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9844 if (EVar.isInvalid()) 9845 return nullptr; 9846 Vars.push_back(EVar.get()); 9847 } 9848 return getDerived().RebuildOMPAllocateClause( 9849 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9850 C->getEndLoc()); 9851 } 9852 9853 template <typename Derived> 9854 OMPClause * 9855 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9856 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9857 if (E.isInvalid()) 9858 return nullptr; 9859 return getDerived().RebuildOMPNumTeamsClause( 9860 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9861 } 9862 9863 template <typename Derived> 9864 OMPClause * 9865 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9866 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9867 if (E.isInvalid()) 9868 return nullptr; 9869 return getDerived().RebuildOMPThreadLimitClause( 9870 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9871 } 9872 9873 template <typename Derived> 9874 OMPClause * 9875 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9876 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9877 if (E.isInvalid()) 9878 return nullptr; 9879 return getDerived().RebuildOMPPriorityClause( 9880 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9881 } 9882 9883 template <typename Derived> 9884 OMPClause * 9885 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9886 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9887 if (E.isInvalid()) 9888 return nullptr; 9889 return getDerived().RebuildOMPGrainsizeClause( 9890 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9891 } 9892 9893 template <typename Derived> 9894 OMPClause * 9895 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9896 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9897 if (E.isInvalid()) 9898 return nullptr; 9899 return getDerived().RebuildOMPNumTasksClause( 9900 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9901 } 9902 9903 template <typename Derived> 9904 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9905 ExprResult E = getDerived().TransformExpr(C->getHint()); 9906 if (E.isInvalid()) 9907 return nullptr; 9908 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9909 C->getLParenLoc(), C->getEndLoc()); 9910 } 9911 9912 template <typename Derived> 9913 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9914 OMPDistScheduleClause *C) { 9915 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9916 if (E.isInvalid()) 9917 return nullptr; 9918 return getDerived().RebuildOMPDistScheduleClause( 9919 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9920 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9921 } 9922 9923 template <typename Derived> 9924 OMPClause * 9925 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9926 // Rebuild Defaultmap Clause since we need to invoke the checking of 9927 // defaultmap(none:variable-category) after template initialization. 9928 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9929 C->getDefaultmapKind(), 9930 C->getBeginLoc(), 9931 C->getLParenLoc(), 9932 C->getDefaultmapModifierLoc(), 9933 C->getDefaultmapKindLoc(), 9934 C->getEndLoc()); 9935 } 9936 9937 template <typename Derived> 9938 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9939 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9940 llvm::SmallVector<Expr *, 16> Vars; 9941 CXXScopeSpec MapperIdScopeSpec; 9942 DeclarationNameInfo MapperIdInfo; 9943 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9944 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9945 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9946 return nullptr; 9947 return getDerived().RebuildOMPToClause( 9948 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9949 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9950 } 9951 9952 template <typename Derived> 9953 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9954 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9955 llvm::SmallVector<Expr *, 16> Vars; 9956 CXXScopeSpec MapperIdScopeSpec; 9957 DeclarationNameInfo MapperIdInfo; 9958 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9959 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9960 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9961 return nullptr; 9962 return getDerived().RebuildOMPFromClause( 9963 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9964 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9965 } 9966 9967 template <typename Derived> 9968 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9969 OMPUseDevicePtrClause *C) { 9970 llvm::SmallVector<Expr *, 16> Vars; 9971 Vars.reserve(C->varlist_size()); 9972 for (auto *VE : C->varlists()) { 9973 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9974 if (EVar.isInvalid()) 9975 return nullptr; 9976 Vars.push_back(EVar.get()); 9977 } 9978 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9979 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9980 } 9981 9982 template <typename Derived> 9983 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 9984 OMPUseDeviceAddrClause *C) { 9985 llvm::SmallVector<Expr *, 16> Vars; 9986 Vars.reserve(C->varlist_size()); 9987 for (auto *VE : C->varlists()) { 9988 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9989 if (EVar.isInvalid()) 9990 return nullptr; 9991 Vars.push_back(EVar.get()); 9992 } 9993 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9994 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 9995 } 9996 9997 template <typename Derived> 9998 OMPClause * 9999 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10000 llvm::SmallVector<Expr *, 16> Vars; 10001 Vars.reserve(C->varlist_size()); 10002 for (auto *VE : C->varlists()) { 10003 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10004 if (EVar.isInvalid()) 10005 return nullptr; 10006 Vars.push_back(EVar.get()); 10007 } 10008 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10009 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10010 } 10011 10012 template <typename Derived> 10013 OMPClause * 10014 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10015 llvm::SmallVector<Expr *, 16> Vars; 10016 Vars.reserve(C->varlist_size()); 10017 for (auto *VE : C->varlists()) { 10018 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10019 if (EVar.isInvalid()) 10020 return nullptr; 10021 Vars.push_back(EVar.get()); 10022 } 10023 return getDerived().RebuildOMPNontemporalClause( 10024 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10025 } 10026 10027 template <typename Derived> 10028 OMPClause * 10029 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10030 llvm::SmallVector<Expr *, 16> Vars; 10031 Vars.reserve(C->varlist_size()); 10032 for (auto *VE : C->varlists()) { 10033 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10034 if (EVar.isInvalid()) 10035 return nullptr; 10036 Vars.push_back(EVar.get()); 10037 } 10038 return getDerived().RebuildOMPInclusiveClause( 10039 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10040 } 10041 10042 template <typename Derived> 10043 OMPClause * 10044 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10045 llvm::SmallVector<Expr *, 16> Vars; 10046 Vars.reserve(C->varlist_size()); 10047 for (auto *VE : C->varlists()) { 10048 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10049 if (EVar.isInvalid()) 10050 return nullptr; 10051 Vars.push_back(EVar.get()); 10052 } 10053 return getDerived().RebuildOMPExclusiveClause( 10054 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10055 } 10056 10057 template <typename Derived> 10058 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10059 OMPUsesAllocatorsClause *C) { 10060 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10061 Data.reserve(C->getNumberOfAllocators()); 10062 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10063 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10064 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10065 if (Allocator.isInvalid()) 10066 continue; 10067 ExprResult AllocatorTraits; 10068 if (Expr *AT = D.AllocatorTraits) { 10069 AllocatorTraits = getDerived().TransformExpr(AT); 10070 if (AllocatorTraits.isInvalid()) 10071 continue; 10072 } 10073 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10074 NewD.Allocator = Allocator.get(); 10075 NewD.AllocatorTraits = AllocatorTraits.get(); 10076 NewD.LParenLoc = D.LParenLoc; 10077 NewD.RParenLoc = D.RParenLoc; 10078 } 10079 return getDerived().RebuildOMPUsesAllocatorsClause( 10080 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10081 } 10082 10083 template <typename Derived> 10084 OMPClause * 10085 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10086 SmallVector<Expr *, 4> Locators; 10087 Locators.reserve(C->varlist_size()); 10088 ExprResult ModifierRes; 10089 if (Expr *Modifier = C->getModifier()) { 10090 ModifierRes = getDerived().TransformExpr(Modifier); 10091 if (ModifierRes.isInvalid()) 10092 return nullptr; 10093 } 10094 for (Expr *E : C->varlists()) { 10095 ExprResult Locator = getDerived().TransformExpr(E); 10096 if (Locator.isInvalid()) 10097 continue; 10098 Locators.push_back(Locator.get()); 10099 } 10100 return getDerived().RebuildOMPAffinityClause( 10101 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10102 ModifierRes.get(), Locators); 10103 } 10104 10105 template <typename Derived> 10106 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10107 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10108 C->getBeginLoc(), C->getLParenLoc(), 10109 C->getEndLoc()); 10110 } 10111 10112 //===----------------------------------------------------------------------===// 10113 // Expression transformation 10114 //===----------------------------------------------------------------------===// 10115 template<typename Derived> 10116 ExprResult 10117 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10118 return TransformExpr(E->getSubExpr()); 10119 } 10120 10121 template<typename Derived> 10122 ExprResult 10123 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10124 if (!E->isTypeDependent()) 10125 return E; 10126 10127 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10128 E->getIdentKind()); 10129 } 10130 10131 template<typename Derived> 10132 ExprResult 10133 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10134 NestedNameSpecifierLoc QualifierLoc; 10135 if (E->getQualifierLoc()) { 10136 QualifierLoc 10137 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10138 if (!QualifierLoc) 10139 return ExprError(); 10140 } 10141 10142 ValueDecl *ND 10143 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10144 E->getDecl())); 10145 if (!ND) 10146 return ExprError(); 10147 10148 NamedDecl *Found = ND; 10149 if (E->getFoundDecl() != E->getDecl()) { 10150 Found = cast_or_null<NamedDecl>( 10151 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10152 if (!Found) 10153 return ExprError(); 10154 } 10155 10156 DeclarationNameInfo NameInfo = E->getNameInfo(); 10157 if (NameInfo.getName()) { 10158 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10159 if (!NameInfo.getName()) 10160 return ExprError(); 10161 } 10162 10163 if (!getDerived().AlwaysRebuild() && 10164 QualifierLoc == E->getQualifierLoc() && 10165 ND == E->getDecl() && 10166 Found == E->getFoundDecl() && 10167 NameInfo.getName() == E->getDecl()->getDeclName() && 10168 !E->hasExplicitTemplateArgs()) { 10169 10170 // Mark it referenced in the new context regardless. 10171 // FIXME: this is a bit instantiation-specific. 10172 SemaRef.MarkDeclRefReferenced(E); 10173 10174 return E; 10175 } 10176 10177 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10178 if (E->hasExplicitTemplateArgs()) { 10179 TemplateArgs = &TransArgs; 10180 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10181 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10182 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10183 E->getNumTemplateArgs(), 10184 TransArgs)) 10185 return ExprError(); 10186 } 10187 10188 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10189 Found, TemplateArgs); 10190 } 10191 10192 template<typename Derived> 10193 ExprResult 10194 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10195 return E; 10196 } 10197 10198 template <typename Derived> 10199 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10200 FixedPointLiteral *E) { 10201 return E; 10202 } 10203 10204 template<typename Derived> 10205 ExprResult 10206 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10207 return E; 10208 } 10209 10210 template<typename Derived> 10211 ExprResult 10212 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10213 return E; 10214 } 10215 10216 template<typename Derived> 10217 ExprResult 10218 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10219 return E; 10220 } 10221 10222 template<typename Derived> 10223 ExprResult 10224 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10225 return E; 10226 } 10227 10228 template<typename Derived> 10229 ExprResult 10230 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10231 if (FunctionDecl *FD = E->getDirectCallee()) 10232 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10233 return SemaRef.MaybeBindToTemporary(E); 10234 } 10235 10236 template<typename Derived> 10237 ExprResult 10238 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10239 ExprResult ControllingExpr = 10240 getDerived().TransformExpr(E->getControllingExpr()); 10241 if (ControllingExpr.isInvalid()) 10242 return ExprError(); 10243 10244 SmallVector<Expr *, 4> AssocExprs; 10245 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10246 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10247 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10248 if (TSI) { 10249 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10250 if (!AssocType) 10251 return ExprError(); 10252 AssocTypes.push_back(AssocType); 10253 } else { 10254 AssocTypes.push_back(nullptr); 10255 } 10256 10257 ExprResult AssocExpr = 10258 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10259 if (AssocExpr.isInvalid()) 10260 return ExprError(); 10261 AssocExprs.push_back(AssocExpr.get()); 10262 } 10263 10264 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10265 E->getDefaultLoc(), 10266 E->getRParenLoc(), 10267 ControllingExpr.get(), 10268 AssocTypes, 10269 AssocExprs); 10270 } 10271 10272 template<typename Derived> 10273 ExprResult 10274 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10275 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10276 if (SubExpr.isInvalid()) 10277 return ExprError(); 10278 10279 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10280 return E; 10281 10282 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10283 E->getRParen()); 10284 } 10285 10286 /// The operand of a unary address-of operator has special rules: it's 10287 /// allowed to refer to a non-static member of a class even if there's no 'this' 10288 /// object available. 10289 template<typename Derived> 10290 ExprResult 10291 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10292 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10293 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10294 else 10295 return getDerived().TransformExpr(E); 10296 } 10297 10298 template<typename Derived> 10299 ExprResult 10300 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10301 ExprResult SubExpr; 10302 if (E->getOpcode() == UO_AddrOf) 10303 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10304 else 10305 SubExpr = TransformExpr(E->getSubExpr()); 10306 if (SubExpr.isInvalid()) 10307 return ExprError(); 10308 10309 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10310 return E; 10311 10312 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10313 E->getOpcode(), 10314 SubExpr.get()); 10315 } 10316 10317 template<typename Derived> 10318 ExprResult 10319 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10320 // Transform the type. 10321 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10322 if (!Type) 10323 return ExprError(); 10324 10325 // Transform all of the components into components similar to what the 10326 // parser uses. 10327 // FIXME: It would be slightly more efficient in the non-dependent case to 10328 // just map FieldDecls, rather than requiring the rebuilder to look for 10329 // the fields again. However, __builtin_offsetof is rare enough in 10330 // template code that we don't care. 10331 bool ExprChanged = false; 10332 typedef Sema::OffsetOfComponent Component; 10333 SmallVector<Component, 4> Components; 10334 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10335 const OffsetOfNode &ON = E->getComponent(I); 10336 Component Comp; 10337 Comp.isBrackets = true; 10338 Comp.LocStart = ON.getSourceRange().getBegin(); 10339 Comp.LocEnd = ON.getSourceRange().getEnd(); 10340 switch (ON.getKind()) { 10341 case OffsetOfNode::Array: { 10342 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10343 ExprResult Index = getDerived().TransformExpr(FromIndex); 10344 if (Index.isInvalid()) 10345 return ExprError(); 10346 10347 ExprChanged = ExprChanged || Index.get() != FromIndex; 10348 Comp.isBrackets = true; 10349 Comp.U.E = Index.get(); 10350 break; 10351 } 10352 10353 case OffsetOfNode::Field: 10354 case OffsetOfNode::Identifier: 10355 Comp.isBrackets = false; 10356 Comp.U.IdentInfo = ON.getFieldName(); 10357 if (!Comp.U.IdentInfo) 10358 continue; 10359 10360 break; 10361 10362 case OffsetOfNode::Base: 10363 // Will be recomputed during the rebuild. 10364 continue; 10365 } 10366 10367 Components.push_back(Comp); 10368 } 10369 10370 // If nothing changed, retain the existing expression. 10371 if (!getDerived().AlwaysRebuild() && 10372 Type == E->getTypeSourceInfo() && 10373 !ExprChanged) 10374 return E; 10375 10376 // Build a new offsetof expression. 10377 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10378 Components, E->getRParenLoc()); 10379 } 10380 10381 template<typename Derived> 10382 ExprResult 10383 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10384 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10385 "opaque value expression requires transformation"); 10386 return E; 10387 } 10388 10389 template<typename Derived> 10390 ExprResult 10391 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10392 return E; 10393 } 10394 10395 template <typename Derived> 10396 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10397 llvm::SmallVector<Expr *, 8> Children; 10398 bool Changed = false; 10399 for (Expr *C : E->subExpressions()) { 10400 ExprResult NewC = getDerived().TransformExpr(C); 10401 if (NewC.isInvalid()) 10402 return ExprError(); 10403 Children.push_back(NewC.get()); 10404 10405 Changed |= NewC.get() != C; 10406 } 10407 if (!getDerived().AlwaysRebuild() && !Changed) 10408 return E; 10409 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10410 Children, E->getType()); 10411 } 10412 10413 template<typename Derived> 10414 ExprResult 10415 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10416 // Rebuild the syntactic form. The original syntactic form has 10417 // opaque-value expressions in it, so strip those away and rebuild 10418 // the result. This is a really awful way of doing this, but the 10419 // better solution (rebuilding the semantic expressions and 10420 // rebinding OVEs as necessary) doesn't work; we'd need 10421 // TreeTransform to not strip away implicit conversions. 10422 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10423 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10424 if (result.isInvalid()) return ExprError(); 10425 10426 // If that gives us a pseudo-object result back, the pseudo-object 10427 // expression must have been an lvalue-to-rvalue conversion which we 10428 // should reapply. 10429 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10430 result = SemaRef.checkPseudoObjectRValue(result.get()); 10431 10432 return result; 10433 } 10434 10435 template<typename Derived> 10436 ExprResult 10437 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10438 UnaryExprOrTypeTraitExpr *E) { 10439 if (E->isArgumentType()) { 10440 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10441 10442 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10443 if (!NewT) 10444 return ExprError(); 10445 10446 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10447 return E; 10448 10449 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10450 E->getKind(), 10451 E->getSourceRange()); 10452 } 10453 10454 // C++0x [expr.sizeof]p1: 10455 // The operand is either an expression, which is an unevaluated operand 10456 // [...] 10457 EnterExpressionEvaluationContext Unevaluated( 10458 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10459 Sema::ReuseLambdaContextDecl); 10460 10461 // Try to recover if we have something like sizeof(T::X) where X is a type. 10462 // Notably, there must be *exactly* one set of parens if X is a type. 10463 TypeSourceInfo *RecoveryTSI = nullptr; 10464 ExprResult SubExpr; 10465 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10466 if (auto *DRE = 10467 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10468 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10469 PE, DRE, false, &RecoveryTSI); 10470 else 10471 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10472 10473 if (RecoveryTSI) { 10474 return getDerived().RebuildUnaryExprOrTypeTrait( 10475 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10476 } else if (SubExpr.isInvalid()) 10477 return ExprError(); 10478 10479 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10480 return E; 10481 10482 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10483 E->getOperatorLoc(), 10484 E->getKind(), 10485 E->getSourceRange()); 10486 } 10487 10488 template<typename Derived> 10489 ExprResult 10490 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10491 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10492 if (LHS.isInvalid()) 10493 return ExprError(); 10494 10495 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10496 if (RHS.isInvalid()) 10497 return ExprError(); 10498 10499 10500 if (!getDerived().AlwaysRebuild() && 10501 LHS.get() == E->getLHS() && 10502 RHS.get() == E->getRHS()) 10503 return E; 10504 10505 return getDerived().RebuildArraySubscriptExpr( 10506 LHS.get(), 10507 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10508 } 10509 10510 template <typename Derived> 10511 ExprResult 10512 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10513 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10514 if (Base.isInvalid()) 10515 return ExprError(); 10516 10517 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10518 if (RowIdx.isInvalid()) 10519 return ExprError(); 10520 10521 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10522 if (ColumnIdx.isInvalid()) 10523 return ExprError(); 10524 10525 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10526 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10527 return E; 10528 10529 return getDerived().RebuildMatrixSubscriptExpr( 10530 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10531 } 10532 10533 template <typename Derived> 10534 ExprResult 10535 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10536 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10537 if (Base.isInvalid()) 10538 return ExprError(); 10539 10540 ExprResult LowerBound; 10541 if (E->getLowerBound()) { 10542 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10543 if (LowerBound.isInvalid()) 10544 return ExprError(); 10545 } 10546 10547 ExprResult Length; 10548 if (E->getLength()) { 10549 Length = getDerived().TransformExpr(E->getLength()); 10550 if (Length.isInvalid()) 10551 return ExprError(); 10552 } 10553 10554 ExprResult Stride; 10555 if (Expr *Str = E->getStride()) { 10556 Stride = getDerived().TransformExpr(Str); 10557 if (Stride.isInvalid()) 10558 return ExprError(); 10559 } 10560 10561 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10562 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10563 return E; 10564 10565 return getDerived().RebuildOMPArraySectionExpr( 10566 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10567 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10568 E->getRBracketLoc()); 10569 } 10570 10571 template <typename Derived> 10572 ExprResult 10573 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10574 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10575 if (Base.isInvalid()) 10576 return ExprError(); 10577 10578 SmallVector<Expr *, 4> Dims; 10579 bool ErrorFound = false; 10580 for (Expr *Dim : E->getDimensions()) { 10581 ExprResult DimRes = getDerived().TransformExpr(Dim); 10582 if (DimRes.isInvalid()) { 10583 ErrorFound = true; 10584 continue; 10585 } 10586 Dims.push_back(DimRes.get()); 10587 } 10588 10589 if (ErrorFound) 10590 return ExprError(); 10591 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10592 E->getRParenLoc(), Dims, 10593 E->getBracketsRanges()); 10594 } 10595 10596 template <typename Derived> 10597 ExprResult 10598 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10599 unsigned NumIterators = E->numOfIterators(); 10600 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10601 10602 bool ErrorFound = false; 10603 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10604 for (unsigned I = 0; I < NumIterators; ++I) { 10605 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10606 Data[I].DeclIdent = D->getIdentifier(); 10607 Data[I].DeclIdentLoc = D->getLocation(); 10608 if (D->getLocation() == D->getBeginLoc()) { 10609 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10610 "Implicit type must be int."); 10611 } else { 10612 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10613 QualType DeclTy = getDerived().TransformType(D->getType()); 10614 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10615 } 10616 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10617 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10618 ExprResult End = getDerived().TransformExpr(Range.End); 10619 ExprResult Step = getDerived().TransformExpr(Range.Step); 10620 ErrorFound = ErrorFound || 10621 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10622 !Data[I].Type.get().isNull())) || 10623 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10624 if (ErrorFound) 10625 continue; 10626 Data[I].Range.Begin = Begin.get(); 10627 Data[I].Range.End = End.get(); 10628 Data[I].Range.Step = Step.get(); 10629 Data[I].AssignLoc = E->getAssignLoc(I); 10630 Data[I].ColonLoc = E->getColonLoc(I); 10631 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10632 NeedToRebuild = 10633 NeedToRebuild || 10634 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10635 D->getType().getTypePtrOrNull()) || 10636 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10637 Range.Step != Data[I].Range.Step; 10638 } 10639 if (ErrorFound) 10640 return ExprError(); 10641 if (!NeedToRebuild) 10642 return E; 10643 10644 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10645 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10646 if (!Res.isUsable()) 10647 return Res; 10648 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10649 for (unsigned I = 0; I < NumIterators; ++I) 10650 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10651 IE->getIteratorDecl(I)); 10652 return Res; 10653 } 10654 10655 template<typename Derived> 10656 ExprResult 10657 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10658 // Transform the callee. 10659 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10660 if (Callee.isInvalid()) 10661 return ExprError(); 10662 10663 // Transform arguments. 10664 bool ArgChanged = false; 10665 SmallVector<Expr*, 8> Args; 10666 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10667 &ArgChanged)) 10668 return ExprError(); 10669 10670 if (!getDerived().AlwaysRebuild() && 10671 Callee.get() == E->getCallee() && 10672 !ArgChanged) 10673 return SemaRef.MaybeBindToTemporary(E); 10674 10675 // FIXME: Wrong source location information for the '('. 10676 SourceLocation FakeLParenLoc 10677 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10678 10679 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10680 if (E->hasStoredFPFeatures()) { 10681 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10682 getSema().CurFPFeatures = 10683 NewOverrides.applyOverrides(getSema().getLangOpts()); 10684 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10685 } 10686 10687 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10688 Args, 10689 E->getRParenLoc()); 10690 } 10691 10692 template<typename Derived> 10693 ExprResult 10694 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10695 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10696 if (Base.isInvalid()) 10697 return ExprError(); 10698 10699 NestedNameSpecifierLoc QualifierLoc; 10700 if (E->hasQualifier()) { 10701 QualifierLoc 10702 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10703 10704 if (!QualifierLoc) 10705 return ExprError(); 10706 } 10707 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10708 10709 ValueDecl *Member 10710 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10711 E->getMemberDecl())); 10712 if (!Member) 10713 return ExprError(); 10714 10715 NamedDecl *FoundDecl = E->getFoundDecl(); 10716 if (FoundDecl == E->getMemberDecl()) { 10717 FoundDecl = Member; 10718 } else { 10719 FoundDecl = cast_or_null<NamedDecl>( 10720 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10721 if (!FoundDecl) 10722 return ExprError(); 10723 } 10724 10725 if (!getDerived().AlwaysRebuild() && 10726 Base.get() == E->getBase() && 10727 QualifierLoc == E->getQualifierLoc() && 10728 Member == E->getMemberDecl() && 10729 FoundDecl == E->getFoundDecl() && 10730 !E->hasExplicitTemplateArgs()) { 10731 10732 // Mark it referenced in the new context regardless. 10733 // FIXME: this is a bit instantiation-specific. 10734 SemaRef.MarkMemberReferenced(E); 10735 10736 return E; 10737 } 10738 10739 TemplateArgumentListInfo TransArgs; 10740 if (E->hasExplicitTemplateArgs()) { 10741 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10742 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10743 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10744 E->getNumTemplateArgs(), 10745 TransArgs)) 10746 return ExprError(); 10747 } 10748 10749 // FIXME: Bogus source location for the operator 10750 SourceLocation FakeOperatorLoc = 10751 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10752 10753 // FIXME: to do this check properly, we will need to preserve the 10754 // first-qualifier-in-scope here, just in case we had a dependent 10755 // base (and therefore couldn't do the check) and a 10756 // nested-name-qualifier (and therefore could do the lookup). 10757 NamedDecl *FirstQualifierInScope = nullptr; 10758 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10759 if (MemberNameInfo.getName()) { 10760 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10761 if (!MemberNameInfo.getName()) 10762 return ExprError(); 10763 } 10764 10765 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10766 E->isArrow(), 10767 QualifierLoc, 10768 TemplateKWLoc, 10769 MemberNameInfo, 10770 Member, 10771 FoundDecl, 10772 (E->hasExplicitTemplateArgs() 10773 ? &TransArgs : nullptr), 10774 FirstQualifierInScope); 10775 } 10776 10777 template<typename Derived> 10778 ExprResult 10779 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10780 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10781 if (LHS.isInvalid()) 10782 return ExprError(); 10783 10784 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10785 if (RHS.isInvalid()) 10786 return ExprError(); 10787 10788 if (!getDerived().AlwaysRebuild() && 10789 LHS.get() == E->getLHS() && 10790 RHS.get() == E->getRHS()) 10791 return E; 10792 10793 if (E->isCompoundAssignmentOp()) 10794 // FPFeatures has already been established from trailing storage 10795 return getDerived().RebuildBinaryOperator( 10796 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10797 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10798 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10799 getSema().CurFPFeatures = 10800 NewOverrides.applyOverrides(getSema().getLangOpts()); 10801 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10802 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10803 LHS.get(), RHS.get()); 10804 } 10805 10806 template <typename Derived> 10807 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10808 CXXRewrittenBinaryOperator *E) { 10809 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10810 10811 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10812 if (LHS.isInvalid()) 10813 return ExprError(); 10814 10815 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10816 if (RHS.isInvalid()) 10817 return ExprError(); 10818 10819 if (!getDerived().AlwaysRebuild() && 10820 LHS.get() == Decomp.LHS && 10821 RHS.get() == Decomp.RHS) 10822 return E; 10823 10824 // Extract the already-resolved callee declarations so that we can restrict 10825 // ourselves to using them as the unqualified lookup results when rebuilding. 10826 UnresolvedSet<2> UnqualLookups; 10827 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10828 const_cast<Expr *>(Decomp.InnerBinOp)}; 10829 for (Expr *PossibleBinOp : PossibleBinOps) { 10830 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10831 if (!Op) 10832 continue; 10833 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10834 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10835 continue; 10836 10837 // Transform the callee in case we built a call to a local extern 10838 // declaration. 10839 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10840 E->getOperatorLoc(), Callee->getFoundDecl())); 10841 if (!Found) 10842 return ExprError(); 10843 UnqualLookups.addDecl(Found); 10844 } 10845 10846 return getDerived().RebuildCXXRewrittenBinaryOperator( 10847 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10848 } 10849 10850 template<typename Derived> 10851 ExprResult 10852 TreeTransform<Derived>::TransformCompoundAssignOperator( 10853 CompoundAssignOperator *E) { 10854 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10855 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10856 getSema().CurFPFeatures = 10857 NewOverrides.applyOverrides(getSema().getLangOpts()); 10858 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10859 return getDerived().TransformBinaryOperator(E); 10860 } 10861 10862 template<typename Derived> 10863 ExprResult TreeTransform<Derived>:: 10864 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10865 // Just rebuild the common and RHS expressions and see whether we 10866 // get any changes. 10867 10868 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10869 if (commonExpr.isInvalid()) 10870 return ExprError(); 10871 10872 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10873 if (rhs.isInvalid()) 10874 return ExprError(); 10875 10876 if (!getDerived().AlwaysRebuild() && 10877 commonExpr.get() == e->getCommon() && 10878 rhs.get() == e->getFalseExpr()) 10879 return e; 10880 10881 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10882 e->getQuestionLoc(), 10883 nullptr, 10884 e->getColonLoc(), 10885 rhs.get()); 10886 } 10887 10888 template<typename Derived> 10889 ExprResult 10890 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10891 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10892 if (Cond.isInvalid()) 10893 return ExprError(); 10894 10895 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10896 if (LHS.isInvalid()) 10897 return ExprError(); 10898 10899 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10900 if (RHS.isInvalid()) 10901 return ExprError(); 10902 10903 if (!getDerived().AlwaysRebuild() && 10904 Cond.get() == E->getCond() && 10905 LHS.get() == E->getLHS() && 10906 RHS.get() == E->getRHS()) 10907 return E; 10908 10909 return getDerived().RebuildConditionalOperator(Cond.get(), 10910 E->getQuestionLoc(), 10911 LHS.get(), 10912 E->getColonLoc(), 10913 RHS.get()); 10914 } 10915 10916 template<typename Derived> 10917 ExprResult 10918 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10919 // Implicit casts are eliminated during transformation, since they 10920 // will be recomputed by semantic analysis after transformation. 10921 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10922 } 10923 10924 template<typename Derived> 10925 ExprResult 10926 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10927 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10928 if (!Type) 10929 return ExprError(); 10930 10931 ExprResult SubExpr 10932 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10933 if (SubExpr.isInvalid()) 10934 return ExprError(); 10935 10936 if (!getDerived().AlwaysRebuild() && 10937 Type == E->getTypeInfoAsWritten() && 10938 SubExpr.get() == E->getSubExpr()) 10939 return E; 10940 10941 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10942 Type, 10943 E->getRParenLoc(), 10944 SubExpr.get()); 10945 } 10946 10947 template<typename Derived> 10948 ExprResult 10949 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10950 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10951 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10952 if (!NewT) 10953 return ExprError(); 10954 10955 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10956 if (Init.isInvalid()) 10957 return ExprError(); 10958 10959 if (!getDerived().AlwaysRebuild() && 10960 OldT == NewT && 10961 Init.get() == E->getInitializer()) 10962 return SemaRef.MaybeBindToTemporary(E); 10963 10964 // Note: the expression type doesn't necessarily match the 10965 // type-as-written, but that's okay, because it should always be 10966 // derivable from the initializer. 10967 10968 return getDerived().RebuildCompoundLiteralExpr( 10969 E->getLParenLoc(), NewT, 10970 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10971 } 10972 10973 template<typename Derived> 10974 ExprResult 10975 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10976 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10977 if (Base.isInvalid()) 10978 return ExprError(); 10979 10980 if (!getDerived().AlwaysRebuild() && 10981 Base.get() == E->getBase()) 10982 return E; 10983 10984 // FIXME: Bad source location 10985 SourceLocation FakeOperatorLoc = 10986 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10987 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10988 E->getAccessorLoc(), 10989 E->getAccessor()); 10990 } 10991 10992 template<typename Derived> 10993 ExprResult 10994 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10995 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10996 E = Syntactic; 10997 10998 bool InitChanged = false; 10999 11000 EnterExpressionEvaluationContext Context( 11001 getSema(), EnterExpressionEvaluationContext::InitList); 11002 11003 SmallVector<Expr*, 4> Inits; 11004 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11005 Inits, &InitChanged)) 11006 return ExprError(); 11007 11008 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11009 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11010 // in some cases. We can't reuse it in general, because the syntactic and 11011 // semantic forms are linked, and we can't know that semantic form will 11012 // match even if the syntactic form does. 11013 } 11014 11015 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11016 E->getRBraceLoc()); 11017 } 11018 11019 template<typename Derived> 11020 ExprResult 11021 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11022 Designation Desig; 11023 11024 // transform the initializer value 11025 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11026 if (Init.isInvalid()) 11027 return ExprError(); 11028 11029 // transform the designators. 11030 SmallVector<Expr*, 4> ArrayExprs; 11031 bool ExprChanged = false; 11032 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11033 if (D.isFieldDesignator()) { 11034 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11035 D.getDotLoc(), 11036 D.getFieldLoc())); 11037 if (D.getField()) { 11038 FieldDecl *Field = cast_or_null<FieldDecl>( 11039 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11040 if (Field != D.getField()) 11041 // Rebuild the expression when the transformed FieldDecl is 11042 // different to the already assigned FieldDecl. 11043 ExprChanged = true; 11044 } else { 11045 // Ensure that the designator expression is rebuilt when there isn't 11046 // a resolved FieldDecl in the designator as we don't want to assign 11047 // a FieldDecl to a pattern designator that will be instantiated again. 11048 ExprChanged = true; 11049 } 11050 continue; 11051 } 11052 11053 if (D.isArrayDesignator()) { 11054 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11055 if (Index.isInvalid()) 11056 return ExprError(); 11057 11058 Desig.AddDesignator( 11059 Designator::getArray(Index.get(), D.getLBracketLoc())); 11060 11061 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11062 ArrayExprs.push_back(Index.get()); 11063 continue; 11064 } 11065 11066 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11067 ExprResult Start 11068 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11069 if (Start.isInvalid()) 11070 return ExprError(); 11071 11072 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11073 if (End.isInvalid()) 11074 return ExprError(); 11075 11076 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11077 End.get(), 11078 D.getLBracketLoc(), 11079 D.getEllipsisLoc())); 11080 11081 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11082 End.get() != E->getArrayRangeEnd(D); 11083 11084 ArrayExprs.push_back(Start.get()); 11085 ArrayExprs.push_back(End.get()); 11086 } 11087 11088 if (!getDerived().AlwaysRebuild() && 11089 Init.get() == E->getInit() && 11090 !ExprChanged) 11091 return E; 11092 11093 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11094 E->getEqualOrColonLoc(), 11095 E->usesGNUSyntax(), Init.get()); 11096 } 11097 11098 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11099 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11100 template<typename Derived> 11101 ExprResult 11102 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11103 DesignatedInitUpdateExpr *E) { 11104 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11105 "initializer"); 11106 return ExprError(); 11107 } 11108 11109 template<typename Derived> 11110 ExprResult 11111 TreeTransform<Derived>::TransformNoInitExpr( 11112 NoInitExpr *E) { 11113 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11114 return ExprError(); 11115 } 11116 11117 template<typename Derived> 11118 ExprResult 11119 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11120 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11121 return ExprError(); 11122 } 11123 11124 template<typename Derived> 11125 ExprResult 11126 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11127 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11128 return ExprError(); 11129 } 11130 11131 template<typename Derived> 11132 ExprResult 11133 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11134 ImplicitValueInitExpr *E) { 11135 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11136 11137 // FIXME: Will we ever have proper type location here? Will we actually 11138 // need to transform the type? 11139 QualType T = getDerived().TransformType(E->getType()); 11140 if (T.isNull()) 11141 return ExprError(); 11142 11143 if (!getDerived().AlwaysRebuild() && 11144 T == E->getType()) 11145 return E; 11146 11147 return getDerived().RebuildImplicitValueInitExpr(T); 11148 } 11149 11150 template<typename Derived> 11151 ExprResult 11152 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11153 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11154 if (!TInfo) 11155 return ExprError(); 11156 11157 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11158 if (SubExpr.isInvalid()) 11159 return ExprError(); 11160 11161 if (!getDerived().AlwaysRebuild() && 11162 TInfo == E->getWrittenTypeInfo() && 11163 SubExpr.get() == E->getSubExpr()) 11164 return E; 11165 11166 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11167 TInfo, E->getRParenLoc()); 11168 } 11169 11170 template<typename Derived> 11171 ExprResult 11172 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11173 bool ArgumentChanged = false; 11174 SmallVector<Expr*, 4> Inits; 11175 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11176 &ArgumentChanged)) 11177 return ExprError(); 11178 11179 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11180 Inits, 11181 E->getRParenLoc()); 11182 } 11183 11184 /// Transform an address-of-label expression. 11185 /// 11186 /// By default, the transformation of an address-of-label expression always 11187 /// rebuilds the expression, so that the label identifier can be resolved to 11188 /// the corresponding label statement by semantic analysis. 11189 template<typename Derived> 11190 ExprResult 11191 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11192 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11193 E->getLabel()); 11194 if (!LD) 11195 return ExprError(); 11196 11197 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11198 cast<LabelDecl>(LD)); 11199 } 11200 11201 template<typename Derived> 11202 ExprResult 11203 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11204 SemaRef.ActOnStartStmtExpr(); 11205 StmtResult SubStmt 11206 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11207 if (SubStmt.isInvalid()) { 11208 SemaRef.ActOnStmtExprError(); 11209 return ExprError(); 11210 } 11211 11212 unsigned OldDepth = E->getTemplateDepth(); 11213 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11214 11215 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11216 SubStmt.get() == E->getSubStmt()) { 11217 // Calling this an 'error' is unintuitive, but it does the right thing. 11218 SemaRef.ActOnStmtExprError(); 11219 return SemaRef.MaybeBindToTemporary(E); 11220 } 11221 11222 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11223 E->getRParenLoc(), NewDepth); 11224 } 11225 11226 template<typename Derived> 11227 ExprResult 11228 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11229 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11230 if (Cond.isInvalid()) 11231 return ExprError(); 11232 11233 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11234 if (LHS.isInvalid()) 11235 return ExprError(); 11236 11237 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11238 if (RHS.isInvalid()) 11239 return ExprError(); 11240 11241 if (!getDerived().AlwaysRebuild() && 11242 Cond.get() == E->getCond() && 11243 LHS.get() == E->getLHS() && 11244 RHS.get() == E->getRHS()) 11245 return E; 11246 11247 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11248 Cond.get(), LHS.get(), RHS.get(), 11249 E->getRParenLoc()); 11250 } 11251 11252 template<typename Derived> 11253 ExprResult 11254 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11255 return E; 11256 } 11257 11258 template<typename Derived> 11259 ExprResult 11260 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11261 switch (E->getOperator()) { 11262 case OO_New: 11263 case OO_Delete: 11264 case OO_Array_New: 11265 case OO_Array_Delete: 11266 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11267 11268 case OO_Call: { 11269 // This is a call to an object's operator(). 11270 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11271 11272 // Transform the object itself. 11273 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11274 if (Object.isInvalid()) 11275 return ExprError(); 11276 11277 // FIXME: Poor location information 11278 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11279 static_cast<Expr *>(Object.get())->getEndLoc()); 11280 11281 // Transform the call arguments. 11282 SmallVector<Expr*, 8> Args; 11283 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11284 Args)) 11285 return ExprError(); 11286 11287 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11288 E->getEndLoc()); 11289 } 11290 11291 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11292 case OO_##Name: 11293 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11294 #include "clang/Basic/OperatorKinds.def" 11295 case OO_Subscript: 11296 // Handled below. 11297 break; 11298 11299 case OO_Conditional: 11300 llvm_unreachable("conditional operator is not actually overloadable"); 11301 11302 case OO_None: 11303 case NUM_OVERLOADED_OPERATORS: 11304 llvm_unreachable("not an overloaded operator?"); 11305 } 11306 11307 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11308 if (Callee.isInvalid()) 11309 return ExprError(); 11310 11311 ExprResult First; 11312 if (E->getOperator() == OO_Amp) 11313 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11314 else 11315 First = getDerived().TransformExpr(E->getArg(0)); 11316 if (First.isInvalid()) 11317 return ExprError(); 11318 11319 ExprResult Second; 11320 if (E->getNumArgs() == 2) { 11321 Second = getDerived().TransformExpr(E->getArg(1)); 11322 if (Second.isInvalid()) 11323 return ExprError(); 11324 } 11325 11326 if (!getDerived().AlwaysRebuild() && 11327 Callee.get() == E->getCallee() && 11328 First.get() == E->getArg(0) && 11329 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11330 return SemaRef.MaybeBindToTemporary(E); 11331 11332 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11333 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11334 getSema().CurFPFeatures = 11335 NewOverrides.applyOverrides(getSema().getLangOpts()); 11336 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11337 11338 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11339 E->getOperatorLoc(), 11340 Callee.get(), 11341 First.get(), 11342 Second.get()); 11343 } 11344 11345 template<typename Derived> 11346 ExprResult 11347 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11348 return getDerived().TransformCallExpr(E); 11349 } 11350 11351 template <typename Derived> 11352 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11353 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11354 getSema().CurContext != E->getParentContext(); 11355 11356 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11357 return E; 11358 11359 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11360 E->getEndLoc(), 11361 getSema().CurContext); 11362 } 11363 11364 template<typename Derived> 11365 ExprResult 11366 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11367 // Transform the callee. 11368 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11369 if (Callee.isInvalid()) 11370 return ExprError(); 11371 11372 // Transform exec config. 11373 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11374 if (EC.isInvalid()) 11375 return ExprError(); 11376 11377 // Transform arguments. 11378 bool ArgChanged = false; 11379 SmallVector<Expr*, 8> Args; 11380 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11381 &ArgChanged)) 11382 return ExprError(); 11383 11384 if (!getDerived().AlwaysRebuild() && 11385 Callee.get() == E->getCallee() && 11386 !ArgChanged) 11387 return SemaRef.MaybeBindToTemporary(E); 11388 11389 // FIXME: Wrong source location information for the '('. 11390 SourceLocation FakeLParenLoc 11391 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11392 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11393 Args, 11394 E->getRParenLoc(), EC.get()); 11395 } 11396 11397 template<typename Derived> 11398 ExprResult 11399 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11400 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11401 if (!Type) 11402 return ExprError(); 11403 11404 ExprResult SubExpr 11405 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11406 if (SubExpr.isInvalid()) 11407 return ExprError(); 11408 11409 if (!getDerived().AlwaysRebuild() && 11410 Type == E->getTypeInfoAsWritten() && 11411 SubExpr.get() == E->getSubExpr()) 11412 return E; 11413 return getDerived().RebuildCXXNamedCastExpr( 11414 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11415 Type, E->getAngleBrackets().getEnd(), 11416 // FIXME. this should be '(' location 11417 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11418 } 11419 11420 template<typename Derived> 11421 ExprResult 11422 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11423 TypeSourceInfo *TSI = 11424 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11425 if (!TSI) 11426 return ExprError(); 11427 11428 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11429 if (Sub.isInvalid()) 11430 return ExprError(); 11431 11432 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11433 Sub.get(), BCE->getEndLoc()); 11434 } 11435 11436 template<typename Derived> 11437 ExprResult 11438 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11439 return getDerived().TransformCXXNamedCastExpr(E); 11440 } 11441 11442 template<typename Derived> 11443 ExprResult 11444 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11445 return getDerived().TransformCXXNamedCastExpr(E); 11446 } 11447 11448 template<typename Derived> 11449 ExprResult 11450 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11451 CXXReinterpretCastExpr *E) { 11452 return getDerived().TransformCXXNamedCastExpr(E); 11453 } 11454 11455 template<typename Derived> 11456 ExprResult 11457 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11458 return getDerived().TransformCXXNamedCastExpr(E); 11459 } 11460 11461 template<typename Derived> 11462 ExprResult 11463 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11464 return getDerived().TransformCXXNamedCastExpr(E); 11465 } 11466 11467 template<typename Derived> 11468 ExprResult 11469 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11470 CXXFunctionalCastExpr *E) { 11471 TypeSourceInfo *Type = 11472 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11473 if (!Type) 11474 return ExprError(); 11475 11476 ExprResult SubExpr 11477 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11478 if (SubExpr.isInvalid()) 11479 return ExprError(); 11480 11481 if (!getDerived().AlwaysRebuild() && 11482 Type == E->getTypeInfoAsWritten() && 11483 SubExpr.get() == E->getSubExpr()) 11484 return E; 11485 11486 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11487 E->getLParenLoc(), 11488 SubExpr.get(), 11489 E->getRParenLoc(), 11490 E->isListInitialization()); 11491 } 11492 11493 template<typename Derived> 11494 ExprResult 11495 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11496 if (E->isTypeOperand()) { 11497 TypeSourceInfo *TInfo 11498 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11499 if (!TInfo) 11500 return ExprError(); 11501 11502 if (!getDerived().AlwaysRebuild() && 11503 TInfo == E->getTypeOperandSourceInfo()) 11504 return E; 11505 11506 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11507 TInfo, E->getEndLoc()); 11508 } 11509 11510 // We don't know whether the subexpression is potentially evaluated until 11511 // after we perform semantic analysis. We speculatively assume it is 11512 // unevaluated; it will get fixed later if the subexpression is in fact 11513 // potentially evaluated. 11514 EnterExpressionEvaluationContext Unevaluated( 11515 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11516 Sema::ReuseLambdaContextDecl); 11517 11518 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11519 if (SubExpr.isInvalid()) 11520 return ExprError(); 11521 11522 if (!getDerived().AlwaysRebuild() && 11523 SubExpr.get() == E->getExprOperand()) 11524 return E; 11525 11526 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11527 SubExpr.get(), E->getEndLoc()); 11528 } 11529 11530 template<typename Derived> 11531 ExprResult 11532 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11533 if (E->isTypeOperand()) { 11534 TypeSourceInfo *TInfo 11535 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11536 if (!TInfo) 11537 return ExprError(); 11538 11539 if (!getDerived().AlwaysRebuild() && 11540 TInfo == E->getTypeOperandSourceInfo()) 11541 return E; 11542 11543 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11544 TInfo, E->getEndLoc()); 11545 } 11546 11547 EnterExpressionEvaluationContext Unevaluated( 11548 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11549 11550 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11551 if (SubExpr.isInvalid()) 11552 return ExprError(); 11553 11554 if (!getDerived().AlwaysRebuild() && 11555 SubExpr.get() == E->getExprOperand()) 11556 return E; 11557 11558 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11559 SubExpr.get(), E->getEndLoc()); 11560 } 11561 11562 template<typename Derived> 11563 ExprResult 11564 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11565 return E; 11566 } 11567 11568 template<typename Derived> 11569 ExprResult 11570 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11571 CXXNullPtrLiteralExpr *E) { 11572 return E; 11573 } 11574 11575 template<typename Derived> 11576 ExprResult 11577 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11578 QualType T = getSema().getCurrentThisType(); 11579 11580 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11581 // Mark it referenced in the new context regardless. 11582 // FIXME: this is a bit instantiation-specific. 11583 getSema().MarkThisReferenced(E); 11584 return E; 11585 } 11586 11587 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11588 } 11589 11590 template<typename Derived> 11591 ExprResult 11592 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11593 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11594 if (SubExpr.isInvalid()) 11595 return ExprError(); 11596 11597 if (!getDerived().AlwaysRebuild() && 11598 SubExpr.get() == E->getSubExpr()) 11599 return E; 11600 11601 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11602 E->isThrownVariableInScope()); 11603 } 11604 11605 template<typename Derived> 11606 ExprResult 11607 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11608 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11609 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11610 if (!Param) 11611 return ExprError(); 11612 11613 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11614 E->getUsedContext() == SemaRef.CurContext) 11615 return E; 11616 11617 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11618 } 11619 11620 template<typename Derived> 11621 ExprResult 11622 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11623 FieldDecl *Field = cast_or_null<FieldDecl>( 11624 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11625 if (!Field) 11626 return ExprError(); 11627 11628 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11629 E->getUsedContext() == SemaRef.CurContext) 11630 return E; 11631 11632 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11633 } 11634 11635 template<typename Derived> 11636 ExprResult 11637 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11638 CXXScalarValueInitExpr *E) { 11639 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11640 if (!T) 11641 return ExprError(); 11642 11643 if (!getDerived().AlwaysRebuild() && 11644 T == E->getTypeSourceInfo()) 11645 return E; 11646 11647 return getDerived().RebuildCXXScalarValueInitExpr(T, 11648 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11649 E->getRParenLoc()); 11650 } 11651 11652 template<typename Derived> 11653 ExprResult 11654 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11655 // Transform the type that we're allocating 11656 TypeSourceInfo *AllocTypeInfo = 11657 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11658 if (!AllocTypeInfo) 11659 return ExprError(); 11660 11661 // Transform the size of the array we're allocating (if any). 11662 Optional<Expr *> ArraySize; 11663 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11664 ExprResult NewArraySize; 11665 if (*OldArraySize) { 11666 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11667 if (NewArraySize.isInvalid()) 11668 return ExprError(); 11669 } 11670 ArraySize = NewArraySize.get(); 11671 } 11672 11673 // Transform the placement arguments (if any). 11674 bool ArgumentChanged = false; 11675 SmallVector<Expr*, 8> PlacementArgs; 11676 if (getDerived().TransformExprs(E->getPlacementArgs(), 11677 E->getNumPlacementArgs(), true, 11678 PlacementArgs, &ArgumentChanged)) 11679 return ExprError(); 11680 11681 // Transform the initializer (if any). 11682 Expr *OldInit = E->getInitializer(); 11683 ExprResult NewInit; 11684 if (OldInit) 11685 NewInit = getDerived().TransformInitializer(OldInit, true); 11686 if (NewInit.isInvalid()) 11687 return ExprError(); 11688 11689 // Transform new operator and delete operator. 11690 FunctionDecl *OperatorNew = nullptr; 11691 if (E->getOperatorNew()) { 11692 OperatorNew = cast_or_null<FunctionDecl>( 11693 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11694 if (!OperatorNew) 11695 return ExprError(); 11696 } 11697 11698 FunctionDecl *OperatorDelete = nullptr; 11699 if (E->getOperatorDelete()) { 11700 OperatorDelete = cast_or_null<FunctionDecl>( 11701 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11702 if (!OperatorDelete) 11703 return ExprError(); 11704 } 11705 11706 if (!getDerived().AlwaysRebuild() && 11707 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11708 ArraySize == E->getArraySize() && 11709 NewInit.get() == OldInit && 11710 OperatorNew == E->getOperatorNew() && 11711 OperatorDelete == E->getOperatorDelete() && 11712 !ArgumentChanged) { 11713 // Mark any declarations we need as referenced. 11714 // FIXME: instantiation-specific. 11715 if (OperatorNew) 11716 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11717 if (OperatorDelete) 11718 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11719 11720 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11721 QualType ElementType 11722 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11723 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11724 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11725 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11726 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11727 } 11728 } 11729 } 11730 11731 return E; 11732 } 11733 11734 QualType AllocType = AllocTypeInfo->getType(); 11735 if (!ArraySize) { 11736 // If no array size was specified, but the new expression was 11737 // instantiated with an array type (e.g., "new T" where T is 11738 // instantiated with "int[4]"), extract the outer bound from the 11739 // array type as our array size. We do this with constant and 11740 // dependently-sized array types. 11741 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11742 if (!ArrayT) { 11743 // Do nothing 11744 } else if (const ConstantArrayType *ConsArrayT 11745 = dyn_cast<ConstantArrayType>(ArrayT)) { 11746 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11747 SemaRef.Context.getSizeType(), 11748 /*FIXME:*/ E->getBeginLoc()); 11749 AllocType = ConsArrayT->getElementType(); 11750 } else if (const DependentSizedArrayType *DepArrayT 11751 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11752 if (DepArrayT->getSizeExpr()) { 11753 ArraySize = DepArrayT->getSizeExpr(); 11754 AllocType = DepArrayT->getElementType(); 11755 } 11756 } 11757 } 11758 11759 return getDerived().RebuildCXXNewExpr( 11760 E->getBeginLoc(), E->isGlobalNew(), 11761 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11762 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11763 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11764 } 11765 11766 template<typename Derived> 11767 ExprResult 11768 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11769 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11770 if (Operand.isInvalid()) 11771 return ExprError(); 11772 11773 // Transform the delete operator, if known. 11774 FunctionDecl *OperatorDelete = nullptr; 11775 if (E->getOperatorDelete()) { 11776 OperatorDelete = cast_or_null<FunctionDecl>( 11777 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11778 if (!OperatorDelete) 11779 return ExprError(); 11780 } 11781 11782 if (!getDerived().AlwaysRebuild() && 11783 Operand.get() == E->getArgument() && 11784 OperatorDelete == E->getOperatorDelete()) { 11785 // Mark any declarations we need as referenced. 11786 // FIXME: instantiation-specific. 11787 if (OperatorDelete) 11788 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11789 11790 if (!E->getArgument()->isTypeDependent()) { 11791 QualType Destroyed = SemaRef.Context.getBaseElementType( 11792 E->getDestroyedType()); 11793 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11794 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11795 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11796 SemaRef.LookupDestructor(Record)); 11797 } 11798 } 11799 11800 return E; 11801 } 11802 11803 return getDerived().RebuildCXXDeleteExpr( 11804 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11805 } 11806 11807 template<typename Derived> 11808 ExprResult 11809 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11810 CXXPseudoDestructorExpr *E) { 11811 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11812 if (Base.isInvalid()) 11813 return ExprError(); 11814 11815 ParsedType ObjectTypePtr; 11816 bool MayBePseudoDestructor = false; 11817 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11818 E->getOperatorLoc(), 11819 E->isArrow()? tok::arrow : tok::period, 11820 ObjectTypePtr, 11821 MayBePseudoDestructor); 11822 if (Base.isInvalid()) 11823 return ExprError(); 11824 11825 QualType ObjectType = ObjectTypePtr.get(); 11826 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11827 if (QualifierLoc) { 11828 QualifierLoc 11829 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11830 if (!QualifierLoc) 11831 return ExprError(); 11832 } 11833 CXXScopeSpec SS; 11834 SS.Adopt(QualifierLoc); 11835 11836 PseudoDestructorTypeStorage Destroyed; 11837 if (E->getDestroyedTypeInfo()) { 11838 TypeSourceInfo *DestroyedTypeInfo 11839 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11840 ObjectType, nullptr, SS); 11841 if (!DestroyedTypeInfo) 11842 return ExprError(); 11843 Destroyed = DestroyedTypeInfo; 11844 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11845 // We aren't likely to be able to resolve the identifier down to a type 11846 // now anyway, so just retain the identifier. 11847 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11848 E->getDestroyedTypeLoc()); 11849 } else { 11850 // Look for a destructor known with the given name. 11851 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11852 *E->getDestroyedTypeIdentifier(), 11853 E->getDestroyedTypeLoc(), 11854 /*Scope=*/nullptr, 11855 SS, ObjectTypePtr, 11856 false); 11857 if (!T) 11858 return ExprError(); 11859 11860 Destroyed 11861 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11862 E->getDestroyedTypeLoc()); 11863 } 11864 11865 TypeSourceInfo *ScopeTypeInfo = nullptr; 11866 if (E->getScopeTypeInfo()) { 11867 CXXScopeSpec EmptySS; 11868 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11869 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11870 if (!ScopeTypeInfo) 11871 return ExprError(); 11872 } 11873 11874 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11875 E->getOperatorLoc(), 11876 E->isArrow(), 11877 SS, 11878 ScopeTypeInfo, 11879 E->getColonColonLoc(), 11880 E->getTildeLoc(), 11881 Destroyed); 11882 } 11883 11884 template <typename Derived> 11885 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11886 bool RequiresADL, 11887 LookupResult &R) { 11888 // Transform all the decls. 11889 bool AllEmptyPacks = true; 11890 for (auto *OldD : Old->decls()) { 11891 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11892 if (!InstD) { 11893 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11894 // This can happen because of dependent hiding. 11895 if (isa<UsingShadowDecl>(OldD)) 11896 continue; 11897 else { 11898 R.clear(); 11899 return true; 11900 } 11901 } 11902 11903 // Expand using pack declarations. 11904 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11905 ArrayRef<NamedDecl*> Decls = SingleDecl; 11906 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11907 Decls = UPD->expansions(); 11908 11909 // Expand using declarations. 11910 for (auto *D : Decls) { 11911 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11912 for (auto *SD : UD->shadows()) 11913 R.addDecl(SD); 11914 } else { 11915 R.addDecl(D); 11916 } 11917 } 11918 11919 AllEmptyPacks &= Decls.empty(); 11920 }; 11921 11922 // C++ [temp.res]/8.4.2: 11923 // The program is ill-formed, no diagnostic required, if [...] lookup for 11924 // a name in the template definition found a using-declaration, but the 11925 // lookup in the corresponding scope in the instantiation odoes not find 11926 // any declarations because the using-declaration was a pack expansion and 11927 // the corresponding pack is empty 11928 if (AllEmptyPacks && !RequiresADL) { 11929 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11930 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11931 return true; 11932 } 11933 11934 // Resolve a kind, but don't do any further analysis. If it's 11935 // ambiguous, the callee needs to deal with it. 11936 R.resolveKind(); 11937 return false; 11938 } 11939 11940 template<typename Derived> 11941 ExprResult 11942 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11943 UnresolvedLookupExpr *Old) { 11944 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11945 Sema::LookupOrdinaryName); 11946 11947 // Transform the declaration set. 11948 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11949 return ExprError(); 11950 11951 // Rebuild the nested-name qualifier, if present. 11952 CXXScopeSpec SS; 11953 if (Old->getQualifierLoc()) { 11954 NestedNameSpecifierLoc QualifierLoc 11955 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11956 if (!QualifierLoc) 11957 return ExprError(); 11958 11959 SS.Adopt(QualifierLoc); 11960 } 11961 11962 if (Old->getNamingClass()) { 11963 CXXRecordDecl *NamingClass 11964 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11965 Old->getNameLoc(), 11966 Old->getNamingClass())); 11967 if (!NamingClass) { 11968 R.clear(); 11969 return ExprError(); 11970 } 11971 11972 R.setNamingClass(NamingClass); 11973 } 11974 11975 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11976 11977 // If we have neither explicit template arguments, nor the template keyword, 11978 // it's a normal declaration name or member reference. 11979 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11980 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11981 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11982 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11983 // give a good diagnostic. 11984 if (D && D->isCXXInstanceMember()) { 11985 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11986 /*TemplateArgs=*/nullptr, 11987 /*Scope=*/nullptr); 11988 } 11989 11990 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11991 } 11992 11993 // If we have template arguments, rebuild them, then rebuild the 11994 // templateid expression. 11995 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11996 if (Old->hasExplicitTemplateArgs() && 11997 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11998 Old->getNumTemplateArgs(), 11999 TransArgs)) { 12000 R.clear(); 12001 return ExprError(); 12002 } 12003 12004 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12005 Old->requiresADL(), &TransArgs); 12006 } 12007 12008 template<typename Derived> 12009 ExprResult 12010 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12011 bool ArgChanged = false; 12012 SmallVector<TypeSourceInfo *, 4> Args; 12013 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12014 TypeSourceInfo *From = E->getArg(I); 12015 TypeLoc FromTL = From->getTypeLoc(); 12016 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12017 TypeLocBuilder TLB; 12018 TLB.reserve(FromTL.getFullDataSize()); 12019 QualType To = getDerived().TransformType(TLB, FromTL); 12020 if (To.isNull()) 12021 return ExprError(); 12022 12023 if (To == From->getType()) 12024 Args.push_back(From); 12025 else { 12026 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12027 ArgChanged = true; 12028 } 12029 continue; 12030 } 12031 12032 ArgChanged = true; 12033 12034 // We have a pack expansion. Instantiate it. 12035 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12036 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12037 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12038 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12039 12040 // Determine whether the set of unexpanded parameter packs can and should 12041 // be expanded. 12042 bool Expand = true; 12043 bool RetainExpansion = false; 12044 Optional<unsigned> OrigNumExpansions = 12045 ExpansionTL.getTypePtr()->getNumExpansions(); 12046 Optional<unsigned> NumExpansions = OrigNumExpansions; 12047 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12048 PatternTL.getSourceRange(), 12049 Unexpanded, 12050 Expand, RetainExpansion, 12051 NumExpansions)) 12052 return ExprError(); 12053 12054 if (!Expand) { 12055 // The transform has determined that we should perform a simple 12056 // transformation on the pack expansion, producing another pack 12057 // expansion. 12058 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12059 12060 TypeLocBuilder TLB; 12061 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12062 12063 QualType To = getDerived().TransformType(TLB, PatternTL); 12064 if (To.isNull()) 12065 return ExprError(); 12066 12067 To = getDerived().RebuildPackExpansionType(To, 12068 PatternTL.getSourceRange(), 12069 ExpansionTL.getEllipsisLoc(), 12070 NumExpansions); 12071 if (To.isNull()) 12072 return ExprError(); 12073 12074 PackExpansionTypeLoc ToExpansionTL 12075 = TLB.push<PackExpansionTypeLoc>(To); 12076 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12077 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12078 continue; 12079 } 12080 12081 // Expand the pack expansion by substituting for each argument in the 12082 // pack(s). 12083 for (unsigned I = 0; I != *NumExpansions; ++I) { 12084 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12085 TypeLocBuilder TLB; 12086 TLB.reserve(PatternTL.getFullDataSize()); 12087 QualType To = getDerived().TransformType(TLB, PatternTL); 12088 if (To.isNull()) 12089 return ExprError(); 12090 12091 if (To->containsUnexpandedParameterPack()) { 12092 To = getDerived().RebuildPackExpansionType(To, 12093 PatternTL.getSourceRange(), 12094 ExpansionTL.getEllipsisLoc(), 12095 NumExpansions); 12096 if (To.isNull()) 12097 return ExprError(); 12098 12099 PackExpansionTypeLoc ToExpansionTL 12100 = TLB.push<PackExpansionTypeLoc>(To); 12101 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12102 } 12103 12104 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12105 } 12106 12107 if (!RetainExpansion) 12108 continue; 12109 12110 // If we're supposed to retain a pack expansion, do so by temporarily 12111 // forgetting the partially-substituted parameter pack. 12112 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12113 12114 TypeLocBuilder TLB; 12115 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12116 12117 QualType To = getDerived().TransformType(TLB, PatternTL); 12118 if (To.isNull()) 12119 return ExprError(); 12120 12121 To = getDerived().RebuildPackExpansionType(To, 12122 PatternTL.getSourceRange(), 12123 ExpansionTL.getEllipsisLoc(), 12124 NumExpansions); 12125 if (To.isNull()) 12126 return ExprError(); 12127 12128 PackExpansionTypeLoc ToExpansionTL 12129 = TLB.push<PackExpansionTypeLoc>(To); 12130 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12131 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12132 } 12133 12134 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12135 return E; 12136 12137 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12138 E->getEndLoc()); 12139 } 12140 12141 template<typename Derived> 12142 ExprResult 12143 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12144 ConceptSpecializationExpr *E) { 12145 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12146 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12147 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12148 Old->NumTemplateArgs, TransArgs)) 12149 return ExprError(); 12150 12151 return getDerived().RebuildConceptSpecializationExpr( 12152 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12153 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12154 &TransArgs); 12155 } 12156 12157 template<typename Derived> 12158 ExprResult 12159 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12160 SmallVector<ParmVarDecl*, 4> TransParams; 12161 SmallVector<QualType, 4> TransParamTypes; 12162 Sema::ExtParameterInfoBuilder ExtParamInfos; 12163 12164 // C++2a [expr.prim.req]p2 12165 // Expressions appearing within a requirement-body are unevaluated operands. 12166 EnterExpressionEvaluationContext Ctx( 12167 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12168 12169 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12170 getSema().Context, getSema().CurContext, 12171 E->getBody()->getBeginLoc()); 12172 12173 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12174 12175 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12176 E->getLocalParameters(), 12177 /*ParamTypes=*/nullptr, 12178 /*ParamInfos=*/nullptr, 12179 TransParamTypes, &TransParams, 12180 ExtParamInfos)) 12181 return ExprError(); 12182 12183 for (ParmVarDecl *Param : TransParams) 12184 Param->setDeclContext(Body); 12185 12186 SmallVector<concepts::Requirement *, 4> TransReqs; 12187 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12188 TransReqs)) 12189 return ExprError(); 12190 12191 for (concepts::Requirement *Req : TransReqs) { 12192 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12193 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12194 ER->getReturnTypeRequirement() 12195 .getTypeConstraintTemplateParameterList()->getParam(0) 12196 ->setDeclContext(Body); 12197 } 12198 } 12199 } 12200 12201 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12202 TransParams, TransReqs, 12203 E->getRBraceLoc()); 12204 } 12205 12206 template<typename Derived> 12207 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12208 ArrayRef<concepts::Requirement *> Reqs, 12209 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12210 for (concepts::Requirement *Req : Reqs) { 12211 concepts::Requirement *TransReq = nullptr; 12212 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12213 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12214 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12215 TransReq = getDerived().TransformExprRequirement(ExprReq); 12216 else 12217 TransReq = getDerived().TransformNestedRequirement( 12218 cast<concepts::NestedRequirement>(Req)); 12219 if (!TransReq) 12220 return true; 12221 Transformed.push_back(TransReq); 12222 } 12223 return false; 12224 } 12225 12226 template<typename Derived> 12227 concepts::TypeRequirement * 12228 TreeTransform<Derived>::TransformTypeRequirement( 12229 concepts::TypeRequirement *Req) { 12230 if (Req->isSubstitutionFailure()) { 12231 if (getDerived().AlwaysRebuild()) 12232 return getDerived().RebuildTypeRequirement( 12233 Req->getSubstitutionDiagnostic()); 12234 return Req; 12235 } 12236 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12237 if (!TransType) 12238 return nullptr; 12239 return getDerived().RebuildTypeRequirement(TransType); 12240 } 12241 12242 template<typename Derived> 12243 concepts::ExprRequirement * 12244 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12245 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12246 if (Req->isExprSubstitutionFailure()) 12247 TransExpr = Req->getExprSubstitutionDiagnostic(); 12248 else { 12249 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12250 if (TransExprRes.isInvalid()) 12251 return nullptr; 12252 TransExpr = TransExprRes.get(); 12253 } 12254 12255 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12256 const auto &RetReq = Req->getReturnTypeRequirement(); 12257 if (RetReq.isEmpty()) 12258 TransRetReq.emplace(); 12259 else if (RetReq.isSubstitutionFailure()) 12260 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12261 else if (RetReq.isTypeConstraint()) { 12262 TemplateParameterList *OrigTPL = 12263 RetReq.getTypeConstraintTemplateParameterList(); 12264 TemplateParameterList *TPL = 12265 getDerived().TransformTemplateParameterList(OrigTPL); 12266 if (!TPL) 12267 return nullptr; 12268 TransRetReq.emplace(TPL); 12269 } 12270 assert(TransRetReq.hasValue() && 12271 "All code paths leading here must set TransRetReq"); 12272 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12273 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12274 Req->getNoexceptLoc(), 12275 std::move(*TransRetReq)); 12276 return getDerived().RebuildExprRequirement( 12277 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12278 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12279 } 12280 12281 template<typename Derived> 12282 concepts::NestedRequirement * 12283 TreeTransform<Derived>::TransformNestedRequirement( 12284 concepts::NestedRequirement *Req) { 12285 if (Req->isSubstitutionFailure()) { 12286 if (getDerived().AlwaysRebuild()) 12287 return getDerived().RebuildNestedRequirement( 12288 Req->getSubstitutionDiagnostic()); 12289 return Req; 12290 } 12291 ExprResult TransConstraint = 12292 getDerived().TransformExpr(Req->getConstraintExpr()); 12293 if (TransConstraint.isInvalid()) 12294 return nullptr; 12295 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12296 } 12297 12298 template<typename Derived> 12299 ExprResult 12300 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12301 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12302 if (!T) 12303 return ExprError(); 12304 12305 if (!getDerived().AlwaysRebuild() && 12306 T == E->getQueriedTypeSourceInfo()) 12307 return E; 12308 12309 ExprResult SubExpr; 12310 { 12311 EnterExpressionEvaluationContext Unevaluated( 12312 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12313 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12314 if (SubExpr.isInvalid()) 12315 return ExprError(); 12316 12317 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12318 return E; 12319 } 12320 12321 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12322 SubExpr.get(), E->getEndLoc()); 12323 } 12324 12325 template<typename Derived> 12326 ExprResult 12327 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12328 ExprResult SubExpr; 12329 { 12330 EnterExpressionEvaluationContext Unevaluated( 12331 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12332 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12333 if (SubExpr.isInvalid()) 12334 return ExprError(); 12335 12336 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12337 return E; 12338 } 12339 12340 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12341 SubExpr.get(), E->getEndLoc()); 12342 } 12343 12344 template <typename Derived> 12345 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12346 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12347 TypeSourceInfo **RecoveryTSI) { 12348 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12349 DRE, AddrTaken, RecoveryTSI); 12350 12351 // Propagate both errors and recovered types, which return ExprEmpty. 12352 if (!NewDRE.isUsable()) 12353 return NewDRE; 12354 12355 // We got an expr, wrap it up in parens. 12356 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12357 return PE; 12358 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12359 PE->getRParen()); 12360 } 12361 12362 template <typename Derived> 12363 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12364 DependentScopeDeclRefExpr *E) { 12365 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12366 nullptr); 12367 } 12368 12369 template<typename Derived> 12370 ExprResult 12371 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12372 DependentScopeDeclRefExpr *E, 12373 bool IsAddressOfOperand, 12374 TypeSourceInfo **RecoveryTSI) { 12375 assert(E->getQualifierLoc()); 12376 NestedNameSpecifierLoc QualifierLoc 12377 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12378 if (!QualifierLoc) 12379 return ExprError(); 12380 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12381 12382 // TODO: If this is a conversion-function-id, verify that the 12383 // destination type name (if present) resolves the same way after 12384 // instantiation as it did in the local scope. 12385 12386 DeclarationNameInfo NameInfo 12387 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12388 if (!NameInfo.getName()) 12389 return ExprError(); 12390 12391 if (!E->hasExplicitTemplateArgs()) { 12392 if (!getDerived().AlwaysRebuild() && 12393 QualifierLoc == E->getQualifierLoc() && 12394 // Note: it is sufficient to compare the Name component of NameInfo: 12395 // if name has not changed, DNLoc has not changed either. 12396 NameInfo.getName() == E->getDeclName()) 12397 return E; 12398 12399 return getDerived().RebuildDependentScopeDeclRefExpr( 12400 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12401 IsAddressOfOperand, RecoveryTSI); 12402 } 12403 12404 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12405 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12406 E->getNumTemplateArgs(), 12407 TransArgs)) 12408 return ExprError(); 12409 12410 return getDerived().RebuildDependentScopeDeclRefExpr( 12411 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12412 RecoveryTSI); 12413 } 12414 12415 template<typename Derived> 12416 ExprResult 12417 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12418 // CXXConstructExprs other than for list-initialization and 12419 // CXXTemporaryObjectExpr are always implicit, so when we have 12420 // a 1-argument construction we just transform that argument. 12421 if (getDerived().AllowSkippingCXXConstructExpr() && 12422 ((E->getNumArgs() == 1 || 12423 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12424 (!getDerived().DropCallArgument(E->getArg(0))) && 12425 !E->isListInitialization())) 12426 return getDerived().TransformInitializer(E->getArg(0), 12427 /*DirectInit*/ false); 12428 12429 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12430 12431 QualType T = getDerived().TransformType(E->getType()); 12432 if (T.isNull()) 12433 return ExprError(); 12434 12435 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12436 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12437 if (!Constructor) 12438 return ExprError(); 12439 12440 bool ArgumentChanged = false; 12441 SmallVector<Expr*, 8> Args; 12442 { 12443 EnterExpressionEvaluationContext Context( 12444 getSema(), EnterExpressionEvaluationContext::InitList, 12445 E->isListInitialization()); 12446 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12447 &ArgumentChanged)) 12448 return ExprError(); 12449 } 12450 12451 if (!getDerived().AlwaysRebuild() && 12452 T == E->getType() && 12453 Constructor == E->getConstructor() && 12454 !ArgumentChanged) { 12455 // Mark the constructor as referenced. 12456 // FIXME: Instantiation-specific 12457 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12458 return E; 12459 } 12460 12461 return getDerived().RebuildCXXConstructExpr( 12462 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12463 E->hadMultipleCandidates(), E->isListInitialization(), 12464 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12465 E->getConstructionKind(), E->getParenOrBraceRange()); 12466 } 12467 12468 template<typename Derived> 12469 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12470 CXXInheritedCtorInitExpr *E) { 12471 QualType T = getDerived().TransformType(E->getType()); 12472 if (T.isNull()) 12473 return ExprError(); 12474 12475 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12476 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12477 if (!Constructor) 12478 return ExprError(); 12479 12480 if (!getDerived().AlwaysRebuild() && 12481 T == E->getType() && 12482 Constructor == E->getConstructor()) { 12483 // Mark the constructor as referenced. 12484 // FIXME: Instantiation-specific 12485 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12486 return E; 12487 } 12488 12489 return getDerived().RebuildCXXInheritedCtorInitExpr( 12490 T, E->getLocation(), Constructor, 12491 E->constructsVBase(), E->inheritedFromVBase()); 12492 } 12493 12494 /// Transform a C++ temporary-binding expression. 12495 /// 12496 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12497 /// transform the subexpression and return that. 12498 template<typename Derived> 12499 ExprResult 12500 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12501 return getDerived().TransformExpr(E->getSubExpr()); 12502 } 12503 12504 /// Transform a C++ expression that contains cleanups that should 12505 /// be run after the expression is evaluated. 12506 /// 12507 /// Since ExprWithCleanups nodes are implicitly generated, we 12508 /// just transform the subexpression and return that. 12509 template<typename Derived> 12510 ExprResult 12511 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12512 return getDerived().TransformExpr(E->getSubExpr()); 12513 } 12514 12515 template<typename Derived> 12516 ExprResult 12517 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12518 CXXTemporaryObjectExpr *E) { 12519 TypeSourceInfo *T = 12520 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12521 if (!T) 12522 return ExprError(); 12523 12524 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12525 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12526 if (!Constructor) 12527 return ExprError(); 12528 12529 bool ArgumentChanged = false; 12530 SmallVector<Expr*, 8> Args; 12531 Args.reserve(E->getNumArgs()); 12532 { 12533 EnterExpressionEvaluationContext Context( 12534 getSema(), EnterExpressionEvaluationContext::InitList, 12535 E->isListInitialization()); 12536 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12537 &ArgumentChanged)) 12538 return ExprError(); 12539 } 12540 12541 if (!getDerived().AlwaysRebuild() && 12542 T == E->getTypeSourceInfo() && 12543 Constructor == E->getConstructor() && 12544 !ArgumentChanged) { 12545 // FIXME: Instantiation-specific 12546 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12547 return SemaRef.MaybeBindToTemporary(E); 12548 } 12549 12550 // FIXME: We should just pass E->isListInitialization(), but we're not 12551 // prepared to handle list-initialization without a child InitListExpr. 12552 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12553 return getDerived().RebuildCXXTemporaryObjectExpr( 12554 T, LParenLoc, Args, E->getEndLoc(), 12555 /*ListInitialization=*/LParenLoc.isInvalid()); 12556 } 12557 12558 template<typename Derived> 12559 ExprResult 12560 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12561 // Transform any init-capture expressions before entering the scope of the 12562 // lambda body, because they are not semantically within that scope. 12563 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12564 struct TransformedInitCapture { 12565 // The location of the ... if the result is retaining a pack expansion. 12566 SourceLocation EllipsisLoc; 12567 // Zero or more expansions of the init-capture. 12568 SmallVector<InitCaptureInfoTy, 4> Expansions; 12569 }; 12570 SmallVector<TransformedInitCapture, 4> InitCaptures; 12571 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12572 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12573 CEnd = E->capture_end(); 12574 C != CEnd; ++C) { 12575 if (!E->isInitCapture(C)) 12576 continue; 12577 12578 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12579 VarDecl *OldVD = C->getCapturedVar(); 12580 12581 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12582 Optional<unsigned> NumExpansions) { 12583 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12584 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12585 12586 if (NewExprInitResult.isInvalid()) { 12587 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12588 return; 12589 } 12590 Expr *NewExprInit = NewExprInitResult.get(); 12591 12592 QualType NewInitCaptureType = 12593 getSema().buildLambdaInitCaptureInitialization( 12594 C->getLocation(), OldVD->getType()->isReferenceType(), 12595 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12596 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12597 NewExprInit); 12598 Result.Expansions.push_back( 12599 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12600 }; 12601 12602 // If this is an init-capture pack, consider expanding the pack now. 12603 if (OldVD->isParameterPack()) { 12604 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12605 ->getTypeLoc() 12606 .castAs<PackExpansionTypeLoc>(); 12607 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12608 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12609 12610 // Determine whether the set of unexpanded parameter packs can and should 12611 // be expanded. 12612 bool Expand = true; 12613 bool RetainExpansion = false; 12614 Optional<unsigned> OrigNumExpansions = 12615 ExpansionTL.getTypePtr()->getNumExpansions(); 12616 Optional<unsigned> NumExpansions = OrigNumExpansions; 12617 if (getDerived().TryExpandParameterPacks( 12618 ExpansionTL.getEllipsisLoc(), 12619 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12620 RetainExpansion, NumExpansions)) 12621 return ExprError(); 12622 if (Expand) { 12623 for (unsigned I = 0; I != *NumExpansions; ++I) { 12624 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12625 SubstInitCapture(SourceLocation(), None); 12626 } 12627 } 12628 if (!Expand || RetainExpansion) { 12629 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12630 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12631 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12632 } 12633 } else { 12634 SubstInitCapture(SourceLocation(), None); 12635 } 12636 } 12637 12638 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12639 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12640 12641 // Transform the template parameters, and add them to the current 12642 // instantiation scope. The null case is handled correctly. 12643 auto TPL = getDerived().TransformTemplateParameterList( 12644 E->getTemplateParameterList()); 12645 LSI->GLTemplateParameterList = TPL; 12646 12647 // Transform the type of the original lambda's call operator. 12648 // The transformation MUST be done in the CurrentInstantiationScope since 12649 // it introduces a mapping of the original to the newly created 12650 // transformed parameters. 12651 TypeSourceInfo *NewCallOpTSI = nullptr; 12652 { 12653 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12654 FunctionProtoTypeLoc OldCallOpFPTL = 12655 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12656 12657 TypeLocBuilder NewCallOpTLBuilder; 12658 SmallVector<QualType, 4> ExceptionStorage; 12659 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12660 QualType NewCallOpType = TransformFunctionProtoType( 12661 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12662 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12663 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12664 ExceptionStorage, Changed); 12665 }); 12666 if (NewCallOpType.isNull()) 12667 return ExprError(); 12668 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12669 NewCallOpType); 12670 } 12671 12672 // Transform the trailing requires clause 12673 ExprResult NewTrailingRequiresClause; 12674 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12675 // FIXME: Concepts: Substitution into requires clause should only happen 12676 // when checking satisfaction. 12677 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12678 12679 // Create the local class that will describe the lambda. 12680 // FIXME: KnownDependent below is wrong when substituting inside a templated 12681 // context that isn't a DeclContext (such as a variable template). 12682 CXXRecordDecl *OldClass = E->getLambdaClass(); 12683 CXXRecordDecl *Class 12684 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12685 NewCallOpTSI, 12686 /*KnownDependent=*/false, 12687 E->getCaptureDefault()); 12688 getDerived().transformedLocalDecl(OldClass, {Class}); 12689 12690 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12691 if (getDerived().ReplacingOriginal()) 12692 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12693 OldClass->getLambdaManglingNumber(), 12694 OldClass->getDeviceLambdaManglingNumber(), 12695 OldClass->getLambdaContextDecl()); 12696 12697 // Build the call operator. 12698 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12699 Class, E->getIntroducerRange(), NewCallOpTSI, 12700 E->getCallOperator()->getEndLoc(), 12701 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12702 E->getCallOperator()->getConstexprKind(), 12703 NewTrailingRequiresClause.get()); 12704 12705 LSI->CallOperator = NewCallOperator; 12706 12707 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12708 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12709 12710 // Number the lambda for linkage purposes if necessary. 12711 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12712 12713 // Introduce the context of the call operator. 12714 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12715 /*NewThisContext*/false); 12716 12717 // Enter the scope of the lambda. 12718 getSema().buildLambdaScope(LSI, NewCallOperator, 12719 E->getIntroducerRange(), 12720 E->getCaptureDefault(), 12721 E->getCaptureDefaultLoc(), 12722 E->hasExplicitParameters(), 12723 E->hasExplicitResultType(), 12724 E->isMutable()); 12725 12726 bool Invalid = false; 12727 12728 // Transform captures. 12729 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12730 CEnd = E->capture_end(); 12731 C != CEnd; ++C) { 12732 // When we hit the first implicit capture, tell Sema that we've finished 12733 // the list of explicit captures. 12734 if (C->isImplicit()) 12735 break; 12736 12737 // Capturing 'this' is trivial. 12738 if (C->capturesThis()) { 12739 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12740 /*BuildAndDiagnose*/ true, nullptr, 12741 C->getCaptureKind() == LCK_StarThis); 12742 continue; 12743 } 12744 // Captured expression will be recaptured during captured variables 12745 // rebuilding. 12746 if (C->capturesVLAType()) 12747 continue; 12748 12749 // Rebuild init-captures, including the implied field declaration. 12750 if (E->isInitCapture(C)) { 12751 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12752 12753 VarDecl *OldVD = C->getCapturedVar(); 12754 llvm::SmallVector<Decl*, 4> NewVDs; 12755 12756 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12757 ExprResult Init = Info.first; 12758 QualType InitQualType = Info.second; 12759 if (Init.isInvalid() || InitQualType.isNull()) { 12760 Invalid = true; 12761 break; 12762 } 12763 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12764 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12765 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12766 if (!NewVD) { 12767 Invalid = true; 12768 break; 12769 } 12770 NewVDs.push_back(NewVD); 12771 getSema().addInitCapture(LSI, NewVD); 12772 } 12773 12774 if (Invalid) 12775 break; 12776 12777 getDerived().transformedLocalDecl(OldVD, NewVDs); 12778 continue; 12779 } 12780 12781 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12782 12783 // Determine the capture kind for Sema. 12784 Sema::TryCaptureKind Kind 12785 = C->isImplicit()? Sema::TryCapture_Implicit 12786 : C->getCaptureKind() == LCK_ByCopy 12787 ? Sema::TryCapture_ExplicitByVal 12788 : Sema::TryCapture_ExplicitByRef; 12789 SourceLocation EllipsisLoc; 12790 if (C->isPackExpansion()) { 12791 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12792 bool ShouldExpand = false; 12793 bool RetainExpansion = false; 12794 Optional<unsigned> NumExpansions; 12795 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12796 C->getLocation(), 12797 Unexpanded, 12798 ShouldExpand, RetainExpansion, 12799 NumExpansions)) { 12800 Invalid = true; 12801 continue; 12802 } 12803 12804 if (ShouldExpand) { 12805 // The transform has determined that we should perform an expansion; 12806 // transform and capture each of the arguments. 12807 // expansion of the pattern. Do so. 12808 VarDecl *Pack = C->getCapturedVar(); 12809 for (unsigned I = 0; I != *NumExpansions; ++I) { 12810 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12811 VarDecl *CapturedVar 12812 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12813 Pack)); 12814 if (!CapturedVar) { 12815 Invalid = true; 12816 continue; 12817 } 12818 12819 // Capture the transformed variable. 12820 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12821 } 12822 12823 // FIXME: Retain a pack expansion if RetainExpansion is true. 12824 12825 continue; 12826 } 12827 12828 EllipsisLoc = C->getEllipsisLoc(); 12829 } 12830 12831 // Transform the captured variable. 12832 VarDecl *CapturedVar 12833 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12834 C->getCapturedVar())); 12835 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12836 Invalid = true; 12837 continue; 12838 } 12839 12840 // Capture the transformed variable. 12841 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12842 EllipsisLoc); 12843 } 12844 getSema().finishLambdaExplicitCaptures(LSI); 12845 12846 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12847 // evaluation context even if we're not transforming the function body. 12848 getSema().PushExpressionEvaluationContext( 12849 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12850 12851 // Instantiate the body of the lambda expression. 12852 StmtResult Body = 12853 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12854 12855 // ActOnLambda* will pop the function scope for us. 12856 FuncScopeCleanup.disable(); 12857 12858 if (Body.isInvalid()) { 12859 SavedContext.pop(); 12860 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12861 /*IsInstantiation=*/true); 12862 return ExprError(); 12863 } 12864 12865 // Copy the LSI before ActOnFinishFunctionBody removes it. 12866 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12867 // the call operator. 12868 auto LSICopy = *LSI; 12869 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12870 /*IsInstantiation*/ true); 12871 SavedContext.pop(); 12872 12873 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12874 &LSICopy); 12875 } 12876 12877 template<typename Derived> 12878 StmtResult 12879 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12880 return TransformStmt(S); 12881 } 12882 12883 template<typename Derived> 12884 StmtResult 12885 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12886 // Transform captures. 12887 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12888 CEnd = E->capture_end(); 12889 C != CEnd; ++C) { 12890 // When we hit the first implicit capture, tell Sema that we've finished 12891 // the list of explicit captures. 12892 if (!C->isImplicit()) 12893 continue; 12894 12895 // Capturing 'this' is trivial. 12896 if (C->capturesThis()) { 12897 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12898 /*BuildAndDiagnose*/ true, nullptr, 12899 C->getCaptureKind() == LCK_StarThis); 12900 continue; 12901 } 12902 // Captured expression will be recaptured during captured variables 12903 // rebuilding. 12904 if (C->capturesVLAType()) 12905 continue; 12906 12907 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12908 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12909 12910 // Transform the captured variable. 12911 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12912 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12913 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12914 return StmtError(); 12915 12916 // Capture the transformed variable. 12917 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12918 } 12919 12920 return S; 12921 } 12922 12923 template<typename Derived> 12924 ExprResult 12925 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12926 CXXUnresolvedConstructExpr *E) { 12927 TypeSourceInfo *T = 12928 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12929 if (!T) 12930 return ExprError(); 12931 12932 bool ArgumentChanged = false; 12933 SmallVector<Expr*, 8> Args; 12934 Args.reserve(E->getNumArgs()); 12935 { 12936 EnterExpressionEvaluationContext Context( 12937 getSema(), EnterExpressionEvaluationContext::InitList, 12938 E->isListInitialization()); 12939 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 12940 &ArgumentChanged)) 12941 return ExprError(); 12942 } 12943 12944 if (!getDerived().AlwaysRebuild() && 12945 T == E->getTypeSourceInfo() && 12946 !ArgumentChanged) 12947 return E; 12948 12949 // FIXME: we're faking the locations of the commas 12950 return getDerived().RebuildCXXUnresolvedConstructExpr( 12951 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12952 } 12953 12954 template<typename Derived> 12955 ExprResult 12956 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12957 CXXDependentScopeMemberExpr *E) { 12958 // Transform the base of the expression. 12959 ExprResult Base((Expr*) nullptr); 12960 Expr *OldBase; 12961 QualType BaseType; 12962 QualType ObjectType; 12963 if (!E->isImplicitAccess()) { 12964 OldBase = E->getBase(); 12965 Base = getDerived().TransformExpr(OldBase); 12966 if (Base.isInvalid()) 12967 return ExprError(); 12968 12969 // Start the member reference and compute the object's type. 12970 ParsedType ObjectTy; 12971 bool MayBePseudoDestructor = false; 12972 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12973 E->getOperatorLoc(), 12974 E->isArrow()? tok::arrow : tok::period, 12975 ObjectTy, 12976 MayBePseudoDestructor); 12977 if (Base.isInvalid()) 12978 return ExprError(); 12979 12980 ObjectType = ObjectTy.get(); 12981 BaseType = ((Expr*) Base.get())->getType(); 12982 } else { 12983 OldBase = nullptr; 12984 BaseType = getDerived().TransformType(E->getBaseType()); 12985 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12986 } 12987 12988 // Transform the first part of the nested-name-specifier that qualifies 12989 // the member name. 12990 NamedDecl *FirstQualifierInScope 12991 = getDerived().TransformFirstQualifierInScope( 12992 E->getFirstQualifierFoundInScope(), 12993 E->getQualifierLoc().getBeginLoc()); 12994 12995 NestedNameSpecifierLoc QualifierLoc; 12996 if (E->getQualifier()) { 12997 QualifierLoc 12998 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12999 ObjectType, 13000 FirstQualifierInScope); 13001 if (!QualifierLoc) 13002 return ExprError(); 13003 } 13004 13005 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13006 13007 // TODO: If this is a conversion-function-id, verify that the 13008 // destination type name (if present) resolves the same way after 13009 // instantiation as it did in the local scope. 13010 13011 DeclarationNameInfo NameInfo 13012 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13013 if (!NameInfo.getName()) 13014 return ExprError(); 13015 13016 if (!E->hasExplicitTemplateArgs()) { 13017 // This is a reference to a member without an explicitly-specified 13018 // template argument list. Optimize for this common case. 13019 if (!getDerived().AlwaysRebuild() && 13020 Base.get() == OldBase && 13021 BaseType == E->getBaseType() && 13022 QualifierLoc == E->getQualifierLoc() && 13023 NameInfo.getName() == E->getMember() && 13024 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13025 return E; 13026 13027 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13028 BaseType, 13029 E->isArrow(), 13030 E->getOperatorLoc(), 13031 QualifierLoc, 13032 TemplateKWLoc, 13033 FirstQualifierInScope, 13034 NameInfo, 13035 /*TemplateArgs*/nullptr); 13036 } 13037 13038 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13039 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13040 E->getNumTemplateArgs(), 13041 TransArgs)) 13042 return ExprError(); 13043 13044 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13045 BaseType, 13046 E->isArrow(), 13047 E->getOperatorLoc(), 13048 QualifierLoc, 13049 TemplateKWLoc, 13050 FirstQualifierInScope, 13051 NameInfo, 13052 &TransArgs); 13053 } 13054 13055 template<typename Derived> 13056 ExprResult 13057 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 13058 // Transform the base of the expression. 13059 ExprResult Base((Expr*) nullptr); 13060 QualType BaseType; 13061 if (!Old->isImplicitAccess()) { 13062 Base = getDerived().TransformExpr(Old->getBase()); 13063 if (Base.isInvalid()) 13064 return ExprError(); 13065 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 13066 Old->isArrow()); 13067 if (Base.isInvalid()) 13068 return ExprError(); 13069 BaseType = Base.get()->getType(); 13070 } else { 13071 BaseType = getDerived().TransformType(Old->getBaseType()); 13072 } 13073 13074 NestedNameSpecifierLoc QualifierLoc; 13075 if (Old->getQualifierLoc()) { 13076 QualifierLoc 13077 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13078 if (!QualifierLoc) 13079 return ExprError(); 13080 } 13081 13082 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13083 13084 LookupResult R(SemaRef, Old->getMemberNameInfo(), 13085 Sema::LookupOrdinaryName); 13086 13087 // Transform the declaration set. 13088 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 13089 return ExprError(); 13090 13091 // Determine the naming class. 13092 if (Old->getNamingClass()) { 13093 CXXRecordDecl *NamingClass 13094 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 13095 Old->getMemberLoc(), 13096 Old->getNamingClass())); 13097 if (!NamingClass) 13098 return ExprError(); 13099 13100 R.setNamingClass(NamingClass); 13101 } 13102 13103 TemplateArgumentListInfo TransArgs; 13104 if (Old->hasExplicitTemplateArgs()) { 13105 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13106 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13107 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 13108 Old->getNumTemplateArgs(), 13109 TransArgs)) 13110 return ExprError(); 13111 } 13112 13113 // FIXME: to do this check properly, we will need to preserve the 13114 // first-qualifier-in-scope here, just in case we had a dependent 13115 // base (and therefore couldn't do the check) and a 13116 // nested-name-qualifier (and therefore could do the lookup). 13117 NamedDecl *FirstQualifierInScope = nullptr; 13118 13119 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 13120 BaseType, 13121 Old->getOperatorLoc(), 13122 Old->isArrow(), 13123 QualifierLoc, 13124 TemplateKWLoc, 13125 FirstQualifierInScope, 13126 R, 13127 (Old->hasExplicitTemplateArgs() 13128 ? &TransArgs : nullptr)); 13129 } 13130 13131 template<typename Derived> 13132 ExprResult 13133 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13134 EnterExpressionEvaluationContext Unevaluated( 13135 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13136 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13137 if (SubExpr.isInvalid()) 13138 return ExprError(); 13139 13140 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13141 return E; 13142 13143 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13144 } 13145 13146 template<typename Derived> 13147 ExprResult 13148 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13149 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13150 if (Pattern.isInvalid()) 13151 return ExprError(); 13152 13153 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13154 return E; 13155 13156 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13157 E->getNumExpansions()); 13158 } 13159 13160 template<typename Derived> 13161 ExprResult 13162 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13163 // If E is not value-dependent, then nothing will change when we transform it. 13164 // Note: This is an instantiation-centric view. 13165 if (!E->isValueDependent()) 13166 return E; 13167 13168 EnterExpressionEvaluationContext Unevaluated( 13169 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13170 13171 ArrayRef<TemplateArgument> PackArgs; 13172 TemplateArgument ArgStorage; 13173 13174 // Find the argument list to transform. 13175 if (E->isPartiallySubstituted()) { 13176 PackArgs = E->getPartialArguments(); 13177 } else if (E->isValueDependent()) { 13178 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13179 bool ShouldExpand = false; 13180 bool RetainExpansion = false; 13181 Optional<unsigned> NumExpansions; 13182 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13183 Unexpanded, 13184 ShouldExpand, RetainExpansion, 13185 NumExpansions)) 13186 return ExprError(); 13187 13188 // If we need to expand the pack, build a template argument from it and 13189 // expand that. 13190 if (ShouldExpand) { 13191 auto *Pack = E->getPack(); 13192 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13193 ArgStorage = getSema().Context.getPackExpansionType( 13194 getSema().Context.getTypeDeclType(TTPD), None); 13195 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13196 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13197 } else { 13198 auto *VD = cast<ValueDecl>(Pack); 13199 ExprResult DRE = getSema().BuildDeclRefExpr( 13200 VD, VD->getType().getNonLValueExprType(getSema().Context), 13201 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 13202 E->getPackLoc()); 13203 if (DRE.isInvalid()) 13204 return ExprError(); 13205 ArgStorage = new (getSema().Context) PackExpansionExpr( 13206 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13207 } 13208 PackArgs = ArgStorage; 13209 } 13210 } 13211 13212 // If we're not expanding the pack, just transform the decl. 13213 if (!PackArgs.size()) { 13214 auto *Pack = cast_or_null<NamedDecl>( 13215 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13216 if (!Pack) 13217 return ExprError(); 13218 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13219 E->getPackLoc(), 13220 E->getRParenLoc(), None, None); 13221 } 13222 13223 // Try to compute the result without performing a partial substitution. 13224 Optional<unsigned> Result = 0; 13225 for (const TemplateArgument &Arg : PackArgs) { 13226 if (!Arg.isPackExpansion()) { 13227 Result = *Result + 1; 13228 continue; 13229 } 13230 13231 TemplateArgumentLoc ArgLoc; 13232 InventTemplateArgumentLoc(Arg, ArgLoc); 13233 13234 // Find the pattern of the pack expansion. 13235 SourceLocation Ellipsis; 13236 Optional<unsigned> OrigNumExpansions; 13237 TemplateArgumentLoc Pattern = 13238 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13239 OrigNumExpansions); 13240 13241 // Substitute under the pack expansion. Do not expand the pack (yet). 13242 TemplateArgumentLoc OutPattern; 13243 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13244 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13245 /*Uneval*/ true)) 13246 return true; 13247 13248 // See if we can determine the number of arguments from the result. 13249 Optional<unsigned> NumExpansions = 13250 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13251 if (!NumExpansions) { 13252 // No: we must be in an alias template expansion, and we're going to need 13253 // to actually expand the packs. 13254 Result = None; 13255 break; 13256 } 13257 13258 Result = *Result + *NumExpansions; 13259 } 13260 13261 // Common case: we could determine the number of expansions without 13262 // substituting. 13263 if (Result) 13264 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13265 E->getPackLoc(), 13266 E->getRParenLoc(), *Result, None); 13267 13268 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13269 E->getPackLoc()); 13270 { 13271 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13272 typedef TemplateArgumentLocInventIterator< 13273 Derived, const TemplateArgument*> PackLocIterator; 13274 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13275 PackLocIterator(*this, PackArgs.end()), 13276 TransformedPackArgs, /*Uneval*/true)) 13277 return ExprError(); 13278 } 13279 13280 // Check whether we managed to fully-expand the pack. 13281 // FIXME: Is it possible for us to do so and not hit the early exit path? 13282 SmallVector<TemplateArgument, 8> Args; 13283 bool PartialSubstitution = false; 13284 for (auto &Loc : TransformedPackArgs.arguments()) { 13285 Args.push_back(Loc.getArgument()); 13286 if (Loc.getArgument().isPackExpansion()) 13287 PartialSubstitution = true; 13288 } 13289 13290 if (PartialSubstitution) 13291 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13292 E->getPackLoc(), 13293 E->getRParenLoc(), None, Args); 13294 13295 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13296 E->getPackLoc(), E->getRParenLoc(), 13297 Args.size(), None); 13298 } 13299 13300 template<typename Derived> 13301 ExprResult 13302 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13303 SubstNonTypeTemplateParmPackExpr *E) { 13304 // Default behavior is to do nothing with this transformation. 13305 return E; 13306 } 13307 13308 template<typename Derived> 13309 ExprResult 13310 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13311 SubstNonTypeTemplateParmExpr *E) { 13312 // Default behavior is to do nothing with this transformation. 13313 return E; 13314 } 13315 13316 template<typename Derived> 13317 ExprResult 13318 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13319 // Default behavior is to do nothing with this transformation. 13320 return E; 13321 } 13322 13323 template<typename Derived> 13324 ExprResult 13325 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13326 MaterializeTemporaryExpr *E) { 13327 return getDerived().TransformExpr(E->getSubExpr()); 13328 } 13329 13330 template<typename Derived> 13331 ExprResult 13332 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13333 UnresolvedLookupExpr *Callee = nullptr; 13334 if (Expr *OldCallee = E->getCallee()) { 13335 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13336 if (CalleeResult.isInvalid()) 13337 return ExprError(); 13338 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13339 } 13340 13341 Expr *Pattern = E->getPattern(); 13342 13343 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13344 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13345 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13346 13347 // Determine whether the set of unexpanded parameter packs can and should 13348 // be expanded. 13349 bool Expand = true; 13350 bool RetainExpansion = false; 13351 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13352 NumExpansions = OrigNumExpansions; 13353 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13354 Pattern->getSourceRange(), 13355 Unexpanded, 13356 Expand, RetainExpansion, 13357 NumExpansions)) 13358 return true; 13359 13360 if (!Expand) { 13361 // Do not expand any packs here, just transform and rebuild a fold 13362 // expression. 13363 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13364 13365 ExprResult LHS = 13366 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13367 if (LHS.isInvalid()) 13368 return true; 13369 13370 ExprResult RHS = 13371 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13372 if (RHS.isInvalid()) 13373 return true; 13374 13375 if (!getDerived().AlwaysRebuild() && 13376 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13377 return E; 13378 13379 return getDerived().RebuildCXXFoldExpr( 13380 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13381 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13382 } 13383 13384 // Formally a fold expression expands to nested parenthesized expressions. 13385 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13386 // them. 13387 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13388 SemaRef.Diag(E->getEllipsisLoc(), 13389 clang::diag::err_fold_expression_limit_exceeded) 13390 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13391 << E->getSourceRange(); 13392 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13393 return ExprError(); 13394 } 13395 13396 // The transform has determined that we should perform an elementwise 13397 // expansion of the pattern. Do so. 13398 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13399 if (Result.isInvalid()) 13400 return true; 13401 bool LeftFold = E->isLeftFold(); 13402 13403 // If we're retaining an expansion for a right fold, it is the innermost 13404 // component and takes the init (if any). 13405 if (!LeftFold && RetainExpansion) { 13406 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13407 13408 ExprResult Out = getDerived().TransformExpr(Pattern); 13409 if (Out.isInvalid()) 13410 return true; 13411 13412 Result = getDerived().RebuildCXXFoldExpr( 13413 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13414 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13415 if (Result.isInvalid()) 13416 return true; 13417 } 13418 13419 for (unsigned I = 0; I != *NumExpansions; ++I) { 13420 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13421 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13422 ExprResult Out = getDerived().TransformExpr(Pattern); 13423 if (Out.isInvalid()) 13424 return true; 13425 13426 if (Out.get()->containsUnexpandedParameterPack()) { 13427 // We still have a pack; retain a pack expansion for this slice. 13428 Result = getDerived().RebuildCXXFoldExpr( 13429 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13430 E->getOperator(), E->getEllipsisLoc(), 13431 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13432 OrigNumExpansions); 13433 } else if (Result.isUsable()) { 13434 // We've got down to a single element; build a binary operator. 13435 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13436 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13437 if (Callee) 13438 Result = getDerived().RebuildCXXOperatorCallExpr( 13439 BinaryOperator::getOverloadedOperator(E->getOperator()), 13440 E->getEllipsisLoc(), Callee, LHS, RHS); 13441 else 13442 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13443 E->getOperator(), LHS, RHS); 13444 } else 13445 Result = Out; 13446 13447 if (Result.isInvalid()) 13448 return true; 13449 } 13450 13451 // If we're retaining an expansion for a left fold, it is the outermost 13452 // component and takes the complete expansion so far as its init (if any). 13453 if (LeftFold && RetainExpansion) { 13454 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13455 13456 ExprResult Out = getDerived().TransformExpr(Pattern); 13457 if (Out.isInvalid()) 13458 return true; 13459 13460 Result = getDerived().RebuildCXXFoldExpr( 13461 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13462 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13463 if (Result.isInvalid()) 13464 return true; 13465 } 13466 13467 // If we had no init and an empty pack, and we're not retaining an expansion, 13468 // then produce a fallback value or error. 13469 if (Result.isUnset()) 13470 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13471 E->getOperator()); 13472 13473 return Result; 13474 } 13475 13476 template<typename Derived> 13477 ExprResult 13478 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13479 CXXStdInitializerListExpr *E) { 13480 return getDerived().TransformExpr(E->getSubExpr()); 13481 } 13482 13483 template<typename Derived> 13484 ExprResult 13485 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13486 return SemaRef.MaybeBindToTemporary(E); 13487 } 13488 13489 template<typename Derived> 13490 ExprResult 13491 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13492 return E; 13493 } 13494 13495 template<typename Derived> 13496 ExprResult 13497 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13498 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13499 if (SubExpr.isInvalid()) 13500 return ExprError(); 13501 13502 if (!getDerived().AlwaysRebuild() && 13503 SubExpr.get() == E->getSubExpr()) 13504 return E; 13505 13506 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13507 } 13508 13509 template<typename Derived> 13510 ExprResult 13511 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13512 // Transform each of the elements. 13513 SmallVector<Expr *, 8> Elements; 13514 bool ArgChanged = false; 13515 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13516 /*IsCall=*/false, Elements, &ArgChanged)) 13517 return ExprError(); 13518 13519 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13520 return SemaRef.MaybeBindToTemporary(E); 13521 13522 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13523 Elements.data(), 13524 Elements.size()); 13525 } 13526 13527 template<typename Derived> 13528 ExprResult 13529 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13530 ObjCDictionaryLiteral *E) { 13531 // Transform each of the elements. 13532 SmallVector<ObjCDictionaryElement, 8> Elements; 13533 bool ArgChanged = false; 13534 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13535 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13536 13537 if (OrigElement.isPackExpansion()) { 13538 // This key/value element is a pack expansion. 13539 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13540 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13541 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13542 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13543 13544 // Determine whether the set of unexpanded parameter packs can 13545 // and should be expanded. 13546 bool Expand = true; 13547 bool RetainExpansion = false; 13548 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13549 Optional<unsigned> NumExpansions = OrigNumExpansions; 13550 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13551 OrigElement.Value->getEndLoc()); 13552 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13553 PatternRange, Unexpanded, Expand, 13554 RetainExpansion, NumExpansions)) 13555 return ExprError(); 13556 13557 if (!Expand) { 13558 // The transform has determined that we should perform a simple 13559 // transformation on the pack expansion, producing another pack 13560 // expansion. 13561 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13562 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13563 if (Key.isInvalid()) 13564 return ExprError(); 13565 13566 if (Key.get() != OrigElement.Key) 13567 ArgChanged = true; 13568 13569 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13570 if (Value.isInvalid()) 13571 return ExprError(); 13572 13573 if (Value.get() != OrigElement.Value) 13574 ArgChanged = true; 13575 13576 ObjCDictionaryElement Expansion = { 13577 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13578 }; 13579 Elements.push_back(Expansion); 13580 continue; 13581 } 13582 13583 // Record right away that the argument was changed. This needs 13584 // to happen even if the array expands to nothing. 13585 ArgChanged = true; 13586 13587 // The transform has determined that we should perform an elementwise 13588 // expansion of the pattern. Do so. 13589 for (unsigned I = 0; I != *NumExpansions; ++I) { 13590 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13591 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13592 if (Key.isInvalid()) 13593 return ExprError(); 13594 13595 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13596 if (Value.isInvalid()) 13597 return ExprError(); 13598 13599 ObjCDictionaryElement Element = { 13600 Key.get(), Value.get(), SourceLocation(), NumExpansions 13601 }; 13602 13603 // If any unexpanded parameter packs remain, we still have a 13604 // pack expansion. 13605 // FIXME: Can this really happen? 13606 if (Key.get()->containsUnexpandedParameterPack() || 13607 Value.get()->containsUnexpandedParameterPack()) 13608 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13609 13610 Elements.push_back(Element); 13611 } 13612 13613 // FIXME: Retain a pack expansion if RetainExpansion is true. 13614 13615 // We've finished with this pack expansion. 13616 continue; 13617 } 13618 13619 // Transform and check key. 13620 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13621 if (Key.isInvalid()) 13622 return ExprError(); 13623 13624 if (Key.get() != OrigElement.Key) 13625 ArgChanged = true; 13626 13627 // Transform and check value. 13628 ExprResult Value 13629 = getDerived().TransformExpr(OrigElement.Value); 13630 if (Value.isInvalid()) 13631 return ExprError(); 13632 13633 if (Value.get() != OrigElement.Value) 13634 ArgChanged = true; 13635 13636 ObjCDictionaryElement Element = { 13637 Key.get(), Value.get(), SourceLocation(), None 13638 }; 13639 Elements.push_back(Element); 13640 } 13641 13642 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13643 return SemaRef.MaybeBindToTemporary(E); 13644 13645 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13646 Elements); 13647 } 13648 13649 template<typename Derived> 13650 ExprResult 13651 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13652 TypeSourceInfo *EncodedTypeInfo 13653 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13654 if (!EncodedTypeInfo) 13655 return ExprError(); 13656 13657 if (!getDerived().AlwaysRebuild() && 13658 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13659 return E; 13660 13661 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13662 EncodedTypeInfo, 13663 E->getRParenLoc()); 13664 } 13665 13666 template<typename Derived> 13667 ExprResult TreeTransform<Derived>:: 13668 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13669 // This is a kind of implicit conversion, and it needs to get dropped 13670 // and recomputed for the same general reasons that ImplicitCastExprs 13671 // do, as well a more specific one: this expression is only valid when 13672 // it appears *immediately* as an argument expression. 13673 return getDerived().TransformExpr(E->getSubExpr()); 13674 } 13675 13676 template<typename Derived> 13677 ExprResult TreeTransform<Derived>:: 13678 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13679 TypeSourceInfo *TSInfo 13680 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13681 if (!TSInfo) 13682 return ExprError(); 13683 13684 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13685 if (Result.isInvalid()) 13686 return ExprError(); 13687 13688 if (!getDerived().AlwaysRebuild() && 13689 TSInfo == E->getTypeInfoAsWritten() && 13690 Result.get() == E->getSubExpr()) 13691 return E; 13692 13693 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13694 E->getBridgeKeywordLoc(), TSInfo, 13695 Result.get()); 13696 } 13697 13698 template <typename Derived> 13699 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13700 ObjCAvailabilityCheckExpr *E) { 13701 return E; 13702 } 13703 13704 template<typename Derived> 13705 ExprResult 13706 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13707 // Transform arguments. 13708 bool ArgChanged = false; 13709 SmallVector<Expr*, 8> Args; 13710 Args.reserve(E->getNumArgs()); 13711 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13712 &ArgChanged)) 13713 return ExprError(); 13714 13715 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13716 // Class message: transform the receiver type. 13717 TypeSourceInfo *ReceiverTypeInfo 13718 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13719 if (!ReceiverTypeInfo) 13720 return ExprError(); 13721 13722 // If nothing changed, just retain the existing message send. 13723 if (!getDerived().AlwaysRebuild() && 13724 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13725 return SemaRef.MaybeBindToTemporary(E); 13726 13727 // Build a new class message send. 13728 SmallVector<SourceLocation, 16> SelLocs; 13729 E->getSelectorLocs(SelLocs); 13730 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13731 E->getSelector(), 13732 SelLocs, 13733 E->getMethodDecl(), 13734 E->getLeftLoc(), 13735 Args, 13736 E->getRightLoc()); 13737 } 13738 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13739 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13740 if (!E->getMethodDecl()) 13741 return ExprError(); 13742 13743 // Build a new class message send to 'super'. 13744 SmallVector<SourceLocation, 16> SelLocs; 13745 E->getSelectorLocs(SelLocs); 13746 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13747 E->getSelector(), 13748 SelLocs, 13749 E->getReceiverType(), 13750 E->getMethodDecl(), 13751 E->getLeftLoc(), 13752 Args, 13753 E->getRightLoc()); 13754 } 13755 13756 // Instance message: transform the receiver 13757 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13758 "Only class and instance messages may be instantiated"); 13759 ExprResult Receiver 13760 = getDerived().TransformExpr(E->getInstanceReceiver()); 13761 if (Receiver.isInvalid()) 13762 return ExprError(); 13763 13764 // If nothing changed, just retain the existing message send. 13765 if (!getDerived().AlwaysRebuild() && 13766 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13767 return SemaRef.MaybeBindToTemporary(E); 13768 13769 // Build a new instance message send. 13770 SmallVector<SourceLocation, 16> SelLocs; 13771 E->getSelectorLocs(SelLocs); 13772 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13773 E->getSelector(), 13774 SelLocs, 13775 E->getMethodDecl(), 13776 E->getLeftLoc(), 13777 Args, 13778 E->getRightLoc()); 13779 } 13780 13781 template<typename Derived> 13782 ExprResult 13783 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13784 return E; 13785 } 13786 13787 template<typename Derived> 13788 ExprResult 13789 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13790 return E; 13791 } 13792 13793 template<typename Derived> 13794 ExprResult 13795 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13796 // Transform the base expression. 13797 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13798 if (Base.isInvalid()) 13799 return ExprError(); 13800 13801 // We don't need to transform the ivar; it will never change. 13802 13803 // If nothing changed, just retain the existing expression. 13804 if (!getDerived().AlwaysRebuild() && 13805 Base.get() == E->getBase()) 13806 return E; 13807 13808 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13809 E->getLocation(), 13810 E->isArrow(), E->isFreeIvar()); 13811 } 13812 13813 template<typename Derived> 13814 ExprResult 13815 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13816 // 'super' and types never change. Property never changes. Just 13817 // retain the existing expression. 13818 if (!E->isObjectReceiver()) 13819 return E; 13820 13821 // Transform the base expression. 13822 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13823 if (Base.isInvalid()) 13824 return ExprError(); 13825 13826 // We don't need to transform the property; it will never change. 13827 13828 // If nothing changed, just retain the existing expression. 13829 if (!getDerived().AlwaysRebuild() && 13830 Base.get() == E->getBase()) 13831 return E; 13832 13833 if (E->isExplicitProperty()) 13834 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13835 E->getExplicitProperty(), 13836 E->getLocation()); 13837 13838 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13839 SemaRef.Context.PseudoObjectTy, 13840 E->getImplicitPropertyGetter(), 13841 E->getImplicitPropertySetter(), 13842 E->getLocation()); 13843 } 13844 13845 template<typename Derived> 13846 ExprResult 13847 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13848 // Transform the base expression. 13849 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13850 if (Base.isInvalid()) 13851 return ExprError(); 13852 13853 // Transform the key expression. 13854 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13855 if (Key.isInvalid()) 13856 return ExprError(); 13857 13858 // If nothing changed, just retain the existing expression. 13859 if (!getDerived().AlwaysRebuild() && 13860 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13861 return E; 13862 13863 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13864 Base.get(), Key.get(), 13865 E->getAtIndexMethodDecl(), 13866 E->setAtIndexMethodDecl()); 13867 } 13868 13869 template<typename Derived> 13870 ExprResult 13871 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13872 // Transform the base expression. 13873 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13874 if (Base.isInvalid()) 13875 return ExprError(); 13876 13877 // If nothing changed, just retain the existing expression. 13878 if (!getDerived().AlwaysRebuild() && 13879 Base.get() == E->getBase()) 13880 return E; 13881 13882 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13883 E->getOpLoc(), 13884 E->isArrow()); 13885 } 13886 13887 template<typename Derived> 13888 ExprResult 13889 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13890 bool ArgumentChanged = false; 13891 SmallVector<Expr*, 8> SubExprs; 13892 SubExprs.reserve(E->getNumSubExprs()); 13893 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13894 SubExprs, &ArgumentChanged)) 13895 return ExprError(); 13896 13897 if (!getDerived().AlwaysRebuild() && 13898 !ArgumentChanged) 13899 return E; 13900 13901 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13902 SubExprs, 13903 E->getRParenLoc()); 13904 } 13905 13906 template<typename Derived> 13907 ExprResult 13908 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13909 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13910 if (SrcExpr.isInvalid()) 13911 return ExprError(); 13912 13913 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13914 if (!Type) 13915 return ExprError(); 13916 13917 if (!getDerived().AlwaysRebuild() && 13918 Type == E->getTypeSourceInfo() && 13919 SrcExpr.get() == E->getSrcExpr()) 13920 return E; 13921 13922 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13923 SrcExpr.get(), Type, 13924 E->getRParenLoc()); 13925 } 13926 13927 template<typename Derived> 13928 ExprResult 13929 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13930 BlockDecl *oldBlock = E->getBlockDecl(); 13931 13932 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13933 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13934 13935 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13936 blockScope->TheDecl->setBlockMissingReturnType( 13937 oldBlock->blockMissingReturnType()); 13938 13939 SmallVector<ParmVarDecl*, 4> params; 13940 SmallVector<QualType, 4> paramTypes; 13941 13942 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13943 13944 // Parameter substitution. 13945 Sema::ExtParameterInfoBuilder extParamInfos; 13946 if (getDerived().TransformFunctionTypeParams( 13947 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13948 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13949 extParamInfos)) { 13950 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13951 return ExprError(); 13952 } 13953 13954 QualType exprResultType = 13955 getDerived().TransformType(exprFunctionType->getReturnType()); 13956 13957 auto epi = exprFunctionType->getExtProtoInfo(); 13958 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13959 13960 QualType functionType = 13961 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13962 blockScope->FunctionType = functionType; 13963 13964 // Set the parameters on the block decl. 13965 if (!params.empty()) 13966 blockScope->TheDecl->setParams(params); 13967 13968 if (!oldBlock->blockMissingReturnType()) { 13969 blockScope->HasImplicitReturnType = false; 13970 blockScope->ReturnType = exprResultType; 13971 } 13972 13973 // Transform the body 13974 StmtResult body = getDerived().TransformStmt(E->getBody()); 13975 if (body.isInvalid()) { 13976 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13977 return ExprError(); 13978 } 13979 13980 #ifndef NDEBUG 13981 // In builds with assertions, make sure that we captured everything we 13982 // captured before. 13983 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13984 for (const auto &I : oldBlock->captures()) { 13985 VarDecl *oldCapture = I.getVariable(); 13986 13987 // Ignore parameter packs. 13988 if (oldCapture->isParameterPack()) 13989 continue; 13990 13991 VarDecl *newCapture = 13992 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13993 oldCapture)); 13994 assert(blockScope->CaptureMap.count(newCapture)); 13995 } 13996 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13997 } 13998 #endif 13999 14000 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14001 /*Scope=*/nullptr); 14002 } 14003 14004 template<typename Derived> 14005 ExprResult 14006 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14007 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14008 if (SrcExpr.isInvalid()) 14009 return ExprError(); 14010 14011 QualType Type = getDerived().TransformType(E->getType()); 14012 14013 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14014 E->getRParenLoc()); 14015 } 14016 14017 template<typename Derived> 14018 ExprResult 14019 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14020 bool ArgumentChanged = false; 14021 SmallVector<Expr*, 8> SubExprs; 14022 SubExprs.reserve(E->getNumSubExprs()); 14023 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14024 SubExprs, &ArgumentChanged)) 14025 return ExprError(); 14026 14027 if (!getDerived().AlwaysRebuild() && 14028 !ArgumentChanged) 14029 return E; 14030 14031 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14032 E->getOp(), E->getRParenLoc()); 14033 } 14034 14035 //===----------------------------------------------------------------------===// 14036 // Type reconstruction 14037 //===----------------------------------------------------------------------===// 14038 14039 template<typename Derived> 14040 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14041 SourceLocation Star) { 14042 return SemaRef.BuildPointerType(PointeeType, Star, 14043 getDerived().getBaseEntity()); 14044 } 14045 14046 template<typename Derived> 14047 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14048 SourceLocation Star) { 14049 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14050 getDerived().getBaseEntity()); 14051 } 14052 14053 template<typename Derived> 14054 QualType 14055 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14056 bool WrittenAsLValue, 14057 SourceLocation Sigil) { 14058 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14059 Sigil, getDerived().getBaseEntity()); 14060 } 14061 14062 template<typename Derived> 14063 QualType 14064 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14065 QualType ClassType, 14066 SourceLocation Sigil) { 14067 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14068 getDerived().getBaseEntity()); 14069 } 14070 14071 template<typename Derived> 14072 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14073 const ObjCTypeParamDecl *Decl, 14074 SourceLocation ProtocolLAngleLoc, 14075 ArrayRef<ObjCProtocolDecl *> Protocols, 14076 ArrayRef<SourceLocation> ProtocolLocs, 14077 SourceLocation ProtocolRAngleLoc) { 14078 return SemaRef.BuildObjCTypeParamType(Decl, 14079 ProtocolLAngleLoc, Protocols, 14080 ProtocolLocs, ProtocolRAngleLoc, 14081 /*FailOnError=*/true); 14082 } 14083 14084 template<typename Derived> 14085 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14086 QualType BaseType, 14087 SourceLocation Loc, 14088 SourceLocation TypeArgsLAngleLoc, 14089 ArrayRef<TypeSourceInfo *> TypeArgs, 14090 SourceLocation TypeArgsRAngleLoc, 14091 SourceLocation ProtocolLAngleLoc, 14092 ArrayRef<ObjCProtocolDecl *> Protocols, 14093 ArrayRef<SourceLocation> ProtocolLocs, 14094 SourceLocation ProtocolRAngleLoc) { 14095 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14096 TypeArgs, TypeArgsRAngleLoc, 14097 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14098 ProtocolRAngleLoc, 14099 /*FailOnError=*/true); 14100 } 14101 14102 template<typename Derived> 14103 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14104 QualType PointeeType, 14105 SourceLocation Star) { 14106 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14107 } 14108 14109 template<typename Derived> 14110 QualType 14111 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14112 ArrayType::ArraySizeModifier SizeMod, 14113 const llvm::APInt *Size, 14114 Expr *SizeExpr, 14115 unsigned IndexTypeQuals, 14116 SourceRange BracketsRange) { 14117 if (SizeExpr || !Size) 14118 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14119 IndexTypeQuals, BracketsRange, 14120 getDerived().getBaseEntity()); 14121 14122 QualType Types[] = { 14123 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14124 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14125 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14126 }; 14127 const unsigned NumTypes = llvm::array_lengthof(Types); 14128 QualType SizeType; 14129 for (unsigned I = 0; I != NumTypes; ++I) 14130 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14131 SizeType = Types[I]; 14132 break; 14133 } 14134 14135 // Note that we can return a VariableArrayType here in the case where 14136 // the element type was a dependent VariableArrayType. 14137 IntegerLiteral *ArraySize 14138 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14139 /*FIXME*/BracketsRange.getBegin()); 14140 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14141 IndexTypeQuals, BracketsRange, 14142 getDerived().getBaseEntity()); 14143 } 14144 14145 template<typename Derived> 14146 QualType 14147 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14148 ArrayType::ArraySizeModifier SizeMod, 14149 const llvm::APInt &Size, 14150 Expr *SizeExpr, 14151 unsigned IndexTypeQuals, 14152 SourceRange BracketsRange) { 14153 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14154 IndexTypeQuals, BracketsRange); 14155 } 14156 14157 template<typename Derived> 14158 QualType 14159 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14160 ArrayType::ArraySizeModifier SizeMod, 14161 unsigned IndexTypeQuals, 14162 SourceRange BracketsRange) { 14163 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14164 IndexTypeQuals, BracketsRange); 14165 } 14166 14167 template<typename Derived> 14168 QualType 14169 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14170 ArrayType::ArraySizeModifier SizeMod, 14171 Expr *SizeExpr, 14172 unsigned IndexTypeQuals, 14173 SourceRange BracketsRange) { 14174 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14175 SizeExpr, 14176 IndexTypeQuals, BracketsRange); 14177 } 14178 14179 template<typename Derived> 14180 QualType 14181 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14182 ArrayType::ArraySizeModifier SizeMod, 14183 Expr *SizeExpr, 14184 unsigned IndexTypeQuals, 14185 SourceRange BracketsRange) { 14186 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14187 SizeExpr, 14188 IndexTypeQuals, BracketsRange); 14189 } 14190 14191 template <typename Derived> 14192 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14193 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14194 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14195 AttributeLoc); 14196 } 14197 14198 template <typename Derived> 14199 QualType 14200 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14201 unsigned NumElements, 14202 VectorType::VectorKind VecKind) { 14203 // FIXME: semantic checking! 14204 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14205 } 14206 14207 template <typename Derived> 14208 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14209 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14210 VectorType::VectorKind VecKind) { 14211 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14212 } 14213 14214 template<typename Derived> 14215 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14216 unsigned NumElements, 14217 SourceLocation AttributeLoc) { 14218 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14219 NumElements, true); 14220 IntegerLiteral *VectorSize 14221 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14222 AttributeLoc); 14223 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14224 } 14225 14226 template<typename Derived> 14227 QualType 14228 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14229 Expr *SizeExpr, 14230 SourceLocation AttributeLoc) { 14231 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14232 } 14233 14234 template <typename Derived> 14235 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14236 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14237 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14238 NumColumns); 14239 } 14240 14241 template <typename Derived> 14242 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14243 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14244 SourceLocation AttributeLoc) { 14245 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14246 AttributeLoc); 14247 } 14248 14249 template<typename Derived> 14250 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14251 QualType T, 14252 MutableArrayRef<QualType> ParamTypes, 14253 const FunctionProtoType::ExtProtoInfo &EPI) { 14254 return SemaRef.BuildFunctionType(T, ParamTypes, 14255 getDerived().getBaseLocation(), 14256 getDerived().getBaseEntity(), 14257 EPI); 14258 } 14259 14260 template<typename Derived> 14261 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14262 return SemaRef.Context.getFunctionNoProtoType(T); 14263 } 14264 14265 template<typename Derived> 14266 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14267 Decl *D) { 14268 assert(D && "no decl found"); 14269 if (D->isInvalidDecl()) return QualType(); 14270 14271 // FIXME: Doesn't account for ObjCInterfaceDecl! 14272 TypeDecl *Ty; 14273 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14274 // A valid resolved using typename pack expansion decl can have multiple 14275 // UsingDecls, but they must each have exactly one type, and it must be 14276 // the same type in every case. But we must have at least one expansion! 14277 if (UPD->expansions().empty()) { 14278 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14279 << UPD->isCXXClassMember() << UPD; 14280 return QualType(); 14281 } 14282 14283 // We might still have some unresolved types. Try to pick a resolved type 14284 // if we can. The final instantiation will check that the remaining 14285 // unresolved types instantiate to the type we pick. 14286 QualType FallbackT; 14287 QualType T; 14288 for (auto *E : UPD->expansions()) { 14289 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14290 if (ThisT.isNull()) 14291 continue; 14292 else if (ThisT->getAs<UnresolvedUsingType>()) 14293 FallbackT = ThisT; 14294 else if (T.isNull()) 14295 T = ThisT; 14296 else 14297 assert(getSema().Context.hasSameType(ThisT, T) && 14298 "mismatched resolved types in using pack expansion"); 14299 } 14300 return T.isNull() ? FallbackT : T; 14301 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14302 assert(Using->hasTypename() && 14303 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14304 14305 // A valid resolved using typename decl points to exactly one type decl. 14306 assert(++Using->shadow_begin() == Using->shadow_end()); 14307 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 14308 } else { 14309 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14310 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14311 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14312 } 14313 14314 return SemaRef.Context.getTypeDeclType(Ty); 14315 } 14316 14317 template<typename Derived> 14318 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14319 SourceLocation Loc) { 14320 return SemaRef.BuildTypeofExprType(E, Loc); 14321 } 14322 14323 template<typename Derived> 14324 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14325 return SemaRef.Context.getTypeOfType(Underlying); 14326 } 14327 14328 template<typename Derived> 14329 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14330 SourceLocation Loc) { 14331 return SemaRef.BuildDecltypeType(E, Loc); 14332 } 14333 14334 template<typename Derived> 14335 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14336 UnaryTransformType::UTTKind UKind, 14337 SourceLocation Loc) { 14338 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14339 } 14340 14341 template<typename Derived> 14342 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14343 TemplateName Template, 14344 SourceLocation TemplateNameLoc, 14345 TemplateArgumentListInfo &TemplateArgs) { 14346 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14347 } 14348 14349 template<typename Derived> 14350 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14351 SourceLocation KWLoc) { 14352 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14353 } 14354 14355 template<typename Derived> 14356 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14357 SourceLocation KWLoc, 14358 bool isReadPipe) { 14359 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14360 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14361 } 14362 14363 template <typename Derived> 14364 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14365 unsigned NumBits, 14366 SourceLocation Loc) { 14367 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14368 NumBits, true); 14369 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14370 SemaRef.Context.IntTy, Loc); 14371 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14372 } 14373 14374 template <typename Derived> 14375 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14376 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14377 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14378 } 14379 14380 template<typename Derived> 14381 TemplateName 14382 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14383 bool TemplateKW, 14384 TemplateDecl *Template) { 14385 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14386 Template); 14387 } 14388 14389 template<typename Derived> 14390 TemplateName 14391 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14392 SourceLocation TemplateKWLoc, 14393 const IdentifierInfo &Name, 14394 SourceLocation NameLoc, 14395 QualType ObjectType, 14396 NamedDecl *FirstQualifierInScope, 14397 bool AllowInjectedClassName) { 14398 UnqualifiedId TemplateName; 14399 TemplateName.setIdentifier(&Name, NameLoc); 14400 Sema::TemplateTy Template; 14401 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14402 TemplateName, ParsedType::make(ObjectType), 14403 /*EnteringContext=*/false, Template, 14404 AllowInjectedClassName); 14405 return Template.get(); 14406 } 14407 14408 template<typename Derived> 14409 TemplateName 14410 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14411 SourceLocation TemplateKWLoc, 14412 OverloadedOperatorKind Operator, 14413 SourceLocation NameLoc, 14414 QualType ObjectType, 14415 bool AllowInjectedClassName) { 14416 UnqualifiedId Name; 14417 // FIXME: Bogus location information. 14418 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14419 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14420 Sema::TemplateTy Template; 14421 getSema().ActOnTemplateName( 14422 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14423 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14424 return Template.get(); 14425 } 14426 14427 template<typename Derived> 14428 ExprResult 14429 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14430 SourceLocation OpLoc, 14431 Expr *OrigCallee, 14432 Expr *First, 14433 Expr *Second) { 14434 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14435 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14436 14437 if (First->getObjectKind() == OK_ObjCProperty) { 14438 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14439 if (BinaryOperator::isAssignmentOp(Opc)) 14440 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14441 First, Second); 14442 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14443 if (Result.isInvalid()) 14444 return ExprError(); 14445 First = Result.get(); 14446 } 14447 14448 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14449 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14450 if (Result.isInvalid()) 14451 return ExprError(); 14452 Second = Result.get(); 14453 } 14454 14455 // Determine whether this should be a builtin operation. 14456 if (Op == OO_Subscript) { 14457 if (!First->getType()->isOverloadableType() && 14458 !Second->getType()->isOverloadableType()) 14459 return getSema().CreateBuiltinArraySubscriptExpr( 14460 First, Callee->getBeginLoc(), Second, OpLoc); 14461 } else if (Op == OO_Arrow) { 14462 // -> is never a builtin operation. 14463 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14464 } else if (Second == nullptr || isPostIncDec) { 14465 if (!First->getType()->isOverloadableType() || 14466 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14467 // The argument is not of overloadable type, or this is an expression 14468 // of the form &Class::member, so try to create a built-in unary 14469 // operation. 14470 UnaryOperatorKind Opc 14471 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14472 14473 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14474 } 14475 } else { 14476 if (!First->getType()->isOverloadableType() && 14477 !Second->getType()->isOverloadableType()) { 14478 // Neither of the arguments is an overloadable type, so try to 14479 // create a built-in binary operation. 14480 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14481 ExprResult Result 14482 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14483 if (Result.isInvalid()) 14484 return ExprError(); 14485 14486 return Result; 14487 } 14488 } 14489 14490 // Compute the transformed set of functions (and function templates) to be 14491 // used during overload resolution. 14492 UnresolvedSet<16> Functions; 14493 bool RequiresADL; 14494 14495 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14496 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14497 // If the overload could not be resolved in the template definition 14498 // (because we had a dependent argument), ADL is performed as part of 14499 // template instantiation. 14500 RequiresADL = ULE->requiresADL(); 14501 } else { 14502 // If we've resolved this to a particular non-member function, just call 14503 // that function. If we resolved it to a member function, 14504 // CreateOverloaded* will find that function for us. 14505 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14506 if (!isa<CXXMethodDecl>(ND)) 14507 Functions.addDecl(ND); 14508 RequiresADL = false; 14509 } 14510 14511 // Add any functions found via argument-dependent lookup. 14512 Expr *Args[2] = { First, Second }; 14513 unsigned NumArgs = 1 + (Second != nullptr); 14514 14515 // Create the overloaded operator invocation for unary operators. 14516 if (NumArgs == 1 || isPostIncDec) { 14517 UnaryOperatorKind Opc 14518 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14519 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14520 RequiresADL); 14521 } 14522 14523 if (Op == OO_Subscript) { 14524 SourceLocation LBrace; 14525 SourceLocation RBrace; 14526 14527 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14528 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14529 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14530 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14531 } else { 14532 LBrace = Callee->getBeginLoc(); 14533 RBrace = OpLoc; 14534 } 14535 14536 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14537 First, Second); 14538 } 14539 14540 // Create the overloaded operator invocation for binary operators. 14541 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14542 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14543 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14544 if (Result.isInvalid()) 14545 return ExprError(); 14546 14547 return Result; 14548 } 14549 14550 template<typename Derived> 14551 ExprResult 14552 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14553 SourceLocation OperatorLoc, 14554 bool isArrow, 14555 CXXScopeSpec &SS, 14556 TypeSourceInfo *ScopeType, 14557 SourceLocation CCLoc, 14558 SourceLocation TildeLoc, 14559 PseudoDestructorTypeStorage Destroyed) { 14560 QualType BaseType = Base->getType(); 14561 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14562 (!isArrow && !BaseType->getAs<RecordType>()) || 14563 (isArrow && BaseType->getAs<PointerType>() && 14564 !BaseType->castAs<PointerType>()->getPointeeType() 14565 ->template getAs<RecordType>())){ 14566 // This pseudo-destructor expression is still a pseudo-destructor. 14567 return SemaRef.BuildPseudoDestructorExpr( 14568 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14569 CCLoc, TildeLoc, Destroyed); 14570 } 14571 14572 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14573 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14574 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14575 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14576 NameInfo.setNamedTypeInfo(DestroyedType); 14577 14578 // The scope type is now known to be a valid nested name specifier 14579 // component. Tack it on to the end of the nested name specifier. 14580 if (ScopeType) { 14581 if (!ScopeType->getType()->getAs<TagType>()) { 14582 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14583 diag::err_expected_class_or_namespace) 14584 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14585 return ExprError(); 14586 } 14587 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14588 CCLoc); 14589 } 14590 14591 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14592 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14593 OperatorLoc, isArrow, 14594 SS, TemplateKWLoc, 14595 /*FIXME: FirstQualifier*/ nullptr, 14596 NameInfo, 14597 /*TemplateArgs*/ nullptr, 14598 /*S*/nullptr); 14599 } 14600 14601 template<typename Derived> 14602 StmtResult 14603 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14604 SourceLocation Loc = S->getBeginLoc(); 14605 CapturedDecl *CD = S->getCapturedDecl(); 14606 unsigned NumParams = CD->getNumParams(); 14607 unsigned ContextParamPos = CD->getContextParamPosition(); 14608 SmallVector<Sema::CapturedParamNameType, 4> Params; 14609 for (unsigned I = 0; I < NumParams; ++I) { 14610 if (I != ContextParamPos) { 14611 Params.push_back( 14612 std::make_pair( 14613 CD->getParam(I)->getName(), 14614 getDerived().TransformType(CD->getParam(I)->getType()))); 14615 } else { 14616 Params.push_back(std::make_pair(StringRef(), QualType())); 14617 } 14618 } 14619 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14620 S->getCapturedRegionKind(), Params); 14621 StmtResult Body; 14622 { 14623 Sema::CompoundScopeRAII CompoundScope(getSema()); 14624 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14625 } 14626 14627 if (Body.isInvalid()) { 14628 getSema().ActOnCapturedRegionError(); 14629 return StmtError(); 14630 } 14631 14632 return getSema().ActOnCapturedRegionEnd(Body.get()); 14633 } 14634 14635 } // end namespace clang 14636 14637 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14638