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.BuildAttributedStmt(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 /// Build a new OpenMP 'nocontext' clause. 2224 /// 2225 /// By default, performs semantic analysis to build the new OpenMP clause. 2226 /// Subclasses may override this routine to provide different behavior. 2227 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2228 SourceLocation LParenLoc, 2229 SourceLocation EndLoc) { 2230 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2231 EndLoc); 2232 } 2233 2234 /// Build a new OpenMP 'filter' clause. 2235 /// 2236 /// By default, performs semantic analysis to build the new OpenMP clause. 2237 /// Subclasses may override this routine to provide different behavior. 2238 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2239 SourceLocation LParenLoc, 2240 SourceLocation EndLoc) { 2241 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2242 EndLoc); 2243 } 2244 2245 /// Rebuild the operand to an Objective-C \@synchronized statement. 2246 /// 2247 /// By default, performs semantic analysis to build the new statement. 2248 /// Subclasses may override this routine to provide different behavior. 2249 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2250 Expr *object) { 2251 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2252 } 2253 2254 /// Build a new Objective-C \@synchronized statement. 2255 /// 2256 /// By default, performs semantic analysis to build the new statement. 2257 /// Subclasses may override this routine to provide different behavior. 2258 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2259 Expr *Object, Stmt *Body) { 2260 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2261 } 2262 2263 /// Build a new Objective-C \@autoreleasepool statement. 2264 /// 2265 /// By default, performs semantic analysis to build the new statement. 2266 /// Subclasses may override this routine to provide different behavior. 2267 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2268 Stmt *Body) { 2269 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2270 } 2271 2272 /// Build a new Objective-C fast enumeration statement. 2273 /// 2274 /// By default, performs semantic analysis to build the new statement. 2275 /// Subclasses may override this routine to provide different behavior. 2276 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2277 Stmt *Element, 2278 Expr *Collection, 2279 SourceLocation RParenLoc, 2280 Stmt *Body) { 2281 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2282 Element, 2283 Collection, 2284 RParenLoc); 2285 if (ForEachStmt.isInvalid()) 2286 return StmtError(); 2287 2288 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2289 } 2290 2291 /// Build a new C++ exception declaration. 2292 /// 2293 /// By default, performs semantic analysis to build the new decaration. 2294 /// Subclasses may override this routine to provide different behavior. 2295 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2296 TypeSourceInfo *Declarator, 2297 SourceLocation StartLoc, 2298 SourceLocation IdLoc, 2299 IdentifierInfo *Id) { 2300 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2301 StartLoc, IdLoc, Id); 2302 if (Var) 2303 getSema().CurContext->addDecl(Var); 2304 return Var; 2305 } 2306 2307 /// Build a new C++ catch statement. 2308 /// 2309 /// By default, performs semantic analysis to build the new statement. 2310 /// Subclasses may override this routine to provide different behavior. 2311 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2312 VarDecl *ExceptionDecl, 2313 Stmt *Handler) { 2314 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2315 Handler)); 2316 } 2317 2318 /// Build a new C++ try statement. 2319 /// 2320 /// By default, performs semantic analysis to build the new statement. 2321 /// Subclasses may override this routine to provide different behavior. 2322 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2323 ArrayRef<Stmt *> Handlers) { 2324 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2325 } 2326 2327 /// Build a new C++0x range-based for statement. 2328 /// 2329 /// By default, performs semantic analysis to build the new statement. 2330 /// Subclasses may override this routine to provide different behavior. 2331 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2332 SourceLocation CoawaitLoc, Stmt *Init, 2333 SourceLocation ColonLoc, Stmt *Range, 2334 Stmt *Begin, Stmt *End, Expr *Cond, 2335 Expr *Inc, Stmt *LoopVar, 2336 SourceLocation RParenLoc) { 2337 // If we've just learned that the range is actually an Objective-C 2338 // collection, treat this as an Objective-C fast enumeration loop. 2339 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2340 if (RangeStmt->isSingleDecl()) { 2341 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2342 if (RangeVar->isInvalidDecl()) 2343 return StmtError(); 2344 2345 Expr *RangeExpr = RangeVar->getInit(); 2346 if (!RangeExpr->isTypeDependent() && 2347 RangeExpr->getType()->isObjCObjectPointerType()) { 2348 // FIXME: Support init-statements in Objective-C++20 ranged for 2349 // statement. 2350 if (Init) { 2351 return SemaRef.Diag(Init->getBeginLoc(), 2352 diag::err_objc_for_range_init_stmt) 2353 << Init->getSourceRange(); 2354 } 2355 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2356 RangeExpr, RParenLoc); 2357 } 2358 } 2359 } 2360 } 2361 2362 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2363 Range, Begin, End, Cond, Inc, LoopVar, 2364 RParenLoc, Sema::BFRK_Rebuild); 2365 } 2366 2367 /// Build a new C++0x range-based for statement. 2368 /// 2369 /// By default, performs semantic analysis to build the new statement. 2370 /// Subclasses may override this routine to provide different behavior. 2371 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2372 bool IsIfExists, 2373 NestedNameSpecifierLoc QualifierLoc, 2374 DeclarationNameInfo NameInfo, 2375 Stmt *Nested) { 2376 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2377 QualifierLoc, NameInfo, Nested); 2378 } 2379 2380 /// Attach body to a C++0x range-based for statement. 2381 /// 2382 /// By default, performs semantic analysis to finish the new statement. 2383 /// Subclasses may override this routine to provide different behavior. 2384 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2385 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2386 } 2387 2388 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2389 Stmt *TryBlock, Stmt *Handler) { 2390 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2391 } 2392 2393 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2394 Stmt *Block) { 2395 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2396 } 2397 2398 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2399 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2400 } 2401 2402 /// Build a new predefined expression. 2403 /// 2404 /// By default, performs semantic analysis to build the new expression. 2405 /// Subclasses may override this routine to provide different behavior. 2406 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2407 PredefinedExpr::IdentKind IK) { 2408 return getSema().BuildPredefinedExpr(Loc, IK); 2409 } 2410 2411 /// Build a new expression that references a declaration. 2412 /// 2413 /// By default, performs semantic analysis to build the new expression. 2414 /// Subclasses may override this routine to provide different behavior. 2415 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2416 LookupResult &R, 2417 bool RequiresADL) { 2418 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2419 } 2420 2421 2422 /// Build a new expression that references a declaration. 2423 /// 2424 /// By default, performs semantic analysis to build the new expression. 2425 /// Subclasses may override this routine to provide different behavior. 2426 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2427 ValueDecl *VD, 2428 const DeclarationNameInfo &NameInfo, 2429 NamedDecl *Found, 2430 TemplateArgumentListInfo *TemplateArgs) { 2431 CXXScopeSpec SS; 2432 SS.Adopt(QualifierLoc); 2433 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2434 TemplateArgs); 2435 } 2436 2437 /// Build a new expression in parentheses. 2438 /// 2439 /// By default, performs semantic analysis to build the new expression. 2440 /// Subclasses may override this routine to provide different behavior. 2441 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2442 SourceLocation RParen) { 2443 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2444 } 2445 2446 /// Build a new pseudo-destructor expression. 2447 /// 2448 /// By default, performs semantic analysis to build the new expression. 2449 /// Subclasses may override this routine to provide different behavior. 2450 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2451 SourceLocation OperatorLoc, 2452 bool isArrow, 2453 CXXScopeSpec &SS, 2454 TypeSourceInfo *ScopeType, 2455 SourceLocation CCLoc, 2456 SourceLocation TildeLoc, 2457 PseudoDestructorTypeStorage Destroyed); 2458 2459 /// Build a new unary operator expression. 2460 /// 2461 /// By default, performs semantic analysis to build the new expression. 2462 /// Subclasses may override this routine to provide different behavior. 2463 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2464 UnaryOperatorKind Opc, 2465 Expr *SubExpr) { 2466 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2467 } 2468 2469 /// Build a new builtin offsetof expression. 2470 /// 2471 /// By default, performs semantic analysis to build the new expression. 2472 /// Subclasses may override this routine to provide different behavior. 2473 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2474 TypeSourceInfo *Type, 2475 ArrayRef<Sema::OffsetOfComponent> Components, 2476 SourceLocation RParenLoc) { 2477 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2478 RParenLoc); 2479 } 2480 2481 /// Build a new sizeof, alignof or vec_step expression with a 2482 /// type argument. 2483 /// 2484 /// By default, performs semantic analysis to build the new expression. 2485 /// Subclasses may override this routine to provide different behavior. 2486 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2487 SourceLocation OpLoc, 2488 UnaryExprOrTypeTrait ExprKind, 2489 SourceRange R) { 2490 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2491 } 2492 2493 /// Build a new sizeof, alignof or vec step expression with an 2494 /// expression argument. 2495 /// 2496 /// By default, performs semantic analysis to build the new expression. 2497 /// Subclasses may override this routine to provide different behavior. 2498 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2499 UnaryExprOrTypeTrait ExprKind, 2500 SourceRange R) { 2501 ExprResult Result 2502 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2503 if (Result.isInvalid()) 2504 return ExprError(); 2505 2506 return Result; 2507 } 2508 2509 /// Build a new array subscript expression. 2510 /// 2511 /// By default, performs semantic analysis to build the new expression. 2512 /// Subclasses may override this routine to provide different behavior. 2513 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2514 SourceLocation LBracketLoc, 2515 Expr *RHS, 2516 SourceLocation RBracketLoc) { 2517 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2518 LBracketLoc, RHS, 2519 RBracketLoc); 2520 } 2521 2522 /// Build a new matrix subscript expression. 2523 /// 2524 /// By default, performs semantic analysis to build the new expression. 2525 /// Subclasses may override this routine to provide different behavior. 2526 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2527 Expr *ColumnIdx, 2528 SourceLocation RBracketLoc) { 2529 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2530 RBracketLoc); 2531 } 2532 2533 /// Build a new array section expression. 2534 /// 2535 /// By default, performs semantic analysis to build the new expression. 2536 /// Subclasses may override this routine to provide different behavior. 2537 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2538 Expr *LowerBound, 2539 SourceLocation ColonLocFirst, 2540 SourceLocation ColonLocSecond, 2541 Expr *Length, Expr *Stride, 2542 SourceLocation RBracketLoc) { 2543 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2544 ColonLocFirst, ColonLocSecond, 2545 Length, Stride, RBracketLoc); 2546 } 2547 2548 /// Build a new array shaping expression. 2549 /// 2550 /// By default, performs semantic analysis to build the new expression. 2551 /// Subclasses may override this routine to provide different behavior. 2552 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2553 SourceLocation RParenLoc, 2554 ArrayRef<Expr *> Dims, 2555 ArrayRef<SourceRange> BracketsRanges) { 2556 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2557 BracketsRanges); 2558 } 2559 2560 /// Build a new iterator expression. 2561 /// 2562 /// By default, performs semantic analysis to build the new expression. 2563 /// Subclasses may override this routine to provide different behavior. 2564 ExprResult RebuildOMPIteratorExpr( 2565 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2566 ArrayRef<Sema::OMPIteratorData> Data) { 2567 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2568 LLoc, RLoc, Data); 2569 } 2570 2571 /// Build a new call expression. 2572 /// 2573 /// By default, performs semantic analysis to build the new expression. 2574 /// Subclasses may override this routine to provide different behavior. 2575 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2576 MultiExprArg Args, 2577 SourceLocation RParenLoc, 2578 Expr *ExecConfig = nullptr) { 2579 return getSema().ActOnCallExpr( 2580 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2581 } 2582 2583 /// Build a new member access expression. 2584 /// 2585 /// By default, performs semantic analysis to build the new expression. 2586 /// Subclasses may override this routine to provide different behavior. 2587 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2588 bool isArrow, 2589 NestedNameSpecifierLoc QualifierLoc, 2590 SourceLocation TemplateKWLoc, 2591 const DeclarationNameInfo &MemberNameInfo, 2592 ValueDecl *Member, 2593 NamedDecl *FoundDecl, 2594 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2595 NamedDecl *FirstQualifierInScope) { 2596 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2597 isArrow); 2598 if (!Member->getDeclName()) { 2599 // We have a reference to an unnamed field. This is always the 2600 // base of an anonymous struct/union member access, i.e. the 2601 // field is always of record type. 2602 assert(Member->getType()->isRecordType() && 2603 "unnamed member not of record type?"); 2604 2605 BaseResult = 2606 getSema().PerformObjectMemberConversion(BaseResult.get(), 2607 QualifierLoc.getNestedNameSpecifier(), 2608 FoundDecl, Member); 2609 if (BaseResult.isInvalid()) 2610 return ExprError(); 2611 Base = BaseResult.get(); 2612 2613 CXXScopeSpec EmptySS; 2614 return getSema().BuildFieldReferenceExpr( 2615 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2616 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2617 } 2618 2619 CXXScopeSpec SS; 2620 SS.Adopt(QualifierLoc); 2621 2622 Base = BaseResult.get(); 2623 QualType BaseType = Base->getType(); 2624 2625 if (isArrow && !BaseType->isPointerType()) 2626 return ExprError(); 2627 2628 // FIXME: this involves duplicating earlier analysis in a lot of 2629 // cases; we should avoid this when possible. 2630 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2631 R.addDecl(FoundDecl); 2632 R.resolveKind(); 2633 2634 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2635 SS, TemplateKWLoc, 2636 FirstQualifierInScope, 2637 R, ExplicitTemplateArgs, 2638 /*S*/nullptr); 2639 } 2640 2641 /// Build a new binary operator expression. 2642 /// 2643 /// By default, performs semantic analysis to build the new expression. 2644 /// Subclasses may override this routine to provide different behavior. 2645 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2646 BinaryOperatorKind Opc, 2647 Expr *LHS, Expr *RHS) { 2648 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2649 } 2650 2651 /// Build a new rewritten operator expression. 2652 /// 2653 /// By default, performs semantic analysis to build the new expression. 2654 /// Subclasses may override this routine to provide different behavior. 2655 ExprResult RebuildCXXRewrittenBinaryOperator( 2656 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2657 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2658 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2659 RHS, /*RequiresADL*/false); 2660 } 2661 2662 /// Build a new conditional operator expression. 2663 /// 2664 /// By default, performs semantic analysis to build the new expression. 2665 /// Subclasses may override this routine to provide different behavior. 2666 ExprResult RebuildConditionalOperator(Expr *Cond, 2667 SourceLocation QuestionLoc, 2668 Expr *LHS, 2669 SourceLocation ColonLoc, 2670 Expr *RHS) { 2671 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2672 LHS, RHS); 2673 } 2674 2675 /// Build a new C-style cast expression. 2676 /// 2677 /// By default, performs semantic analysis to build the new expression. 2678 /// Subclasses may override this routine to provide different behavior. 2679 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2680 TypeSourceInfo *TInfo, 2681 SourceLocation RParenLoc, 2682 Expr *SubExpr) { 2683 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2684 SubExpr); 2685 } 2686 2687 /// Build a new compound literal expression. 2688 /// 2689 /// By default, performs semantic analysis to build the new expression. 2690 /// Subclasses may override this routine to provide different behavior. 2691 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2692 TypeSourceInfo *TInfo, 2693 SourceLocation RParenLoc, 2694 Expr *Init) { 2695 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2696 Init); 2697 } 2698 2699 /// Build a new extended vector element access expression. 2700 /// 2701 /// By default, performs semantic analysis to build the new expression. 2702 /// Subclasses may override this routine to provide different behavior. 2703 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2704 SourceLocation OpLoc, 2705 SourceLocation AccessorLoc, 2706 IdentifierInfo &Accessor) { 2707 2708 CXXScopeSpec SS; 2709 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2710 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2711 OpLoc, /*IsArrow*/ false, 2712 SS, SourceLocation(), 2713 /*FirstQualifierInScope*/ nullptr, 2714 NameInfo, 2715 /* TemplateArgs */ nullptr, 2716 /*S*/ nullptr); 2717 } 2718 2719 /// Build a new initializer list expression. 2720 /// 2721 /// By default, performs semantic analysis to build the new expression. 2722 /// Subclasses may override this routine to provide different behavior. 2723 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2724 MultiExprArg Inits, 2725 SourceLocation RBraceLoc) { 2726 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2727 } 2728 2729 /// Build a new designated initializer expression. 2730 /// 2731 /// By default, performs semantic analysis to build the new expression. 2732 /// Subclasses may override this routine to provide different behavior. 2733 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2734 MultiExprArg ArrayExprs, 2735 SourceLocation EqualOrColonLoc, 2736 bool GNUSyntax, 2737 Expr *Init) { 2738 ExprResult Result 2739 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2740 Init); 2741 if (Result.isInvalid()) 2742 return ExprError(); 2743 2744 return Result; 2745 } 2746 2747 /// Build a new value-initialized expression. 2748 /// 2749 /// By default, builds the implicit value initialization without performing 2750 /// any semantic analysis. Subclasses may override this routine to provide 2751 /// different behavior. 2752 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2753 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2754 } 2755 2756 /// Build a new \c va_arg expression. 2757 /// 2758 /// By default, performs semantic analysis to build the new expression. 2759 /// Subclasses may override this routine to provide different behavior. 2760 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2761 Expr *SubExpr, TypeSourceInfo *TInfo, 2762 SourceLocation RParenLoc) { 2763 return getSema().BuildVAArgExpr(BuiltinLoc, 2764 SubExpr, TInfo, 2765 RParenLoc); 2766 } 2767 2768 /// Build a new expression list in parentheses. 2769 /// 2770 /// By default, performs semantic analysis to build the new expression. 2771 /// Subclasses may override this routine to provide different behavior. 2772 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2773 MultiExprArg SubExprs, 2774 SourceLocation RParenLoc) { 2775 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2776 } 2777 2778 /// Build a new address-of-label expression. 2779 /// 2780 /// By default, performs semantic analysis, using the name of the label 2781 /// rather than attempting to map the label statement itself. 2782 /// Subclasses may override this routine to provide different behavior. 2783 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2784 SourceLocation LabelLoc, LabelDecl *Label) { 2785 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2786 } 2787 2788 /// Build a new GNU statement 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 RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2793 SourceLocation RParenLoc, unsigned TemplateDepth) { 2794 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2795 TemplateDepth); 2796 } 2797 2798 /// Build a new __builtin_choose_expr expression. 2799 /// 2800 /// By default, performs semantic analysis to build the new expression. 2801 /// Subclasses may override this routine to provide different behavior. 2802 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2803 Expr *Cond, Expr *LHS, Expr *RHS, 2804 SourceLocation RParenLoc) { 2805 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2806 Cond, LHS, RHS, 2807 RParenLoc); 2808 } 2809 2810 /// Build a new generic selection expression. 2811 /// 2812 /// By default, performs semantic analysis to build the new expression. 2813 /// Subclasses may override this routine to provide different behavior. 2814 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2815 SourceLocation DefaultLoc, 2816 SourceLocation RParenLoc, 2817 Expr *ControllingExpr, 2818 ArrayRef<TypeSourceInfo *> Types, 2819 ArrayRef<Expr *> Exprs) { 2820 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2821 ControllingExpr, Types, Exprs); 2822 } 2823 2824 /// Build a new overloaded operator call expression. 2825 /// 2826 /// By default, performs semantic analysis to build the new expression. 2827 /// The semantic analysis provides the behavior of template instantiation, 2828 /// copying with transformations that turn what looks like an overloaded 2829 /// operator call into a use of a builtin operator, performing 2830 /// argument-dependent lookup, etc. Subclasses may override this routine to 2831 /// provide different behavior. 2832 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2833 SourceLocation OpLoc, 2834 Expr *Callee, 2835 Expr *First, 2836 Expr *Second); 2837 2838 /// Build a new C++ "named" cast expression, such as static_cast or 2839 /// reinterpret_cast. 2840 /// 2841 /// By default, this routine dispatches to one of the more-specific routines 2842 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2843 /// Subclasses may override this routine to provide different behavior. 2844 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2845 Stmt::StmtClass Class, 2846 SourceLocation LAngleLoc, 2847 TypeSourceInfo *TInfo, 2848 SourceLocation RAngleLoc, 2849 SourceLocation LParenLoc, 2850 Expr *SubExpr, 2851 SourceLocation RParenLoc) { 2852 switch (Class) { 2853 case Stmt::CXXStaticCastExprClass: 2854 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2855 RAngleLoc, LParenLoc, 2856 SubExpr, RParenLoc); 2857 2858 case Stmt::CXXDynamicCastExprClass: 2859 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2860 RAngleLoc, LParenLoc, 2861 SubExpr, RParenLoc); 2862 2863 case Stmt::CXXReinterpretCastExprClass: 2864 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2865 RAngleLoc, LParenLoc, 2866 SubExpr, 2867 RParenLoc); 2868 2869 case Stmt::CXXConstCastExprClass: 2870 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2871 RAngleLoc, LParenLoc, 2872 SubExpr, RParenLoc); 2873 2874 case Stmt::CXXAddrspaceCastExprClass: 2875 return getDerived().RebuildCXXAddrspaceCastExpr( 2876 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2877 2878 default: 2879 llvm_unreachable("Invalid C++ named cast"); 2880 } 2881 } 2882 2883 /// Build a new C++ static_cast expression. 2884 /// 2885 /// By default, performs semantic analysis to build the new expression. 2886 /// Subclasses may override this routine to provide different behavior. 2887 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2888 SourceLocation LAngleLoc, 2889 TypeSourceInfo *TInfo, 2890 SourceLocation RAngleLoc, 2891 SourceLocation LParenLoc, 2892 Expr *SubExpr, 2893 SourceLocation RParenLoc) { 2894 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2895 TInfo, SubExpr, 2896 SourceRange(LAngleLoc, RAngleLoc), 2897 SourceRange(LParenLoc, RParenLoc)); 2898 } 2899 2900 /// Build a new C++ dynamic_cast expression. 2901 /// 2902 /// By default, performs semantic analysis to build the new expression. 2903 /// Subclasses may override this routine to provide different behavior. 2904 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2905 SourceLocation LAngleLoc, 2906 TypeSourceInfo *TInfo, 2907 SourceLocation RAngleLoc, 2908 SourceLocation LParenLoc, 2909 Expr *SubExpr, 2910 SourceLocation RParenLoc) { 2911 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2912 TInfo, SubExpr, 2913 SourceRange(LAngleLoc, RAngleLoc), 2914 SourceRange(LParenLoc, RParenLoc)); 2915 } 2916 2917 /// Build a new C++ reinterpret_cast expression. 2918 /// 2919 /// By default, performs semantic analysis to build the new expression. 2920 /// Subclasses may override this routine to provide different behavior. 2921 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2922 SourceLocation LAngleLoc, 2923 TypeSourceInfo *TInfo, 2924 SourceLocation RAngleLoc, 2925 SourceLocation LParenLoc, 2926 Expr *SubExpr, 2927 SourceLocation RParenLoc) { 2928 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2929 TInfo, SubExpr, 2930 SourceRange(LAngleLoc, RAngleLoc), 2931 SourceRange(LParenLoc, RParenLoc)); 2932 } 2933 2934 /// Build a new C++ const_cast expression. 2935 /// 2936 /// By default, performs semantic analysis to build the new expression. 2937 /// Subclasses may override this routine to provide different behavior. 2938 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2939 SourceLocation LAngleLoc, 2940 TypeSourceInfo *TInfo, 2941 SourceLocation RAngleLoc, 2942 SourceLocation LParenLoc, 2943 Expr *SubExpr, 2944 SourceLocation RParenLoc) { 2945 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2946 TInfo, SubExpr, 2947 SourceRange(LAngleLoc, RAngleLoc), 2948 SourceRange(LParenLoc, RParenLoc)); 2949 } 2950 2951 ExprResult 2952 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2953 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2954 SourceLocation LParenLoc, Expr *SubExpr, 2955 SourceLocation RParenLoc) { 2956 return getSema().BuildCXXNamedCast( 2957 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2958 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2959 } 2960 2961 /// Build a new C++ functional-style cast expression. 2962 /// 2963 /// By default, performs semantic analysis to build the new expression. 2964 /// Subclasses may override this routine to provide different behavior. 2965 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2966 SourceLocation LParenLoc, 2967 Expr *Sub, 2968 SourceLocation RParenLoc, 2969 bool ListInitialization) { 2970 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2971 MultiExprArg(&Sub, 1), RParenLoc, 2972 ListInitialization); 2973 } 2974 2975 /// Build a new C++ __builtin_bit_cast expression. 2976 /// 2977 /// By default, performs semantic analysis to build the new expression. 2978 /// Subclasses may override this routine to provide different behavior. 2979 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2980 TypeSourceInfo *TSI, Expr *Sub, 2981 SourceLocation RParenLoc) { 2982 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2983 } 2984 2985 /// Build a new C++ typeid(type) expression. 2986 /// 2987 /// By default, performs semantic analysis to build the new expression. 2988 /// Subclasses may override this routine to provide different behavior. 2989 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2990 SourceLocation TypeidLoc, 2991 TypeSourceInfo *Operand, 2992 SourceLocation RParenLoc) { 2993 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2994 RParenLoc); 2995 } 2996 2997 2998 /// Build a new C++ typeid(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 RebuildCXXTypeidExpr(QualType TypeInfoType, 3003 SourceLocation TypeidLoc, 3004 Expr *Operand, 3005 SourceLocation RParenLoc) { 3006 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3007 RParenLoc); 3008 } 3009 3010 /// Build a new C++ __uuidof(type) expression. 3011 /// 3012 /// By default, performs semantic analysis to build the new expression. 3013 /// Subclasses may override this routine to provide different behavior. 3014 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3015 TypeSourceInfo *Operand, 3016 SourceLocation RParenLoc) { 3017 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3018 } 3019 3020 /// Build a new C++ __uuidof(expr) expression. 3021 /// 3022 /// By default, performs semantic analysis to build the new expression. 3023 /// Subclasses may override this routine to provide different behavior. 3024 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3025 Expr *Operand, SourceLocation RParenLoc) { 3026 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3027 } 3028 3029 /// Build a new C++ "this" expression. 3030 /// 3031 /// By default, builds a new "this" expression without performing any 3032 /// semantic analysis. Subclasses may override this routine to provide 3033 /// different behavior. 3034 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3035 QualType ThisType, 3036 bool isImplicit) { 3037 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3038 } 3039 3040 /// Build a new C++ throw expression. 3041 /// 3042 /// By default, performs semantic analysis to build the new expression. 3043 /// Subclasses may override this routine to provide different behavior. 3044 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3045 bool IsThrownVariableInScope) { 3046 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3047 } 3048 3049 /// Build a new C++ default-argument expression. 3050 /// 3051 /// By default, builds a new default-argument expression, which does not 3052 /// require any semantic analysis. Subclasses may override this routine to 3053 /// provide different behavior. 3054 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3055 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3056 getSema().CurContext); 3057 } 3058 3059 /// Build a new C++11 default-initialization expression. 3060 /// 3061 /// By default, builds a new default field initialization expression, which 3062 /// does not require any semantic analysis. Subclasses may override this 3063 /// routine to provide different behavior. 3064 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3065 FieldDecl *Field) { 3066 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3067 getSema().CurContext); 3068 } 3069 3070 /// Build a new C++ zero-initialization expression. 3071 /// 3072 /// By default, performs semantic analysis to build the new expression. 3073 /// Subclasses may override this routine to provide different behavior. 3074 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3075 SourceLocation LParenLoc, 3076 SourceLocation RParenLoc) { 3077 return getSema().BuildCXXTypeConstructExpr( 3078 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3079 } 3080 3081 /// Build a new C++ "new" expression. 3082 /// 3083 /// By default, performs semantic analysis to build the new expression. 3084 /// Subclasses may override this routine to provide different behavior. 3085 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3086 bool UseGlobal, 3087 SourceLocation PlacementLParen, 3088 MultiExprArg PlacementArgs, 3089 SourceLocation PlacementRParen, 3090 SourceRange TypeIdParens, 3091 QualType AllocatedType, 3092 TypeSourceInfo *AllocatedTypeInfo, 3093 Optional<Expr *> ArraySize, 3094 SourceRange DirectInitRange, 3095 Expr *Initializer) { 3096 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3097 PlacementLParen, 3098 PlacementArgs, 3099 PlacementRParen, 3100 TypeIdParens, 3101 AllocatedType, 3102 AllocatedTypeInfo, 3103 ArraySize, 3104 DirectInitRange, 3105 Initializer); 3106 } 3107 3108 /// Build a new C++ "delete" expression. 3109 /// 3110 /// By default, performs semantic analysis to build the new expression. 3111 /// Subclasses may override this routine to provide different behavior. 3112 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3113 bool IsGlobalDelete, 3114 bool IsArrayForm, 3115 Expr *Operand) { 3116 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3117 Operand); 3118 } 3119 3120 /// Build a new type trait expression. 3121 /// 3122 /// By default, performs semantic analysis to build the new expression. 3123 /// Subclasses may override this routine to provide different behavior. 3124 ExprResult RebuildTypeTrait(TypeTrait Trait, 3125 SourceLocation StartLoc, 3126 ArrayRef<TypeSourceInfo *> Args, 3127 SourceLocation RParenLoc) { 3128 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3129 } 3130 3131 /// Build a new array type trait expression. 3132 /// 3133 /// By default, performs semantic analysis to build the new expression. 3134 /// Subclasses may override this routine to provide different behavior. 3135 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3136 SourceLocation StartLoc, 3137 TypeSourceInfo *TSInfo, 3138 Expr *DimExpr, 3139 SourceLocation RParenLoc) { 3140 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3141 } 3142 3143 /// Build a new expression trait expression. 3144 /// 3145 /// By default, performs semantic analysis to build the new expression. 3146 /// Subclasses may override this routine to provide different behavior. 3147 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3148 SourceLocation StartLoc, 3149 Expr *Queried, 3150 SourceLocation RParenLoc) { 3151 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3152 } 3153 3154 /// Build a new (previously unresolved) declaration reference 3155 /// 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 RebuildDependentScopeDeclRefExpr( 3160 NestedNameSpecifierLoc QualifierLoc, 3161 SourceLocation TemplateKWLoc, 3162 const DeclarationNameInfo &NameInfo, 3163 const TemplateArgumentListInfo *TemplateArgs, 3164 bool IsAddressOfOperand, 3165 TypeSourceInfo **RecoveryTSI) { 3166 CXXScopeSpec SS; 3167 SS.Adopt(QualifierLoc); 3168 3169 if (TemplateArgs || TemplateKWLoc.isValid()) 3170 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3171 TemplateArgs); 3172 3173 return getSema().BuildQualifiedDeclarationNameExpr( 3174 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3175 } 3176 3177 /// Build a new template-id expression. 3178 /// 3179 /// By default, performs semantic analysis to build the new expression. 3180 /// Subclasses may override this routine to provide different behavior. 3181 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3182 SourceLocation TemplateKWLoc, 3183 LookupResult &R, 3184 bool RequiresADL, 3185 const TemplateArgumentListInfo *TemplateArgs) { 3186 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3187 TemplateArgs); 3188 } 3189 3190 /// Build a new object-construction expression. 3191 /// 3192 /// By default, performs semantic analysis to build the new expression. 3193 /// Subclasses may override this routine to provide different behavior. 3194 ExprResult RebuildCXXConstructExpr(QualType T, 3195 SourceLocation Loc, 3196 CXXConstructorDecl *Constructor, 3197 bool IsElidable, 3198 MultiExprArg Args, 3199 bool HadMultipleCandidates, 3200 bool ListInitialization, 3201 bool StdInitListInitialization, 3202 bool RequiresZeroInit, 3203 CXXConstructExpr::ConstructionKind ConstructKind, 3204 SourceRange ParenRange) { 3205 // Reconstruct the constructor we originally found, which might be 3206 // different if this is a call to an inherited constructor. 3207 CXXConstructorDecl *FoundCtor = Constructor; 3208 if (Constructor->isInheritingConstructor()) 3209 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3210 3211 SmallVector<Expr *, 8> ConvertedArgs; 3212 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3213 ConvertedArgs)) 3214 return ExprError(); 3215 3216 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3217 IsElidable, 3218 ConvertedArgs, 3219 HadMultipleCandidates, 3220 ListInitialization, 3221 StdInitListInitialization, 3222 RequiresZeroInit, ConstructKind, 3223 ParenRange); 3224 } 3225 3226 /// Build a new implicit construction via inherited constructor 3227 /// expression. 3228 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3229 CXXConstructorDecl *Constructor, 3230 bool ConstructsVBase, 3231 bool InheritedFromVBase) { 3232 return new (getSema().Context) CXXInheritedCtorInitExpr( 3233 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3234 } 3235 3236 /// Build a new object-construction expression. 3237 /// 3238 /// By default, performs semantic analysis to build the new expression. 3239 /// Subclasses may override this routine to provide different behavior. 3240 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3241 SourceLocation LParenOrBraceLoc, 3242 MultiExprArg Args, 3243 SourceLocation RParenOrBraceLoc, 3244 bool ListInitialization) { 3245 return getSema().BuildCXXTypeConstructExpr( 3246 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3247 } 3248 3249 /// Build a new object-construction expression. 3250 /// 3251 /// By default, performs semantic analysis to build the new expression. 3252 /// Subclasses may override this routine to provide different behavior. 3253 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3254 SourceLocation LParenLoc, 3255 MultiExprArg Args, 3256 SourceLocation RParenLoc, 3257 bool ListInitialization) { 3258 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3259 RParenLoc, ListInitialization); 3260 } 3261 3262 /// Build a new member reference expression. 3263 /// 3264 /// By default, performs semantic analysis to build the new expression. 3265 /// Subclasses may override this routine to provide different behavior. 3266 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3267 QualType BaseType, 3268 bool IsArrow, 3269 SourceLocation OperatorLoc, 3270 NestedNameSpecifierLoc QualifierLoc, 3271 SourceLocation TemplateKWLoc, 3272 NamedDecl *FirstQualifierInScope, 3273 const DeclarationNameInfo &MemberNameInfo, 3274 const TemplateArgumentListInfo *TemplateArgs) { 3275 CXXScopeSpec SS; 3276 SS.Adopt(QualifierLoc); 3277 3278 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3279 OperatorLoc, IsArrow, 3280 SS, TemplateKWLoc, 3281 FirstQualifierInScope, 3282 MemberNameInfo, 3283 TemplateArgs, /*S*/nullptr); 3284 } 3285 3286 /// Build a new member reference 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 RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3291 SourceLocation OperatorLoc, 3292 bool IsArrow, 3293 NestedNameSpecifierLoc QualifierLoc, 3294 SourceLocation TemplateKWLoc, 3295 NamedDecl *FirstQualifierInScope, 3296 LookupResult &R, 3297 const TemplateArgumentListInfo *TemplateArgs) { 3298 CXXScopeSpec SS; 3299 SS.Adopt(QualifierLoc); 3300 3301 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3302 OperatorLoc, IsArrow, 3303 SS, TemplateKWLoc, 3304 FirstQualifierInScope, 3305 R, TemplateArgs, /*S*/nullptr); 3306 } 3307 3308 /// Build a new noexcept expression. 3309 /// 3310 /// By default, performs semantic analysis to build the new expression. 3311 /// Subclasses may override this routine to provide different behavior. 3312 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3313 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3314 } 3315 3316 /// Build a new expression to compute the length of a parameter pack. 3317 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3318 NamedDecl *Pack, 3319 SourceLocation PackLoc, 3320 SourceLocation RParenLoc, 3321 Optional<unsigned> Length, 3322 ArrayRef<TemplateArgument> PartialArgs) { 3323 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3324 RParenLoc, Length, PartialArgs); 3325 } 3326 3327 /// Build a new expression representing a call to a source location 3328 /// builtin. 3329 /// 3330 /// By default, performs semantic analysis to build the new expression. 3331 /// Subclasses may override this routine to provide different behavior. 3332 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3333 SourceLocation BuiltinLoc, 3334 SourceLocation RPLoc, 3335 DeclContext *ParentContext) { 3336 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3337 } 3338 3339 /// Build a new Objective-C boxed expression. 3340 /// 3341 /// By default, performs semantic analysis to build the new expression. 3342 /// Subclasses may override this routine to provide different behavior. 3343 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3344 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3345 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3346 TemplateArgumentListInfo *TALI) { 3347 CXXScopeSpec SS; 3348 SS.Adopt(NNS); 3349 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3350 ConceptNameInfo, 3351 FoundDecl, 3352 NamedConcept, TALI); 3353 if (Result.isInvalid()) 3354 return ExprError(); 3355 return Result; 3356 } 3357 3358 /// \brief Build a new requires expression. 3359 /// 3360 /// By default, performs semantic analysis to build the new expression. 3361 /// Subclasses may override this routine to provide different behavior. 3362 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3363 RequiresExprBodyDecl *Body, 3364 ArrayRef<ParmVarDecl *> LocalParameters, 3365 ArrayRef<concepts::Requirement *> Requirements, 3366 SourceLocation ClosingBraceLoc) { 3367 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3368 LocalParameters, Requirements, ClosingBraceLoc); 3369 } 3370 3371 concepts::TypeRequirement * 3372 RebuildTypeRequirement( 3373 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3374 return SemaRef.BuildTypeRequirement(SubstDiag); 3375 } 3376 3377 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3378 return SemaRef.BuildTypeRequirement(T); 3379 } 3380 3381 concepts::ExprRequirement * 3382 RebuildExprRequirement( 3383 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3384 SourceLocation NoexceptLoc, 3385 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3386 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3387 std::move(Ret)); 3388 } 3389 3390 concepts::ExprRequirement * 3391 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3392 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3393 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3394 std::move(Ret)); 3395 } 3396 3397 concepts::NestedRequirement * 3398 RebuildNestedRequirement( 3399 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3400 return SemaRef.BuildNestedRequirement(SubstDiag); 3401 } 3402 3403 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3404 return SemaRef.BuildNestedRequirement(Constraint); 3405 } 3406 3407 /// \brief Build a new Objective-C boxed expression. 3408 /// 3409 /// By default, performs semantic analysis to build the new expression. 3410 /// Subclasses may override this routine to provide different behavior. 3411 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3412 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3413 } 3414 3415 /// Build a new Objective-C array literal. 3416 /// 3417 /// By default, performs semantic analysis to build the new expression. 3418 /// Subclasses may override this routine to provide different behavior. 3419 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3420 Expr **Elements, unsigned NumElements) { 3421 return getSema().BuildObjCArrayLiteral(Range, 3422 MultiExprArg(Elements, NumElements)); 3423 } 3424 3425 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3426 Expr *Base, Expr *Key, 3427 ObjCMethodDecl *getterMethod, 3428 ObjCMethodDecl *setterMethod) { 3429 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3430 getterMethod, setterMethod); 3431 } 3432 3433 /// Build a new Objective-C dictionary literal. 3434 /// 3435 /// By default, performs semantic analysis to build the new expression. 3436 /// Subclasses may override this routine to provide different behavior. 3437 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3438 MutableArrayRef<ObjCDictionaryElement> Elements) { 3439 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3440 } 3441 3442 /// Build a new Objective-C \@encode expression. 3443 /// 3444 /// By default, performs semantic analysis to build the new expression. 3445 /// Subclasses may override this routine to provide different behavior. 3446 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3447 TypeSourceInfo *EncodeTypeInfo, 3448 SourceLocation RParenLoc) { 3449 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3450 } 3451 3452 /// Build a new Objective-C class message. 3453 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3454 Selector Sel, 3455 ArrayRef<SourceLocation> SelectorLocs, 3456 ObjCMethodDecl *Method, 3457 SourceLocation LBracLoc, 3458 MultiExprArg Args, 3459 SourceLocation RBracLoc) { 3460 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3461 ReceiverTypeInfo->getType(), 3462 /*SuperLoc=*/SourceLocation(), 3463 Sel, Method, LBracLoc, SelectorLocs, 3464 RBracLoc, Args); 3465 } 3466 3467 /// Build a new Objective-C instance message. 3468 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3469 Selector Sel, 3470 ArrayRef<SourceLocation> SelectorLocs, 3471 ObjCMethodDecl *Method, 3472 SourceLocation LBracLoc, 3473 MultiExprArg Args, 3474 SourceLocation RBracLoc) { 3475 return SemaRef.BuildInstanceMessage(Receiver, 3476 Receiver->getType(), 3477 /*SuperLoc=*/SourceLocation(), 3478 Sel, Method, LBracLoc, SelectorLocs, 3479 RBracLoc, Args); 3480 } 3481 3482 /// Build a new Objective-C instance/class message to 'super'. 3483 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3484 Selector Sel, 3485 ArrayRef<SourceLocation> SelectorLocs, 3486 QualType SuperType, 3487 ObjCMethodDecl *Method, 3488 SourceLocation LBracLoc, 3489 MultiExprArg Args, 3490 SourceLocation RBracLoc) { 3491 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3492 SuperType, 3493 SuperLoc, 3494 Sel, Method, LBracLoc, SelectorLocs, 3495 RBracLoc, Args) 3496 : SemaRef.BuildClassMessage(nullptr, 3497 SuperType, 3498 SuperLoc, 3499 Sel, Method, LBracLoc, SelectorLocs, 3500 RBracLoc, Args); 3501 3502 3503 } 3504 3505 /// Build a new Objective-C ivar reference expression. 3506 /// 3507 /// By default, performs semantic analysis to build the new expression. 3508 /// Subclasses may override this routine to provide different behavior. 3509 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3510 SourceLocation IvarLoc, 3511 bool IsArrow, bool IsFreeIvar) { 3512 CXXScopeSpec SS; 3513 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3514 ExprResult Result = getSema().BuildMemberReferenceExpr( 3515 BaseArg, BaseArg->getType(), 3516 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3517 /*FirstQualifierInScope=*/nullptr, NameInfo, 3518 /*TemplateArgs=*/nullptr, 3519 /*S=*/nullptr); 3520 if (IsFreeIvar && Result.isUsable()) 3521 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3522 return Result; 3523 } 3524 3525 /// Build a new Objective-C property reference expression. 3526 /// 3527 /// By default, performs semantic analysis to build the new expression. 3528 /// Subclasses may override this routine to provide different behavior. 3529 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3530 ObjCPropertyDecl *Property, 3531 SourceLocation PropertyLoc) { 3532 CXXScopeSpec SS; 3533 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3534 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3535 /*FIXME:*/PropertyLoc, 3536 /*IsArrow=*/false, 3537 SS, SourceLocation(), 3538 /*FirstQualifierInScope=*/nullptr, 3539 NameInfo, 3540 /*TemplateArgs=*/nullptr, 3541 /*S=*/nullptr); 3542 } 3543 3544 /// Build a new Objective-C property reference expression. 3545 /// 3546 /// By default, performs semantic analysis to build the new expression. 3547 /// Subclasses may override this routine to provide different behavior. 3548 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3549 ObjCMethodDecl *Getter, 3550 ObjCMethodDecl *Setter, 3551 SourceLocation PropertyLoc) { 3552 // Since these expressions can only be value-dependent, we do not 3553 // need to perform semantic analysis again. 3554 return Owned( 3555 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3556 VK_LValue, OK_ObjCProperty, 3557 PropertyLoc, Base)); 3558 } 3559 3560 /// Build a new Objective-C "isa" expression. 3561 /// 3562 /// By default, performs semantic analysis to build the new expression. 3563 /// Subclasses may override this routine to provide different behavior. 3564 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3565 SourceLocation OpLoc, bool IsArrow) { 3566 CXXScopeSpec SS; 3567 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3568 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3569 OpLoc, IsArrow, 3570 SS, SourceLocation(), 3571 /*FirstQualifierInScope=*/nullptr, 3572 NameInfo, 3573 /*TemplateArgs=*/nullptr, 3574 /*S=*/nullptr); 3575 } 3576 3577 /// Build a new shuffle vector expression. 3578 /// 3579 /// By default, performs semantic analysis to build the new expression. 3580 /// Subclasses may override this routine to provide different behavior. 3581 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3582 MultiExprArg SubExprs, 3583 SourceLocation RParenLoc) { 3584 // Find the declaration for __builtin_shufflevector 3585 const IdentifierInfo &Name 3586 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3587 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3588 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3589 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3590 3591 // Build a reference to the __builtin_shufflevector builtin 3592 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3593 Expr *Callee = new (SemaRef.Context) 3594 DeclRefExpr(SemaRef.Context, Builtin, false, 3595 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3596 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3597 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3598 CK_BuiltinFnToFnPtr).get(); 3599 3600 // Build the CallExpr 3601 ExprResult TheCall = CallExpr::Create( 3602 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3603 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3604 FPOptionsOverride()); 3605 3606 // Type-check the __builtin_shufflevector expression. 3607 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3608 } 3609 3610 /// Build a new convert vector expression. 3611 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3612 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3613 SourceLocation RParenLoc) { 3614 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3615 BuiltinLoc, RParenLoc); 3616 } 3617 3618 /// Build a new template argument pack expansion. 3619 /// 3620 /// By default, performs semantic analysis to build a new pack expansion 3621 /// for a template argument. Subclasses may override this routine to provide 3622 /// different behavior. 3623 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3624 SourceLocation EllipsisLoc, 3625 Optional<unsigned> NumExpansions) { 3626 switch (Pattern.getArgument().getKind()) { 3627 case TemplateArgument::Expression: { 3628 ExprResult Result 3629 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3630 EllipsisLoc, NumExpansions); 3631 if (Result.isInvalid()) 3632 return TemplateArgumentLoc(); 3633 3634 return TemplateArgumentLoc(Result.get(), Result.get()); 3635 } 3636 3637 case TemplateArgument::Template: 3638 return TemplateArgumentLoc( 3639 SemaRef.Context, 3640 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3641 NumExpansions), 3642 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3643 EllipsisLoc); 3644 3645 case TemplateArgument::Null: 3646 case TemplateArgument::Integral: 3647 case TemplateArgument::Declaration: 3648 case TemplateArgument::Pack: 3649 case TemplateArgument::TemplateExpansion: 3650 case TemplateArgument::NullPtr: 3651 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3652 3653 case TemplateArgument::Type: 3654 if (TypeSourceInfo *Expansion 3655 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3656 EllipsisLoc, 3657 NumExpansions)) 3658 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3659 Expansion); 3660 break; 3661 } 3662 3663 return TemplateArgumentLoc(); 3664 } 3665 3666 /// Build a new expression pack expansion. 3667 /// 3668 /// By default, performs semantic analysis to build a new pack expansion 3669 /// for an expression. Subclasses may override this routine to provide 3670 /// different behavior. 3671 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3672 Optional<unsigned> NumExpansions) { 3673 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3674 } 3675 3676 /// Build a new C++1z fold-expression. 3677 /// 3678 /// By default, performs semantic analysis in order to build a new fold 3679 /// expression. 3680 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3681 SourceLocation LParenLoc, Expr *LHS, 3682 BinaryOperatorKind Operator, 3683 SourceLocation EllipsisLoc, Expr *RHS, 3684 SourceLocation RParenLoc, 3685 Optional<unsigned> NumExpansions) { 3686 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3687 EllipsisLoc, RHS, RParenLoc, 3688 NumExpansions); 3689 } 3690 3691 /// Build an empty C++1z fold-expression with the given operator. 3692 /// 3693 /// By default, produces the fallback value for the fold-expression, or 3694 /// produce an error if there is no fallback value. 3695 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3696 BinaryOperatorKind Operator) { 3697 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3698 } 3699 3700 /// Build a new atomic operation expression. 3701 /// 3702 /// By default, performs semantic analysis to build the new expression. 3703 /// Subclasses may override this routine to provide different behavior. 3704 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3705 AtomicExpr::AtomicOp Op, 3706 SourceLocation RParenLoc) { 3707 // Use this for all of the locations, since we don't know the difference 3708 // between the call and the expr at this point. 3709 SourceRange Range{BuiltinLoc, RParenLoc}; 3710 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3711 Sema::AtomicArgumentOrder::AST); 3712 } 3713 3714 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3715 ArrayRef<Expr *> SubExprs, QualType Type) { 3716 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3717 } 3718 3719 private: 3720 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3721 QualType ObjectType, 3722 NamedDecl *FirstQualifierInScope, 3723 CXXScopeSpec &SS); 3724 3725 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3726 QualType ObjectType, 3727 NamedDecl *FirstQualifierInScope, 3728 CXXScopeSpec &SS); 3729 3730 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3731 NamedDecl *FirstQualifierInScope, 3732 CXXScopeSpec &SS); 3733 3734 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3735 DependentNameTypeLoc TL, 3736 bool DeducibleTSTContext); 3737 }; 3738 3739 template <typename Derived> 3740 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3741 if (!S) 3742 return S; 3743 3744 switch (S->getStmtClass()) { 3745 case Stmt::NoStmtClass: break; 3746 3747 // Transform individual statement nodes 3748 // Pass SDK into statements that can produce a value 3749 #define STMT(Node, Parent) \ 3750 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3751 #define VALUESTMT(Node, Parent) \ 3752 case Stmt::Node##Class: \ 3753 return getDerived().Transform##Node(cast<Node>(S), SDK); 3754 #define ABSTRACT_STMT(Node) 3755 #define EXPR(Node, Parent) 3756 #include "clang/AST/StmtNodes.inc" 3757 3758 // Transform expressions by calling TransformExpr. 3759 #define STMT(Node, Parent) 3760 #define ABSTRACT_STMT(Stmt) 3761 #define EXPR(Node, Parent) case Stmt::Node##Class: 3762 #include "clang/AST/StmtNodes.inc" 3763 { 3764 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3765 3766 if (SDK == SDK_StmtExprResult) 3767 E = getSema().ActOnStmtExprResult(E); 3768 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3769 } 3770 } 3771 3772 return S; 3773 } 3774 3775 template<typename Derived> 3776 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3777 if (!S) 3778 return S; 3779 3780 switch (S->getClauseKind()) { 3781 default: break; 3782 // Transform individual clause nodes 3783 #define GEN_CLANG_CLAUSE_CLASS 3784 #define CLAUSE_CLASS(Enum, Str, Class) \ 3785 case Enum: \ 3786 return getDerived().Transform##Class(cast<Class>(S)); 3787 #include "llvm/Frontend/OpenMP/OMP.inc" 3788 } 3789 3790 return S; 3791 } 3792 3793 3794 template<typename Derived> 3795 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3796 if (!E) 3797 return E; 3798 3799 switch (E->getStmtClass()) { 3800 case Stmt::NoStmtClass: break; 3801 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3802 #define ABSTRACT_STMT(Stmt) 3803 #define EXPR(Node, Parent) \ 3804 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3805 #include "clang/AST/StmtNodes.inc" 3806 } 3807 3808 return E; 3809 } 3810 3811 template<typename Derived> 3812 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3813 bool NotCopyInit) { 3814 // Initializers are instantiated like expressions, except that various outer 3815 // layers are stripped. 3816 if (!Init) 3817 return Init; 3818 3819 if (auto *FE = dyn_cast<FullExpr>(Init)) 3820 Init = FE->getSubExpr(); 3821 3822 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3823 Init = AIL->getCommonExpr(); 3824 3825 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3826 Init = MTE->getSubExpr(); 3827 3828 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3829 Init = Binder->getSubExpr(); 3830 3831 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3832 Init = ICE->getSubExprAsWritten(); 3833 3834 if (CXXStdInitializerListExpr *ILE = 3835 dyn_cast<CXXStdInitializerListExpr>(Init)) 3836 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3837 3838 // If this is copy-initialization, we only need to reconstruct 3839 // InitListExprs. Other forms of copy-initialization will be a no-op if 3840 // the initializer is already the right type. 3841 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3842 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3843 return getDerived().TransformExpr(Init); 3844 3845 // Revert value-initialization back to empty parens. 3846 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3847 SourceRange Parens = VIE->getSourceRange(); 3848 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3849 Parens.getEnd()); 3850 } 3851 3852 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3853 if (isa<ImplicitValueInitExpr>(Init)) 3854 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3855 SourceLocation()); 3856 3857 // Revert initialization by constructor back to a parenthesized or braced list 3858 // of expressions. Any other form of initializer can just be reused directly. 3859 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3860 return getDerived().TransformExpr(Init); 3861 3862 // If the initialization implicitly converted an initializer list to a 3863 // std::initializer_list object, unwrap the std::initializer_list too. 3864 if (Construct && Construct->isStdInitListInitialization()) 3865 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3866 3867 // Enter a list-init context if this was list initialization. 3868 EnterExpressionEvaluationContext Context( 3869 getSema(), EnterExpressionEvaluationContext::InitList, 3870 Construct->isListInitialization()); 3871 3872 SmallVector<Expr*, 8> NewArgs; 3873 bool ArgChanged = false; 3874 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3875 /*IsCall*/true, NewArgs, &ArgChanged)) 3876 return ExprError(); 3877 3878 // If this was list initialization, revert to syntactic list form. 3879 if (Construct->isListInitialization()) 3880 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3881 Construct->getEndLoc()); 3882 3883 // Build a ParenListExpr to represent anything else. 3884 SourceRange Parens = Construct->getParenOrBraceRange(); 3885 if (Parens.isInvalid()) { 3886 // This was a variable declaration's initialization for which no initializer 3887 // was specified. 3888 assert(NewArgs.empty() && 3889 "no parens or braces but have direct init with arguments?"); 3890 return ExprEmpty(); 3891 } 3892 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3893 Parens.getEnd()); 3894 } 3895 3896 template<typename Derived> 3897 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3898 unsigned NumInputs, 3899 bool IsCall, 3900 SmallVectorImpl<Expr *> &Outputs, 3901 bool *ArgChanged) { 3902 for (unsigned I = 0; I != NumInputs; ++I) { 3903 // If requested, drop call arguments that need to be dropped. 3904 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3905 if (ArgChanged) 3906 *ArgChanged = true; 3907 3908 break; 3909 } 3910 3911 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3912 Expr *Pattern = Expansion->getPattern(); 3913 3914 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3915 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3916 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3917 3918 // Determine whether the set of unexpanded parameter packs can and should 3919 // be expanded. 3920 bool Expand = true; 3921 bool RetainExpansion = false; 3922 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3923 Optional<unsigned> NumExpansions = OrigNumExpansions; 3924 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3925 Pattern->getSourceRange(), 3926 Unexpanded, 3927 Expand, RetainExpansion, 3928 NumExpansions)) 3929 return true; 3930 3931 if (!Expand) { 3932 // The transform has determined that we should perform a simple 3933 // transformation on the pack expansion, producing another pack 3934 // expansion. 3935 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3936 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3937 if (OutPattern.isInvalid()) 3938 return true; 3939 3940 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3941 Expansion->getEllipsisLoc(), 3942 NumExpansions); 3943 if (Out.isInvalid()) 3944 return true; 3945 3946 if (ArgChanged) 3947 *ArgChanged = true; 3948 Outputs.push_back(Out.get()); 3949 continue; 3950 } 3951 3952 // Record right away that the argument was changed. This needs 3953 // to happen even if the array expands to nothing. 3954 if (ArgChanged) *ArgChanged = true; 3955 3956 // The transform has determined that we should perform an elementwise 3957 // expansion of the pattern. Do so. 3958 for (unsigned I = 0; I != *NumExpansions; ++I) { 3959 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3960 ExprResult Out = getDerived().TransformExpr(Pattern); 3961 if (Out.isInvalid()) 3962 return true; 3963 3964 if (Out.get()->containsUnexpandedParameterPack()) { 3965 Out = getDerived().RebuildPackExpansion( 3966 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3967 if (Out.isInvalid()) 3968 return true; 3969 } 3970 3971 Outputs.push_back(Out.get()); 3972 } 3973 3974 // If we're supposed to retain a pack expansion, do so by temporarily 3975 // forgetting the partially-substituted parameter pack. 3976 if (RetainExpansion) { 3977 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3978 3979 ExprResult Out = getDerived().TransformExpr(Pattern); 3980 if (Out.isInvalid()) 3981 return true; 3982 3983 Out = getDerived().RebuildPackExpansion( 3984 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3985 if (Out.isInvalid()) 3986 return true; 3987 3988 Outputs.push_back(Out.get()); 3989 } 3990 3991 continue; 3992 } 3993 3994 ExprResult Result = 3995 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3996 : getDerived().TransformExpr(Inputs[I]); 3997 if (Result.isInvalid()) 3998 return true; 3999 4000 if (Result.get() != Inputs[I] && ArgChanged) 4001 *ArgChanged = true; 4002 4003 Outputs.push_back(Result.get()); 4004 } 4005 4006 return false; 4007 } 4008 4009 template <typename Derived> 4010 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4011 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4012 if (Var) { 4013 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4014 getDerived().TransformDefinition(Var->getLocation(), Var)); 4015 4016 if (!ConditionVar) 4017 return Sema::ConditionError(); 4018 4019 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4020 } 4021 4022 if (Expr) { 4023 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4024 4025 if (CondExpr.isInvalid()) 4026 return Sema::ConditionError(); 4027 4028 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 4029 } 4030 4031 return Sema::ConditionResult(); 4032 } 4033 4034 template<typename Derived> 4035 NestedNameSpecifierLoc 4036 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4037 NestedNameSpecifierLoc NNS, 4038 QualType ObjectType, 4039 NamedDecl *FirstQualifierInScope) { 4040 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4041 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4042 Qualifier = Qualifier.getPrefix()) 4043 Qualifiers.push_back(Qualifier); 4044 4045 CXXScopeSpec SS; 4046 while (!Qualifiers.empty()) { 4047 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4048 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4049 4050 switch (QNNS->getKind()) { 4051 case NestedNameSpecifier::Identifier: { 4052 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4053 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 4054 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4055 SS, FirstQualifierInScope, false)) 4056 return NestedNameSpecifierLoc(); 4057 } 4058 break; 4059 4060 case NestedNameSpecifier::Namespace: { 4061 NamespaceDecl *NS 4062 = cast_or_null<NamespaceDecl>( 4063 getDerived().TransformDecl( 4064 Q.getLocalBeginLoc(), 4065 QNNS->getAsNamespace())); 4066 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4067 break; 4068 } 4069 4070 case NestedNameSpecifier::NamespaceAlias: { 4071 NamespaceAliasDecl *Alias 4072 = cast_or_null<NamespaceAliasDecl>( 4073 getDerived().TransformDecl(Q.getLocalBeginLoc(), 4074 QNNS->getAsNamespaceAlias())); 4075 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4076 Q.getLocalEndLoc()); 4077 break; 4078 } 4079 4080 case NestedNameSpecifier::Global: 4081 // There is no meaningful transformation that one could perform on the 4082 // global scope. 4083 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4084 break; 4085 4086 case NestedNameSpecifier::Super: { 4087 CXXRecordDecl *RD = 4088 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4089 SourceLocation(), QNNS->getAsRecordDecl())); 4090 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4091 break; 4092 } 4093 4094 case NestedNameSpecifier::TypeSpecWithTemplate: 4095 case NestedNameSpecifier::TypeSpec: { 4096 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4097 FirstQualifierInScope, SS); 4098 4099 if (!TL) 4100 return NestedNameSpecifierLoc(); 4101 4102 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4103 (SemaRef.getLangOpts().CPlusPlus11 && 4104 TL.getType()->isEnumeralType())) { 4105 assert(!TL.getType().hasLocalQualifiers() && 4106 "Can't get cv-qualifiers here"); 4107 if (TL.getType()->isEnumeralType()) 4108 SemaRef.Diag(TL.getBeginLoc(), 4109 diag::warn_cxx98_compat_enum_nested_name_spec); 4110 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 4111 Q.getLocalEndLoc()); 4112 break; 4113 } 4114 // If the nested-name-specifier is an invalid type def, don't emit an 4115 // error because a previous error should have already been emitted. 4116 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4117 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4118 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4119 << TL.getType() << SS.getRange(); 4120 } 4121 return NestedNameSpecifierLoc(); 4122 } 4123 } 4124 4125 // The qualifier-in-scope and object type only apply to the leftmost entity. 4126 FirstQualifierInScope = nullptr; 4127 ObjectType = QualType(); 4128 } 4129 4130 // Don't rebuild the nested-name-specifier if we don't have to. 4131 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4132 !getDerived().AlwaysRebuild()) 4133 return NNS; 4134 4135 // If we can re-use the source-location data from the original 4136 // nested-name-specifier, do so. 4137 if (SS.location_size() == NNS.getDataLength() && 4138 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4139 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4140 4141 // Allocate new nested-name-specifier location information. 4142 return SS.getWithLocInContext(SemaRef.Context); 4143 } 4144 4145 template<typename Derived> 4146 DeclarationNameInfo 4147 TreeTransform<Derived> 4148 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4149 DeclarationName Name = NameInfo.getName(); 4150 if (!Name) 4151 return DeclarationNameInfo(); 4152 4153 switch (Name.getNameKind()) { 4154 case DeclarationName::Identifier: 4155 case DeclarationName::ObjCZeroArgSelector: 4156 case DeclarationName::ObjCOneArgSelector: 4157 case DeclarationName::ObjCMultiArgSelector: 4158 case DeclarationName::CXXOperatorName: 4159 case DeclarationName::CXXLiteralOperatorName: 4160 case DeclarationName::CXXUsingDirective: 4161 return NameInfo; 4162 4163 case DeclarationName::CXXDeductionGuideName: { 4164 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4165 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4166 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4167 if (!NewTemplate) 4168 return DeclarationNameInfo(); 4169 4170 DeclarationNameInfo NewNameInfo(NameInfo); 4171 NewNameInfo.setName( 4172 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4173 return NewNameInfo; 4174 } 4175 4176 case DeclarationName::CXXConstructorName: 4177 case DeclarationName::CXXDestructorName: 4178 case DeclarationName::CXXConversionFunctionName: { 4179 TypeSourceInfo *NewTInfo; 4180 CanQualType NewCanTy; 4181 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4182 NewTInfo = getDerived().TransformType(OldTInfo); 4183 if (!NewTInfo) 4184 return DeclarationNameInfo(); 4185 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4186 } 4187 else { 4188 NewTInfo = nullptr; 4189 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4190 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4191 if (NewT.isNull()) 4192 return DeclarationNameInfo(); 4193 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4194 } 4195 4196 DeclarationName NewName 4197 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4198 NewCanTy); 4199 DeclarationNameInfo NewNameInfo(NameInfo); 4200 NewNameInfo.setName(NewName); 4201 NewNameInfo.setNamedTypeInfo(NewTInfo); 4202 return NewNameInfo; 4203 } 4204 } 4205 4206 llvm_unreachable("Unknown name kind."); 4207 } 4208 4209 template<typename Derived> 4210 TemplateName 4211 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4212 TemplateName Name, 4213 SourceLocation NameLoc, 4214 QualType ObjectType, 4215 NamedDecl *FirstQualifierInScope, 4216 bool AllowInjectedClassName) { 4217 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4218 TemplateDecl *Template = QTN->getTemplateDecl(); 4219 assert(Template && "qualified template name must refer to a template"); 4220 4221 TemplateDecl *TransTemplate 4222 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4223 Template)); 4224 if (!TransTemplate) 4225 return TemplateName(); 4226 4227 if (!getDerived().AlwaysRebuild() && 4228 SS.getScopeRep() == QTN->getQualifier() && 4229 TransTemplate == Template) 4230 return Name; 4231 4232 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4233 TransTemplate); 4234 } 4235 4236 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4237 if (SS.getScopeRep()) { 4238 // These apply to the scope specifier, not the template. 4239 ObjectType = QualType(); 4240 FirstQualifierInScope = nullptr; 4241 } 4242 4243 if (!getDerived().AlwaysRebuild() && 4244 SS.getScopeRep() == DTN->getQualifier() && 4245 ObjectType.isNull()) 4246 return Name; 4247 4248 // FIXME: Preserve the location of the "template" keyword. 4249 SourceLocation TemplateKWLoc = NameLoc; 4250 4251 if (DTN->isIdentifier()) { 4252 return getDerived().RebuildTemplateName(SS, 4253 TemplateKWLoc, 4254 *DTN->getIdentifier(), 4255 NameLoc, 4256 ObjectType, 4257 FirstQualifierInScope, 4258 AllowInjectedClassName); 4259 } 4260 4261 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4262 DTN->getOperator(), NameLoc, 4263 ObjectType, AllowInjectedClassName); 4264 } 4265 4266 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4267 TemplateDecl *TransTemplate 4268 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4269 Template)); 4270 if (!TransTemplate) 4271 return TemplateName(); 4272 4273 if (!getDerived().AlwaysRebuild() && 4274 TransTemplate == Template) 4275 return Name; 4276 4277 return TemplateName(TransTemplate); 4278 } 4279 4280 if (SubstTemplateTemplateParmPackStorage *SubstPack 4281 = Name.getAsSubstTemplateTemplateParmPack()) { 4282 TemplateTemplateParmDecl *TransParam 4283 = cast_or_null<TemplateTemplateParmDecl>( 4284 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4285 if (!TransParam) 4286 return TemplateName(); 4287 4288 if (!getDerived().AlwaysRebuild() && 4289 TransParam == SubstPack->getParameterPack()) 4290 return Name; 4291 4292 return getDerived().RebuildTemplateName(TransParam, 4293 SubstPack->getArgumentPack()); 4294 } 4295 4296 // These should be getting filtered out before they reach the AST. 4297 llvm_unreachable("overloaded function decl survived to here"); 4298 } 4299 4300 template<typename Derived> 4301 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4302 const TemplateArgument &Arg, 4303 TemplateArgumentLoc &Output) { 4304 Output = getSema().getTrivialTemplateArgumentLoc( 4305 Arg, QualType(), getDerived().getBaseLocation()); 4306 } 4307 4308 template<typename Derived> 4309 bool TreeTransform<Derived>::TransformTemplateArgument( 4310 const TemplateArgumentLoc &Input, 4311 TemplateArgumentLoc &Output, bool Uneval) { 4312 const TemplateArgument &Arg = Input.getArgument(); 4313 switch (Arg.getKind()) { 4314 case TemplateArgument::Null: 4315 case TemplateArgument::Pack: 4316 llvm_unreachable("Unexpected TemplateArgument"); 4317 4318 case TemplateArgument::Integral: 4319 case TemplateArgument::NullPtr: 4320 case TemplateArgument::Declaration: { 4321 // Transform a resolved template argument straight to a resolved template 4322 // argument. We get here when substituting into an already-substituted 4323 // template type argument during concept satisfaction checking. 4324 QualType T = Arg.getNonTypeTemplateArgumentType(); 4325 QualType NewT = getDerived().TransformType(T); 4326 if (NewT.isNull()) 4327 return true; 4328 4329 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4330 ? Arg.getAsDecl() 4331 : nullptr; 4332 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4333 getDerived().getBaseLocation(), D)) 4334 : nullptr; 4335 if (D && !NewD) 4336 return true; 4337 4338 if (NewT == T && D == NewD) 4339 Output = Input; 4340 else if (Arg.getKind() == TemplateArgument::Integral) 4341 Output = TemplateArgumentLoc( 4342 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4343 TemplateArgumentLocInfo()); 4344 else if (Arg.getKind() == TemplateArgument::NullPtr) 4345 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4346 TemplateArgumentLocInfo()); 4347 else 4348 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4349 TemplateArgumentLocInfo()); 4350 4351 return false; 4352 } 4353 4354 case TemplateArgument::Type: { 4355 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4356 if (!DI) 4357 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4358 4359 DI = getDerived().TransformType(DI); 4360 if (!DI) return true; 4361 4362 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4363 return false; 4364 } 4365 4366 case TemplateArgument::Template: { 4367 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4368 if (QualifierLoc) { 4369 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4370 if (!QualifierLoc) 4371 return true; 4372 } 4373 4374 CXXScopeSpec SS; 4375 SS.Adopt(QualifierLoc); 4376 TemplateName Template 4377 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4378 Input.getTemplateNameLoc()); 4379 if (Template.isNull()) 4380 return true; 4381 4382 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4383 QualifierLoc, Input.getTemplateNameLoc()); 4384 return false; 4385 } 4386 4387 case TemplateArgument::TemplateExpansion: 4388 llvm_unreachable("Caller should expand pack expansions"); 4389 4390 case TemplateArgument::Expression: { 4391 // Template argument expressions are constant expressions. 4392 EnterExpressionEvaluationContext Unevaluated( 4393 getSema(), 4394 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4395 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4396 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4397 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4398 4399 Expr *InputExpr = Input.getSourceExpression(); 4400 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4401 4402 ExprResult E = getDerived().TransformExpr(InputExpr); 4403 E = SemaRef.ActOnConstantExpression(E); 4404 if (E.isInvalid()) return true; 4405 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4406 return false; 4407 } 4408 } 4409 4410 // Work around bogus GCC warning 4411 return true; 4412 } 4413 4414 /// Iterator adaptor that invents template argument location information 4415 /// for each of the template arguments in its underlying iterator. 4416 template<typename Derived, typename InputIterator> 4417 class TemplateArgumentLocInventIterator { 4418 TreeTransform<Derived> &Self; 4419 InputIterator Iter; 4420 4421 public: 4422 typedef TemplateArgumentLoc value_type; 4423 typedef TemplateArgumentLoc reference; 4424 typedef typename std::iterator_traits<InputIterator>::difference_type 4425 difference_type; 4426 typedef std::input_iterator_tag iterator_category; 4427 4428 class pointer { 4429 TemplateArgumentLoc Arg; 4430 4431 public: 4432 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4433 4434 const TemplateArgumentLoc *operator->() const { return &Arg; } 4435 }; 4436 4437 TemplateArgumentLocInventIterator() { } 4438 4439 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4440 InputIterator Iter) 4441 : Self(Self), Iter(Iter) { } 4442 4443 TemplateArgumentLocInventIterator &operator++() { 4444 ++Iter; 4445 return *this; 4446 } 4447 4448 TemplateArgumentLocInventIterator operator++(int) { 4449 TemplateArgumentLocInventIterator Old(*this); 4450 ++(*this); 4451 return Old; 4452 } 4453 4454 reference operator*() const { 4455 TemplateArgumentLoc Result; 4456 Self.InventTemplateArgumentLoc(*Iter, Result); 4457 return Result; 4458 } 4459 4460 pointer operator->() const { return pointer(**this); } 4461 4462 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4463 const TemplateArgumentLocInventIterator &Y) { 4464 return X.Iter == Y.Iter; 4465 } 4466 4467 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4468 const TemplateArgumentLocInventIterator &Y) { 4469 return X.Iter != Y.Iter; 4470 } 4471 }; 4472 4473 template<typename Derived> 4474 template<typename InputIterator> 4475 bool TreeTransform<Derived>::TransformTemplateArguments( 4476 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4477 bool Uneval) { 4478 for (; First != Last; ++First) { 4479 TemplateArgumentLoc Out; 4480 TemplateArgumentLoc In = *First; 4481 4482 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4483 // Unpack argument packs, which we translate them into separate 4484 // arguments. 4485 // FIXME: We could do much better if we could guarantee that the 4486 // TemplateArgumentLocInfo for the pack expansion would be usable for 4487 // all of the template arguments in the argument pack. 4488 typedef TemplateArgumentLocInventIterator<Derived, 4489 TemplateArgument::pack_iterator> 4490 PackLocIterator; 4491 if (TransformTemplateArguments(PackLocIterator(*this, 4492 In.getArgument().pack_begin()), 4493 PackLocIterator(*this, 4494 In.getArgument().pack_end()), 4495 Outputs, Uneval)) 4496 return true; 4497 4498 continue; 4499 } 4500 4501 if (In.getArgument().isPackExpansion()) { 4502 // We have a pack expansion, for which we will be substituting into 4503 // the pattern. 4504 SourceLocation Ellipsis; 4505 Optional<unsigned> OrigNumExpansions; 4506 TemplateArgumentLoc Pattern 4507 = getSema().getTemplateArgumentPackExpansionPattern( 4508 In, Ellipsis, OrigNumExpansions); 4509 4510 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4511 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4512 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4513 4514 // Determine whether the set of unexpanded parameter packs can and should 4515 // be expanded. 4516 bool Expand = true; 4517 bool RetainExpansion = false; 4518 Optional<unsigned> NumExpansions = OrigNumExpansions; 4519 if (getDerived().TryExpandParameterPacks(Ellipsis, 4520 Pattern.getSourceRange(), 4521 Unexpanded, 4522 Expand, 4523 RetainExpansion, 4524 NumExpansions)) 4525 return true; 4526 4527 if (!Expand) { 4528 // The transform has determined that we should perform a simple 4529 // transformation on the pack expansion, producing another pack 4530 // expansion. 4531 TemplateArgumentLoc OutPattern; 4532 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4533 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4534 return true; 4535 4536 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4537 NumExpansions); 4538 if (Out.getArgument().isNull()) 4539 return true; 4540 4541 Outputs.addArgument(Out); 4542 continue; 4543 } 4544 4545 // The transform has determined that we should perform an elementwise 4546 // expansion of the pattern. Do so. 4547 for (unsigned I = 0; I != *NumExpansions; ++I) { 4548 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4549 4550 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4551 return true; 4552 4553 if (Out.getArgument().containsUnexpandedParameterPack()) { 4554 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4555 OrigNumExpansions); 4556 if (Out.getArgument().isNull()) 4557 return true; 4558 } 4559 4560 Outputs.addArgument(Out); 4561 } 4562 4563 // If we're supposed to retain a pack expansion, do so by temporarily 4564 // forgetting the partially-substituted parameter pack. 4565 if (RetainExpansion) { 4566 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4567 4568 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4569 return true; 4570 4571 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4572 OrigNumExpansions); 4573 if (Out.getArgument().isNull()) 4574 return true; 4575 4576 Outputs.addArgument(Out); 4577 } 4578 4579 continue; 4580 } 4581 4582 // The simple case: 4583 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4584 return true; 4585 4586 Outputs.addArgument(Out); 4587 } 4588 4589 return false; 4590 4591 } 4592 4593 //===----------------------------------------------------------------------===// 4594 // Type transformation 4595 //===----------------------------------------------------------------------===// 4596 4597 template<typename Derived> 4598 QualType TreeTransform<Derived>::TransformType(QualType T) { 4599 if (getDerived().AlreadyTransformed(T)) 4600 return T; 4601 4602 // Temporary workaround. All of these transformations should 4603 // eventually turn into transformations on TypeLocs. 4604 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4605 getDerived().getBaseLocation()); 4606 4607 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4608 4609 if (!NewDI) 4610 return QualType(); 4611 4612 return NewDI->getType(); 4613 } 4614 4615 template<typename Derived> 4616 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4617 // Refine the base location to the type's location. 4618 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4619 getDerived().getBaseEntity()); 4620 if (getDerived().AlreadyTransformed(DI->getType())) 4621 return DI; 4622 4623 TypeLocBuilder TLB; 4624 4625 TypeLoc TL = DI->getTypeLoc(); 4626 TLB.reserve(TL.getFullDataSize()); 4627 4628 QualType Result = getDerived().TransformType(TLB, TL); 4629 if (Result.isNull()) 4630 return nullptr; 4631 4632 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4633 } 4634 4635 template<typename Derived> 4636 QualType 4637 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4638 switch (T.getTypeLocClass()) { 4639 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4640 #define TYPELOC(CLASS, PARENT) \ 4641 case TypeLoc::CLASS: \ 4642 return getDerived().Transform##CLASS##Type(TLB, \ 4643 T.castAs<CLASS##TypeLoc>()); 4644 #include "clang/AST/TypeLocNodes.def" 4645 } 4646 4647 llvm_unreachable("unhandled type loc!"); 4648 } 4649 4650 template<typename Derived> 4651 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4652 if (!isa<DependentNameType>(T)) 4653 return TransformType(T); 4654 4655 if (getDerived().AlreadyTransformed(T)) 4656 return T; 4657 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4658 getDerived().getBaseLocation()); 4659 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4660 return NewDI ? NewDI->getType() : QualType(); 4661 } 4662 4663 template<typename Derived> 4664 TypeSourceInfo * 4665 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4666 if (!isa<DependentNameType>(DI->getType())) 4667 return TransformType(DI); 4668 4669 // Refine the base location to the type's location. 4670 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4671 getDerived().getBaseEntity()); 4672 if (getDerived().AlreadyTransformed(DI->getType())) 4673 return DI; 4674 4675 TypeLocBuilder TLB; 4676 4677 TypeLoc TL = DI->getTypeLoc(); 4678 TLB.reserve(TL.getFullDataSize()); 4679 4680 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4681 if (QTL) 4682 TL = QTL.getUnqualifiedLoc(); 4683 4684 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4685 4686 QualType Result = getDerived().TransformDependentNameType( 4687 TLB, DNTL, /*DeducedTSTContext*/true); 4688 if (Result.isNull()) 4689 return nullptr; 4690 4691 if (QTL) { 4692 Result = getDerived().RebuildQualifiedType(Result, QTL); 4693 if (Result.isNull()) 4694 return nullptr; 4695 TLB.TypeWasModifiedSafely(Result); 4696 } 4697 4698 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4699 } 4700 4701 template<typename Derived> 4702 QualType 4703 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4704 QualifiedTypeLoc T) { 4705 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4706 if (Result.isNull()) 4707 return QualType(); 4708 4709 Result = getDerived().RebuildQualifiedType(Result, T); 4710 4711 if (Result.isNull()) 4712 return QualType(); 4713 4714 // RebuildQualifiedType might have updated the type, but not in a way 4715 // that invalidates the TypeLoc. (There's no location information for 4716 // qualifiers.) 4717 TLB.TypeWasModifiedSafely(Result); 4718 4719 return Result; 4720 } 4721 4722 template <typename Derived> 4723 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4724 QualifiedTypeLoc TL) { 4725 4726 SourceLocation Loc = TL.getBeginLoc(); 4727 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4728 4729 if (((T.getAddressSpace() != LangAS::Default && 4730 Quals.getAddressSpace() != LangAS::Default)) && 4731 T.getAddressSpace() != Quals.getAddressSpace()) { 4732 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4733 << TL.getType() << T; 4734 return QualType(); 4735 } 4736 4737 // C++ [dcl.fct]p7: 4738 // [When] adding cv-qualifications on top of the function type [...] the 4739 // cv-qualifiers are ignored. 4740 if (T->isFunctionType()) { 4741 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4742 Quals.getAddressSpace()); 4743 return T; 4744 } 4745 4746 // C++ [dcl.ref]p1: 4747 // when the cv-qualifiers are introduced through the use of a typedef-name 4748 // or decltype-specifier [...] the cv-qualifiers are ignored. 4749 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4750 // applied to a reference type. 4751 if (T->isReferenceType()) { 4752 // The only qualifier that applies to a reference type is restrict. 4753 if (!Quals.hasRestrict()) 4754 return T; 4755 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4756 } 4757 4758 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4759 // resulting type. 4760 if (Quals.hasObjCLifetime()) { 4761 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4762 Quals.removeObjCLifetime(); 4763 else if (T.getObjCLifetime()) { 4764 // Objective-C ARC: 4765 // A lifetime qualifier applied to a substituted template parameter 4766 // overrides the lifetime qualifier from the template argument. 4767 const AutoType *AutoTy; 4768 if (const SubstTemplateTypeParmType *SubstTypeParam 4769 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4770 QualType Replacement = SubstTypeParam->getReplacementType(); 4771 Qualifiers Qs = Replacement.getQualifiers(); 4772 Qs.removeObjCLifetime(); 4773 Replacement = SemaRef.Context.getQualifiedType( 4774 Replacement.getUnqualifiedType(), Qs); 4775 T = SemaRef.Context.getSubstTemplateTypeParmType( 4776 SubstTypeParam->getReplacedParameter(), Replacement); 4777 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4778 // 'auto' types behave the same way as template parameters. 4779 QualType Deduced = AutoTy->getDeducedType(); 4780 Qualifiers Qs = Deduced.getQualifiers(); 4781 Qs.removeObjCLifetime(); 4782 Deduced = 4783 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4784 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4785 AutoTy->isDependentType(), 4786 /*isPack=*/false, 4787 AutoTy->getTypeConstraintConcept(), 4788 AutoTy->getTypeConstraintArguments()); 4789 } else { 4790 // Otherwise, complain about the addition of a qualifier to an 4791 // already-qualified type. 4792 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4793 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4794 Quals.removeObjCLifetime(); 4795 } 4796 } 4797 } 4798 4799 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4800 } 4801 4802 template<typename Derived> 4803 TypeLoc 4804 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4805 QualType ObjectType, 4806 NamedDecl *UnqualLookup, 4807 CXXScopeSpec &SS) { 4808 if (getDerived().AlreadyTransformed(TL.getType())) 4809 return TL; 4810 4811 TypeSourceInfo *TSI = 4812 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4813 if (TSI) 4814 return TSI->getTypeLoc(); 4815 return TypeLoc(); 4816 } 4817 4818 template<typename Derived> 4819 TypeSourceInfo * 4820 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4821 QualType ObjectType, 4822 NamedDecl *UnqualLookup, 4823 CXXScopeSpec &SS) { 4824 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4825 return TSInfo; 4826 4827 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4828 UnqualLookup, SS); 4829 } 4830 4831 template <typename Derived> 4832 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4833 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4834 CXXScopeSpec &SS) { 4835 QualType T = TL.getType(); 4836 assert(!getDerived().AlreadyTransformed(T)); 4837 4838 TypeLocBuilder TLB; 4839 QualType Result; 4840 4841 if (isa<TemplateSpecializationType>(T)) { 4842 TemplateSpecializationTypeLoc SpecTL = 4843 TL.castAs<TemplateSpecializationTypeLoc>(); 4844 4845 TemplateName Template = getDerived().TransformTemplateName( 4846 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4847 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4848 if (Template.isNull()) 4849 return nullptr; 4850 4851 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4852 Template); 4853 } else if (isa<DependentTemplateSpecializationType>(T)) { 4854 DependentTemplateSpecializationTypeLoc SpecTL = 4855 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4856 4857 TemplateName Template 4858 = getDerived().RebuildTemplateName(SS, 4859 SpecTL.getTemplateKeywordLoc(), 4860 *SpecTL.getTypePtr()->getIdentifier(), 4861 SpecTL.getTemplateNameLoc(), 4862 ObjectType, UnqualLookup, 4863 /*AllowInjectedClassName*/true); 4864 if (Template.isNull()) 4865 return nullptr; 4866 4867 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4868 SpecTL, 4869 Template, 4870 SS); 4871 } else { 4872 // Nothing special needs to be done for these. 4873 Result = getDerived().TransformType(TLB, TL); 4874 } 4875 4876 if (Result.isNull()) 4877 return nullptr; 4878 4879 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4880 } 4881 4882 template <class TyLoc> static inline 4883 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4884 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4885 NewT.setNameLoc(T.getNameLoc()); 4886 return T.getType(); 4887 } 4888 4889 template<typename Derived> 4890 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4891 BuiltinTypeLoc T) { 4892 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4893 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4894 if (T.needsExtraLocalData()) 4895 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4896 return T.getType(); 4897 } 4898 4899 template<typename Derived> 4900 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4901 ComplexTypeLoc T) { 4902 // FIXME: recurse? 4903 return TransformTypeSpecType(TLB, T); 4904 } 4905 4906 template <typename Derived> 4907 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4908 AdjustedTypeLoc TL) { 4909 // Adjustments applied during transformation are handled elsewhere. 4910 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4911 } 4912 4913 template<typename Derived> 4914 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4915 DecayedTypeLoc TL) { 4916 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4917 if (OriginalType.isNull()) 4918 return QualType(); 4919 4920 QualType Result = TL.getType(); 4921 if (getDerived().AlwaysRebuild() || 4922 OriginalType != TL.getOriginalLoc().getType()) 4923 Result = SemaRef.Context.getDecayedType(OriginalType); 4924 TLB.push<DecayedTypeLoc>(Result); 4925 // Nothing to set for DecayedTypeLoc. 4926 return Result; 4927 } 4928 4929 template<typename Derived> 4930 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4931 PointerTypeLoc TL) { 4932 QualType PointeeType 4933 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4934 if (PointeeType.isNull()) 4935 return QualType(); 4936 4937 QualType Result = TL.getType(); 4938 if (PointeeType->getAs<ObjCObjectType>()) { 4939 // A dependent pointer type 'T *' has is being transformed such 4940 // that an Objective-C class type is being replaced for 'T'. The 4941 // resulting pointer type is an ObjCObjectPointerType, not a 4942 // PointerType. 4943 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4944 4945 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4946 NewT.setStarLoc(TL.getStarLoc()); 4947 return Result; 4948 } 4949 4950 if (getDerived().AlwaysRebuild() || 4951 PointeeType != TL.getPointeeLoc().getType()) { 4952 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4953 if (Result.isNull()) 4954 return QualType(); 4955 } 4956 4957 // Objective-C ARC can add lifetime qualifiers to the type that we're 4958 // pointing to. 4959 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4960 4961 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4962 NewT.setSigilLoc(TL.getSigilLoc()); 4963 return Result; 4964 } 4965 4966 template<typename Derived> 4967 QualType 4968 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4969 BlockPointerTypeLoc TL) { 4970 QualType PointeeType 4971 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4972 if (PointeeType.isNull()) 4973 return QualType(); 4974 4975 QualType Result = TL.getType(); 4976 if (getDerived().AlwaysRebuild() || 4977 PointeeType != TL.getPointeeLoc().getType()) { 4978 Result = getDerived().RebuildBlockPointerType(PointeeType, 4979 TL.getSigilLoc()); 4980 if (Result.isNull()) 4981 return QualType(); 4982 } 4983 4984 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4985 NewT.setSigilLoc(TL.getSigilLoc()); 4986 return Result; 4987 } 4988 4989 /// Transforms a reference type. Note that somewhat paradoxically we 4990 /// don't care whether the type itself is an l-value type or an r-value 4991 /// type; we only care if the type was *written* as an l-value type 4992 /// or an r-value type. 4993 template<typename Derived> 4994 QualType 4995 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4996 ReferenceTypeLoc TL) { 4997 const ReferenceType *T = TL.getTypePtr(); 4998 4999 // Note that this works with the pointee-as-written. 5000 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5001 if (PointeeType.isNull()) 5002 return QualType(); 5003 5004 QualType Result = TL.getType(); 5005 if (getDerived().AlwaysRebuild() || 5006 PointeeType != T->getPointeeTypeAsWritten()) { 5007 Result = getDerived().RebuildReferenceType(PointeeType, 5008 T->isSpelledAsLValue(), 5009 TL.getSigilLoc()); 5010 if (Result.isNull()) 5011 return QualType(); 5012 } 5013 5014 // Objective-C ARC can add lifetime qualifiers to the type that we're 5015 // referring to. 5016 TLB.TypeWasModifiedSafely( 5017 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5018 5019 // r-value references can be rebuilt as l-value references. 5020 ReferenceTypeLoc NewTL; 5021 if (isa<LValueReferenceType>(Result)) 5022 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5023 else 5024 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5025 NewTL.setSigilLoc(TL.getSigilLoc()); 5026 5027 return Result; 5028 } 5029 5030 template<typename Derived> 5031 QualType 5032 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5033 LValueReferenceTypeLoc TL) { 5034 return TransformReferenceType(TLB, TL); 5035 } 5036 5037 template<typename Derived> 5038 QualType 5039 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5040 RValueReferenceTypeLoc TL) { 5041 return TransformReferenceType(TLB, TL); 5042 } 5043 5044 template<typename Derived> 5045 QualType 5046 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5047 MemberPointerTypeLoc TL) { 5048 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5049 if (PointeeType.isNull()) 5050 return QualType(); 5051 5052 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5053 TypeSourceInfo *NewClsTInfo = nullptr; 5054 if (OldClsTInfo) { 5055 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5056 if (!NewClsTInfo) 5057 return QualType(); 5058 } 5059 5060 const MemberPointerType *T = TL.getTypePtr(); 5061 QualType OldClsType = QualType(T->getClass(), 0); 5062 QualType NewClsType; 5063 if (NewClsTInfo) 5064 NewClsType = NewClsTInfo->getType(); 5065 else { 5066 NewClsType = getDerived().TransformType(OldClsType); 5067 if (NewClsType.isNull()) 5068 return QualType(); 5069 } 5070 5071 QualType Result = TL.getType(); 5072 if (getDerived().AlwaysRebuild() || 5073 PointeeType != T->getPointeeType() || 5074 NewClsType != OldClsType) { 5075 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5076 TL.getStarLoc()); 5077 if (Result.isNull()) 5078 return QualType(); 5079 } 5080 5081 // If we had to adjust the pointee type when building a member pointer, make 5082 // sure to push TypeLoc info for it. 5083 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5084 if (MPT && PointeeType != MPT->getPointeeType()) { 5085 assert(isa<AdjustedType>(MPT->getPointeeType())); 5086 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5087 } 5088 5089 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5090 NewTL.setSigilLoc(TL.getSigilLoc()); 5091 NewTL.setClassTInfo(NewClsTInfo); 5092 5093 return Result; 5094 } 5095 5096 template<typename Derived> 5097 QualType 5098 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5099 ConstantArrayTypeLoc TL) { 5100 const ConstantArrayType *T = TL.getTypePtr(); 5101 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5102 if (ElementType.isNull()) 5103 return QualType(); 5104 5105 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5106 Expr *OldSize = TL.getSizeExpr(); 5107 if (!OldSize) 5108 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5109 Expr *NewSize = nullptr; 5110 if (OldSize) { 5111 EnterExpressionEvaluationContext Unevaluated( 5112 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5113 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5114 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5115 } 5116 5117 QualType Result = TL.getType(); 5118 if (getDerived().AlwaysRebuild() || 5119 ElementType != T->getElementType() || 5120 (T->getSizeExpr() && NewSize != OldSize)) { 5121 Result = getDerived().RebuildConstantArrayType(ElementType, 5122 T->getSizeModifier(), 5123 T->getSize(), NewSize, 5124 T->getIndexTypeCVRQualifiers(), 5125 TL.getBracketsRange()); 5126 if (Result.isNull()) 5127 return QualType(); 5128 } 5129 5130 // We might have either a ConstantArrayType or a VariableArrayType now: 5131 // a ConstantArrayType is allowed to have an element type which is a 5132 // VariableArrayType if the type is dependent. Fortunately, all array 5133 // types have the same location layout. 5134 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5135 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5136 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5137 NewTL.setSizeExpr(NewSize); 5138 5139 return Result; 5140 } 5141 5142 template<typename Derived> 5143 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5144 TypeLocBuilder &TLB, 5145 IncompleteArrayTypeLoc TL) { 5146 const IncompleteArrayType *T = TL.getTypePtr(); 5147 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5148 if (ElementType.isNull()) 5149 return QualType(); 5150 5151 QualType Result = TL.getType(); 5152 if (getDerived().AlwaysRebuild() || 5153 ElementType != T->getElementType()) { 5154 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5155 T->getSizeModifier(), 5156 T->getIndexTypeCVRQualifiers(), 5157 TL.getBracketsRange()); 5158 if (Result.isNull()) 5159 return QualType(); 5160 } 5161 5162 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5163 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5164 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5165 NewTL.setSizeExpr(nullptr); 5166 5167 return Result; 5168 } 5169 5170 template<typename Derived> 5171 QualType 5172 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5173 VariableArrayTypeLoc TL) { 5174 const VariableArrayType *T = TL.getTypePtr(); 5175 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5176 if (ElementType.isNull()) 5177 return QualType(); 5178 5179 ExprResult SizeResult; 5180 { 5181 EnterExpressionEvaluationContext Context( 5182 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5183 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5184 } 5185 if (SizeResult.isInvalid()) 5186 return QualType(); 5187 SizeResult = 5188 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5189 if (SizeResult.isInvalid()) 5190 return QualType(); 5191 5192 Expr *Size = SizeResult.get(); 5193 5194 QualType Result = TL.getType(); 5195 if (getDerived().AlwaysRebuild() || 5196 ElementType != T->getElementType() || 5197 Size != T->getSizeExpr()) { 5198 Result = getDerived().RebuildVariableArrayType(ElementType, 5199 T->getSizeModifier(), 5200 Size, 5201 T->getIndexTypeCVRQualifiers(), 5202 TL.getBracketsRange()); 5203 if (Result.isNull()) 5204 return QualType(); 5205 } 5206 5207 // We might have constant size array now, but fortunately it has the same 5208 // location layout. 5209 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5210 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5211 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5212 NewTL.setSizeExpr(Size); 5213 5214 return Result; 5215 } 5216 5217 template<typename Derived> 5218 QualType 5219 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5220 DependentSizedArrayTypeLoc TL) { 5221 const DependentSizedArrayType *T = TL.getTypePtr(); 5222 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5223 if (ElementType.isNull()) 5224 return QualType(); 5225 5226 // Array bounds are constant expressions. 5227 EnterExpressionEvaluationContext Unevaluated( 5228 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5229 5230 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5231 Expr *origSize = TL.getSizeExpr(); 5232 if (!origSize) origSize = T->getSizeExpr(); 5233 5234 ExprResult sizeResult 5235 = getDerived().TransformExpr(origSize); 5236 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5237 if (sizeResult.isInvalid()) 5238 return QualType(); 5239 5240 Expr *size = sizeResult.get(); 5241 5242 QualType Result = TL.getType(); 5243 if (getDerived().AlwaysRebuild() || 5244 ElementType != T->getElementType() || 5245 size != origSize) { 5246 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5247 T->getSizeModifier(), 5248 size, 5249 T->getIndexTypeCVRQualifiers(), 5250 TL.getBracketsRange()); 5251 if (Result.isNull()) 5252 return QualType(); 5253 } 5254 5255 // We might have any sort of array type now, but fortunately they 5256 // all have the same location layout. 5257 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5258 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5259 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5260 NewTL.setSizeExpr(size); 5261 5262 return Result; 5263 } 5264 5265 template <typename Derived> 5266 QualType TreeTransform<Derived>::TransformDependentVectorType( 5267 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5268 const DependentVectorType *T = TL.getTypePtr(); 5269 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5270 if (ElementType.isNull()) 5271 return QualType(); 5272 5273 EnterExpressionEvaluationContext Unevaluated( 5274 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5275 5276 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5277 Size = SemaRef.ActOnConstantExpression(Size); 5278 if (Size.isInvalid()) 5279 return QualType(); 5280 5281 QualType Result = TL.getType(); 5282 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5283 Size.get() != T->getSizeExpr()) { 5284 Result = getDerived().RebuildDependentVectorType( 5285 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5286 if (Result.isNull()) 5287 return QualType(); 5288 } 5289 5290 // Result might be dependent or not. 5291 if (isa<DependentVectorType>(Result)) { 5292 DependentVectorTypeLoc NewTL = 5293 TLB.push<DependentVectorTypeLoc>(Result); 5294 NewTL.setNameLoc(TL.getNameLoc()); 5295 } else { 5296 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5297 NewTL.setNameLoc(TL.getNameLoc()); 5298 } 5299 5300 return Result; 5301 } 5302 5303 template<typename Derived> 5304 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5305 TypeLocBuilder &TLB, 5306 DependentSizedExtVectorTypeLoc TL) { 5307 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5308 5309 // FIXME: ext vector locs should be nested 5310 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5311 if (ElementType.isNull()) 5312 return QualType(); 5313 5314 // Vector sizes are constant expressions. 5315 EnterExpressionEvaluationContext Unevaluated( 5316 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5317 5318 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5319 Size = SemaRef.ActOnConstantExpression(Size); 5320 if (Size.isInvalid()) 5321 return QualType(); 5322 5323 QualType Result = TL.getType(); 5324 if (getDerived().AlwaysRebuild() || 5325 ElementType != T->getElementType() || 5326 Size.get() != T->getSizeExpr()) { 5327 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5328 Size.get(), 5329 T->getAttributeLoc()); 5330 if (Result.isNull()) 5331 return QualType(); 5332 } 5333 5334 // Result might be dependent or not. 5335 if (isa<DependentSizedExtVectorType>(Result)) { 5336 DependentSizedExtVectorTypeLoc NewTL 5337 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5338 NewTL.setNameLoc(TL.getNameLoc()); 5339 } else { 5340 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5341 NewTL.setNameLoc(TL.getNameLoc()); 5342 } 5343 5344 return Result; 5345 } 5346 5347 template <typename Derived> 5348 QualType 5349 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5350 ConstantMatrixTypeLoc TL) { 5351 const ConstantMatrixType *T = TL.getTypePtr(); 5352 QualType ElementType = getDerived().TransformType(T->getElementType()); 5353 if (ElementType.isNull()) 5354 return QualType(); 5355 5356 QualType Result = TL.getType(); 5357 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5358 Result = getDerived().RebuildConstantMatrixType( 5359 ElementType, T->getNumRows(), T->getNumColumns()); 5360 if (Result.isNull()) 5361 return QualType(); 5362 } 5363 5364 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5365 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5366 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5367 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5368 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5369 5370 return Result; 5371 } 5372 5373 template <typename Derived> 5374 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5375 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5376 const DependentSizedMatrixType *T = TL.getTypePtr(); 5377 5378 QualType ElementType = getDerived().TransformType(T->getElementType()); 5379 if (ElementType.isNull()) { 5380 return QualType(); 5381 } 5382 5383 // Matrix dimensions are constant expressions. 5384 EnterExpressionEvaluationContext Unevaluated( 5385 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5386 5387 Expr *origRows = TL.getAttrRowOperand(); 5388 if (!origRows) 5389 origRows = T->getRowExpr(); 5390 Expr *origColumns = TL.getAttrColumnOperand(); 5391 if (!origColumns) 5392 origColumns = T->getColumnExpr(); 5393 5394 ExprResult rowResult = getDerived().TransformExpr(origRows); 5395 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5396 if (rowResult.isInvalid()) 5397 return QualType(); 5398 5399 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5400 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5401 if (columnResult.isInvalid()) 5402 return QualType(); 5403 5404 Expr *rows = rowResult.get(); 5405 Expr *columns = columnResult.get(); 5406 5407 QualType Result = TL.getType(); 5408 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5409 rows != origRows || columns != origColumns) { 5410 Result = getDerived().RebuildDependentSizedMatrixType( 5411 ElementType, rows, columns, T->getAttributeLoc()); 5412 5413 if (Result.isNull()) 5414 return QualType(); 5415 } 5416 5417 // We might have any sort of matrix type now, but fortunately they 5418 // all have the same location layout. 5419 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5420 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5421 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5422 NewTL.setAttrRowOperand(rows); 5423 NewTL.setAttrColumnOperand(columns); 5424 return Result; 5425 } 5426 5427 template <typename Derived> 5428 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5429 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5430 const DependentAddressSpaceType *T = TL.getTypePtr(); 5431 5432 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5433 5434 if (pointeeType.isNull()) 5435 return QualType(); 5436 5437 // Address spaces are constant expressions. 5438 EnterExpressionEvaluationContext Unevaluated( 5439 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5440 5441 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5442 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5443 if (AddrSpace.isInvalid()) 5444 return QualType(); 5445 5446 QualType Result = TL.getType(); 5447 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5448 AddrSpace.get() != T->getAddrSpaceExpr()) { 5449 Result = getDerived().RebuildDependentAddressSpaceType( 5450 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5451 if (Result.isNull()) 5452 return QualType(); 5453 } 5454 5455 // Result might be dependent or not. 5456 if (isa<DependentAddressSpaceType>(Result)) { 5457 DependentAddressSpaceTypeLoc NewTL = 5458 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5459 5460 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5461 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5462 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5463 5464 } else { 5465 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5466 Result, getDerived().getBaseLocation()); 5467 TransformType(TLB, DI->getTypeLoc()); 5468 } 5469 5470 return Result; 5471 } 5472 5473 template <typename Derived> 5474 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5475 VectorTypeLoc TL) { 5476 const VectorType *T = TL.getTypePtr(); 5477 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5478 if (ElementType.isNull()) 5479 return QualType(); 5480 5481 QualType Result = TL.getType(); 5482 if (getDerived().AlwaysRebuild() || 5483 ElementType != T->getElementType()) { 5484 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5485 T->getVectorKind()); 5486 if (Result.isNull()) 5487 return QualType(); 5488 } 5489 5490 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5491 NewTL.setNameLoc(TL.getNameLoc()); 5492 5493 return Result; 5494 } 5495 5496 template<typename Derived> 5497 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5498 ExtVectorTypeLoc TL) { 5499 const VectorType *T = TL.getTypePtr(); 5500 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5501 if (ElementType.isNull()) 5502 return QualType(); 5503 5504 QualType Result = TL.getType(); 5505 if (getDerived().AlwaysRebuild() || 5506 ElementType != T->getElementType()) { 5507 Result = getDerived().RebuildExtVectorType(ElementType, 5508 T->getNumElements(), 5509 /*FIXME*/ SourceLocation()); 5510 if (Result.isNull()) 5511 return QualType(); 5512 } 5513 5514 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5515 NewTL.setNameLoc(TL.getNameLoc()); 5516 5517 return Result; 5518 } 5519 5520 template <typename Derived> 5521 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5522 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5523 bool ExpectParameterPack) { 5524 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5525 TypeSourceInfo *NewDI = nullptr; 5526 5527 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5528 // If we're substituting into a pack expansion type and we know the 5529 // length we want to expand to, just substitute for the pattern. 5530 TypeLoc OldTL = OldDI->getTypeLoc(); 5531 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5532 5533 TypeLocBuilder TLB; 5534 TypeLoc NewTL = OldDI->getTypeLoc(); 5535 TLB.reserve(NewTL.getFullDataSize()); 5536 5537 QualType Result = getDerived().TransformType(TLB, 5538 OldExpansionTL.getPatternLoc()); 5539 if (Result.isNull()) 5540 return nullptr; 5541 5542 Result = RebuildPackExpansionType(Result, 5543 OldExpansionTL.getPatternLoc().getSourceRange(), 5544 OldExpansionTL.getEllipsisLoc(), 5545 NumExpansions); 5546 if (Result.isNull()) 5547 return nullptr; 5548 5549 PackExpansionTypeLoc NewExpansionTL 5550 = TLB.push<PackExpansionTypeLoc>(Result); 5551 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5552 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5553 } else 5554 NewDI = getDerived().TransformType(OldDI); 5555 if (!NewDI) 5556 return nullptr; 5557 5558 if (NewDI == OldDI && indexAdjustment == 0) 5559 return OldParm; 5560 5561 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5562 OldParm->getDeclContext(), 5563 OldParm->getInnerLocStart(), 5564 OldParm->getLocation(), 5565 OldParm->getIdentifier(), 5566 NewDI->getType(), 5567 NewDI, 5568 OldParm->getStorageClass(), 5569 /* DefArg */ nullptr); 5570 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5571 OldParm->getFunctionScopeIndex() + indexAdjustment); 5572 transformedLocalDecl(OldParm, {newParm}); 5573 return newParm; 5574 } 5575 5576 template <typename Derived> 5577 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5578 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5579 const QualType *ParamTypes, 5580 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5581 SmallVectorImpl<QualType> &OutParamTypes, 5582 SmallVectorImpl<ParmVarDecl *> *PVars, 5583 Sema::ExtParameterInfoBuilder &PInfos) { 5584 int indexAdjustment = 0; 5585 5586 unsigned NumParams = Params.size(); 5587 for (unsigned i = 0; i != NumParams; ++i) { 5588 if (ParmVarDecl *OldParm = Params[i]) { 5589 assert(OldParm->getFunctionScopeIndex() == i); 5590 5591 Optional<unsigned> NumExpansions; 5592 ParmVarDecl *NewParm = nullptr; 5593 if (OldParm->isParameterPack()) { 5594 // We have a function parameter pack that may need to be expanded. 5595 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5596 5597 // Find the parameter packs that could be expanded. 5598 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5599 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5600 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5601 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5602 5603 // Determine whether we should expand the parameter packs. 5604 bool ShouldExpand = false; 5605 bool RetainExpansion = false; 5606 Optional<unsigned> OrigNumExpansions; 5607 if (Unexpanded.size() > 0) { 5608 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5609 NumExpansions = OrigNumExpansions; 5610 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5611 Pattern.getSourceRange(), 5612 Unexpanded, 5613 ShouldExpand, 5614 RetainExpansion, 5615 NumExpansions)) { 5616 return true; 5617 } 5618 } else { 5619 #ifndef NDEBUG 5620 const AutoType *AT = 5621 Pattern.getType().getTypePtr()->getContainedAutoType(); 5622 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5623 "Could not find parameter packs or undeduced auto type!"); 5624 #endif 5625 } 5626 5627 if (ShouldExpand) { 5628 // Expand the function parameter pack into multiple, separate 5629 // parameters. 5630 getDerived().ExpandingFunctionParameterPack(OldParm); 5631 for (unsigned I = 0; I != *NumExpansions; ++I) { 5632 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5633 ParmVarDecl *NewParm 5634 = getDerived().TransformFunctionTypeParam(OldParm, 5635 indexAdjustment++, 5636 OrigNumExpansions, 5637 /*ExpectParameterPack=*/false); 5638 if (!NewParm) 5639 return true; 5640 5641 if (ParamInfos) 5642 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5643 OutParamTypes.push_back(NewParm->getType()); 5644 if (PVars) 5645 PVars->push_back(NewParm); 5646 } 5647 5648 // If we're supposed to retain a pack expansion, do so by temporarily 5649 // forgetting the partially-substituted parameter pack. 5650 if (RetainExpansion) { 5651 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5652 ParmVarDecl *NewParm 5653 = getDerived().TransformFunctionTypeParam(OldParm, 5654 indexAdjustment++, 5655 OrigNumExpansions, 5656 /*ExpectParameterPack=*/false); 5657 if (!NewParm) 5658 return true; 5659 5660 if (ParamInfos) 5661 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5662 OutParamTypes.push_back(NewParm->getType()); 5663 if (PVars) 5664 PVars->push_back(NewParm); 5665 } 5666 5667 // The next parameter should have the same adjustment as the 5668 // last thing we pushed, but we post-incremented indexAdjustment 5669 // on every push. Also, if we push nothing, the adjustment should 5670 // go down by one. 5671 indexAdjustment--; 5672 5673 // We're done with the pack expansion. 5674 continue; 5675 } 5676 5677 // We'll substitute the parameter now without expanding the pack 5678 // expansion. 5679 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5680 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5681 indexAdjustment, 5682 NumExpansions, 5683 /*ExpectParameterPack=*/true); 5684 assert(NewParm->isParameterPack() && 5685 "Parameter pack no longer a parameter pack after " 5686 "transformation."); 5687 } else { 5688 NewParm = getDerived().TransformFunctionTypeParam( 5689 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5690 } 5691 5692 if (!NewParm) 5693 return true; 5694 5695 if (ParamInfos) 5696 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5697 OutParamTypes.push_back(NewParm->getType()); 5698 if (PVars) 5699 PVars->push_back(NewParm); 5700 continue; 5701 } 5702 5703 // Deal with the possibility that we don't have a parameter 5704 // declaration for this parameter. 5705 QualType OldType = ParamTypes[i]; 5706 bool IsPackExpansion = false; 5707 Optional<unsigned> NumExpansions; 5708 QualType NewType; 5709 if (const PackExpansionType *Expansion 5710 = dyn_cast<PackExpansionType>(OldType)) { 5711 // We have a function parameter pack that may need to be expanded. 5712 QualType Pattern = Expansion->getPattern(); 5713 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5714 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5715 5716 // Determine whether we should expand the parameter packs. 5717 bool ShouldExpand = false; 5718 bool RetainExpansion = false; 5719 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5720 Unexpanded, 5721 ShouldExpand, 5722 RetainExpansion, 5723 NumExpansions)) { 5724 return true; 5725 } 5726 5727 if (ShouldExpand) { 5728 // Expand the function parameter pack into multiple, separate 5729 // parameters. 5730 for (unsigned I = 0; I != *NumExpansions; ++I) { 5731 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5732 QualType NewType = getDerived().TransformType(Pattern); 5733 if (NewType.isNull()) 5734 return true; 5735 5736 if (NewType->containsUnexpandedParameterPack()) { 5737 NewType = 5738 getSema().getASTContext().getPackExpansionType(NewType, None); 5739 5740 if (NewType.isNull()) 5741 return true; 5742 } 5743 5744 if (ParamInfos) 5745 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5746 OutParamTypes.push_back(NewType); 5747 if (PVars) 5748 PVars->push_back(nullptr); 5749 } 5750 5751 // We're done with the pack expansion. 5752 continue; 5753 } 5754 5755 // If we're supposed to retain a pack expansion, do so by temporarily 5756 // forgetting the partially-substituted parameter pack. 5757 if (RetainExpansion) { 5758 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5759 QualType NewType = getDerived().TransformType(Pattern); 5760 if (NewType.isNull()) 5761 return true; 5762 5763 if (ParamInfos) 5764 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5765 OutParamTypes.push_back(NewType); 5766 if (PVars) 5767 PVars->push_back(nullptr); 5768 } 5769 5770 // We'll substitute the parameter now without expanding the pack 5771 // expansion. 5772 OldType = Expansion->getPattern(); 5773 IsPackExpansion = true; 5774 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5775 NewType = getDerived().TransformType(OldType); 5776 } else { 5777 NewType = getDerived().TransformType(OldType); 5778 } 5779 5780 if (NewType.isNull()) 5781 return true; 5782 5783 if (IsPackExpansion) 5784 NewType = getSema().Context.getPackExpansionType(NewType, 5785 NumExpansions); 5786 5787 if (ParamInfos) 5788 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5789 OutParamTypes.push_back(NewType); 5790 if (PVars) 5791 PVars->push_back(nullptr); 5792 } 5793 5794 #ifndef NDEBUG 5795 if (PVars) { 5796 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5797 if (ParmVarDecl *parm = (*PVars)[i]) 5798 assert(parm->getFunctionScopeIndex() == i); 5799 } 5800 #endif 5801 5802 return false; 5803 } 5804 5805 template<typename Derived> 5806 QualType 5807 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5808 FunctionProtoTypeLoc TL) { 5809 SmallVector<QualType, 4> ExceptionStorage; 5810 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5811 return getDerived().TransformFunctionProtoType( 5812 TLB, TL, nullptr, Qualifiers(), 5813 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5814 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5815 ExceptionStorage, Changed); 5816 }); 5817 } 5818 5819 template<typename Derived> template<typename Fn> 5820 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5821 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5822 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5823 5824 // Transform the parameters and return type. 5825 // 5826 // We are required to instantiate the params and return type in source order. 5827 // When the function has a trailing return type, we instantiate the 5828 // parameters before the return type, since the return type can then refer 5829 // to the parameters themselves (via decltype, sizeof, etc.). 5830 // 5831 SmallVector<QualType, 4> ParamTypes; 5832 SmallVector<ParmVarDecl*, 4> ParamDecls; 5833 Sema::ExtParameterInfoBuilder ExtParamInfos; 5834 const FunctionProtoType *T = TL.getTypePtr(); 5835 5836 QualType ResultType; 5837 5838 if (T->hasTrailingReturn()) { 5839 if (getDerived().TransformFunctionTypeParams( 5840 TL.getBeginLoc(), TL.getParams(), 5841 TL.getTypePtr()->param_type_begin(), 5842 T->getExtParameterInfosOrNull(), 5843 ParamTypes, &ParamDecls, ExtParamInfos)) 5844 return QualType(); 5845 5846 { 5847 // C++11 [expr.prim.general]p3: 5848 // If a declaration declares a member function or member function 5849 // template of a class X, the expression this is a prvalue of type 5850 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5851 // and the end of the function-definition, member-declarator, or 5852 // declarator. 5853 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5854 5855 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5856 if (ResultType.isNull()) 5857 return QualType(); 5858 } 5859 } 5860 else { 5861 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5862 if (ResultType.isNull()) 5863 return QualType(); 5864 5865 if (getDerived().TransformFunctionTypeParams( 5866 TL.getBeginLoc(), TL.getParams(), 5867 TL.getTypePtr()->param_type_begin(), 5868 T->getExtParameterInfosOrNull(), 5869 ParamTypes, &ParamDecls, ExtParamInfos)) 5870 return QualType(); 5871 } 5872 5873 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5874 5875 bool EPIChanged = false; 5876 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5877 return QualType(); 5878 5879 // Handle extended parameter information. 5880 if (auto NewExtParamInfos = 5881 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5882 if (!EPI.ExtParameterInfos || 5883 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5884 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5885 EPIChanged = true; 5886 } 5887 EPI.ExtParameterInfos = NewExtParamInfos; 5888 } else if (EPI.ExtParameterInfos) { 5889 EPIChanged = true; 5890 EPI.ExtParameterInfos = nullptr; 5891 } 5892 5893 QualType Result = TL.getType(); 5894 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5895 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5896 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5897 if (Result.isNull()) 5898 return QualType(); 5899 } 5900 5901 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5902 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5903 NewTL.setLParenLoc(TL.getLParenLoc()); 5904 NewTL.setRParenLoc(TL.getRParenLoc()); 5905 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5906 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5907 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5908 NewTL.setParam(i, ParamDecls[i]); 5909 5910 return Result; 5911 } 5912 5913 template<typename Derived> 5914 bool TreeTransform<Derived>::TransformExceptionSpec( 5915 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5916 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5917 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5918 5919 // Instantiate a dynamic noexcept expression, if any. 5920 if (isComputedNoexcept(ESI.Type)) { 5921 EnterExpressionEvaluationContext Unevaluated( 5922 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5923 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5924 if (NoexceptExpr.isInvalid()) 5925 return true; 5926 5927 ExceptionSpecificationType EST = ESI.Type; 5928 NoexceptExpr = 5929 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5930 if (NoexceptExpr.isInvalid()) 5931 return true; 5932 5933 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5934 Changed = true; 5935 ESI.NoexceptExpr = NoexceptExpr.get(); 5936 ESI.Type = EST; 5937 } 5938 5939 if (ESI.Type != EST_Dynamic) 5940 return false; 5941 5942 // Instantiate a dynamic exception specification's type. 5943 for (QualType T : ESI.Exceptions) { 5944 if (const PackExpansionType *PackExpansion = 5945 T->getAs<PackExpansionType>()) { 5946 Changed = true; 5947 5948 // We have a pack expansion. Instantiate it. 5949 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5950 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5951 Unexpanded); 5952 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5953 5954 // Determine whether the set of unexpanded parameter packs can and 5955 // should 5956 // be expanded. 5957 bool Expand = false; 5958 bool RetainExpansion = false; 5959 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5960 // FIXME: Track the location of the ellipsis (and track source location 5961 // information for the types in the exception specification in general). 5962 if (getDerived().TryExpandParameterPacks( 5963 Loc, SourceRange(), Unexpanded, Expand, 5964 RetainExpansion, NumExpansions)) 5965 return true; 5966 5967 if (!Expand) { 5968 // We can't expand this pack expansion into separate arguments yet; 5969 // just substitute into the pattern and create a new pack expansion 5970 // type. 5971 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5972 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5973 if (U.isNull()) 5974 return true; 5975 5976 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5977 Exceptions.push_back(U); 5978 continue; 5979 } 5980 5981 // Substitute into the pack expansion pattern for each slice of the 5982 // pack. 5983 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5984 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5985 5986 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5987 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5988 return true; 5989 5990 Exceptions.push_back(U); 5991 } 5992 } else { 5993 QualType U = getDerived().TransformType(T); 5994 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5995 return true; 5996 if (T != U) 5997 Changed = true; 5998 5999 Exceptions.push_back(U); 6000 } 6001 } 6002 6003 ESI.Exceptions = Exceptions; 6004 if (ESI.Exceptions.empty()) 6005 ESI.Type = EST_DynamicNone; 6006 return false; 6007 } 6008 6009 template<typename Derived> 6010 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6011 TypeLocBuilder &TLB, 6012 FunctionNoProtoTypeLoc TL) { 6013 const FunctionNoProtoType *T = TL.getTypePtr(); 6014 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6015 if (ResultType.isNull()) 6016 return QualType(); 6017 6018 QualType Result = TL.getType(); 6019 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6020 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6021 6022 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6023 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6024 NewTL.setLParenLoc(TL.getLParenLoc()); 6025 NewTL.setRParenLoc(TL.getRParenLoc()); 6026 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6027 6028 return Result; 6029 } 6030 6031 template<typename Derived> QualType 6032 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 6033 UnresolvedUsingTypeLoc TL) { 6034 const UnresolvedUsingType *T = TL.getTypePtr(); 6035 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6036 if (!D) 6037 return QualType(); 6038 6039 QualType Result = TL.getType(); 6040 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6041 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6042 if (Result.isNull()) 6043 return QualType(); 6044 } 6045 6046 // We might get an arbitrary type spec type back. We should at 6047 // least always get a type spec type, though. 6048 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6049 NewTL.setNameLoc(TL.getNameLoc()); 6050 6051 return Result; 6052 } 6053 6054 template<typename Derived> 6055 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6056 TypedefTypeLoc TL) { 6057 const TypedefType *T = TL.getTypePtr(); 6058 TypedefNameDecl *Typedef 6059 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6060 T->getDecl())); 6061 if (!Typedef) 6062 return QualType(); 6063 6064 QualType Result = TL.getType(); 6065 if (getDerived().AlwaysRebuild() || 6066 Typedef != T->getDecl()) { 6067 Result = getDerived().RebuildTypedefType(Typedef); 6068 if (Result.isNull()) 6069 return QualType(); 6070 } 6071 6072 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6073 NewTL.setNameLoc(TL.getNameLoc()); 6074 6075 return Result; 6076 } 6077 6078 template<typename Derived> 6079 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6080 TypeOfExprTypeLoc TL) { 6081 // typeof expressions are not potentially evaluated contexts 6082 EnterExpressionEvaluationContext Unevaluated( 6083 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6084 Sema::ReuseLambdaContextDecl); 6085 6086 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6087 if (E.isInvalid()) 6088 return QualType(); 6089 6090 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6091 if (E.isInvalid()) 6092 return QualType(); 6093 6094 QualType Result = TL.getType(); 6095 if (getDerived().AlwaysRebuild() || 6096 E.get() != TL.getUnderlyingExpr()) { 6097 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6098 if (Result.isNull()) 6099 return QualType(); 6100 } 6101 else E.get(); 6102 6103 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6104 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6105 NewTL.setLParenLoc(TL.getLParenLoc()); 6106 NewTL.setRParenLoc(TL.getRParenLoc()); 6107 6108 return Result; 6109 } 6110 6111 template<typename Derived> 6112 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6113 TypeOfTypeLoc TL) { 6114 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6115 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6116 if (!New_Under_TI) 6117 return QualType(); 6118 6119 QualType Result = TL.getType(); 6120 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6121 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6122 if (Result.isNull()) 6123 return QualType(); 6124 } 6125 6126 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6127 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6128 NewTL.setLParenLoc(TL.getLParenLoc()); 6129 NewTL.setRParenLoc(TL.getRParenLoc()); 6130 NewTL.setUnderlyingTInfo(New_Under_TI); 6131 6132 return Result; 6133 } 6134 6135 template<typename Derived> 6136 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6137 DecltypeTypeLoc TL) { 6138 const DecltypeType *T = TL.getTypePtr(); 6139 6140 // decltype expressions are not potentially evaluated contexts 6141 EnterExpressionEvaluationContext Unevaluated( 6142 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6143 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6144 6145 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6146 if (E.isInvalid()) 6147 return QualType(); 6148 6149 E = getSema().ActOnDecltypeExpression(E.get()); 6150 if (E.isInvalid()) 6151 return QualType(); 6152 6153 QualType Result = TL.getType(); 6154 if (getDerived().AlwaysRebuild() || 6155 E.get() != T->getUnderlyingExpr()) { 6156 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6157 if (Result.isNull()) 6158 return QualType(); 6159 } 6160 else E.get(); 6161 6162 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6163 NewTL.setNameLoc(TL.getNameLoc()); 6164 6165 return Result; 6166 } 6167 6168 template<typename Derived> 6169 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6170 TypeLocBuilder &TLB, 6171 UnaryTransformTypeLoc TL) { 6172 QualType Result = TL.getType(); 6173 if (Result->isDependentType()) { 6174 const UnaryTransformType *T = TL.getTypePtr(); 6175 QualType NewBase = 6176 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6177 Result = getDerived().RebuildUnaryTransformType(NewBase, 6178 T->getUTTKind(), 6179 TL.getKWLoc()); 6180 if (Result.isNull()) 6181 return QualType(); 6182 } 6183 6184 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6185 NewTL.setKWLoc(TL.getKWLoc()); 6186 NewTL.setParensRange(TL.getParensRange()); 6187 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6188 return Result; 6189 } 6190 6191 template<typename Derived> 6192 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6193 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6194 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6195 6196 CXXScopeSpec SS; 6197 TemplateName TemplateName = getDerived().TransformTemplateName( 6198 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6199 if (TemplateName.isNull()) 6200 return QualType(); 6201 6202 QualType OldDeduced = T->getDeducedType(); 6203 QualType NewDeduced; 6204 if (!OldDeduced.isNull()) { 6205 NewDeduced = getDerived().TransformType(OldDeduced); 6206 if (NewDeduced.isNull()) 6207 return QualType(); 6208 } 6209 6210 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6211 TemplateName, NewDeduced); 6212 if (Result.isNull()) 6213 return QualType(); 6214 6215 DeducedTemplateSpecializationTypeLoc NewTL = 6216 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6217 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6218 6219 return Result; 6220 } 6221 6222 template<typename Derived> 6223 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6224 RecordTypeLoc TL) { 6225 const RecordType *T = TL.getTypePtr(); 6226 RecordDecl *Record 6227 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6228 T->getDecl())); 6229 if (!Record) 6230 return QualType(); 6231 6232 QualType Result = TL.getType(); 6233 if (getDerived().AlwaysRebuild() || 6234 Record != T->getDecl()) { 6235 Result = getDerived().RebuildRecordType(Record); 6236 if (Result.isNull()) 6237 return QualType(); 6238 } 6239 6240 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6241 NewTL.setNameLoc(TL.getNameLoc()); 6242 6243 return Result; 6244 } 6245 6246 template<typename Derived> 6247 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6248 EnumTypeLoc TL) { 6249 const EnumType *T = TL.getTypePtr(); 6250 EnumDecl *Enum 6251 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6252 T->getDecl())); 6253 if (!Enum) 6254 return QualType(); 6255 6256 QualType Result = TL.getType(); 6257 if (getDerived().AlwaysRebuild() || 6258 Enum != T->getDecl()) { 6259 Result = getDerived().RebuildEnumType(Enum); 6260 if (Result.isNull()) 6261 return QualType(); 6262 } 6263 6264 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6265 NewTL.setNameLoc(TL.getNameLoc()); 6266 6267 return Result; 6268 } 6269 6270 template<typename Derived> 6271 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6272 TypeLocBuilder &TLB, 6273 InjectedClassNameTypeLoc TL) { 6274 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6275 TL.getTypePtr()->getDecl()); 6276 if (!D) return QualType(); 6277 6278 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6279 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6280 return T; 6281 } 6282 6283 template<typename Derived> 6284 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6285 TypeLocBuilder &TLB, 6286 TemplateTypeParmTypeLoc TL) { 6287 return TransformTypeSpecType(TLB, TL); 6288 } 6289 6290 template<typename Derived> 6291 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6292 TypeLocBuilder &TLB, 6293 SubstTemplateTypeParmTypeLoc TL) { 6294 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6295 6296 // Substitute into the replacement type, which itself might involve something 6297 // that needs to be transformed. This only tends to occur with default 6298 // template arguments of template template parameters. 6299 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6300 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6301 if (Replacement.isNull()) 6302 return QualType(); 6303 6304 // Always canonicalize the replacement type. 6305 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6306 QualType Result 6307 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6308 Replacement); 6309 6310 // Propagate type-source information. 6311 SubstTemplateTypeParmTypeLoc NewTL 6312 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6313 NewTL.setNameLoc(TL.getNameLoc()); 6314 return Result; 6315 6316 } 6317 6318 template<typename Derived> 6319 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6320 TypeLocBuilder &TLB, 6321 SubstTemplateTypeParmPackTypeLoc TL) { 6322 return TransformTypeSpecType(TLB, TL); 6323 } 6324 6325 template<typename Derived> 6326 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6327 TypeLocBuilder &TLB, 6328 TemplateSpecializationTypeLoc TL) { 6329 const TemplateSpecializationType *T = TL.getTypePtr(); 6330 6331 // The nested-name-specifier never matters in a TemplateSpecializationType, 6332 // because we can't have a dependent nested-name-specifier anyway. 6333 CXXScopeSpec SS; 6334 TemplateName Template 6335 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6336 TL.getTemplateNameLoc()); 6337 if (Template.isNull()) 6338 return QualType(); 6339 6340 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6341 } 6342 6343 template<typename Derived> 6344 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6345 AtomicTypeLoc TL) { 6346 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6347 if (ValueType.isNull()) 6348 return QualType(); 6349 6350 QualType Result = TL.getType(); 6351 if (getDerived().AlwaysRebuild() || 6352 ValueType != TL.getValueLoc().getType()) { 6353 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6354 if (Result.isNull()) 6355 return QualType(); 6356 } 6357 6358 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6359 NewTL.setKWLoc(TL.getKWLoc()); 6360 NewTL.setLParenLoc(TL.getLParenLoc()); 6361 NewTL.setRParenLoc(TL.getRParenLoc()); 6362 6363 return Result; 6364 } 6365 6366 template <typename Derived> 6367 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6368 PipeTypeLoc TL) { 6369 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6370 if (ValueType.isNull()) 6371 return QualType(); 6372 6373 QualType Result = TL.getType(); 6374 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6375 const PipeType *PT = Result->castAs<PipeType>(); 6376 bool isReadPipe = PT->isReadOnly(); 6377 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6378 if (Result.isNull()) 6379 return QualType(); 6380 } 6381 6382 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6383 NewTL.setKWLoc(TL.getKWLoc()); 6384 6385 return Result; 6386 } 6387 6388 template <typename Derived> 6389 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6390 ExtIntTypeLoc TL) { 6391 const ExtIntType *EIT = TL.getTypePtr(); 6392 QualType Result = TL.getType(); 6393 6394 if (getDerived().AlwaysRebuild()) { 6395 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6396 EIT->getNumBits(), TL.getNameLoc()); 6397 if (Result.isNull()) 6398 return QualType(); 6399 } 6400 6401 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6402 NewTL.setNameLoc(TL.getNameLoc()); 6403 return Result; 6404 } 6405 6406 template <typename Derived> 6407 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6408 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6409 const DependentExtIntType *EIT = TL.getTypePtr(); 6410 6411 EnterExpressionEvaluationContext Unevaluated( 6412 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6413 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6414 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6415 6416 if (BitsExpr.isInvalid()) 6417 return QualType(); 6418 6419 QualType Result = TL.getType(); 6420 6421 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6422 Result = getDerived().RebuildDependentExtIntType( 6423 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6424 6425 if (Result.isNull()) 6426 return QualType(); 6427 } 6428 6429 if (isa<DependentExtIntType>(Result)) { 6430 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6431 NewTL.setNameLoc(TL.getNameLoc()); 6432 } else { 6433 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6434 NewTL.setNameLoc(TL.getNameLoc()); 6435 } 6436 return Result; 6437 } 6438 6439 /// Simple iterator that traverses the template arguments in a 6440 /// container that provides a \c getArgLoc() member function. 6441 /// 6442 /// This iterator is intended to be used with the iterator form of 6443 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6444 template<typename ArgLocContainer> 6445 class TemplateArgumentLocContainerIterator { 6446 ArgLocContainer *Container; 6447 unsigned Index; 6448 6449 public: 6450 typedef TemplateArgumentLoc value_type; 6451 typedef TemplateArgumentLoc reference; 6452 typedef int difference_type; 6453 typedef std::input_iterator_tag iterator_category; 6454 6455 class pointer { 6456 TemplateArgumentLoc Arg; 6457 6458 public: 6459 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6460 6461 const TemplateArgumentLoc *operator->() const { 6462 return &Arg; 6463 } 6464 }; 6465 6466 6467 TemplateArgumentLocContainerIterator() {} 6468 6469 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6470 unsigned Index) 6471 : Container(&Container), Index(Index) { } 6472 6473 TemplateArgumentLocContainerIterator &operator++() { 6474 ++Index; 6475 return *this; 6476 } 6477 6478 TemplateArgumentLocContainerIterator operator++(int) { 6479 TemplateArgumentLocContainerIterator Old(*this); 6480 ++(*this); 6481 return Old; 6482 } 6483 6484 TemplateArgumentLoc operator*() const { 6485 return Container->getArgLoc(Index); 6486 } 6487 6488 pointer operator->() const { 6489 return pointer(Container->getArgLoc(Index)); 6490 } 6491 6492 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6493 const TemplateArgumentLocContainerIterator &Y) { 6494 return X.Container == Y.Container && X.Index == Y.Index; 6495 } 6496 6497 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6498 const TemplateArgumentLocContainerIterator &Y) { 6499 return !(X == Y); 6500 } 6501 }; 6502 6503 template<typename Derived> 6504 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6505 AutoTypeLoc TL) { 6506 const AutoType *T = TL.getTypePtr(); 6507 QualType OldDeduced = T->getDeducedType(); 6508 QualType NewDeduced; 6509 if (!OldDeduced.isNull()) { 6510 NewDeduced = getDerived().TransformType(OldDeduced); 6511 if (NewDeduced.isNull()) 6512 return QualType(); 6513 } 6514 6515 ConceptDecl *NewCD = nullptr; 6516 TemplateArgumentListInfo NewTemplateArgs; 6517 NestedNameSpecifierLoc NewNestedNameSpec; 6518 if (TL.getTypePtr()->isConstrained()) { 6519 NewCD = cast_or_null<ConceptDecl>( 6520 getDerived().TransformDecl( 6521 TL.getConceptNameLoc(), 6522 TL.getTypePtr()->getTypeConstraintConcept())); 6523 6524 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6525 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6526 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6527 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6528 ArgIterator(TL, 6529 TL.getNumArgs()), 6530 NewTemplateArgs)) 6531 return QualType(); 6532 6533 if (TL.getNestedNameSpecifierLoc()) { 6534 NewNestedNameSpec 6535 = getDerived().TransformNestedNameSpecifierLoc( 6536 TL.getNestedNameSpecifierLoc()); 6537 if (!NewNestedNameSpec) 6538 return QualType(); 6539 } 6540 } 6541 6542 QualType Result = TL.getType(); 6543 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6544 T->isDependentType()) { 6545 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6546 NewArgList.reserve(NewArgList.size()); 6547 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6548 NewArgList.push_back(ArgLoc.getArgument()); 6549 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6550 NewArgList); 6551 if (Result.isNull()) 6552 return QualType(); 6553 } 6554 6555 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6556 NewTL.setNameLoc(TL.getNameLoc()); 6557 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6558 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6559 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6560 NewTL.setFoundDecl(TL.getFoundDecl()); 6561 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6562 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6563 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6564 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6565 6566 return Result; 6567 } 6568 6569 template <typename Derived> 6570 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6571 TypeLocBuilder &TLB, 6572 TemplateSpecializationTypeLoc TL, 6573 TemplateName Template) { 6574 TemplateArgumentListInfo NewTemplateArgs; 6575 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6576 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6577 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6578 ArgIterator; 6579 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6580 ArgIterator(TL, TL.getNumArgs()), 6581 NewTemplateArgs)) 6582 return QualType(); 6583 6584 // FIXME: maybe don't rebuild if all the template arguments are the same. 6585 6586 QualType Result = 6587 getDerived().RebuildTemplateSpecializationType(Template, 6588 TL.getTemplateNameLoc(), 6589 NewTemplateArgs); 6590 6591 if (!Result.isNull()) { 6592 // Specializations of template template parameters are represented as 6593 // TemplateSpecializationTypes, and substitution of type alias templates 6594 // within a dependent context can transform them into 6595 // DependentTemplateSpecializationTypes. 6596 if (isa<DependentTemplateSpecializationType>(Result)) { 6597 DependentTemplateSpecializationTypeLoc NewTL 6598 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6599 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6600 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6601 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6602 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6603 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6604 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6605 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6606 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6607 return Result; 6608 } 6609 6610 TemplateSpecializationTypeLoc NewTL 6611 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6612 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6613 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6614 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6615 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6616 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6617 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6618 } 6619 6620 return Result; 6621 } 6622 6623 template <typename Derived> 6624 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6625 TypeLocBuilder &TLB, 6626 DependentTemplateSpecializationTypeLoc TL, 6627 TemplateName Template, 6628 CXXScopeSpec &SS) { 6629 TemplateArgumentListInfo NewTemplateArgs; 6630 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6631 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6632 typedef TemplateArgumentLocContainerIterator< 6633 DependentTemplateSpecializationTypeLoc> ArgIterator; 6634 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6635 ArgIterator(TL, TL.getNumArgs()), 6636 NewTemplateArgs)) 6637 return QualType(); 6638 6639 // FIXME: maybe don't rebuild if all the template arguments are the same. 6640 6641 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6642 QualType Result 6643 = getSema().Context.getDependentTemplateSpecializationType( 6644 TL.getTypePtr()->getKeyword(), 6645 DTN->getQualifier(), 6646 DTN->getIdentifier(), 6647 NewTemplateArgs); 6648 6649 DependentTemplateSpecializationTypeLoc NewTL 6650 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6651 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6652 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6653 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6654 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6655 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6656 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6657 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6658 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6659 return Result; 6660 } 6661 6662 QualType Result 6663 = getDerived().RebuildTemplateSpecializationType(Template, 6664 TL.getTemplateNameLoc(), 6665 NewTemplateArgs); 6666 6667 if (!Result.isNull()) { 6668 /// FIXME: Wrap this in an elaborated-type-specifier? 6669 TemplateSpecializationTypeLoc NewTL 6670 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6671 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6672 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6673 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6674 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6675 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6676 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6677 } 6678 6679 return Result; 6680 } 6681 6682 template<typename Derived> 6683 QualType 6684 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6685 ElaboratedTypeLoc TL) { 6686 const ElaboratedType *T = TL.getTypePtr(); 6687 6688 NestedNameSpecifierLoc QualifierLoc; 6689 // NOTE: the qualifier in an ElaboratedType is optional. 6690 if (TL.getQualifierLoc()) { 6691 QualifierLoc 6692 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6693 if (!QualifierLoc) 6694 return QualType(); 6695 } 6696 6697 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6698 if (NamedT.isNull()) 6699 return QualType(); 6700 6701 // C++0x [dcl.type.elab]p2: 6702 // If the identifier resolves to a typedef-name or the simple-template-id 6703 // resolves to an alias template specialization, the 6704 // elaborated-type-specifier is ill-formed. 6705 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6706 if (const TemplateSpecializationType *TST = 6707 NamedT->getAs<TemplateSpecializationType>()) { 6708 TemplateName Template = TST->getTemplateName(); 6709 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6710 Template.getAsTemplateDecl())) { 6711 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6712 diag::err_tag_reference_non_tag) 6713 << TAT << Sema::NTK_TypeAliasTemplate 6714 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6715 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6716 } 6717 } 6718 } 6719 6720 QualType Result = TL.getType(); 6721 if (getDerived().AlwaysRebuild() || 6722 QualifierLoc != TL.getQualifierLoc() || 6723 NamedT != T->getNamedType()) { 6724 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6725 T->getKeyword(), 6726 QualifierLoc, NamedT); 6727 if (Result.isNull()) 6728 return QualType(); 6729 } 6730 6731 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6732 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6733 NewTL.setQualifierLoc(QualifierLoc); 6734 return Result; 6735 } 6736 6737 template<typename Derived> 6738 QualType TreeTransform<Derived>::TransformAttributedType( 6739 TypeLocBuilder &TLB, 6740 AttributedTypeLoc TL) { 6741 const AttributedType *oldType = TL.getTypePtr(); 6742 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6743 if (modifiedType.isNull()) 6744 return QualType(); 6745 6746 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6747 const Attr *oldAttr = TL.getAttr(); 6748 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6749 if (oldAttr && !newAttr) 6750 return QualType(); 6751 6752 QualType result = TL.getType(); 6753 6754 // FIXME: dependent operand expressions? 6755 if (getDerived().AlwaysRebuild() || 6756 modifiedType != oldType->getModifiedType()) { 6757 // TODO: this is really lame; we should really be rebuilding the 6758 // equivalent type from first principles. 6759 QualType equivalentType 6760 = getDerived().TransformType(oldType->getEquivalentType()); 6761 if (equivalentType.isNull()) 6762 return QualType(); 6763 6764 // Check whether we can add nullability; it is only represented as 6765 // type sugar, and therefore cannot be diagnosed in any other way. 6766 if (auto nullability = oldType->getImmediateNullability()) { 6767 if (!modifiedType->canHaveNullability()) { 6768 SemaRef.Diag(TL.getAttr()->getLocation(), 6769 diag::err_nullability_nonpointer) 6770 << DiagNullabilityKind(*nullability, false) << modifiedType; 6771 return QualType(); 6772 } 6773 } 6774 6775 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6776 modifiedType, 6777 equivalentType); 6778 } 6779 6780 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6781 newTL.setAttr(newAttr); 6782 return result; 6783 } 6784 6785 template<typename Derived> 6786 QualType 6787 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6788 ParenTypeLoc 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() || 6795 Inner != TL.getInnerLoc().getType()) { 6796 Result = getDerived().RebuildParenType(Inner); 6797 if (Result.isNull()) 6798 return QualType(); 6799 } 6800 6801 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6802 NewTL.setLParenLoc(TL.getLParenLoc()); 6803 NewTL.setRParenLoc(TL.getRParenLoc()); 6804 return Result; 6805 } 6806 6807 template <typename Derived> 6808 QualType 6809 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6810 MacroQualifiedTypeLoc TL) { 6811 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6812 if (Inner.isNull()) 6813 return QualType(); 6814 6815 QualType Result = TL.getType(); 6816 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6817 Result = 6818 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6819 if (Result.isNull()) 6820 return QualType(); 6821 } 6822 6823 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6824 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6825 return Result; 6826 } 6827 6828 template<typename Derived> 6829 QualType TreeTransform<Derived>::TransformDependentNameType( 6830 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6831 return TransformDependentNameType(TLB, TL, false); 6832 } 6833 6834 template<typename Derived> 6835 QualType TreeTransform<Derived>::TransformDependentNameType( 6836 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6837 const DependentNameType *T = TL.getTypePtr(); 6838 6839 NestedNameSpecifierLoc QualifierLoc 6840 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6841 if (!QualifierLoc) 6842 return QualType(); 6843 6844 QualType Result 6845 = getDerived().RebuildDependentNameType(T->getKeyword(), 6846 TL.getElaboratedKeywordLoc(), 6847 QualifierLoc, 6848 T->getIdentifier(), 6849 TL.getNameLoc(), 6850 DeducedTSTContext); 6851 if (Result.isNull()) 6852 return QualType(); 6853 6854 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6855 QualType NamedT = ElabT->getNamedType(); 6856 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6857 6858 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6859 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6860 NewTL.setQualifierLoc(QualifierLoc); 6861 } else { 6862 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6863 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6864 NewTL.setQualifierLoc(QualifierLoc); 6865 NewTL.setNameLoc(TL.getNameLoc()); 6866 } 6867 return Result; 6868 } 6869 6870 template<typename Derived> 6871 QualType TreeTransform<Derived>:: 6872 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6873 DependentTemplateSpecializationTypeLoc TL) { 6874 NestedNameSpecifierLoc QualifierLoc; 6875 if (TL.getQualifierLoc()) { 6876 QualifierLoc 6877 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6878 if (!QualifierLoc) 6879 return QualType(); 6880 } 6881 6882 return getDerived() 6883 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6884 } 6885 6886 template<typename Derived> 6887 QualType TreeTransform<Derived>:: 6888 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6889 DependentTemplateSpecializationTypeLoc TL, 6890 NestedNameSpecifierLoc QualifierLoc) { 6891 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6892 6893 TemplateArgumentListInfo NewTemplateArgs; 6894 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6895 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6896 6897 typedef TemplateArgumentLocContainerIterator< 6898 DependentTemplateSpecializationTypeLoc> ArgIterator; 6899 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6900 ArgIterator(TL, TL.getNumArgs()), 6901 NewTemplateArgs)) 6902 return QualType(); 6903 6904 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6905 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6906 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6907 /*AllowInjectedClassName*/ false); 6908 if (Result.isNull()) 6909 return QualType(); 6910 6911 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6912 QualType NamedT = ElabT->getNamedType(); 6913 6914 // Copy information relevant to the template specialization. 6915 TemplateSpecializationTypeLoc NamedTL 6916 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6917 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6918 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6919 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6920 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6921 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6922 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6923 6924 // Copy information relevant to the elaborated type. 6925 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6926 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6927 NewTL.setQualifierLoc(QualifierLoc); 6928 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6929 DependentTemplateSpecializationTypeLoc SpecTL 6930 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6931 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6932 SpecTL.setQualifierLoc(QualifierLoc); 6933 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6934 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6935 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6936 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6937 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6938 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6939 } else { 6940 TemplateSpecializationTypeLoc SpecTL 6941 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6942 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6943 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6944 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6945 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6946 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6947 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6948 } 6949 return Result; 6950 } 6951 6952 template<typename Derived> 6953 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6954 PackExpansionTypeLoc TL) { 6955 QualType Pattern 6956 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6957 if (Pattern.isNull()) 6958 return QualType(); 6959 6960 QualType Result = TL.getType(); 6961 if (getDerived().AlwaysRebuild() || 6962 Pattern != TL.getPatternLoc().getType()) { 6963 Result = getDerived().RebuildPackExpansionType(Pattern, 6964 TL.getPatternLoc().getSourceRange(), 6965 TL.getEllipsisLoc(), 6966 TL.getTypePtr()->getNumExpansions()); 6967 if (Result.isNull()) 6968 return QualType(); 6969 } 6970 6971 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6972 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6973 return Result; 6974 } 6975 6976 template<typename Derived> 6977 QualType 6978 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6979 ObjCInterfaceTypeLoc TL) { 6980 // ObjCInterfaceType is never dependent. 6981 TLB.pushFullCopy(TL); 6982 return TL.getType(); 6983 } 6984 6985 template<typename Derived> 6986 QualType 6987 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6988 ObjCTypeParamTypeLoc TL) { 6989 const ObjCTypeParamType *T = TL.getTypePtr(); 6990 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6991 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6992 if (!OTP) 6993 return QualType(); 6994 6995 QualType Result = TL.getType(); 6996 if (getDerived().AlwaysRebuild() || 6997 OTP != T->getDecl()) { 6998 Result = getDerived().RebuildObjCTypeParamType(OTP, 6999 TL.getProtocolLAngleLoc(), 7000 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7001 TL.getNumProtocols()), 7002 TL.getProtocolLocs(), 7003 TL.getProtocolRAngleLoc()); 7004 if (Result.isNull()) 7005 return QualType(); 7006 } 7007 7008 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7009 if (TL.getNumProtocols()) { 7010 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7011 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7012 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7013 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7014 } 7015 return Result; 7016 } 7017 7018 template<typename Derived> 7019 QualType 7020 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7021 ObjCObjectTypeLoc TL) { 7022 // Transform base type. 7023 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7024 if (BaseType.isNull()) 7025 return QualType(); 7026 7027 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7028 7029 // Transform type arguments. 7030 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7031 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7032 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7033 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7034 QualType TypeArg = TypeArgInfo->getType(); 7035 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7036 AnyChanged = true; 7037 7038 // We have a pack expansion. Instantiate it. 7039 const auto *PackExpansion = PackExpansionLoc.getType() 7040 ->castAs<PackExpansionType>(); 7041 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7042 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7043 Unexpanded); 7044 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7045 7046 // Determine whether the set of unexpanded parameter packs can 7047 // and should be expanded. 7048 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7049 bool Expand = false; 7050 bool RetainExpansion = false; 7051 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7052 if (getDerived().TryExpandParameterPacks( 7053 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7054 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7055 return QualType(); 7056 7057 if (!Expand) { 7058 // We can't expand this pack expansion into separate arguments yet; 7059 // just substitute into the pattern and create a new pack expansion 7060 // type. 7061 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7062 7063 TypeLocBuilder TypeArgBuilder; 7064 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7065 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7066 PatternLoc); 7067 if (NewPatternType.isNull()) 7068 return QualType(); 7069 7070 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7071 NewPatternType, NumExpansions); 7072 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7073 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7074 NewTypeArgInfos.push_back( 7075 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7076 continue; 7077 } 7078 7079 // Substitute into the pack expansion pattern for each slice of the 7080 // pack. 7081 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7082 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7083 7084 TypeLocBuilder TypeArgBuilder; 7085 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7086 7087 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7088 PatternLoc); 7089 if (NewTypeArg.isNull()) 7090 return QualType(); 7091 7092 NewTypeArgInfos.push_back( 7093 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7094 } 7095 7096 continue; 7097 } 7098 7099 TypeLocBuilder TypeArgBuilder; 7100 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7101 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7102 if (NewTypeArg.isNull()) 7103 return QualType(); 7104 7105 // If nothing changed, just keep the old TypeSourceInfo. 7106 if (NewTypeArg == TypeArg) { 7107 NewTypeArgInfos.push_back(TypeArgInfo); 7108 continue; 7109 } 7110 7111 NewTypeArgInfos.push_back( 7112 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7113 AnyChanged = true; 7114 } 7115 7116 QualType Result = TL.getType(); 7117 if (getDerived().AlwaysRebuild() || AnyChanged) { 7118 // Rebuild the type. 7119 Result = getDerived().RebuildObjCObjectType( 7120 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7121 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7122 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7123 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7124 7125 if (Result.isNull()) 7126 return QualType(); 7127 } 7128 7129 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7130 NewT.setHasBaseTypeAsWritten(true); 7131 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7132 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7133 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7134 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7135 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7136 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7137 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7138 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7139 return Result; 7140 } 7141 7142 template<typename Derived> 7143 QualType 7144 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7145 ObjCObjectPointerTypeLoc TL) { 7146 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7147 if (PointeeType.isNull()) 7148 return QualType(); 7149 7150 QualType Result = TL.getType(); 7151 if (getDerived().AlwaysRebuild() || 7152 PointeeType != TL.getPointeeLoc().getType()) { 7153 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7154 TL.getStarLoc()); 7155 if (Result.isNull()) 7156 return QualType(); 7157 } 7158 7159 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7160 NewT.setStarLoc(TL.getStarLoc()); 7161 return Result; 7162 } 7163 7164 //===----------------------------------------------------------------------===// 7165 // Statement transformation 7166 //===----------------------------------------------------------------------===// 7167 template<typename Derived> 7168 StmtResult 7169 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7170 return S; 7171 } 7172 7173 template<typename Derived> 7174 StmtResult 7175 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7176 return getDerived().TransformCompoundStmt(S, false); 7177 } 7178 7179 template<typename Derived> 7180 StmtResult 7181 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7182 bool IsStmtExpr) { 7183 Sema::CompoundScopeRAII CompoundScope(getSema()); 7184 7185 const Stmt *ExprResult = S->getStmtExprResult(); 7186 bool SubStmtInvalid = false; 7187 bool SubStmtChanged = false; 7188 SmallVector<Stmt*, 8> Statements; 7189 for (auto *B : S->body()) { 7190 StmtResult Result = getDerived().TransformStmt( 7191 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7192 7193 if (Result.isInvalid()) { 7194 // Immediately fail if this was a DeclStmt, since it's very 7195 // likely that this will cause problems for future statements. 7196 if (isa<DeclStmt>(B)) 7197 return StmtError(); 7198 7199 // Otherwise, just keep processing substatements and fail later. 7200 SubStmtInvalid = true; 7201 continue; 7202 } 7203 7204 SubStmtChanged = SubStmtChanged || Result.get() != B; 7205 Statements.push_back(Result.getAs<Stmt>()); 7206 } 7207 7208 if (SubStmtInvalid) 7209 return StmtError(); 7210 7211 if (!getDerived().AlwaysRebuild() && 7212 !SubStmtChanged) 7213 return S; 7214 7215 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7216 Statements, 7217 S->getRBracLoc(), 7218 IsStmtExpr); 7219 } 7220 7221 template<typename Derived> 7222 StmtResult 7223 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7224 ExprResult LHS, RHS; 7225 { 7226 EnterExpressionEvaluationContext Unevaluated( 7227 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7228 7229 // Transform the left-hand case value. 7230 LHS = getDerived().TransformExpr(S->getLHS()); 7231 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7232 if (LHS.isInvalid()) 7233 return StmtError(); 7234 7235 // Transform the right-hand case value (for the GNU case-range extension). 7236 RHS = getDerived().TransformExpr(S->getRHS()); 7237 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7238 if (RHS.isInvalid()) 7239 return StmtError(); 7240 } 7241 7242 // Build the case statement. 7243 // Case statements are always rebuilt so that they will attached to their 7244 // transformed switch statement. 7245 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7246 LHS.get(), 7247 S->getEllipsisLoc(), 7248 RHS.get(), 7249 S->getColonLoc()); 7250 if (Case.isInvalid()) 7251 return StmtError(); 7252 7253 // Transform the statement following the case 7254 StmtResult SubStmt = 7255 getDerived().TransformStmt(S->getSubStmt()); 7256 if (SubStmt.isInvalid()) 7257 return StmtError(); 7258 7259 // Attach the body to the case statement 7260 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7261 } 7262 7263 template <typename Derived> 7264 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7265 // Transform the statement following the default case 7266 StmtResult SubStmt = 7267 getDerived().TransformStmt(S->getSubStmt()); 7268 if (SubStmt.isInvalid()) 7269 return StmtError(); 7270 7271 // Default statements are always rebuilt 7272 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7273 SubStmt.get()); 7274 } 7275 7276 template<typename Derived> 7277 StmtResult 7278 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7279 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7280 if (SubStmt.isInvalid()) 7281 return StmtError(); 7282 7283 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7284 S->getDecl()); 7285 if (!LD) 7286 return StmtError(); 7287 7288 // If we're transforming "in-place" (we're not creating new local 7289 // declarations), assume we're replacing the old label statement 7290 // and clear out the reference to it. 7291 if (LD == S->getDecl()) 7292 S->getDecl()->setStmt(nullptr); 7293 7294 // FIXME: Pass the real colon location in. 7295 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7296 cast<LabelDecl>(LD), SourceLocation(), 7297 SubStmt.get()); 7298 } 7299 7300 template <typename Derived> 7301 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7302 if (!R) 7303 return R; 7304 7305 switch (R->getKind()) { 7306 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7307 #define ATTR(X) 7308 #define PRAGMA_SPELLING_ATTR(X) \ 7309 case attr::X: \ 7310 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7311 #include "clang/Basic/AttrList.inc" 7312 default: 7313 return R; 7314 } 7315 } 7316 7317 template <typename Derived> 7318 StmtResult 7319 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7320 StmtDiscardKind SDK) { 7321 bool AttrsChanged = false; 7322 SmallVector<const Attr *, 1> Attrs; 7323 7324 // Visit attributes and keep track if any are transformed. 7325 for (const auto *I : S->getAttrs()) { 7326 const Attr *R = getDerived().TransformAttr(I); 7327 AttrsChanged |= (I != R); 7328 if (R) 7329 Attrs.push_back(R); 7330 } 7331 7332 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7333 if (SubStmt.isInvalid()) 7334 return StmtError(); 7335 7336 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7337 return S; 7338 7339 // If transforming the attributes failed for all of the attributes in the 7340 // statement, don't make an AttributedStmt without attributes. 7341 if (Attrs.empty()) 7342 return SubStmt; 7343 7344 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7345 SubStmt.get()); 7346 } 7347 7348 template<typename Derived> 7349 StmtResult 7350 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7351 // Transform the initialization statement 7352 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7353 if (Init.isInvalid()) 7354 return StmtError(); 7355 7356 // Transform the condition 7357 Sema::ConditionResult Cond = getDerived().TransformCondition( 7358 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7359 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7360 : Sema::ConditionKind::Boolean); 7361 if (Cond.isInvalid()) 7362 return StmtError(); 7363 7364 // If this is a constexpr if, determine which arm we should instantiate. 7365 llvm::Optional<bool> ConstexprConditionValue; 7366 if (S->isConstexpr()) 7367 ConstexprConditionValue = Cond.getKnownValue(); 7368 7369 // Transform the "then" branch. 7370 StmtResult Then; 7371 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7372 Then = getDerived().TransformStmt(S->getThen()); 7373 if (Then.isInvalid()) 7374 return StmtError(); 7375 } else { 7376 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7377 } 7378 7379 // Transform the "else" branch. 7380 StmtResult Else; 7381 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7382 Else = getDerived().TransformStmt(S->getElse()); 7383 if (Else.isInvalid()) 7384 return StmtError(); 7385 } 7386 7387 if (!getDerived().AlwaysRebuild() && 7388 Init.get() == S->getInit() && 7389 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7390 Then.get() == S->getThen() && 7391 Else.get() == S->getElse()) 7392 return S; 7393 7394 return getDerived().RebuildIfStmt( 7395 S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, 7396 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7397 } 7398 7399 template<typename Derived> 7400 StmtResult 7401 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7402 // Transform the initialization statement 7403 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7404 if (Init.isInvalid()) 7405 return StmtError(); 7406 7407 // Transform the condition. 7408 Sema::ConditionResult Cond = getDerived().TransformCondition( 7409 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7410 Sema::ConditionKind::Switch); 7411 if (Cond.isInvalid()) 7412 return StmtError(); 7413 7414 // Rebuild the switch statement. 7415 StmtResult Switch = 7416 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7417 Init.get(), Cond, S->getRParenLoc()); 7418 if (Switch.isInvalid()) 7419 return StmtError(); 7420 7421 // Transform the body of the switch statement. 7422 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7423 if (Body.isInvalid()) 7424 return StmtError(); 7425 7426 // Complete the switch statement. 7427 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7428 Body.get()); 7429 } 7430 7431 template<typename Derived> 7432 StmtResult 7433 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7434 // Transform the condition 7435 Sema::ConditionResult Cond = getDerived().TransformCondition( 7436 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7437 Sema::ConditionKind::Boolean); 7438 if (Cond.isInvalid()) 7439 return StmtError(); 7440 7441 // Transform the body 7442 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7443 if (Body.isInvalid()) 7444 return StmtError(); 7445 7446 if (!getDerived().AlwaysRebuild() && 7447 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7448 Body.get() == S->getBody()) 7449 return Owned(S); 7450 7451 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7452 Cond, S->getRParenLoc(), Body.get()); 7453 } 7454 7455 template<typename Derived> 7456 StmtResult 7457 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7458 // Transform the body 7459 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7460 if (Body.isInvalid()) 7461 return StmtError(); 7462 7463 // Transform the condition 7464 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7465 if (Cond.isInvalid()) 7466 return StmtError(); 7467 7468 if (!getDerived().AlwaysRebuild() && 7469 Cond.get() == S->getCond() && 7470 Body.get() == S->getBody()) 7471 return S; 7472 7473 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7474 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7475 S->getRParenLoc()); 7476 } 7477 7478 template<typename Derived> 7479 StmtResult 7480 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7481 if (getSema().getLangOpts().OpenMP) 7482 getSema().startOpenMPLoop(); 7483 7484 // Transform the initialization statement 7485 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7486 if (Init.isInvalid()) 7487 return StmtError(); 7488 7489 // In OpenMP loop region loop control variable must be captured and be 7490 // private. Perform analysis of first part (if any). 7491 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7492 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7493 7494 // Transform the condition 7495 Sema::ConditionResult Cond = getDerived().TransformCondition( 7496 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7497 Sema::ConditionKind::Boolean); 7498 if (Cond.isInvalid()) 7499 return StmtError(); 7500 7501 // Transform the increment 7502 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7503 if (Inc.isInvalid()) 7504 return StmtError(); 7505 7506 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7507 if (S->getInc() && !FullInc.get()) 7508 return StmtError(); 7509 7510 // Transform the body 7511 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7512 if (Body.isInvalid()) 7513 return StmtError(); 7514 7515 if (!getDerived().AlwaysRebuild() && 7516 Init.get() == S->getInit() && 7517 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7518 Inc.get() == S->getInc() && 7519 Body.get() == S->getBody()) 7520 return S; 7521 7522 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7523 Init.get(), Cond, FullInc, 7524 S->getRParenLoc(), Body.get()); 7525 } 7526 7527 template<typename Derived> 7528 StmtResult 7529 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7530 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7531 S->getLabel()); 7532 if (!LD) 7533 return StmtError(); 7534 7535 // Goto statements must always be rebuilt, to resolve the label. 7536 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7537 cast<LabelDecl>(LD)); 7538 } 7539 7540 template<typename Derived> 7541 StmtResult 7542 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7543 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7544 if (Target.isInvalid()) 7545 return StmtError(); 7546 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7547 7548 if (!getDerived().AlwaysRebuild() && 7549 Target.get() == S->getTarget()) 7550 return S; 7551 7552 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7553 Target.get()); 7554 } 7555 7556 template<typename Derived> 7557 StmtResult 7558 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7559 return S; 7560 } 7561 7562 template<typename Derived> 7563 StmtResult 7564 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7565 return S; 7566 } 7567 7568 template<typename Derived> 7569 StmtResult 7570 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7571 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7572 /*NotCopyInit*/false); 7573 if (Result.isInvalid()) 7574 return StmtError(); 7575 7576 // FIXME: We always rebuild the return statement because there is no way 7577 // to tell whether the return type of the function has changed. 7578 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7579 } 7580 7581 template<typename Derived> 7582 StmtResult 7583 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7584 bool DeclChanged = false; 7585 SmallVector<Decl *, 4> Decls; 7586 for (auto *D : S->decls()) { 7587 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7588 if (!Transformed) 7589 return StmtError(); 7590 7591 if (Transformed != D) 7592 DeclChanged = true; 7593 7594 Decls.push_back(Transformed); 7595 } 7596 7597 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7598 return S; 7599 7600 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7601 } 7602 7603 template<typename Derived> 7604 StmtResult 7605 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7606 7607 SmallVector<Expr*, 8> Constraints; 7608 SmallVector<Expr*, 8> Exprs; 7609 SmallVector<IdentifierInfo *, 4> Names; 7610 7611 ExprResult AsmString; 7612 SmallVector<Expr*, 8> Clobbers; 7613 7614 bool ExprsChanged = false; 7615 7616 // Go through the outputs. 7617 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7618 Names.push_back(S->getOutputIdentifier(I)); 7619 7620 // No need to transform the constraint literal. 7621 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7622 7623 // Transform the output expr. 7624 Expr *OutputExpr = S->getOutputExpr(I); 7625 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7626 if (Result.isInvalid()) 7627 return StmtError(); 7628 7629 ExprsChanged |= Result.get() != OutputExpr; 7630 7631 Exprs.push_back(Result.get()); 7632 } 7633 7634 // Go through the inputs. 7635 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7636 Names.push_back(S->getInputIdentifier(I)); 7637 7638 // No need to transform the constraint literal. 7639 Constraints.push_back(S->getInputConstraintLiteral(I)); 7640 7641 // Transform the input expr. 7642 Expr *InputExpr = S->getInputExpr(I); 7643 ExprResult Result = getDerived().TransformExpr(InputExpr); 7644 if (Result.isInvalid()) 7645 return StmtError(); 7646 7647 ExprsChanged |= Result.get() != InputExpr; 7648 7649 Exprs.push_back(Result.get()); 7650 } 7651 7652 // Go through the Labels. 7653 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7654 Names.push_back(S->getLabelIdentifier(I)); 7655 7656 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7657 if (Result.isInvalid()) 7658 return StmtError(); 7659 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7660 Exprs.push_back(Result.get()); 7661 } 7662 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7663 return S; 7664 7665 // Go through the clobbers. 7666 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7667 Clobbers.push_back(S->getClobberStringLiteral(I)); 7668 7669 // No need to transform the asm string literal. 7670 AsmString = S->getAsmString(); 7671 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7672 S->isVolatile(), S->getNumOutputs(), 7673 S->getNumInputs(), Names.data(), 7674 Constraints, Exprs, AsmString.get(), 7675 Clobbers, S->getNumLabels(), 7676 S->getRParenLoc()); 7677 } 7678 7679 template<typename Derived> 7680 StmtResult 7681 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7682 ArrayRef<Token> AsmToks = 7683 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7684 7685 bool HadError = false, HadChange = false; 7686 7687 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7688 SmallVector<Expr*, 8> TransformedExprs; 7689 TransformedExprs.reserve(SrcExprs.size()); 7690 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7691 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7692 if (!Result.isUsable()) { 7693 HadError = true; 7694 } else { 7695 HadChange |= (Result.get() != SrcExprs[i]); 7696 TransformedExprs.push_back(Result.get()); 7697 } 7698 } 7699 7700 if (HadError) return StmtError(); 7701 if (!HadChange && !getDerived().AlwaysRebuild()) 7702 return Owned(S); 7703 7704 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7705 AsmToks, S->getAsmString(), 7706 S->getNumOutputs(), S->getNumInputs(), 7707 S->getAllConstraints(), S->getClobbers(), 7708 TransformedExprs, S->getEndLoc()); 7709 } 7710 7711 // C++ Coroutines TS 7712 7713 template<typename Derived> 7714 StmtResult 7715 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7716 auto *ScopeInfo = SemaRef.getCurFunction(); 7717 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7718 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7719 ScopeInfo->NeedsCoroutineSuspends && 7720 ScopeInfo->CoroutineSuspends.first == nullptr && 7721 ScopeInfo->CoroutineSuspends.second == nullptr && 7722 "expected clean scope info"); 7723 7724 // Set that we have (possibly-invalid) suspend points before we do anything 7725 // that may fail. 7726 ScopeInfo->setNeedsCoroutineSuspends(false); 7727 7728 // We re-build the coroutine promise object (and the coroutine parameters its 7729 // type and constructor depend on) based on the types used in our current 7730 // function. We must do so, and set it on the current FunctionScopeInfo, 7731 // before attempting to transform the other parts of the coroutine body 7732 // statement, such as the implicit suspend statements (because those 7733 // statements reference the FunctionScopeInfo::CoroutinePromise). 7734 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7735 return StmtError(); 7736 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7737 if (!Promise) 7738 return StmtError(); 7739 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7740 ScopeInfo->CoroutinePromise = Promise; 7741 7742 // Transform the implicit coroutine statements constructed using dependent 7743 // types during the previous parse: initial and final suspensions, the return 7744 // object, and others. We also transform the coroutine function's body. 7745 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7746 if (InitSuspend.isInvalid()) 7747 return StmtError(); 7748 StmtResult FinalSuspend = 7749 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7750 if (FinalSuspend.isInvalid() || 7751 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7752 return StmtError(); 7753 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7754 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7755 7756 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7757 if (BodyRes.isInvalid()) 7758 return StmtError(); 7759 7760 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7761 if (Builder.isInvalid()) 7762 return StmtError(); 7763 7764 Expr *ReturnObject = S->getReturnValueInit(); 7765 assert(ReturnObject && "the return object is expected to be valid"); 7766 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7767 /*NoCopyInit*/ false); 7768 if (Res.isInvalid()) 7769 return StmtError(); 7770 Builder.ReturnValue = Res.get(); 7771 7772 // If during the previous parse the coroutine still had a dependent promise 7773 // statement, we may need to build some implicit coroutine statements 7774 // (such as exception and fallthrough handlers) for the first time. 7775 if (S->hasDependentPromiseType()) { 7776 // We can only build these statements, however, if the current promise type 7777 // is not dependent. 7778 if (!Promise->getType()->isDependentType()) { 7779 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7780 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7781 "these nodes should not have been built yet"); 7782 if (!Builder.buildDependentStatements()) 7783 return StmtError(); 7784 } 7785 } else { 7786 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7787 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7788 if (Res.isInvalid()) 7789 return StmtError(); 7790 Builder.OnFallthrough = Res.get(); 7791 } 7792 7793 if (auto *OnException = S->getExceptionHandler()) { 7794 StmtResult Res = getDerived().TransformStmt(OnException); 7795 if (Res.isInvalid()) 7796 return StmtError(); 7797 Builder.OnException = Res.get(); 7798 } 7799 7800 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7801 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7802 if (Res.isInvalid()) 7803 return StmtError(); 7804 Builder.ReturnStmtOnAllocFailure = Res.get(); 7805 } 7806 7807 // Transform any additional statements we may have already built 7808 assert(S->getAllocate() && S->getDeallocate() && 7809 "allocation and deallocation calls must already be built"); 7810 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7811 if (AllocRes.isInvalid()) 7812 return StmtError(); 7813 Builder.Allocate = AllocRes.get(); 7814 7815 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7816 if (DeallocRes.isInvalid()) 7817 return StmtError(); 7818 Builder.Deallocate = DeallocRes.get(); 7819 7820 assert(S->getResultDecl() && "ResultDecl must already be built"); 7821 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7822 if (ResultDecl.isInvalid()) 7823 return StmtError(); 7824 Builder.ResultDecl = ResultDecl.get(); 7825 7826 if (auto *ReturnStmt = S->getReturnStmt()) { 7827 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7828 if (Res.isInvalid()) 7829 return StmtError(); 7830 Builder.ReturnStmt = Res.get(); 7831 } 7832 } 7833 7834 return getDerived().RebuildCoroutineBodyStmt(Builder); 7835 } 7836 7837 template<typename Derived> 7838 StmtResult 7839 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7840 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7841 /*NotCopyInit*/false); 7842 if (Result.isInvalid()) 7843 return StmtError(); 7844 7845 // Always rebuild; we don't know if this needs to be injected into a new 7846 // context or if the promise type has changed. 7847 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7848 S->isImplicit()); 7849 } 7850 7851 template<typename Derived> 7852 ExprResult 7853 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7854 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7855 /*NotCopyInit*/false); 7856 if (Result.isInvalid()) 7857 return ExprError(); 7858 7859 // Always rebuild; we don't know if this needs to be injected into a new 7860 // context or if the promise type has changed. 7861 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7862 E->isImplicit()); 7863 } 7864 7865 template <typename Derived> 7866 ExprResult 7867 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7868 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7869 /*NotCopyInit*/ false); 7870 if (OperandResult.isInvalid()) 7871 return ExprError(); 7872 7873 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7874 E->getOperatorCoawaitLookup()); 7875 7876 if (LookupResult.isInvalid()) 7877 return ExprError(); 7878 7879 // Always rebuild; we don't know if this needs to be injected into a new 7880 // context or if the promise type has changed. 7881 return getDerived().RebuildDependentCoawaitExpr( 7882 E->getKeywordLoc(), OperandResult.get(), 7883 cast<UnresolvedLookupExpr>(LookupResult.get())); 7884 } 7885 7886 template<typename Derived> 7887 ExprResult 7888 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7889 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7890 /*NotCopyInit*/false); 7891 if (Result.isInvalid()) 7892 return ExprError(); 7893 7894 // Always rebuild; we don't know if this needs to be injected into a new 7895 // context or if the promise type has changed. 7896 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7897 } 7898 7899 // Objective-C Statements. 7900 7901 template<typename Derived> 7902 StmtResult 7903 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7904 // Transform the body of the @try. 7905 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7906 if (TryBody.isInvalid()) 7907 return StmtError(); 7908 7909 // Transform the @catch statements (if present). 7910 bool AnyCatchChanged = false; 7911 SmallVector<Stmt*, 8> CatchStmts; 7912 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7913 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7914 if (Catch.isInvalid()) 7915 return StmtError(); 7916 if (Catch.get() != S->getCatchStmt(I)) 7917 AnyCatchChanged = true; 7918 CatchStmts.push_back(Catch.get()); 7919 } 7920 7921 // Transform the @finally statement (if present). 7922 StmtResult Finally; 7923 if (S->getFinallyStmt()) { 7924 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7925 if (Finally.isInvalid()) 7926 return StmtError(); 7927 } 7928 7929 // If nothing changed, just retain this statement. 7930 if (!getDerived().AlwaysRebuild() && 7931 TryBody.get() == S->getTryBody() && 7932 !AnyCatchChanged && 7933 Finally.get() == S->getFinallyStmt()) 7934 return S; 7935 7936 // Build a new statement. 7937 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7938 CatchStmts, Finally.get()); 7939 } 7940 7941 template<typename Derived> 7942 StmtResult 7943 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7944 // Transform the @catch parameter, if there is one. 7945 VarDecl *Var = nullptr; 7946 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7947 TypeSourceInfo *TSInfo = nullptr; 7948 if (FromVar->getTypeSourceInfo()) { 7949 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7950 if (!TSInfo) 7951 return StmtError(); 7952 } 7953 7954 QualType T; 7955 if (TSInfo) 7956 T = TSInfo->getType(); 7957 else { 7958 T = getDerived().TransformType(FromVar->getType()); 7959 if (T.isNull()) 7960 return StmtError(); 7961 } 7962 7963 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7964 if (!Var) 7965 return StmtError(); 7966 } 7967 7968 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7969 if (Body.isInvalid()) 7970 return StmtError(); 7971 7972 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7973 S->getRParenLoc(), 7974 Var, Body.get()); 7975 } 7976 7977 template<typename Derived> 7978 StmtResult 7979 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7980 // Transform the body. 7981 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7982 if (Body.isInvalid()) 7983 return StmtError(); 7984 7985 // If nothing changed, just retain this statement. 7986 if (!getDerived().AlwaysRebuild() && 7987 Body.get() == S->getFinallyBody()) 7988 return S; 7989 7990 // Build a new statement. 7991 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7992 Body.get()); 7993 } 7994 7995 template<typename Derived> 7996 StmtResult 7997 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7998 ExprResult Operand; 7999 if (S->getThrowExpr()) { 8000 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8001 if (Operand.isInvalid()) 8002 return StmtError(); 8003 } 8004 8005 if (!getDerived().AlwaysRebuild() && 8006 Operand.get() == S->getThrowExpr()) 8007 return S; 8008 8009 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8010 } 8011 8012 template<typename Derived> 8013 StmtResult 8014 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8015 ObjCAtSynchronizedStmt *S) { 8016 // Transform the object we are locking. 8017 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8018 if (Object.isInvalid()) 8019 return StmtError(); 8020 Object = 8021 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8022 Object.get()); 8023 if (Object.isInvalid()) 8024 return StmtError(); 8025 8026 // Transform the body. 8027 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8028 if (Body.isInvalid()) 8029 return StmtError(); 8030 8031 // If nothing change, just retain the current statement. 8032 if (!getDerived().AlwaysRebuild() && 8033 Object.get() == S->getSynchExpr() && 8034 Body.get() == S->getSynchBody()) 8035 return S; 8036 8037 // Build a new statement. 8038 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8039 Object.get(), Body.get()); 8040 } 8041 8042 template<typename Derived> 8043 StmtResult 8044 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8045 ObjCAutoreleasePoolStmt *S) { 8046 // Transform the body. 8047 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8048 if (Body.isInvalid()) 8049 return StmtError(); 8050 8051 // If nothing changed, just retain this statement. 8052 if (!getDerived().AlwaysRebuild() && 8053 Body.get() == S->getSubStmt()) 8054 return S; 8055 8056 // Build a new statement. 8057 return getDerived().RebuildObjCAutoreleasePoolStmt( 8058 S->getAtLoc(), Body.get()); 8059 } 8060 8061 template<typename Derived> 8062 StmtResult 8063 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8064 ObjCForCollectionStmt *S) { 8065 // Transform the element statement. 8066 StmtResult Element = 8067 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8068 if (Element.isInvalid()) 8069 return StmtError(); 8070 8071 // Transform the collection expression. 8072 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8073 if (Collection.isInvalid()) 8074 return StmtError(); 8075 8076 // Transform the body. 8077 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8078 if (Body.isInvalid()) 8079 return StmtError(); 8080 8081 // If nothing changed, just retain this statement. 8082 if (!getDerived().AlwaysRebuild() && 8083 Element.get() == S->getElement() && 8084 Collection.get() == S->getCollection() && 8085 Body.get() == S->getBody()) 8086 return S; 8087 8088 // Build a new statement. 8089 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8090 Element.get(), 8091 Collection.get(), 8092 S->getRParenLoc(), 8093 Body.get()); 8094 } 8095 8096 template <typename Derived> 8097 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8098 // Transform the exception declaration, if any. 8099 VarDecl *Var = nullptr; 8100 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8101 TypeSourceInfo *T = 8102 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8103 if (!T) 8104 return StmtError(); 8105 8106 Var = getDerived().RebuildExceptionDecl( 8107 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8108 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8109 if (!Var || Var->isInvalidDecl()) 8110 return StmtError(); 8111 } 8112 8113 // Transform the actual exception handler. 8114 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8115 if (Handler.isInvalid()) 8116 return StmtError(); 8117 8118 if (!getDerived().AlwaysRebuild() && !Var && 8119 Handler.get() == S->getHandlerBlock()) 8120 return S; 8121 8122 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8123 } 8124 8125 template <typename Derived> 8126 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8127 // Transform the try block itself. 8128 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8129 if (TryBlock.isInvalid()) 8130 return StmtError(); 8131 8132 // Transform the handlers. 8133 bool HandlerChanged = false; 8134 SmallVector<Stmt *, 8> Handlers; 8135 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8136 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8137 if (Handler.isInvalid()) 8138 return StmtError(); 8139 8140 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8141 Handlers.push_back(Handler.getAs<Stmt>()); 8142 } 8143 8144 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8145 !HandlerChanged) 8146 return S; 8147 8148 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8149 Handlers); 8150 } 8151 8152 template<typename Derived> 8153 StmtResult 8154 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8155 StmtResult Init = 8156 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8157 if (Init.isInvalid()) 8158 return StmtError(); 8159 8160 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8161 if (Range.isInvalid()) 8162 return StmtError(); 8163 8164 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8165 if (Begin.isInvalid()) 8166 return StmtError(); 8167 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8168 if (End.isInvalid()) 8169 return StmtError(); 8170 8171 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8172 if (Cond.isInvalid()) 8173 return StmtError(); 8174 if (Cond.get()) 8175 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8176 if (Cond.isInvalid()) 8177 return StmtError(); 8178 if (Cond.get()) 8179 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8180 8181 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8182 if (Inc.isInvalid()) 8183 return StmtError(); 8184 if (Inc.get()) 8185 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8186 8187 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8188 if (LoopVar.isInvalid()) 8189 return StmtError(); 8190 8191 StmtResult NewStmt = S; 8192 if (getDerived().AlwaysRebuild() || 8193 Init.get() != S->getInit() || 8194 Range.get() != S->getRangeStmt() || 8195 Begin.get() != S->getBeginStmt() || 8196 End.get() != S->getEndStmt() || 8197 Cond.get() != S->getCond() || 8198 Inc.get() != S->getInc() || 8199 LoopVar.get() != S->getLoopVarStmt()) { 8200 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8201 S->getCoawaitLoc(), Init.get(), 8202 S->getColonLoc(), Range.get(), 8203 Begin.get(), End.get(), 8204 Cond.get(), 8205 Inc.get(), LoopVar.get(), 8206 S->getRParenLoc()); 8207 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8208 // Might not have attached any initializer to the loop variable. 8209 getSema().ActOnInitializerError( 8210 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8211 return StmtError(); 8212 } 8213 } 8214 8215 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8216 if (Body.isInvalid()) 8217 return StmtError(); 8218 8219 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8220 // it now so we have a new statement to attach the body to. 8221 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8222 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8223 S->getCoawaitLoc(), Init.get(), 8224 S->getColonLoc(), Range.get(), 8225 Begin.get(), End.get(), 8226 Cond.get(), 8227 Inc.get(), LoopVar.get(), 8228 S->getRParenLoc()); 8229 if (NewStmt.isInvalid()) 8230 return StmtError(); 8231 } 8232 8233 if (NewStmt.get() == S) 8234 return S; 8235 8236 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8237 } 8238 8239 template<typename Derived> 8240 StmtResult 8241 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8242 MSDependentExistsStmt *S) { 8243 // Transform the nested-name-specifier, if any. 8244 NestedNameSpecifierLoc QualifierLoc; 8245 if (S->getQualifierLoc()) { 8246 QualifierLoc 8247 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8248 if (!QualifierLoc) 8249 return StmtError(); 8250 } 8251 8252 // Transform the declaration name. 8253 DeclarationNameInfo NameInfo = S->getNameInfo(); 8254 if (NameInfo.getName()) { 8255 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8256 if (!NameInfo.getName()) 8257 return StmtError(); 8258 } 8259 8260 // Check whether anything changed. 8261 if (!getDerived().AlwaysRebuild() && 8262 QualifierLoc == S->getQualifierLoc() && 8263 NameInfo.getName() == S->getNameInfo().getName()) 8264 return S; 8265 8266 // Determine whether this name exists, if we can. 8267 CXXScopeSpec SS; 8268 SS.Adopt(QualifierLoc); 8269 bool Dependent = false; 8270 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8271 case Sema::IER_Exists: 8272 if (S->isIfExists()) 8273 break; 8274 8275 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8276 8277 case Sema::IER_DoesNotExist: 8278 if (S->isIfNotExists()) 8279 break; 8280 8281 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8282 8283 case Sema::IER_Dependent: 8284 Dependent = true; 8285 break; 8286 8287 case Sema::IER_Error: 8288 return StmtError(); 8289 } 8290 8291 // We need to continue with the instantiation, so do so now. 8292 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8293 if (SubStmt.isInvalid()) 8294 return StmtError(); 8295 8296 // If we have resolved the name, just transform to the substatement. 8297 if (!Dependent) 8298 return SubStmt; 8299 8300 // The name is still dependent, so build a dependent expression again. 8301 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8302 S->isIfExists(), 8303 QualifierLoc, 8304 NameInfo, 8305 SubStmt.get()); 8306 } 8307 8308 template<typename Derived> 8309 ExprResult 8310 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8311 NestedNameSpecifierLoc QualifierLoc; 8312 if (E->getQualifierLoc()) { 8313 QualifierLoc 8314 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8315 if (!QualifierLoc) 8316 return ExprError(); 8317 } 8318 8319 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8320 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8321 if (!PD) 8322 return ExprError(); 8323 8324 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8325 if (Base.isInvalid()) 8326 return ExprError(); 8327 8328 return new (SemaRef.getASTContext()) 8329 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8330 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8331 QualifierLoc, E->getMemberLoc()); 8332 } 8333 8334 template <typename Derived> 8335 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8336 MSPropertySubscriptExpr *E) { 8337 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8338 if (BaseRes.isInvalid()) 8339 return ExprError(); 8340 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8341 if (IdxRes.isInvalid()) 8342 return ExprError(); 8343 8344 if (!getDerived().AlwaysRebuild() && 8345 BaseRes.get() == E->getBase() && 8346 IdxRes.get() == E->getIdx()) 8347 return E; 8348 8349 return getDerived().RebuildArraySubscriptExpr( 8350 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8351 } 8352 8353 template <typename Derived> 8354 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8355 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8356 if (TryBlock.isInvalid()) 8357 return StmtError(); 8358 8359 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8360 if (Handler.isInvalid()) 8361 return StmtError(); 8362 8363 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8364 Handler.get() == S->getHandler()) 8365 return S; 8366 8367 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8368 TryBlock.get(), Handler.get()); 8369 } 8370 8371 template <typename Derived> 8372 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8373 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8374 if (Block.isInvalid()) 8375 return StmtError(); 8376 8377 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8378 } 8379 8380 template <typename Derived> 8381 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8382 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8383 if (FilterExpr.isInvalid()) 8384 return StmtError(); 8385 8386 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8387 if (Block.isInvalid()) 8388 return StmtError(); 8389 8390 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8391 Block.get()); 8392 } 8393 8394 template <typename Derived> 8395 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8396 if (isa<SEHFinallyStmt>(Handler)) 8397 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8398 else 8399 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8400 } 8401 8402 template<typename Derived> 8403 StmtResult 8404 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8405 return S; 8406 } 8407 8408 //===----------------------------------------------------------------------===// 8409 // OpenMP directive transformation 8410 //===----------------------------------------------------------------------===// 8411 8412 template <typename Derived> 8413 StmtResult 8414 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8415 // OMPCanonicalLoops are eliminated during transformation, since they will be 8416 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8417 // after transformation. 8418 return getDerived().TransformStmt(L->getLoopStmt()); 8419 } 8420 8421 template <typename Derived> 8422 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8423 OMPExecutableDirective *D) { 8424 8425 // Transform the clauses 8426 llvm::SmallVector<OMPClause *, 16> TClauses; 8427 ArrayRef<OMPClause *> Clauses = D->clauses(); 8428 TClauses.reserve(Clauses.size()); 8429 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8430 I != E; ++I) { 8431 if (*I) { 8432 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8433 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8434 getDerived().getSema().EndOpenMPClause(); 8435 if (Clause) 8436 TClauses.push_back(Clause); 8437 } else { 8438 TClauses.push_back(nullptr); 8439 } 8440 } 8441 StmtResult AssociatedStmt; 8442 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8443 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8444 /*CurScope=*/nullptr); 8445 StmtResult Body; 8446 { 8447 Sema::CompoundScopeRAII CompoundScope(getSema()); 8448 Stmt *CS; 8449 if (D->getDirectiveKind() == OMPD_atomic || 8450 D->getDirectiveKind() == OMPD_critical || 8451 D->getDirectiveKind() == OMPD_section || 8452 D->getDirectiveKind() == OMPD_master) 8453 CS = D->getAssociatedStmt(); 8454 else 8455 CS = D->getRawStmt(); 8456 Body = getDerived().TransformStmt(CS); 8457 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8458 getSema().getLangOpts().OpenMPIRBuilder) 8459 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8460 } 8461 AssociatedStmt = 8462 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8463 if (AssociatedStmt.isInvalid()) { 8464 return StmtError(); 8465 } 8466 } 8467 if (TClauses.size() != Clauses.size()) { 8468 return StmtError(); 8469 } 8470 8471 // Transform directive name for 'omp critical' directive. 8472 DeclarationNameInfo DirName; 8473 if (D->getDirectiveKind() == OMPD_critical) { 8474 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8475 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8476 } 8477 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8478 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8479 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8480 } else if (D->getDirectiveKind() == OMPD_cancel) { 8481 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8482 } 8483 8484 return getDerived().RebuildOMPExecutableDirective( 8485 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8486 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8487 } 8488 8489 template <typename Derived> 8490 StmtResult 8491 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8492 DeclarationNameInfo DirName; 8493 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8494 D->getBeginLoc()); 8495 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8496 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8497 return Res; 8498 } 8499 8500 template <typename Derived> 8501 StmtResult 8502 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8503 DeclarationNameInfo DirName; 8504 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8505 D->getBeginLoc()); 8506 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8507 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8508 return Res; 8509 } 8510 8511 template <typename Derived> 8512 StmtResult 8513 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8514 DeclarationNameInfo DirName; 8515 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8516 nullptr, D->getBeginLoc()); 8517 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8518 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8519 return Res; 8520 } 8521 8522 template <typename Derived> 8523 StmtResult 8524 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8525 DeclarationNameInfo DirName; 8526 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8527 D->getBeginLoc()); 8528 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8529 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8530 return Res; 8531 } 8532 8533 template <typename Derived> 8534 StmtResult 8535 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8536 DeclarationNameInfo DirName; 8537 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8538 D->getBeginLoc()); 8539 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8540 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8541 return Res; 8542 } 8543 8544 template <typename Derived> 8545 StmtResult 8546 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8547 DeclarationNameInfo DirName; 8548 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8549 D->getBeginLoc()); 8550 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8551 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8552 return Res; 8553 } 8554 8555 template <typename Derived> 8556 StmtResult 8557 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8558 DeclarationNameInfo DirName; 8559 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8560 D->getBeginLoc()); 8561 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8562 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8563 return Res; 8564 } 8565 8566 template <typename Derived> 8567 StmtResult 8568 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8569 DeclarationNameInfo DirName; 8570 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8571 D->getBeginLoc()); 8572 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8573 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8574 return Res; 8575 } 8576 8577 template <typename Derived> 8578 StmtResult 8579 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8580 DeclarationNameInfo DirName; 8581 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8582 D->getBeginLoc()); 8583 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8584 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8585 return Res; 8586 } 8587 8588 template <typename Derived> 8589 StmtResult 8590 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8591 getDerived().getSema().StartOpenMPDSABlock( 8592 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8593 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8594 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8595 return Res; 8596 } 8597 8598 template <typename Derived> 8599 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8600 OMPParallelForDirective *D) { 8601 DeclarationNameInfo DirName; 8602 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8603 nullptr, D->getBeginLoc()); 8604 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8605 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8606 return Res; 8607 } 8608 8609 template <typename Derived> 8610 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8611 OMPParallelForSimdDirective *D) { 8612 DeclarationNameInfo DirName; 8613 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8614 nullptr, D->getBeginLoc()); 8615 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8616 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8617 return Res; 8618 } 8619 8620 template <typename Derived> 8621 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8622 OMPParallelMasterDirective *D) { 8623 DeclarationNameInfo DirName; 8624 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8625 nullptr, D->getBeginLoc()); 8626 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8627 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8628 return Res; 8629 } 8630 8631 template <typename Derived> 8632 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8633 OMPParallelSectionsDirective *D) { 8634 DeclarationNameInfo DirName; 8635 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8636 nullptr, D->getBeginLoc()); 8637 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8638 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8639 return Res; 8640 } 8641 8642 template <typename Derived> 8643 StmtResult 8644 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8645 DeclarationNameInfo DirName; 8646 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8647 D->getBeginLoc()); 8648 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8649 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8650 return Res; 8651 } 8652 8653 template <typename Derived> 8654 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8655 OMPTaskyieldDirective *D) { 8656 DeclarationNameInfo DirName; 8657 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8658 D->getBeginLoc()); 8659 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8660 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8661 return Res; 8662 } 8663 8664 template <typename Derived> 8665 StmtResult 8666 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8667 DeclarationNameInfo DirName; 8668 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8669 D->getBeginLoc()); 8670 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8671 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8672 return Res; 8673 } 8674 8675 template <typename Derived> 8676 StmtResult 8677 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8678 DeclarationNameInfo DirName; 8679 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8680 D->getBeginLoc()); 8681 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8682 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8683 return Res; 8684 } 8685 8686 template <typename Derived> 8687 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8688 OMPTaskgroupDirective *D) { 8689 DeclarationNameInfo DirName; 8690 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8691 D->getBeginLoc()); 8692 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8693 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8694 return Res; 8695 } 8696 8697 template <typename Derived> 8698 StmtResult 8699 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8700 DeclarationNameInfo DirName; 8701 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8702 D->getBeginLoc()); 8703 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8704 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8705 return Res; 8706 } 8707 8708 template <typename Derived> 8709 StmtResult 8710 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8711 DeclarationNameInfo DirName; 8712 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8713 D->getBeginLoc()); 8714 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8715 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8716 return Res; 8717 } 8718 8719 template <typename Derived> 8720 StmtResult 8721 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8722 DeclarationNameInfo DirName; 8723 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8724 D->getBeginLoc()); 8725 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8726 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8727 return Res; 8728 } 8729 8730 template <typename Derived> 8731 StmtResult 8732 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8733 DeclarationNameInfo DirName; 8734 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8735 D->getBeginLoc()); 8736 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8737 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8738 return Res; 8739 } 8740 8741 template <typename Derived> 8742 StmtResult 8743 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8744 DeclarationNameInfo DirName; 8745 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8746 D->getBeginLoc()); 8747 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8748 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8749 return Res; 8750 } 8751 8752 template <typename Derived> 8753 StmtResult 8754 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8755 DeclarationNameInfo DirName; 8756 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8757 D->getBeginLoc()); 8758 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8759 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8760 return Res; 8761 } 8762 8763 template <typename Derived> 8764 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8765 OMPTargetDataDirective *D) { 8766 DeclarationNameInfo DirName; 8767 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8768 D->getBeginLoc()); 8769 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8770 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8771 return Res; 8772 } 8773 8774 template <typename Derived> 8775 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8776 OMPTargetEnterDataDirective *D) { 8777 DeclarationNameInfo DirName; 8778 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8779 nullptr, D->getBeginLoc()); 8780 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8781 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8782 return Res; 8783 } 8784 8785 template <typename Derived> 8786 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8787 OMPTargetExitDataDirective *D) { 8788 DeclarationNameInfo DirName; 8789 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8790 nullptr, D->getBeginLoc()); 8791 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8792 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8793 return Res; 8794 } 8795 8796 template <typename Derived> 8797 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8798 OMPTargetParallelDirective *D) { 8799 DeclarationNameInfo DirName; 8800 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8801 nullptr, D->getBeginLoc()); 8802 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8803 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8804 return Res; 8805 } 8806 8807 template <typename Derived> 8808 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8809 OMPTargetParallelForDirective *D) { 8810 DeclarationNameInfo DirName; 8811 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8812 nullptr, D->getBeginLoc()); 8813 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8814 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8815 return Res; 8816 } 8817 8818 template <typename Derived> 8819 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8820 OMPTargetUpdateDirective *D) { 8821 DeclarationNameInfo DirName; 8822 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8823 nullptr, D->getBeginLoc()); 8824 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8825 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8826 return Res; 8827 } 8828 8829 template <typename Derived> 8830 StmtResult 8831 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8832 DeclarationNameInfo DirName; 8833 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8834 D->getBeginLoc()); 8835 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8836 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8837 return Res; 8838 } 8839 8840 template <typename Derived> 8841 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8842 OMPCancellationPointDirective *D) { 8843 DeclarationNameInfo DirName; 8844 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8845 nullptr, D->getBeginLoc()); 8846 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8847 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8848 return Res; 8849 } 8850 8851 template <typename Derived> 8852 StmtResult 8853 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8854 DeclarationNameInfo DirName; 8855 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8856 D->getBeginLoc()); 8857 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8858 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8859 return Res; 8860 } 8861 8862 template <typename Derived> 8863 StmtResult 8864 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8865 DeclarationNameInfo DirName; 8866 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8867 D->getBeginLoc()); 8868 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8869 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8870 return Res; 8871 } 8872 8873 template <typename Derived> 8874 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8875 OMPTaskLoopSimdDirective *D) { 8876 DeclarationNameInfo DirName; 8877 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8878 nullptr, D->getBeginLoc()); 8879 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8880 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8881 return Res; 8882 } 8883 8884 template <typename Derived> 8885 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8886 OMPMasterTaskLoopDirective *D) { 8887 DeclarationNameInfo DirName; 8888 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8889 nullptr, D->getBeginLoc()); 8890 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8891 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8892 return Res; 8893 } 8894 8895 template <typename Derived> 8896 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8897 OMPMasterTaskLoopSimdDirective *D) { 8898 DeclarationNameInfo DirName; 8899 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8900 nullptr, D->getBeginLoc()); 8901 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8902 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8903 return Res; 8904 } 8905 8906 template <typename Derived> 8907 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8908 OMPParallelMasterTaskLoopDirective *D) { 8909 DeclarationNameInfo DirName; 8910 getDerived().getSema().StartOpenMPDSABlock( 8911 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8912 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8913 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8914 return Res; 8915 } 8916 8917 template <typename Derived> 8918 StmtResult 8919 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8920 OMPParallelMasterTaskLoopSimdDirective *D) { 8921 DeclarationNameInfo DirName; 8922 getDerived().getSema().StartOpenMPDSABlock( 8923 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8924 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8925 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8926 return Res; 8927 } 8928 8929 template <typename Derived> 8930 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8931 OMPDistributeDirective *D) { 8932 DeclarationNameInfo DirName; 8933 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8934 D->getBeginLoc()); 8935 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8936 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8937 return Res; 8938 } 8939 8940 template <typename Derived> 8941 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8942 OMPDistributeParallelForDirective *D) { 8943 DeclarationNameInfo DirName; 8944 getDerived().getSema().StartOpenMPDSABlock( 8945 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8946 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8947 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8948 return Res; 8949 } 8950 8951 template <typename Derived> 8952 StmtResult 8953 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8954 OMPDistributeParallelForSimdDirective *D) { 8955 DeclarationNameInfo DirName; 8956 getDerived().getSema().StartOpenMPDSABlock( 8957 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8958 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8959 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8960 return Res; 8961 } 8962 8963 template <typename Derived> 8964 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8965 OMPDistributeSimdDirective *D) { 8966 DeclarationNameInfo DirName; 8967 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8968 nullptr, D->getBeginLoc()); 8969 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8970 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8971 return Res; 8972 } 8973 8974 template <typename Derived> 8975 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8976 OMPTargetParallelForSimdDirective *D) { 8977 DeclarationNameInfo DirName; 8978 getDerived().getSema().StartOpenMPDSABlock( 8979 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8980 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8981 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8982 return Res; 8983 } 8984 8985 template <typename Derived> 8986 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8987 OMPTargetSimdDirective *D) { 8988 DeclarationNameInfo DirName; 8989 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8990 D->getBeginLoc()); 8991 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8992 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8993 return Res; 8994 } 8995 8996 template <typename Derived> 8997 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8998 OMPTeamsDistributeDirective *D) { 8999 DeclarationNameInfo DirName; 9000 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9001 nullptr, D->getBeginLoc()); 9002 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9003 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9004 return Res; 9005 } 9006 9007 template <typename Derived> 9008 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9009 OMPTeamsDistributeSimdDirective *D) { 9010 DeclarationNameInfo DirName; 9011 getDerived().getSema().StartOpenMPDSABlock( 9012 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9013 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9014 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9015 return Res; 9016 } 9017 9018 template <typename Derived> 9019 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9020 OMPTeamsDistributeParallelForSimdDirective *D) { 9021 DeclarationNameInfo DirName; 9022 getDerived().getSema().StartOpenMPDSABlock( 9023 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9024 D->getBeginLoc()); 9025 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9026 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9027 return Res; 9028 } 9029 9030 template <typename Derived> 9031 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9032 OMPTeamsDistributeParallelForDirective *D) { 9033 DeclarationNameInfo DirName; 9034 getDerived().getSema().StartOpenMPDSABlock( 9035 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9036 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9037 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9038 return Res; 9039 } 9040 9041 template <typename Derived> 9042 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9043 OMPTargetTeamsDirective *D) { 9044 DeclarationNameInfo DirName; 9045 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9046 nullptr, D->getBeginLoc()); 9047 auto Res = getDerived().TransformOMPExecutableDirective(D); 9048 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9049 return Res; 9050 } 9051 9052 template <typename Derived> 9053 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9054 OMPTargetTeamsDistributeDirective *D) { 9055 DeclarationNameInfo DirName; 9056 getDerived().getSema().StartOpenMPDSABlock( 9057 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9058 auto Res = getDerived().TransformOMPExecutableDirective(D); 9059 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9060 return Res; 9061 } 9062 9063 template <typename Derived> 9064 StmtResult 9065 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9066 OMPTargetTeamsDistributeParallelForDirective *D) { 9067 DeclarationNameInfo DirName; 9068 getDerived().getSema().StartOpenMPDSABlock( 9069 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9070 D->getBeginLoc()); 9071 auto Res = getDerived().TransformOMPExecutableDirective(D); 9072 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9073 return Res; 9074 } 9075 9076 template <typename Derived> 9077 StmtResult TreeTransform<Derived>:: 9078 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9079 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9080 DeclarationNameInfo DirName; 9081 getDerived().getSema().StartOpenMPDSABlock( 9082 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9083 D->getBeginLoc()); 9084 auto Res = getDerived().TransformOMPExecutableDirective(D); 9085 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9086 return Res; 9087 } 9088 9089 template <typename Derived> 9090 StmtResult 9091 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9092 OMPTargetTeamsDistributeSimdDirective *D) { 9093 DeclarationNameInfo DirName; 9094 getDerived().getSema().StartOpenMPDSABlock( 9095 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9096 auto Res = getDerived().TransformOMPExecutableDirective(D); 9097 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9098 return Res; 9099 } 9100 9101 template <typename Derived> 9102 StmtResult 9103 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9104 DeclarationNameInfo DirName; 9105 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9106 D->getBeginLoc()); 9107 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9108 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9109 return Res; 9110 } 9111 9112 template <typename Derived> 9113 StmtResult 9114 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9115 DeclarationNameInfo DirName; 9116 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9117 D->getBeginLoc()); 9118 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9119 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9120 return Res; 9121 } 9122 9123 template <typename Derived> 9124 StmtResult 9125 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9126 DeclarationNameInfo DirName; 9127 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9128 D->getBeginLoc()); 9129 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9130 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9131 return Res; 9132 } 9133 9134 //===----------------------------------------------------------------------===// 9135 // OpenMP clause transformation 9136 //===----------------------------------------------------------------------===// 9137 template <typename Derived> 9138 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9139 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9140 if (Cond.isInvalid()) 9141 return nullptr; 9142 return getDerived().RebuildOMPIfClause( 9143 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9144 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9145 } 9146 9147 template <typename Derived> 9148 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9149 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9150 if (Cond.isInvalid()) 9151 return nullptr; 9152 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9153 C->getLParenLoc(), C->getEndLoc()); 9154 } 9155 9156 template <typename Derived> 9157 OMPClause * 9158 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9159 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9160 if (NumThreads.isInvalid()) 9161 return nullptr; 9162 return getDerived().RebuildOMPNumThreadsClause( 9163 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9164 } 9165 9166 template <typename Derived> 9167 OMPClause * 9168 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9169 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9170 if (E.isInvalid()) 9171 return nullptr; 9172 return getDerived().RebuildOMPSafelenClause( 9173 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9174 } 9175 9176 template <typename Derived> 9177 OMPClause * 9178 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9179 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9180 if (E.isInvalid()) 9181 return nullptr; 9182 return getDerived().RebuildOMPAllocatorClause( 9183 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9184 } 9185 9186 template <typename Derived> 9187 OMPClause * 9188 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9189 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9190 if (E.isInvalid()) 9191 return nullptr; 9192 return getDerived().RebuildOMPSimdlenClause( 9193 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9194 } 9195 9196 template <typename Derived> 9197 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9198 SmallVector<Expr *, 4> TransformedSizes; 9199 TransformedSizes.reserve(C->getNumSizes()); 9200 bool Changed = false; 9201 for (Expr *E : C->getSizesRefs()) { 9202 if (!E) { 9203 TransformedSizes.push_back(nullptr); 9204 continue; 9205 } 9206 9207 ExprResult T = getDerived().TransformExpr(E); 9208 if (T.isInvalid()) 9209 return nullptr; 9210 if (E != T.get()) 9211 Changed = true; 9212 TransformedSizes.push_back(T.get()); 9213 } 9214 9215 if (!Changed && !getDerived().AlwaysRebuild()) 9216 return C; 9217 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9218 C->getLParenLoc(), C->getEndLoc()); 9219 } 9220 9221 template <typename Derived> 9222 OMPClause * 9223 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9224 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9225 if (E.isInvalid()) 9226 return nullptr; 9227 return getDerived().RebuildOMPCollapseClause( 9228 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9229 } 9230 9231 template <typename Derived> 9232 OMPClause * 9233 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9234 return getDerived().RebuildOMPDefaultClause( 9235 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9236 C->getLParenLoc(), C->getEndLoc()); 9237 } 9238 9239 template <typename Derived> 9240 OMPClause * 9241 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9242 return getDerived().RebuildOMPProcBindClause( 9243 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9244 C->getLParenLoc(), C->getEndLoc()); 9245 } 9246 9247 template <typename Derived> 9248 OMPClause * 9249 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9250 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9251 if (E.isInvalid()) 9252 return nullptr; 9253 return getDerived().RebuildOMPScheduleClause( 9254 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9255 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9256 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9257 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9258 } 9259 9260 template <typename Derived> 9261 OMPClause * 9262 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9263 ExprResult E; 9264 if (auto *Num = C->getNumForLoops()) { 9265 E = getDerived().TransformExpr(Num); 9266 if (E.isInvalid()) 9267 return nullptr; 9268 } 9269 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9270 C->getLParenLoc(), E.get()); 9271 } 9272 9273 template <typename Derived> 9274 OMPClause * 9275 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9276 ExprResult E; 9277 if (Expr *Evt = C->getEventHandler()) { 9278 E = getDerived().TransformExpr(Evt); 9279 if (E.isInvalid()) 9280 return nullptr; 9281 } 9282 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9283 C->getLParenLoc(), C->getEndLoc()); 9284 } 9285 9286 template <typename Derived> 9287 OMPClause * 9288 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9289 // No need to rebuild this clause, no template-dependent parameters. 9290 return C; 9291 } 9292 9293 template <typename Derived> 9294 OMPClause * 9295 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9296 // No need to rebuild this clause, no template-dependent parameters. 9297 return C; 9298 } 9299 9300 template <typename Derived> 9301 OMPClause * 9302 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9303 // No need to rebuild this clause, no template-dependent parameters. 9304 return C; 9305 } 9306 9307 template <typename Derived> 9308 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9309 // No need to rebuild this clause, no template-dependent parameters. 9310 return C; 9311 } 9312 9313 template <typename Derived> 9314 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9315 // No need to rebuild this clause, no template-dependent parameters. 9316 return C; 9317 } 9318 9319 template <typename Derived> 9320 OMPClause * 9321 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9322 // No need to rebuild this clause, no template-dependent parameters. 9323 return C; 9324 } 9325 9326 template <typename Derived> 9327 OMPClause * 9328 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9329 // No need to rebuild this clause, no template-dependent parameters. 9330 return C; 9331 } 9332 9333 template <typename Derived> 9334 OMPClause * 9335 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9336 // No need to rebuild this clause, no template-dependent parameters. 9337 return C; 9338 } 9339 9340 template <typename Derived> 9341 OMPClause * 9342 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9343 // No need to rebuild this clause, no template-dependent parameters. 9344 return C; 9345 } 9346 9347 template <typename Derived> 9348 OMPClause * 9349 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9350 // No need to rebuild this clause, no template-dependent parameters. 9351 return C; 9352 } 9353 9354 template <typename Derived> 9355 OMPClause * 9356 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9357 // No need to rebuild this clause, no template-dependent parameters. 9358 return C; 9359 } 9360 9361 template <typename Derived> 9362 OMPClause * 9363 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9364 // No need to rebuild this clause, no template-dependent parameters. 9365 return C; 9366 } 9367 9368 template <typename Derived> 9369 OMPClause * 9370 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9371 // No need to rebuild this clause, no template-dependent parameters. 9372 return C; 9373 } 9374 9375 template <typename Derived> 9376 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9377 // No need to rebuild this clause, no template-dependent parameters. 9378 return C; 9379 } 9380 9381 template <typename Derived> 9382 OMPClause * 9383 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9384 // No need to rebuild this clause, no template-dependent parameters. 9385 return C; 9386 } 9387 9388 template <typename Derived> 9389 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9390 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9391 if (IVR.isInvalid()) 9392 return nullptr; 9393 9394 llvm::SmallVector<Expr *, 8> PrefExprs; 9395 PrefExprs.reserve(C->varlist_size() - 1); 9396 for (Expr *E : llvm::drop_begin(C->varlists())) { 9397 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9398 if (ER.isInvalid()) 9399 return nullptr; 9400 PrefExprs.push_back(ER.get()); 9401 } 9402 return getDerived().RebuildOMPInitClause( 9403 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9404 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9405 } 9406 9407 template <typename Derived> 9408 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9409 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9410 if (ER.isInvalid()) 9411 return nullptr; 9412 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9413 C->getLParenLoc(), C->getVarLoc(), 9414 C->getEndLoc()); 9415 } 9416 9417 template <typename Derived> 9418 OMPClause * 9419 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9420 ExprResult ER; 9421 if (Expr *IV = C->getInteropVar()) { 9422 ER = getDerived().TransformExpr(IV); 9423 if (ER.isInvalid()) 9424 return nullptr; 9425 } 9426 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9427 C->getLParenLoc(), C->getVarLoc(), 9428 C->getEndLoc()); 9429 } 9430 9431 template <typename Derived> 9432 OMPClause * 9433 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9434 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9435 if (Cond.isInvalid()) 9436 return nullptr; 9437 return getDerived().RebuildOMPNovariantsClause( 9438 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9439 } 9440 9441 template <typename Derived> 9442 OMPClause * 9443 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9444 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9445 if (Cond.isInvalid()) 9446 return nullptr; 9447 return getDerived().RebuildOMPNocontextClause( 9448 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9449 } 9450 9451 template <typename Derived> 9452 OMPClause * 9453 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9454 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9455 if (ThreadID.isInvalid()) 9456 return nullptr; 9457 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9458 C->getLParenLoc(), C->getEndLoc()); 9459 } 9460 9461 template <typename Derived> 9462 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9463 OMPUnifiedAddressClause *C) { 9464 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9465 } 9466 9467 template <typename Derived> 9468 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9469 OMPUnifiedSharedMemoryClause *C) { 9470 llvm_unreachable( 9471 "unified_shared_memory clause cannot appear in dependent context"); 9472 } 9473 9474 template <typename Derived> 9475 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9476 OMPReverseOffloadClause *C) { 9477 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9478 } 9479 9480 template <typename Derived> 9481 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9482 OMPDynamicAllocatorsClause *C) { 9483 llvm_unreachable( 9484 "dynamic_allocators clause cannot appear in dependent context"); 9485 } 9486 9487 template <typename Derived> 9488 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9489 OMPAtomicDefaultMemOrderClause *C) { 9490 llvm_unreachable( 9491 "atomic_default_mem_order clause cannot appear in dependent context"); 9492 } 9493 9494 template <typename Derived> 9495 OMPClause * 9496 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9497 llvm::SmallVector<Expr *, 16> Vars; 9498 Vars.reserve(C->varlist_size()); 9499 for (auto *VE : C->varlists()) { 9500 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9501 if (EVar.isInvalid()) 9502 return nullptr; 9503 Vars.push_back(EVar.get()); 9504 } 9505 return getDerived().RebuildOMPPrivateClause( 9506 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9507 } 9508 9509 template <typename Derived> 9510 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9511 OMPFirstprivateClause *C) { 9512 llvm::SmallVector<Expr *, 16> Vars; 9513 Vars.reserve(C->varlist_size()); 9514 for (auto *VE : C->varlists()) { 9515 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9516 if (EVar.isInvalid()) 9517 return nullptr; 9518 Vars.push_back(EVar.get()); 9519 } 9520 return getDerived().RebuildOMPFirstprivateClause( 9521 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9522 } 9523 9524 template <typename Derived> 9525 OMPClause * 9526 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9527 llvm::SmallVector<Expr *, 16> Vars; 9528 Vars.reserve(C->varlist_size()); 9529 for (auto *VE : C->varlists()) { 9530 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9531 if (EVar.isInvalid()) 9532 return nullptr; 9533 Vars.push_back(EVar.get()); 9534 } 9535 return getDerived().RebuildOMPLastprivateClause( 9536 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9537 C->getLParenLoc(), C->getEndLoc()); 9538 } 9539 9540 template <typename Derived> 9541 OMPClause * 9542 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9543 llvm::SmallVector<Expr *, 16> Vars; 9544 Vars.reserve(C->varlist_size()); 9545 for (auto *VE : C->varlists()) { 9546 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9547 if (EVar.isInvalid()) 9548 return nullptr; 9549 Vars.push_back(EVar.get()); 9550 } 9551 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9552 C->getLParenLoc(), C->getEndLoc()); 9553 } 9554 9555 template <typename Derived> 9556 OMPClause * 9557 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9558 llvm::SmallVector<Expr *, 16> Vars; 9559 Vars.reserve(C->varlist_size()); 9560 for (auto *VE : C->varlists()) { 9561 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9562 if (EVar.isInvalid()) 9563 return nullptr; 9564 Vars.push_back(EVar.get()); 9565 } 9566 CXXScopeSpec ReductionIdScopeSpec; 9567 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9568 9569 DeclarationNameInfo NameInfo = C->getNameInfo(); 9570 if (NameInfo.getName()) { 9571 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9572 if (!NameInfo.getName()) 9573 return nullptr; 9574 } 9575 // Build a list of all UDR decls with the same names ranged by the Scopes. 9576 // The Scope boundary is a duplication of the previous decl. 9577 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9578 for (auto *E : C->reduction_ops()) { 9579 // Transform all the decls. 9580 if (E) { 9581 auto *ULE = cast<UnresolvedLookupExpr>(E); 9582 UnresolvedSet<8> Decls; 9583 for (auto *D : ULE->decls()) { 9584 NamedDecl *InstD = 9585 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9586 Decls.addDecl(InstD, InstD->getAccess()); 9587 } 9588 UnresolvedReductions.push_back( 9589 UnresolvedLookupExpr::Create( 9590 SemaRef.Context, /*NamingClass=*/nullptr, 9591 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9592 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9593 Decls.begin(), Decls.end())); 9594 } else 9595 UnresolvedReductions.push_back(nullptr); 9596 } 9597 return getDerived().RebuildOMPReductionClause( 9598 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9599 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9600 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9601 } 9602 9603 template <typename Derived> 9604 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9605 OMPTaskReductionClause *C) { 9606 llvm::SmallVector<Expr *, 16> Vars; 9607 Vars.reserve(C->varlist_size()); 9608 for (auto *VE : C->varlists()) { 9609 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9610 if (EVar.isInvalid()) 9611 return nullptr; 9612 Vars.push_back(EVar.get()); 9613 } 9614 CXXScopeSpec ReductionIdScopeSpec; 9615 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9616 9617 DeclarationNameInfo NameInfo = C->getNameInfo(); 9618 if (NameInfo.getName()) { 9619 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9620 if (!NameInfo.getName()) 9621 return nullptr; 9622 } 9623 // Build a list of all UDR decls with the same names ranged by the Scopes. 9624 // The Scope boundary is a duplication of the previous decl. 9625 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9626 for (auto *E : C->reduction_ops()) { 9627 // Transform all the decls. 9628 if (E) { 9629 auto *ULE = cast<UnresolvedLookupExpr>(E); 9630 UnresolvedSet<8> Decls; 9631 for (auto *D : ULE->decls()) { 9632 NamedDecl *InstD = 9633 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9634 Decls.addDecl(InstD, InstD->getAccess()); 9635 } 9636 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9637 SemaRef.Context, /*NamingClass=*/nullptr, 9638 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9639 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9640 } else 9641 UnresolvedReductions.push_back(nullptr); 9642 } 9643 return getDerived().RebuildOMPTaskReductionClause( 9644 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9645 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9646 } 9647 9648 template <typename Derived> 9649 OMPClause * 9650 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9651 llvm::SmallVector<Expr *, 16> Vars; 9652 Vars.reserve(C->varlist_size()); 9653 for (auto *VE : C->varlists()) { 9654 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9655 if (EVar.isInvalid()) 9656 return nullptr; 9657 Vars.push_back(EVar.get()); 9658 } 9659 CXXScopeSpec ReductionIdScopeSpec; 9660 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9661 9662 DeclarationNameInfo NameInfo = C->getNameInfo(); 9663 if (NameInfo.getName()) { 9664 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9665 if (!NameInfo.getName()) 9666 return nullptr; 9667 } 9668 // Build a list of all UDR decls with the same names ranged by the Scopes. 9669 // The Scope boundary is a duplication of the previous decl. 9670 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9671 for (auto *E : C->reduction_ops()) { 9672 // Transform all the decls. 9673 if (E) { 9674 auto *ULE = cast<UnresolvedLookupExpr>(E); 9675 UnresolvedSet<8> Decls; 9676 for (auto *D : ULE->decls()) { 9677 NamedDecl *InstD = 9678 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9679 Decls.addDecl(InstD, InstD->getAccess()); 9680 } 9681 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9682 SemaRef.Context, /*NamingClass=*/nullptr, 9683 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9684 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9685 } else 9686 UnresolvedReductions.push_back(nullptr); 9687 } 9688 return getDerived().RebuildOMPInReductionClause( 9689 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9690 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9691 } 9692 9693 template <typename Derived> 9694 OMPClause * 9695 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9696 llvm::SmallVector<Expr *, 16> Vars; 9697 Vars.reserve(C->varlist_size()); 9698 for (auto *VE : C->varlists()) { 9699 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9700 if (EVar.isInvalid()) 9701 return nullptr; 9702 Vars.push_back(EVar.get()); 9703 } 9704 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9705 if (Step.isInvalid()) 9706 return nullptr; 9707 return getDerived().RebuildOMPLinearClause( 9708 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9709 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9710 } 9711 9712 template <typename Derived> 9713 OMPClause * 9714 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9715 llvm::SmallVector<Expr *, 16> Vars; 9716 Vars.reserve(C->varlist_size()); 9717 for (auto *VE : C->varlists()) { 9718 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9719 if (EVar.isInvalid()) 9720 return nullptr; 9721 Vars.push_back(EVar.get()); 9722 } 9723 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9724 if (Alignment.isInvalid()) 9725 return nullptr; 9726 return getDerived().RebuildOMPAlignedClause( 9727 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9728 C->getColonLoc(), C->getEndLoc()); 9729 } 9730 9731 template <typename Derived> 9732 OMPClause * 9733 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9734 llvm::SmallVector<Expr *, 16> Vars; 9735 Vars.reserve(C->varlist_size()); 9736 for (auto *VE : C->varlists()) { 9737 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9738 if (EVar.isInvalid()) 9739 return nullptr; 9740 Vars.push_back(EVar.get()); 9741 } 9742 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9743 C->getLParenLoc(), C->getEndLoc()); 9744 } 9745 9746 template <typename Derived> 9747 OMPClause * 9748 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9749 llvm::SmallVector<Expr *, 16> Vars; 9750 Vars.reserve(C->varlist_size()); 9751 for (auto *VE : C->varlists()) { 9752 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9753 if (EVar.isInvalid()) 9754 return nullptr; 9755 Vars.push_back(EVar.get()); 9756 } 9757 return getDerived().RebuildOMPCopyprivateClause( 9758 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9759 } 9760 9761 template <typename Derived> 9762 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9763 llvm::SmallVector<Expr *, 16> Vars; 9764 Vars.reserve(C->varlist_size()); 9765 for (auto *VE : C->varlists()) { 9766 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9767 if (EVar.isInvalid()) 9768 return nullptr; 9769 Vars.push_back(EVar.get()); 9770 } 9771 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9772 C->getLParenLoc(), C->getEndLoc()); 9773 } 9774 9775 template <typename Derived> 9776 OMPClause * 9777 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9778 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9779 if (E.isInvalid()) 9780 return nullptr; 9781 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9782 C->getLParenLoc(), C->getEndLoc()); 9783 } 9784 9785 template <typename Derived> 9786 OMPClause * 9787 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9788 llvm::SmallVector<Expr *, 16> Vars; 9789 Expr *DepModifier = C->getModifier(); 9790 if (DepModifier) { 9791 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9792 if (DepModRes.isInvalid()) 9793 return nullptr; 9794 DepModifier = DepModRes.get(); 9795 } 9796 Vars.reserve(C->varlist_size()); 9797 for (auto *VE : C->varlists()) { 9798 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9799 if (EVar.isInvalid()) 9800 return nullptr; 9801 Vars.push_back(EVar.get()); 9802 } 9803 return getDerived().RebuildOMPDependClause( 9804 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9805 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9806 C->getEndLoc()); 9807 } 9808 9809 template <typename Derived> 9810 OMPClause * 9811 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9812 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9813 if (E.isInvalid()) 9814 return nullptr; 9815 return getDerived().RebuildOMPDeviceClause( 9816 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9817 C->getModifierLoc(), C->getEndLoc()); 9818 } 9819 9820 template <typename Derived, class T> 9821 bool transformOMPMappableExprListClause( 9822 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9823 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9824 DeclarationNameInfo &MapperIdInfo, 9825 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9826 // Transform expressions in the list. 9827 Vars.reserve(C->varlist_size()); 9828 for (auto *VE : C->varlists()) { 9829 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9830 if (EVar.isInvalid()) 9831 return true; 9832 Vars.push_back(EVar.get()); 9833 } 9834 // Transform mapper scope specifier and identifier. 9835 NestedNameSpecifierLoc QualifierLoc; 9836 if (C->getMapperQualifierLoc()) { 9837 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9838 C->getMapperQualifierLoc()); 9839 if (!QualifierLoc) 9840 return true; 9841 } 9842 MapperIdScopeSpec.Adopt(QualifierLoc); 9843 MapperIdInfo = C->getMapperIdInfo(); 9844 if (MapperIdInfo.getName()) { 9845 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9846 if (!MapperIdInfo.getName()) 9847 return true; 9848 } 9849 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9850 // the previous user-defined mapper lookup in dependent environment. 9851 for (auto *E : C->mapperlists()) { 9852 // Transform all the decls. 9853 if (E) { 9854 auto *ULE = cast<UnresolvedLookupExpr>(E); 9855 UnresolvedSet<8> Decls; 9856 for (auto *D : ULE->decls()) { 9857 NamedDecl *InstD = 9858 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9859 Decls.addDecl(InstD, InstD->getAccess()); 9860 } 9861 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9862 TT.getSema().Context, /*NamingClass=*/nullptr, 9863 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9864 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9865 Decls.end())); 9866 } else { 9867 UnresolvedMappers.push_back(nullptr); 9868 } 9869 } 9870 return false; 9871 } 9872 9873 template <typename Derived> 9874 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9875 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9876 llvm::SmallVector<Expr *, 16> Vars; 9877 CXXScopeSpec MapperIdScopeSpec; 9878 DeclarationNameInfo MapperIdInfo; 9879 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9880 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9881 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9882 return nullptr; 9883 return getDerived().RebuildOMPMapClause( 9884 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9885 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9886 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9887 } 9888 9889 template <typename Derived> 9890 OMPClause * 9891 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9892 Expr *Allocator = C->getAllocator(); 9893 if (Allocator) { 9894 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9895 if (AllocatorRes.isInvalid()) 9896 return nullptr; 9897 Allocator = AllocatorRes.get(); 9898 } 9899 llvm::SmallVector<Expr *, 16> Vars; 9900 Vars.reserve(C->varlist_size()); 9901 for (auto *VE : C->varlists()) { 9902 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9903 if (EVar.isInvalid()) 9904 return nullptr; 9905 Vars.push_back(EVar.get()); 9906 } 9907 return getDerived().RebuildOMPAllocateClause( 9908 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9909 C->getEndLoc()); 9910 } 9911 9912 template <typename Derived> 9913 OMPClause * 9914 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9915 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9916 if (E.isInvalid()) 9917 return nullptr; 9918 return getDerived().RebuildOMPNumTeamsClause( 9919 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9920 } 9921 9922 template <typename Derived> 9923 OMPClause * 9924 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9925 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9926 if (E.isInvalid()) 9927 return nullptr; 9928 return getDerived().RebuildOMPThreadLimitClause( 9929 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9930 } 9931 9932 template <typename Derived> 9933 OMPClause * 9934 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9935 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9936 if (E.isInvalid()) 9937 return nullptr; 9938 return getDerived().RebuildOMPPriorityClause( 9939 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9940 } 9941 9942 template <typename Derived> 9943 OMPClause * 9944 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9945 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9946 if (E.isInvalid()) 9947 return nullptr; 9948 return getDerived().RebuildOMPGrainsizeClause( 9949 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9950 } 9951 9952 template <typename Derived> 9953 OMPClause * 9954 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9955 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9956 if (E.isInvalid()) 9957 return nullptr; 9958 return getDerived().RebuildOMPNumTasksClause( 9959 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9960 } 9961 9962 template <typename Derived> 9963 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9964 ExprResult E = getDerived().TransformExpr(C->getHint()); 9965 if (E.isInvalid()) 9966 return nullptr; 9967 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9968 C->getLParenLoc(), C->getEndLoc()); 9969 } 9970 9971 template <typename Derived> 9972 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9973 OMPDistScheduleClause *C) { 9974 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9975 if (E.isInvalid()) 9976 return nullptr; 9977 return getDerived().RebuildOMPDistScheduleClause( 9978 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9979 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9980 } 9981 9982 template <typename Derived> 9983 OMPClause * 9984 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9985 // Rebuild Defaultmap Clause since we need to invoke the checking of 9986 // defaultmap(none:variable-category) after template initialization. 9987 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9988 C->getDefaultmapKind(), 9989 C->getBeginLoc(), 9990 C->getLParenLoc(), 9991 C->getDefaultmapModifierLoc(), 9992 C->getDefaultmapKindLoc(), 9993 C->getEndLoc()); 9994 } 9995 9996 template <typename Derived> 9997 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9998 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9999 llvm::SmallVector<Expr *, 16> Vars; 10000 CXXScopeSpec MapperIdScopeSpec; 10001 DeclarationNameInfo MapperIdInfo; 10002 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10003 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10004 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10005 return nullptr; 10006 return getDerived().RebuildOMPToClause( 10007 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10008 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10009 } 10010 10011 template <typename Derived> 10012 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10013 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10014 llvm::SmallVector<Expr *, 16> Vars; 10015 CXXScopeSpec MapperIdScopeSpec; 10016 DeclarationNameInfo MapperIdInfo; 10017 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10018 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10019 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10020 return nullptr; 10021 return getDerived().RebuildOMPFromClause( 10022 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10023 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10024 } 10025 10026 template <typename Derived> 10027 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10028 OMPUseDevicePtrClause *C) { 10029 llvm::SmallVector<Expr *, 16> Vars; 10030 Vars.reserve(C->varlist_size()); 10031 for (auto *VE : C->varlists()) { 10032 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10033 if (EVar.isInvalid()) 10034 return nullptr; 10035 Vars.push_back(EVar.get()); 10036 } 10037 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10038 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10039 } 10040 10041 template <typename Derived> 10042 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10043 OMPUseDeviceAddrClause *C) { 10044 llvm::SmallVector<Expr *, 16> Vars; 10045 Vars.reserve(C->varlist_size()); 10046 for (auto *VE : C->varlists()) { 10047 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10048 if (EVar.isInvalid()) 10049 return nullptr; 10050 Vars.push_back(EVar.get()); 10051 } 10052 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10053 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10054 } 10055 10056 template <typename Derived> 10057 OMPClause * 10058 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10059 llvm::SmallVector<Expr *, 16> Vars; 10060 Vars.reserve(C->varlist_size()); 10061 for (auto *VE : C->varlists()) { 10062 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10063 if (EVar.isInvalid()) 10064 return nullptr; 10065 Vars.push_back(EVar.get()); 10066 } 10067 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10068 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10069 } 10070 10071 template <typename Derived> 10072 OMPClause * 10073 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10074 llvm::SmallVector<Expr *, 16> Vars; 10075 Vars.reserve(C->varlist_size()); 10076 for (auto *VE : C->varlists()) { 10077 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10078 if (EVar.isInvalid()) 10079 return nullptr; 10080 Vars.push_back(EVar.get()); 10081 } 10082 return getDerived().RebuildOMPNontemporalClause( 10083 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10084 } 10085 10086 template <typename Derived> 10087 OMPClause * 10088 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10089 llvm::SmallVector<Expr *, 16> Vars; 10090 Vars.reserve(C->varlist_size()); 10091 for (auto *VE : C->varlists()) { 10092 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10093 if (EVar.isInvalid()) 10094 return nullptr; 10095 Vars.push_back(EVar.get()); 10096 } 10097 return getDerived().RebuildOMPInclusiveClause( 10098 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10099 } 10100 10101 template <typename Derived> 10102 OMPClause * 10103 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10104 llvm::SmallVector<Expr *, 16> Vars; 10105 Vars.reserve(C->varlist_size()); 10106 for (auto *VE : C->varlists()) { 10107 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10108 if (EVar.isInvalid()) 10109 return nullptr; 10110 Vars.push_back(EVar.get()); 10111 } 10112 return getDerived().RebuildOMPExclusiveClause( 10113 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10114 } 10115 10116 template <typename Derived> 10117 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10118 OMPUsesAllocatorsClause *C) { 10119 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10120 Data.reserve(C->getNumberOfAllocators()); 10121 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10122 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10123 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10124 if (Allocator.isInvalid()) 10125 continue; 10126 ExprResult AllocatorTraits; 10127 if (Expr *AT = D.AllocatorTraits) { 10128 AllocatorTraits = getDerived().TransformExpr(AT); 10129 if (AllocatorTraits.isInvalid()) 10130 continue; 10131 } 10132 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10133 NewD.Allocator = Allocator.get(); 10134 NewD.AllocatorTraits = AllocatorTraits.get(); 10135 NewD.LParenLoc = D.LParenLoc; 10136 NewD.RParenLoc = D.RParenLoc; 10137 } 10138 return getDerived().RebuildOMPUsesAllocatorsClause( 10139 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10140 } 10141 10142 template <typename Derived> 10143 OMPClause * 10144 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10145 SmallVector<Expr *, 4> Locators; 10146 Locators.reserve(C->varlist_size()); 10147 ExprResult ModifierRes; 10148 if (Expr *Modifier = C->getModifier()) { 10149 ModifierRes = getDerived().TransformExpr(Modifier); 10150 if (ModifierRes.isInvalid()) 10151 return nullptr; 10152 } 10153 for (Expr *E : C->varlists()) { 10154 ExprResult Locator = getDerived().TransformExpr(E); 10155 if (Locator.isInvalid()) 10156 continue; 10157 Locators.push_back(Locator.get()); 10158 } 10159 return getDerived().RebuildOMPAffinityClause( 10160 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10161 ModifierRes.get(), Locators); 10162 } 10163 10164 template <typename Derived> 10165 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10166 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10167 C->getBeginLoc(), C->getLParenLoc(), 10168 C->getEndLoc()); 10169 } 10170 10171 //===----------------------------------------------------------------------===// 10172 // Expression transformation 10173 //===----------------------------------------------------------------------===// 10174 template<typename Derived> 10175 ExprResult 10176 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10177 return TransformExpr(E->getSubExpr()); 10178 } 10179 10180 template<typename Derived> 10181 ExprResult 10182 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10183 if (!E->isTypeDependent()) 10184 return E; 10185 10186 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10187 E->getIdentKind()); 10188 } 10189 10190 template<typename Derived> 10191 ExprResult 10192 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10193 NestedNameSpecifierLoc QualifierLoc; 10194 if (E->getQualifierLoc()) { 10195 QualifierLoc 10196 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10197 if (!QualifierLoc) 10198 return ExprError(); 10199 } 10200 10201 ValueDecl *ND 10202 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10203 E->getDecl())); 10204 if (!ND) 10205 return ExprError(); 10206 10207 NamedDecl *Found = ND; 10208 if (E->getFoundDecl() != E->getDecl()) { 10209 Found = cast_or_null<NamedDecl>( 10210 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10211 if (!Found) 10212 return ExprError(); 10213 } 10214 10215 DeclarationNameInfo NameInfo = E->getNameInfo(); 10216 if (NameInfo.getName()) { 10217 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10218 if (!NameInfo.getName()) 10219 return ExprError(); 10220 } 10221 10222 if (!getDerived().AlwaysRebuild() && 10223 QualifierLoc == E->getQualifierLoc() && 10224 ND == E->getDecl() && 10225 Found == E->getFoundDecl() && 10226 NameInfo.getName() == E->getDecl()->getDeclName() && 10227 !E->hasExplicitTemplateArgs()) { 10228 10229 // Mark it referenced in the new context regardless. 10230 // FIXME: this is a bit instantiation-specific. 10231 SemaRef.MarkDeclRefReferenced(E); 10232 10233 return E; 10234 } 10235 10236 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10237 if (E->hasExplicitTemplateArgs()) { 10238 TemplateArgs = &TransArgs; 10239 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10240 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10241 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10242 E->getNumTemplateArgs(), 10243 TransArgs)) 10244 return ExprError(); 10245 } 10246 10247 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10248 Found, TemplateArgs); 10249 } 10250 10251 template<typename Derived> 10252 ExprResult 10253 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10254 return E; 10255 } 10256 10257 template <typename Derived> 10258 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10259 FixedPointLiteral *E) { 10260 return E; 10261 } 10262 10263 template<typename Derived> 10264 ExprResult 10265 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10266 return E; 10267 } 10268 10269 template<typename Derived> 10270 ExprResult 10271 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10272 return E; 10273 } 10274 10275 template<typename Derived> 10276 ExprResult 10277 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10278 return E; 10279 } 10280 10281 template<typename Derived> 10282 ExprResult 10283 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10284 return E; 10285 } 10286 10287 template<typename Derived> 10288 ExprResult 10289 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10290 if (FunctionDecl *FD = E->getDirectCallee()) 10291 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10292 return SemaRef.MaybeBindToTemporary(E); 10293 } 10294 10295 template<typename Derived> 10296 ExprResult 10297 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10298 ExprResult ControllingExpr = 10299 getDerived().TransformExpr(E->getControllingExpr()); 10300 if (ControllingExpr.isInvalid()) 10301 return ExprError(); 10302 10303 SmallVector<Expr *, 4> AssocExprs; 10304 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10305 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10306 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10307 if (TSI) { 10308 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10309 if (!AssocType) 10310 return ExprError(); 10311 AssocTypes.push_back(AssocType); 10312 } else { 10313 AssocTypes.push_back(nullptr); 10314 } 10315 10316 ExprResult AssocExpr = 10317 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10318 if (AssocExpr.isInvalid()) 10319 return ExprError(); 10320 AssocExprs.push_back(AssocExpr.get()); 10321 } 10322 10323 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10324 E->getDefaultLoc(), 10325 E->getRParenLoc(), 10326 ControllingExpr.get(), 10327 AssocTypes, 10328 AssocExprs); 10329 } 10330 10331 template<typename Derived> 10332 ExprResult 10333 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10334 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10335 if (SubExpr.isInvalid()) 10336 return ExprError(); 10337 10338 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10339 return E; 10340 10341 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10342 E->getRParen()); 10343 } 10344 10345 /// The operand of a unary address-of operator has special rules: it's 10346 /// allowed to refer to a non-static member of a class even if there's no 'this' 10347 /// object available. 10348 template<typename Derived> 10349 ExprResult 10350 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10351 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10352 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10353 else 10354 return getDerived().TransformExpr(E); 10355 } 10356 10357 template<typename Derived> 10358 ExprResult 10359 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10360 ExprResult SubExpr; 10361 if (E->getOpcode() == UO_AddrOf) 10362 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10363 else 10364 SubExpr = TransformExpr(E->getSubExpr()); 10365 if (SubExpr.isInvalid()) 10366 return ExprError(); 10367 10368 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10369 return E; 10370 10371 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10372 E->getOpcode(), 10373 SubExpr.get()); 10374 } 10375 10376 template<typename Derived> 10377 ExprResult 10378 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10379 // Transform the type. 10380 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10381 if (!Type) 10382 return ExprError(); 10383 10384 // Transform all of the components into components similar to what the 10385 // parser uses. 10386 // FIXME: It would be slightly more efficient in the non-dependent case to 10387 // just map FieldDecls, rather than requiring the rebuilder to look for 10388 // the fields again. However, __builtin_offsetof is rare enough in 10389 // template code that we don't care. 10390 bool ExprChanged = false; 10391 typedef Sema::OffsetOfComponent Component; 10392 SmallVector<Component, 4> Components; 10393 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10394 const OffsetOfNode &ON = E->getComponent(I); 10395 Component Comp; 10396 Comp.isBrackets = true; 10397 Comp.LocStart = ON.getSourceRange().getBegin(); 10398 Comp.LocEnd = ON.getSourceRange().getEnd(); 10399 switch (ON.getKind()) { 10400 case OffsetOfNode::Array: { 10401 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10402 ExprResult Index = getDerived().TransformExpr(FromIndex); 10403 if (Index.isInvalid()) 10404 return ExprError(); 10405 10406 ExprChanged = ExprChanged || Index.get() != FromIndex; 10407 Comp.isBrackets = true; 10408 Comp.U.E = Index.get(); 10409 break; 10410 } 10411 10412 case OffsetOfNode::Field: 10413 case OffsetOfNode::Identifier: 10414 Comp.isBrackets = false; 10415 Comp.U.IdentInfo = ON.getFieldName(); 10416 if (!Comp.U.IdentInfo) 10417 continue; 10418 10419 break; 10420 10421 case OffsetOfNode::Base: 10422 // Will be recomputed during the rebuild. 10423 continue; 10424 } 10425 10426 Components.push_back(Comp); 10427 } 10428 10429 // If nothing changed, retain the existing expression. 10430 if (!getDerived().AlwaysRebuild() && 10431 Type == E->getTypeSourceInfo() && 10432 !ExprChanged) 10433 return E; 10434 10435 // Build a new offsetof expression. 10436 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10437 Components, E->getRParenLoc()); 10438 } 10439 10440 template<typename Derived> 10441 ExprResult 10442 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10443 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10444 "opaque value expression requires transformation"); 10445 return E; 10446 } 10447 10448 template<typename Derived> 10449 ExprResult 10450 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10451 return E; 10452 } 10453 10454 template <typename Derived> 10455 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10456 llvm::SmallVector<Expr *, 8> Children; 10457 bool Changed = false; 10458 for (Expr *C : E->subExpressions()) { 10459 ExprResult NewC = getDerived().TransformExpr(C); 10460 if (NewC.isInvalid()) 10461 return ExprError(); 10462 Children.push_back(NewC.get()); 10463 10464 Changed |= NewC.get() != C; 10465 } 10466 if (!getDerived().AlwaysRebuild() && !Changed) 10467 return E; 10468 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10469 Children, E->getType()); 10470 } 10471 10472 template<typename Derived> 10473 ExprResult 10474 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10475 // Rebuild the syntactic form. The original syntactic form has 10476 // opaque-value expressions in it, so strip those away and rebuild 10477 // the result. This is a really awful way of doing this, but the 10478 // better solution (rebuilding the semantic expressions and 10479 // rebinding OVEs as necessary) doesn't work; we'd need 10480 // TreeTransform to not strip away implicit conversions. 10481 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10482 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10483 if (result.isInvalid()) return ExprError(); 10484 10485 // If that gives us a pseudo-object result back, the pseudo-object 10486 // expression must have been an lvalue-to-rvalue conversion which we 10487 // should reapply. 10488 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10489 result = SemaRef.checkPseudoObjectRValue(result.get()); 10490 10491 return result; 10492 } 10493 10494 template<typename Derived> 10495 ExprResult 10496 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10497 UnaryExprOrTypeTraitExpr *E) { 10498 if (E->isArgumentType()) { 10499 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10500 10501 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10502 if (!NewT) 10503 return ExprError(); 10504 10505 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10506 return E; 10507 10508 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10509 E->getKind(), 10510 E->getSourceRange()); 10511 } 10512 10513 // C++0x [expr.sizeof]p1: 10514 // The operand is either an expression, which is an unevaluated operand 10515 // [...] 10516 EnterExpressionEvaluationContext Unevaluated( 10517 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10518 Sema::ReuseLambdaContextDecl); 10519 10520 // Try to recover if we have something like sizeof(T::X) where X is a type. 10521 // Notably, there must be *exactly* one set of parens if X is a type. 10522 TypeSourceInfo *RecoveryTSI = nullptr; 10523 ExprResult SubExpr; 10524 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10525 if (auto *DRE = 10526 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10527 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10528 PE, DRE, false, &RecoveryTSI); 10529 else 10530 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10531 10532 if (RecoveryTSI) { 10533 return getDerived().RebuildUnaryExprOrTypeTrait( 10534 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10535 } else if (SubExpr.isInvalid()) 10536 return ExprError(); 10537 10538 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10539 return E; 10540 10541 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10542 E->getOperatorLoc(), 10543 E->getKind(), 10544 E->getSourceRange()); 10545 } 10546 10547 template<typename Derived> 10548 ExprResult 10549 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10550 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10551 if (LHS.isInvalid()) 10552 return ExprError(); 10553 10554 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10555 if (RHS.isInvalid()) 10556 return ExprError(); 10557 10558 10559 if (!getDerived().AlwaysRebuild() && 10560 LHS.get() == E->getLHS() && 10561 RHS.get() == E->getRHS()) 10562 return E; 10563 10564 return getDerived().RebuildArraySubscriptExpr( 10565 LHS.get(), 10566 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10567 } 10568 10569 template <typename Derived> 10570 ExprResult 10571 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10572 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10573 if (Base.isInvalid()) 10574 return ExprError(); 10575 10576 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10577 if (RowIdx.isInvalid()) 10578 return ExprError(); 10579 10580 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10581 if (ColumnIdx.isInvalid()) 10582 return ExprError(); 10583 10584 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10585 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10586 return E; 10587 10588 return getDerived().RebuildMatrixSubscriptExpr( 10589 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10590 } 10591 10592 template <typename Derived> 10593 ExprResult 10594 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10595 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10596 if (Base.isInvalid()) 10597 return ExprError(); 10598 10599 ExprResult LowerBound; 10600 if (E->getLowerBound()) { 10601 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10602 if (LowerBound.isInvalid()) 10603 return ExprError(); 10604 } 10605 10606 ExprResult Length; 10607 if (E->getLength()) { 10608 Length = getDerived().TransformExpr(E->getLength()); 10609 if (Length.isInvalid()) 10610 return ExprError(); 10611 } 10612 10613 ExprResult Stride; 10614 if (Expr *Str = E->getStride()) { 10615 Stride = getDerived().TransformExpr(Str); 10616 if (Stride.isInvalid()) 10617 return ExprError(); 10618 } 10619 10620 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10621 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10622 return E; 10623 10624 return getDerived().RebuildOMPArraySectionExpr( 10625 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10626 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10627 E->getRBracketLoc()); 10628 } 10629 10630 template <typename Derived> 10631 ExprResult 10632 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10633 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10634 if (Base.isInvalid()) 10635 return ExprError(); 10636 10637 SmallVector<Expr *, 4> Dims; 10638 bool ErrorFound = false; 10639 for (Expr *Dim : E->getDimensions()) { 10640 ExprResult DimRes = getDerived().TransformExpr(Dim); 10641 if (DimRes.isInvalid()) { 10642 ErrorFound = true; 10643 continue; 10644 } 10645 Dims.push_back(DimRes.get()); 10646 } 10647 10648 if (ErrorFound) 10649 return ExprError(); 10650 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10651 E->getRParenLoc(), Dims, 10652 E->getBracketsRanges()); 10653 } 10654 10655 template <typename Derived> 10656 ExprResult 10657 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10658 unsigned NumIterators = E->numOfIterators(); 10659 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10660 10661 bool ErrorFound = false; 10662 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10663 for (unsigned I = 0; I < NumIterators; ++I) { 10664 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10665 Data[I].DeclIdent = D->getIdentifier(); 10666 Data[I].DeclIdentLoc = D->getLocation(); 10667 if (D->getLocation() == D->getBeginLoc()) { 10668 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10669 "Implicit type must be int."); 10670 } else { 10671 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10672 QualType DeclTy = getDerived().TransformType(D->getType()); 10673 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10674 } 10675 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10676 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10677 ExprResult End = getDerived().TransformExpr(Range.End); 10678 ExprResult Step = getDerived().TransformExpr(Range.Step); 10679 ErrorFound = ErrorFound || 10680 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10681 !Data[I].Type.get().isNull())) || 10682 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10683 if (ErrorFound) 10684 continue; 10685 Data[I].Range.Begin = Begin.get(); 10686 Data[I].Range.End = End.get(); 10687 Data[I].Range.Step = Step.get(); 10688 Data[I].AssignLoc = E->getAssignLoc(I); 10689 Data[I].ColonLoc = E->getColonLoc(I); 10690 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10691 NeedToRebuild = 10692 NeedToRebuild || 10693 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10694 D->getType().getTypePtrOrNull()) || 10695 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10696 Range.Step != Data[I].Range.Step; 10697 } 10698 if (ErrorFound) 10699 return ExprError(); 10700 if (!NeedToRebuild) 10701 return E; 10702 10703 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10704 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10705 if (!Res.isUsable()) 10706 return Res; 10707 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10708 for (unsigned I = 0; I < NumIterators; ++I) 10709 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10710 IE->getIteratorDecl(I)); 10711 return Res; 10712 } 10713 10714 template<typename Derived> 10715 ExprResult 10716 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10717 // Transform the callee. 10718 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10719 if (Callee.isInvalid()) 10720 return ExprError(); 10721 10722 // Transform arguments. 10723 bool ArgChanged = false; 10724 SmallVector<Expr*, 8> Args; 10725 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10726 &ArgChanged)) 10727 return ExprError(); 10728 10729 if (!getDerived().AlwaysRebuild() && 10730 Callee.get() == E->getCallee() && 10731 !ArgChanged) 10732 return SemaRef.MaybeBindToTemporary(E); 10733 10734 // FIXME: Wrong source location information for the '('. 10735 SourceLocation FakeLParenLoc 10736 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10737 10738 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10739 if (E->hasStoredFPFeatures()) { 10740 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10741 getSema().CurFPFeatures = 10742 NewOverrides.applyOverrides(getSema().getLangOpts()); 10743 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10744 } 10745 10746 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10747 Args, 10748 E->getRParenLoc()); 10749 } 10750 10751 template<typename Derived> 10752 ExprResult 10753 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10754 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10755 if (Base.isInvalid()) 10756 return ExprError(); 10757 10758 NestedNameSpecifierLoc QualifierLoc; 10759 if (E->hasQualifier()) { 10760 QualifierLoc 10761 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10762 10763 if (!QualifierLoc) 10764 return ExprError(); 10765 } 10766 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10767 10768 ValueDecl *Member 10769 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10770 E->getMemberDecl())); 10771 if (!Member) 10772 return ExprError(); 10773 10774 NamedDecl *FoundDecl = E->getFoundDecl(); 10775 if (FoundDecl == E->getMemberDecl()) { 10776 FoundDecl = Member; 10777 } else { 10778 FoundDecl = cast_or_null<NamedDecl>( 10779 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10780 if (!FoundDecl) 10781 return ExprError(); 10782 } 10783 10784 if (!getDerived().AlwaysRebuild() && 10785 Base.get() == E->getBase() && 10786 QualifierLoc == E->getQualifierLoc() && 10787 Member == E->getMemberDecl() && 10788 FoundDecl == E->getFoundDecl() && 10789 !E->hasExplicitTemplateArgs()) { 10790 10791 // Mark it referenced in the new context regardless. 10792 // FIXME: this is a bit instantiation-specific. 10793 SemaRef.MarkMemberReferenced(E); 10794 10795 return E; 10796 } 10797 10798 TemplateArgumentListInfo TransArgs; 10799 if (E->hasExplicitTemplateArgs()) { 10800 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10801 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10802 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10803 E->getNumTemplateArgs(), 10804 TransArgs)) 10805 return ExprError(); 10806 } 10807 10808 // FIXME: Bogus source location for the operator 10809 SourceLocation FakeOperatorLoc = 10810 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10811 10812 // FIXME: to do this check properly, we will need to preserve the 10813 // first-qualifier-in-scope here, just in case we had a dependent 10814 // base (and therefore couldn't do the check) and a 10815 // nested-name-qualifier (and therefore could do the lookup). 10816 NamedDecl *FirstQualifierInScope = nullptr; 10817 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10818 if (MemberNameInfo.getName()) { 10819 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10820 if (!MemberNameInfo.getName()) 10821 return ExprError(); 10822 } 10823 10824 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10825 E->isArrow(), 10826 QualifierLoc, 10827 TemplateKWLoc, 10828 MemberNameInfo, 10829 Member, 10830 FoundDecl, 10831 (E->hasExplicitTemplateArgs() 10832 ? &TransArgs : nullptr), 10833 FirstQualifierInScope); 10834 } 10835 10836 template<typename Derived> 10837 ExprResult 10838 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10839 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10840 if (LHS.isInvalid()) 10841 return ExprError(); 10842 10843 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10844 if (RHS.isInvalid()) 10845 return ExprError(); 10846 10847 if (!getDerived().AlwaysRebuild() && 10848 LHS.get() == E->getLHS() && 10849 RHS.get() == E->getRHS()) 10850 return E; 10851 10852 if (E->isCompoundAssignmentOp()) 10853 // FPFeatures has already been established from trailing storage 10854 return getDerived().RebuildBinaryOperator( 10855 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10856 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10857 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10858 getSema().CurFPFeatures = 10859 NewOverrides.applyOverrides(getSema().getLangOpts()); 10860 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10861 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10862 LHS.get(), RHS.get()); 10863 } 10864 10865 template <typename Derived> 10866 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10867 CXXRewrittenBinaryOperator *E) { 10868 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10869 10870 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10871 if (LHS.isInvalid()) 10872 return ExprError(); 10873 10874 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10875 if (RHS.isInvalid()) 10876 return ExprError(); 10877 10878 if (!getDerived().AlwaysRebuild() && 10879 LHS.get() == Decomp.LHS && 10880 RHS.get() == Decomp.RHS) 10881 return E; 10882 10883 // Extract the already-resolved callee declarations so that we can restrict 10884 // ourselves to using them as the unqualified lookup results when rebuilding. 10885 UnresolvedSet<2> UnqualLookups; 10886 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10887 const_cast<Expr *>(Decomp.InnerBinOp)}; 10888 for (Expr *PossibleBinOp : PossibleBinOps) { 10889 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10890 if (!Op) 10891 continue; 10892 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10893 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10894 continue; 10895 10896 // Transform the callee in case we built a call to a local extern 10897 // declaration. 10898 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10899 E->getOperatorLoc(), Callee->getFoundDecl())); 10900 if (!Found) 10901 return ExprError(); 10902 UnqualLookups.addDecl(Found); 10903 } 10904 10905 return getDerived().RebuildCXXRewrittenBinaryOperator( 10906 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10907 } 10908 10909 template<typename Derived> 10910 ExprResult 10911 TreeTransform<Derived>::TransformCompoundAssignOperator( 10912 CompoundAssignOperator *E) { 10913 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10914 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10915 getSema().CurFPFeatures = 10916 NewOverrides.applyOverrides(getSema().getLangOpts()); 10917 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10918 return getDerived().TransformBinaryOperator(E); 10919 } 10920 10921 template<typename Derived> 10922 ExprResult TreeTransform<Derived>:: 10923 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10924 // Just rebuild the common and RHS expressions and see whether we 10925 // get any changes. 10926 10927 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10928 if (commonExpr.isInvalid()) 10929 return ExprError(); 10930 10931 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10932 if (rhs.isInvalid()) 10933 return ExprError(); 10934 10935 if (!getDerived().AlwaysRebuild() && 10936 commonExpr.get() == e->getCommon() && 10937 rhs.get() == e->getFalseExpr()) 10938 return e; 10939 10940 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10941 e->getQuestionLoc(), 10942 nullptr, 10943 e->getColonLoc(), 10944 rhs.get()); 10945 } 10946 10947 template<typename Derived> 10948 ExprResult 10949 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10950 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10951 if (Cond.isInvalid()) 10952 return ExprError(); 10953 10954 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10955 if (LHS.isInvalid()) 10956 return ExprError(); 10957 10958 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10959 if (RHS.isInvalid()) 10960 return ExprError(); 10961 10962 if (!getDerived().AlwaysRebuild() && 10963 Cond.get() == E->getCond() && 10964 LHS.get() == E->getLHS() && 10965 RHS.get() == E->getRHS()) 10966 return E; 10967 10968 return getDerived().RebuildConditionalOperator(Cond.get(), 10969 E->getQuestionLoc(), 10970 LHS.get(), 10971 E->getColonLoc(), 10972 RHS.get()); 10973 } 10974 10975 template<typename Derived> 10976 ExprResult 10977 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10978 // Implicit casts are eliminated during transformation, since they 10979 // will be recomputed by semantic analysis after transformation. 10980 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10981 } 10982 10983 template<typename Derived> 10984 ExprResult 10985 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10986 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10987 if (!Type) 10988 return ExprError(); 10989 10990 ExprResult SubExpr 10991 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10992 if (SubExpr.isInvalid()) 10993 return ExprError(); 10994 10995 if (!getDerived().AlwaysRebuild() && 10996 Type == E->getTypeInfoAsWritten() && 10997 SubExpr.get() == E->getSubExpr()) 10998 return E; 10999 11000 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11001 Type, 11002 E->getRParenLoc(), 11003 SubExpr.get()); 11004 } 11005 11006 template<typename Derived> 11007 ExprResult 11008 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11009 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11010 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11011 if (!NewT) 11012 return ExprError(); 11013 11014 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11015 if (Init.isInvalid()) 11016 return ExprError(); 11017 11018 if (!getDerived().AlwaysRebuild() && 11019 OldT == NewT && 11020 Init.get() == E->getInitializer()) 11021 return SemaRef.MaybeBindToTemporary(E); 11022 11023 // Note: the expression type doesn't necessarily match the 11024 // type-as-written, but that's okay, because it should always be 11025 // derivable from the initializer. 11026 11027 return getDerived().RebuildCompoundLiteralExpr( 11028 E->getLParenLoc(), NewT, 11029 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11030 } 11031 11032 template<typename Derived> 11033 ExprResult 11034 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11035 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11036 if (Base.isInvalid()) 11037 return ExprError(); 11038 11039 if (!getDerived().AlwaysRebuild() && 11040 Base.get() == E->getBase()) 11041 return E; 11042 11043 // FIXME: Bad source location 11044 SourceLocation FakeOperatorLoc = 11045 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11046 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11047 E->getAccessorLoc(), 11048 E->getAccessor()); 11049 } 11050 11051 template<typename Derived> 11052 ExprResult 11053 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11054 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11055 E = Syntactic; 11056 11057 bool InitChanged = false; 11058 11059 EnterExpressionEvaluationContext Context( 11060 getSema(), EnterExpressionEvaluationContext::InitList); 11061 11062 SmallVector<Expr*, 4> Inits; 11063 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11064 Inits, &InitChanged)) 11065 return ExprError(); 11066 11067 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11068 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11069 // in some cases. We can't reuse it in general, because the syntactic and 11070 // semantic forms are linked, and we can't know that semantic form will 11071 // match even if the syntactic form does. 11072 } 11073 11074 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11075 E->getRBraceLoc()); 11076 } 11077 11078 template<typename Derived> 11079 ExprResult 11080 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11081 Designation Desig; 11082 11083 // transform the initializer value 11084 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11085 if (Init.isInvalid()) 11086 return ExprError(); 11087 11088 // transform the designators. 11089 SmallVector<Expr*, 4> ArrayExprs; 11090 bool ExprChanged = false; 11091 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11092 if (D.isFieldDesignator()) { 11093 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11094 D.getDotLoc(), 11095 D.getFieldLoc())); 11096 if (D.getField()) { 11097 FieldDecl *Field = cast_or_null<FieldDecl>( 11098 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11099 if (Field != D.getField()) 11100 // Rebuild the expression when the transformed FieldDecl is 11101 // different to the already assigned FieldDecl. 11102 ExprChanged = true; 11103 } else { 11104 // Ensure that the designator expression is rebuilt when there isn't 11105 // a resolved FieldDecl in the designator as we don't want to assign 11106 // a FieldDecl to a pattern designator that will be instantiated again. 11107 ExprChanged = true; 11108 } 11109 continue; 11110 } 11111 11112 if (D.isArrayDesignator()) { 11113 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11114 if (Index.isInvalid()) 11115 return ExprError(); 11116 11117 Desig.AddDesignator( 11118 Designator::getArray(Index.get(), D.getLBracketLoc())); 11119 11120 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11121 ArrayExprs.push_back(Index.get()); 11122 continue; 11123 } 11124 11125 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11126 ExprResult Start 11127 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11128 if (Start.isInvalid()) 11129 return ExprError(); 11130 11131 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11132 if (End.isInvalid()) 11133 return ExprError(); 11134 11135 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11136 End.get(), 11137 D.getLBracketLoc(), 11138 D.getEllipsisLoc())); 11139 11140 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11141 End.get() != E->getArrayRangeEnd(D); 11142 11143 ArrayExprs.push_back(Start.get()); 11144 ArrayExprs.push_back(End.get()); 11145 } 11146 11147 if (!getDerived().AlwaysRebuild() && 11148 Init.get() == E->getInit() && 11149 !ExprChanged) 11150 return E; 11151 11152 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11153 E->getEqualOrColonLoc(), 11154 E->usesGNUSyntax(), Init.get()); 11155 } 11156 11157 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11158 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11159 template<typename Derived> 11160 ExprResult 11161 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11162 DesignatedInitUpdateExpr *E) { 11163 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11164 "initializer"); 11165 return ExprError(); 11166 } 11167 11168 template<typename Derived> 11169 ExprResult 11170 TreeTransform<Derived>::TransformNoInitExpr( 11171 NoInitExpr *E) { 11172 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11173 return ExprError(); 11174 } 11175 11176 template<typename Derived> 11177 ExprResult 11178 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11179 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11180 return ExprError(); 11181 } 11182 11183 template<typename Derived> 11184 ExprResult 11185 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11186 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11187 return ExprError(); 11188 } 11189 11190 template<typename Derived> 11191 ExprResult 11192 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11193 ImplicitValueInitExpr *E) { 11194 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11195 11196 // FIXME: Will we ever have proper type location here? Will we actually 11197 // need to transform the type? 11198 QualType T = getDerived().TransformType(E->getType()); 11199 if (T.isNull()) 11200 return ExprError(); 11201 11202 if (!getDerived().AlwaysRebuild() && 11203 T == E->getType()) 11204 return E; 11205 11206 return getDerived().RebuildImplicitValueInitExpr(T); 11207 } 11208 11209 template<typename Derived> 11210 ExprResult 11211 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11212 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11213 if (!TInfo) 11214 return ExprError(); 11215 11216 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11217 if (SubExpr.isInvalid()) 11218 return ExprError(); 11219 11220 if (!getDerived().AlwaysRebuild() && 11221 TInfo == E->getWrittenTypeInfo() && 11222 SubExpr.get() == E->getSubExpr()) 11223 return E; 11224 11225 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11226 TInfo, E->getRParenLoc()); 11227 } 11228 11229 template<typename Derived> 11230 ExprResult 11231 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11232 bool ArgumentChanged = false; 11233 SmallVector<Expr*, 4> Inits; 11234 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11235 &ArgumentChanged)) 11236 return ExprError(); 11237 11238 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11239 Inits, 11240 E->getRParenLoc()); 11241 } 11242 11243 /// Transform an address-of-label expression. 11244 /// 11245 /// By default, the transformation of an address-of-label expression always 11246 /// rebuilds the expression, so that the label identifier can be resolved to 11247 /// the corresponding label statement by semantic analysis. 11248 template<typename Derived> 11249 ExprResult 11250 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11251 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11252 E->getLabel()); 11253 if (!LD) 11254 return ExprError(); 11255 11256 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11257 cast<LabelDecl>(LD)); 11258 } 11259 11260 template<typename Derived> 11261 ExprResult 11262 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11263 SemaRef.ActOnStartStmtExpr(); 11264 StmtResult SubStmt 11265 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11266 if (SubStmt.isInvalid()) { 11267 SemaRef.ActOnStmtExprError(); 11268 return ExprError(); 11269 } 11270 11271 unsigned OldDepth = E->getTemplateDepth(); 11272 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11273 11274 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11275 SubStmt.get() == E->getSubStmt()) { 11276 // Calling this an 'error' is unintuitive, but it does the right thing. 11277 SemaRef.ActOnStmtExprError(); 11278 return SemaRef.MaybeBindToTemporary(E); 11279 } 11280 11281 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11282 E->getRParenLoc(), NewDepth); 11283 } 11284 11285 template<typename Derived> 11286 ExprResult 11287 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11288 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11289 if (Cond.isInvalid()) 11290 return ExprError(); 11291 11292 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11293 if (LHS.isInvalid()) 11294 return ExprError(); 11295 11296 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11297 if (RHS.isInvalid()) 11298 return ExprError(); 11299 11300 if (!getDerived().AlwaysRebuild() && 11301 Cond.get() == E->getCond() && 11302 LHS.get() == E->getLHS() && 11303 RHS.get() == E->getRHS()) 11304 return E; 11305 11306 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11307 Cond.get(), LHS.get(), RHS.get(), 11308 E->getRParenLoc()); 11309 } 11310 11311 template<typename Derived> 11312 ExprResult 11313 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11314 return E; 11315 } 11316 11317 template<typename Derived> 11318 ExprResult 11319 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11320 switch (E->getOperator()) { 11321 case OO_New: 11322 case OO_Delete: 11323 case OO_Array_New: 11324 case OO_Array_Delete: 11325 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11326 11327 case OO_Call: { 11328 // This is a call to an object's operator(). 11329 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11330 11331 // Transform the object itself. 11332 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11333 if (Object.isInvalid()) 11334 return ExprError(); 11335 11336 // FIXME: Poor location information 11337 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11338 static_cast<Expr *>(Object.get())->getEndLoc()); 11339 11340 // Transform the call arguments. 11341 SmallVector<Expr*, 8> Args; 11342 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11343 Args)) 11344 return ExprError(); 11345 11346 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11347 E->getEndLoc()); 11348 } 11349 11350 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11351 case OO_##Name: 11352 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11353 #include "clang/Basic/OperatorKinds.def" 11354 case OO_Subscript: 11355 // Handled below. 11356 break; 11357 11358 case OO_Conditional: 11359 llvm_unreachable("conditional operator is not actually overloadable"); 11360 11361 case OO_None: 11362 case NUM_OVERLOADED_OPERATORS: 11363 llvm_unreachable("not an overloaded operator?"); 11364 } 11365 11366 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11367 if (Callee.isInvalid()) 11368 return ExprError(); 11369 11370 ExprResult First; 11371 if (E->getOperator() == OO_Amp) 11372 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11373 else 11374 First = getDerived().TransformExpr(E->getArg(0)); 11375 if (First.isInvalid()) 11376 return ExprError(); 11377 11378 ExprResult Second; 11379 if (E->getNumArgs() == 2) { 11380 Second = getDerived().TransformExpr(E->getArg(1)); 11381 if (Second.isInvalid()) 11382 return ExprError(); 11383 } 11384 11385 if (!getDerived().AlwaysRebuild() && 11386 Callee.get() == E->getCallee() && 11387 First.get() == E->getArg(0) && 11388 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11389 return SemaRef.MaybeBindToTemporary(E); 11390 11391 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11392 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11393 getSema().CurFPFeatures = 11394 NewOverrides.applyOverrides(getSema().getLangOpts()); 11395 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11396 11397 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11398 E->getOperatorLoc(), 11399 Callee.get(), 11400 First.get(), 11401 Second.get()); 11402 } 11403 11404 template<typename Derived> 11405 ExprResult 11406 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11407 return getDerived().TransformCallExpr(E); 11408 } 11409 11410 template <typename Derived> 11411 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11412 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11413 getSema().CurContext != E->getParentContext(); 11414 11415 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11416 return E; 11417 11418 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11419 E->getEndLoc(), 11420 getSema().CurContext); 11421 } 11422 11423 template<typename Derived> 11424 ExprResult 11425 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11426 // Transform the callee. 11427 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11428 if (Callee.isInvalid()) 11429 return ExprError(); 11430 11431 // Transform exec config. 11432 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11433 if (EC.isInvalid()) 11434 return ExprError(); 11435 11436 // Transform arguments. 11437 bool ArgChanged = false; 11438 SmallVector<Expr*, 8> Args; 11439 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11440 &ArgChanged)) 11441 return ExprError(); 11442 11443 if (!getDerived().AlwaysRebuild() && 11444 Callee.get() == E->getCallee() && 11445 !ArgChanged) 11446 return SemaRef.MaybeBindToTemporary(E); 11447 11448 // FIXME: Wrong source location information for the '('. 11449 SourceLocation FakeLParenLoc 11450 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11451 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11452 Args, 11453 E->getRParenLoc(), EC.get()); 11454 } 11455 11456 template<typename Derived> 11457 ExprResult 11458 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11459 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11460 if (!Type) 11461 return ExprError(); 11462 11463 ExprResult SubExpr 11464 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11465 if (SubExpr.isInvalid()) 11466 return ExprError(); 11467 11468 if (!getDerived().AlwaysRebuild() && 11469 Type == E->getTypeInfoAsWritten() && 11470 SubExpr.get() == E->getSubExpr()) 11471 return E; 11472 return getDerived().RebuildCXXNamedCastExpr( 11473 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11474 Type, E->getAngleBrackets().getEnd(), 11475 // FIXME. this should be '(' location 11476 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11477 } 11478 11479 template<typename Derived> 11480 ExprResult 11481 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11482 TypeSourceInfo *TSI = 11483 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11484 if (!TSI) 11485 return ExprError(); 11486 11487 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11488 if (Sub.isInvalid()) 11489 return ExprError(); 11490 11491 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11492 Sub.get(), BCE->getEndLoc()); 11493 } 11494 11495 template<typename Derived> 11496 ExprResult 11497 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11498 return getDerived().TransformCXXNamedCastExpr(E); 11499 } 11500 11501 template<typename Derived> 11502 ExprResult 11503 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11504 return getDerived().TransformCXXNamedCastExpr(E); 11505 } 11506 11507 template<typename Derived> 11508 ExprResult 11509 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11510 CXXReinterpretCastExpr *E) { 11511 return getDerived().TransformCXXNamedCastExpr(E); 11512 } 11513 11514 template<typename Derived> 11515 ExprResult 11516 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11517 return getDerived().TransformCXXNamedCastExpr(E); 11518 } 11519 11520 template<typename Derived> 11521 ExprResult 11522 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11523 return getDerived().TransformCXXNamedCastExpr(E); 11524 } 11525 11526 template<typename Derived> 11527 ExprResult 11528 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11529 CXXFunctionalCastExpr *E) { 11530 TypeSourceInfo *Type = 11531 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11532 if (!Type) 11533 return ExprError(); 11534 11535 ExprResult SubExpr 11536 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11537 if (SubExpr.isInvalid()) 11538 return ExprError(); 11539 11540 if (!getDerived().AlwaysRebuild() && 11541 Type == E->getTypeInfoAsWritten() && 11542 SubExpr.get() == E->getSubExpr()) 11543 return E; 11544 11545 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11546 E->getLParenLoc(), 11547 SubExpr.get(), 11548 E->getRParenLoc(), 11549 E->isListInitialization()); 11550 } 11551 11552 template<typename Derived> 11553 ExprResult 11554 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11555 if (E->isTypeOperand()) { 11556 TypeSourceInfo *TInfo 11557 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11558 if (!TInfo) 11559 return ExprError(); 11560 11561 if (!getDerived().AlwaysRebuild() && 11562 TInfo == E->getTypeOperandSourceInfo()) 11563 return E; 11564 11565 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11566 TInfo, E->getEndLoc()); 11567 } 11568 11569 // We don't know whether the subexpression is potentially evaluated until 11570 // after we perform semantic analysis. We speculatively assume it is 11571 // unevaluated; it will get fixed later if the subexpression is in fact 11572 // potentially evaluated. 11573 EnterExpressionEvaluationContext Unevaluated( 11574 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11575 Sema::ReuseLambdaContextDecl); 11576 11577 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11578 if (SubExpr.isInvalid()) 11579 return ExprError(); 11580 11581 if (!getDerived().AlwaysRebuild() && 11582 SubExpr.get() == E->getExprOperand()) 11583 return E; 11584 11585 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11586 SubExpr.get(), E->getEndLoc()); 11587 } 11588 11589 template<typename Derived> 11590 ExprResult 11591 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11592 if (E->isTypeOperand()) { 11593 TypeSourceInfo *TInfo 11594 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11595 if (!TInfo) 11596 return ExprError(); 11597 11598 if (!getDerived().AlwaysRebuild() && 11599 TInfo == E->getTypeOperandSourceInfo()) 11600 return E; 11601 11602 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11603 TInfo, E->getEndLoc()); 11604 } 11605 11606 EnterExpressionEvaluationContext Unevaluated( 11607 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11608 11609 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11610 if (SubExpr.isInvalid()) 11611 return ExprError(); 11612 11613 if (!getDerived().AlwaysRebuild() && 11614 SubExpr.get() == E->getExprOperand()) 11615 return E; 11616 11617 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11618 SubExpr.get(), E->getEndLoc()); 11619 } 11620 11621 template<typename Derived> 11622 ExprResult 11623 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11624 return E; 11625 } 11626 11627 template<typename Derived> 11628 ExprResult 11629 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11630 CXXNullPtrLiteralExpr *E) { 11631 return E; 11632 } 11633 11634 template<typename Derived> 11635 ExprResult 11636 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11637 QualType T = getSema().getCurrentThisType(); 11638 11639 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11640 // Mark it referenced in the new context regardless. 11641 // FIXME: this is a bit instantiation-specific. 11642 getSema().MarkThisReferenced(E); 11643 return E; 11644 } 11645 11646 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11647 } 11648 11649 template<typename Derived> 11650 ExprResult 11651 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11652 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11653 if (SubExpr.isInvalid()) 11654 return ExprError(); 11655 11656 if (!getDerived().AlwaysRebuild() && 11657 SubExpr.get() == E->getSubExpr()) 11658 return E; 11659 11660 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11661 E->isThrownVariableInScope()); 11662 } 11663 11664 template<typename Derived> 11665 ExprResult 11666 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11667 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11668 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11669 if (!Param) 11670 return ExprError(); 11671 11672 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11673 E->getUsedContext() == SemaRef.CurContext) 11674 return E; 11675 11676 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11677 } 11678 11679 template<typename Derived> 11680 ExprResult 11681 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11682 FieldDecl *Field = cast_or_null<FieldDecl>( 11683 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11684 if (!Field) 11685 return ExprError(); 11686 11687 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11688 E->getUsedContext() == SemaRef.CurContext) 11689 return E; 11690 11691 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11692 } 11693 11694 template<typename Derived> 11695 ExprResult 11696 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11697 CXXScalarValueInitExpr *E) { 11698 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11699 if (!T) 11700 return ExprError(); 11701 11702 if (!getDerived().AlwaysRebuild() && 11703 T == E->getTypeSourceInfo()) 11704 return E; 11705 11706 return getDerived().RebuildCXXScalarValueInitExpr(T, 11707 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11708 E->getRParenLoc()); 11709 } 11710 11711 template<typename Derived> 11712 ExprResult 11713 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11714 // Transform the type that we're allocating 11715 TypeSourceInfo *AllocTypeInfo = 11716 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11717 if (!AllocTypeInfo) 11718 return ExprError(); 11719 11720 // Transform the size of the array we're allocating (if any). 11721 Optional<Expr *> ArraySize; 11722 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11723 ExprResult NewArraySize; 11724 if (*OldArraySize) { 11725 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11726 if (NewArraySize.isInvalid()) 11727 return ExprError(); 11728 } 11729 ArraySize = NewArraySize.get(); 11730 } 11731 11732 // Transform the placement arguments (if any). 11733 bool ArgumentChanged = false; 11734 SmallVector<Expr*, 8> PlacementArgs; 11735 if (getDerived().TransformExprs(E->getPlacementArgs(), 11736 E->getNumPlacementArgs(), true, 11737 PlacementArgs, &ArgumentChanged)) 11738 return ExprError(); 11739 11740 // Transform the initializer (if any). 11741 Expr *OldInit = E->getInitializer(); 11742 ExprResult NewInit; 11743 if (OldInit) 11744 NewInit = getDerived().TransformInitializer(OldInit, true); 11745 if (NewInit.isInvalid()) 11746 return ExprError(); 11747 11748 // Transform new operator and delete operator. 11749 FunctionDecl *OperatorNew = nullptr; 11750 if (E->getOperatorNew()) { 11751 OperatorNew = cast_or_null<FunctionDecl>( 11752 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11753 if (!OperatorNew) 11754 return ExprError(); 11755 } 11756 11757 FunctionDecl *OperatorDelete = nullptr; 11758 if (E->getOperatorDelete()) { 11759 OperatorDelete = cast_or_null<FunctionDecl>( 11760 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11761 if (!OperatorDelete) 11762 return ExprError(); 11763 } 11764 11765 if (!getDerived().AlwaysRebuild() && 11766 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11767 ArraySize == E->getArraySize() && 11768 NewInit.get() == OldInit && 11769 OperatorNew == E->getOperatorNew() && 11770 OperatorDelete == E->getOperatorDelete() && 11771 !ArgumentChanged) { 11772 // Mark any declarations we need as referenced. 11773 // FIXME: instantiation-specific. 11774 if (OperatorNew) 11775 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11776 if (OperatorDelete) 11777 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11778 11779 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11780 QualType ElementType 11781 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11782 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11783 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11784 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11785 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11786 } 11787 } 11788 } 11789 11790 return E; 11791 } 11792 11793 QualType AllocType = AllocTypeInfo->getType(); 11794 if (!ArraySize) { 11795 // If no array size was specified, but the new expression was 11796 // instantiated with an array type (e.g., "new T" where T is 11797 // instantiated with "int[4]"), extract the outer bound from the 11798 // array type as our array size. We do this with constant and 11799 // dependently-sized array types. 11800 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11801 if (!ArrayT) { 11802 // Do nothing 11803 } else if (const ConstantArrayType *ConsArrayT 11804 = dyn_cast<ConstantArrayType>(ArrayT)) { 11805 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11806 SemaRef.Context.getSizeType(), 11807 /*FIXME:*/ E->getBeginLoc()); 11808 AllocType = ConsArrayT->getElementType(); 11809 } else if (const DependentSizedArrayType *DepArrayT 11810 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11811 if (DepArrayT->getSizeExpr()) { 11812 ArraySize = DepArrayT->getSizeExpr(); 11813 AllocType = DepArrayT->getElementType(); 11814 } 11815 } 11816 } 11817 11818 return getDerived().RebuildCXXNewExpr( 11819 E->getBeginLoc(), E->isGlobalNew(), 11820 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11821 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11822 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11823 } 11824 11825 template<typename Derived> 11826 ExprResult 11827 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11828 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11829 if (Operand.isInvalid()) 11830 return ExprError(); 11831 11832 // Transform the delete operator, if known. 11833 FunctionDecl *OperatorDelete = nullptr; 11834 if (E->getOperatorDelete()) { 11835 OperatorDelete = cast_or_null<FunctionDecl>( 11836 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11837 if (!OperatorDelete) 11838 return ExprError(); 11839 } 11840 11841 if (!getDerived().AlwaysRebuild() && 11842 Operand.get() == E->getArgument() && 11843 OperatorDelete == E->getOperatorDelete()) { 11844 // Mark any declarations we need as referenced. 11845 // FIXME: instantiation-specific. 11846 if (OperatorDelete) 11847 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11848 11849 if (!E->getArgument()->isTypeDependent()) { 11850 QualType Destroyed = SemaRef.Context.getBaseElementType( 11851 E->getDestroyedType()); 11852 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11853 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11854 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11855 SemaRef.LookupDestructor(Record)); 11856 } 11857 } 11858 11859 return E; 11860 } 11861 11862 return getDerived().RebuildCXXDeleteExpr( 11863 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11864 } 11865 11866 template<typename Derived> 11867 ExprResult 11868 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11869 CXXPseudoDestructorExpr *E) { 11870 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11871 if (Base.isInvalid()) 11872 return ExprError(); 11873 11874 ParsedType ObjectTypePtr; 11875 bool MayBePseudoDestructor = false; 11876 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11877 E->getOperatorLoc(), 11878 E->isArrow()? tok::arrow : tok::period, 11879 ObjectTypePtr, 11880 MayBePseudoDestructor); 11881 if (Base.isInvalid()) 11882 return ExprError(); 11883 11884 QualType ObjectType = ObjectTypePtr.get(); 11885 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11886 if (QualifierLoc) { 11887 QualifierLoc 11888 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11889 if (!QualifierLoc) 11890 return ExprError(); 11891 } 11892 CXXScopeSpec SS; 11893 SS.Adopt(QualifierLoc); 11894 11895 PseudoDestructorTypeStorage Destroyed; 11896 if (E->getDestroyedTypeInfo()) { 11897 TypeSourceInfo *DestroyedTypeInfo 11898 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11899 ObjectType, nullptr, SS); 11900 if (!DestroyedTypeInfo) 11901 return ExprError(); 11902 Destroyed = DestroyedTypeInfo; 11903 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11904 // We aren't likely to be able to resolve the identifier down to a type 11905 // now anyway, so just retain the identifier. 11906 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11907 E->getDestroyedTypeLoc()); 11908 } else { 11909 // Look for a destructor known with the given name. 11910 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11911 *E->getDestroyedTypeIdentifier(), 11912 E->getDestroyedTypeLoc(), 11913 /*Scope=*/nullptr, 11914 SS, ObjectTypePtr, 11915 false); 11916 if (!T) 11917 return ExprError(); 11918 11919 Destroyed 11920 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11921 E->getDestroyedTypeLoc()); 11922 } 11923 11924 TypeSourceInfo *ScopeTypeInfo = nullptr; 11925 if (E->getScopeTypeInfo()) { 11926 CXXScopeSpec EmptySS; 11927 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11928 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11929 if (!ScopeTypeInfo) 11930 return ExprError(); 11931 } 11932 11933 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11934 E->getOperatorLoc(), 11935 E->isArrow(), 11936 SS, 11937 ScopeTypeInfo, 11938 E->getColonColonLoc(), 11939 E->getTildeLoc(), 11940 Destroyed); 11941 } 11942 11943 template <typename Derived> 11944 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11945 bool RequiresADL, 11946 LookupResult &R) { 11947 // Transform all the decls. 11948 bool AllEmptyPacks = true; 11949 for (auto *OldD : Old->decls()) { 11950 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11951 if (!InstD) { 11952 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11953 // This can happen because of dependent hiding. 11954 if (isa<UsingShadowDecl>(OldD)) 11955 continue; 11956 else { 11957 R.clear(); 11958 return true; 11959 } 11960 } 11961 11962 // Expand using pack declarations. 11963 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11964 ArrayRef<NamedDecl*> Decls = SingleDecl; 11965 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11966 Decls = UPD->expansions(); 11967 11968 // Expand using declarations. 11969 for (auto *D : Decls) { 11970 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11971 for (auto *SD : UD->shadows()) 11972 R.addDecl(SD); 11973 } else { 11974 R.addDecl(D); 11975 } 11976 } 11977 11978 AllEmptyPacks &= Decls.empty(); 11979 }; 11980 11981 // C++ [temp.res]/8.4.2: 11982 // The program is ill-formed, no diagnostic required, if [...] lookup for 11983 // a name in the template definition found a using-declaration, but the 11984 // lookup in the corresponding scope in the instantiation odoes not find 11985 // any declarations because the using-declaration was a pack expansion and 11986 // the corresponding pack is empty 11987 if (AllEmptyPacks && !RequiresADL) { 11988 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11989 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11990 return true; 11991 } 11992 11993 // Resolve a kind, but don't do any further analysis. If it's 11994 // ambiguous, the callee needs to deal with it. 11995 R.resolveKind(); 11996 return false; 11997 } 11998 11999 template<typename Derived> 12000 ExprResult 12001 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12002 UnresolvedLookupExpr *Old) { 12003 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12004 Sema::LookupOrdinaryName); 12005 12006 // Transform the declaration set. 12007 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12008 return ExprError(); 12009 12010 // Rebuild the nested-name qualifier, if present. 12011 CXXScopeSpec SS; 12012 if (Old->getQualifierLoc()) { 12013 NestedNameSpecifierLoc QualifierLoc 12014 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12015 if (!QualifierLoc) 12016 return ExprError(); 12017 12018 SS.Adopt(QualifierLoc); 12019 } 12020 12021 if (Old->getNamingClass()) { 12022 CXXRecordDecl *NamingClass 12023 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12024 Old->getNameLoc(), 12025 Old->getNamingClass())); 12026 if (!NamingClass) { 12027 R.clear(); 12028 return ExprError(); 12029 } 12030 12031 R.setNamingClass(NamingClass); 12032 } 12033 12034 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12035 12036 // If we have neither explicit template arguments, nor the template keyword, 12037 // it's a normal declaration name or member reference. 12038 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12039 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12040 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12041 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12042 // give a good diagnostic. 12043 if (D && D->isCXXInstanceMember()) { 12044 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12045 /*TemplateArgs=*/nullptr, 12046 /*Scope=*/nullptr); 12047 } 12048 12049 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12050 } 12051 12052 // If we have template arguments, rebuild them, then rebuild the 12053 // templateid expression. 12054 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12055 if (Old->hasExplicitTemplateArgs() && 12056 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12057 Old->getNumTemplateArgs(), 12058 TransArgs)) { 12059 R.clear(); 12060 return ExprError(); 12061 } 12062 12063 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12064 Old->requiresADL(), &TransArgs); 12065 } 12066 12067 template<typename Derived> 12068 ExprResult 12069 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12070 bool ArgChanged = false; 12071 SmallVector<TypeSourceInfo *, 4> Args; 12072 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12073 TypeSourceInfo *From = E->getArg(I); 12074 TypeLoc FromTL = From->getTypeLoc(); 12075 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12076 TypeLocBuilder TLB; 12077 TLB.reserve(FromTL.getFullDataSize()); 12078 QualType To = getDerived().TransformType(TLB, FromTL); 12079 if (To.isNull()) 12080 return ExprError(); 12081 12082 if (To == From->getType()) 12083 Args.push_back(From); 12084 else { 12085 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12086 ArgChanged = true; 12087 } 12088 continue; 12089 } 12090 12091 ArgChanged = true; 12092 12093 // We have a pack expansion. Instantiate it. 12094 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12095 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12096 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12097 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12098 12099 // Determine whether the set of unexpanded parameter packs can and should 12100 // be expanded. 12101 bool Expand = true; 12102 bool RetainExpansion = false; 12103 Optional<unsigned> OrigNumExpansions = 12104 ExpansionTL.getTypePtr()->getNumExpansions(); 12105 Optional<unsigned> NumExpansions = OrigNumExpansions; 12106 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12107 PatternTL.getSourceRange(), 12108 Unexpanded, 12109 Expand, RetainExpansion, 12110 NumExpansions)) 12111 return ExprError(); 12112 12113 if (!Expand) { 12114 // The transform has determined that we should perform a simple 12115 // transformation on the pack expansion, producing another pack 12116 // expansion. 12117 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12118 12119 TypeLocBuilder TLB; 12120 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12121 12122 QualType To = getDerived().TransformType(TLB, PatternTL); 12123 if (To.isNull()) 12124 return ExprError(); 12125 12126 To = getDerived().RebuildPackExpansionType(To, 12127 PatternTL.getSourceRange(), 12128 ExpansionTL.getEllipsisLoc(), 12129 NumExpansions); 12130 if (To.isNull()) 12131 return ExprError(); 12132 12133 PackExpansionTypeLoc ToExpansionTL 12134 = TLB.push<PackExpansionTypeLoc>(To); 12135 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12136 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12137 continue; 12138 } 12139 12140 // Expand the pack expansion by substituting for each argument in the 12141 // pack(s). 12142 for (unsigned I = 0; I != *NumExpansions; ++I) { 12143 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12144 TypeLocBuilder TLB; 12145 TLB.reserve(PatternTL.getFullDataSize()); 12146 QualType To = getDerived().TransformType(TLB, PatternTL); 12147 if (To.isNull()) 12148 return ExprError(); 12149 12150 if (To->containsUnexpandedParameterPack()) { 12151 To = getDerived().RebuildPackExpansionType(To, 12152 PatternTL.getSourceRange(), 12153 ExpansionTL.getEllipsisLoc(), 12154 NumExpansions); 12155 if (To.isNull()) 12156 return ExprError(); 12157 12158 PackExpansionTypeLoc ToExpansionTL 12159 = TLB.push<PackExpansionTypeLoc>(To); 12160 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12161 } 12162 12163 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12164 } 12165 12166 if (!RetainExpansion) 12167 continue; 12168 12169 // If we're supposed to retain a pack expansion, do so by temporarily 12170 // forgetting the partially-substituted parameter pack. 12171 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12172 12173 TypeLocBuilder TLB; 12174 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12175 12176 QualType To = getDerived().TransformType(TLB, PatternTL); 12177 if (To.isNull()) 12178 return ExprError(); 12179 12180 To = getDerived().RebuildPackExpansionType(To, 12181 PatternTL.getSourceRange(), 12182 ExpansionTL.getEllipsisLoc(), 12183 NumExpansions); 12184 if (To.isNull()) 12185 return ExprError(); 12186 12187 PackExpansionTypeLoc ToExpansionTL 12188 = TLB.push<PackExpansionTypeLoc>(To); 12189 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12190 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12191 } 12192 12193 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12194 return E; 12195 12196 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12197 E->getEndLoc()); 12198 } 12199 12200 template<typename Derived> 12201 ExprResult 12202 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12203 ConceptSpecializationExpr *E) { 12204 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12205 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12206 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12207 Old->NumTemplateArgs, TransArgs)) 12208 return ExprError(); 12209 12210 return getDerived().RebuildConceptSpecializationExpr( 12211 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12212 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12213 &TransArgs); 12214 } 12215 12216 template<typename Derived> 12217 ExprResult 12218 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12219 SmallVector<ParmVarDecl*, 4> TransParams; 12220 SmallVector<QualType, 4> TransParamTypes; 12221 Sema::ExtParameterInfoBuilder ExtParamInfos; 12222 12223 // C++2a [expr.prim.req]p2 12224 // Expressions appearing within a requirement-body are unevaluated operands. 12225 EnterExpressionEvaluationContext Ctx( 12226 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12227 12228 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12229 getSema().Context, getSema().CurContext, 12230 E->getBody()->getBeginLoc()); 12231 12232 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12233 12234 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12235 E->getLocalParameters(), 12236 /*ParamTypes=*/nullptr, 12237 /*ParamInfos=*/nullptr, 12238 TransParamTypes, &TransParams, 12239 ExtParamInfos)) 12240 return ExprError(); 12241 12242 for (ParmVarDecl *Param : TransParams) 12243 Param->setDeclContext(Body); 12244 12245 SmallVector<concepts::Requirement *, 4> TransReqs; 12246 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12247 TransReqs)) 12248 return ExprError(); 12249 12250 for (concepts::Requirement *Req : TransReqs) { 12251 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12252 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12253 ER->getReturnTypeRequirement() 12254 .getTypeConstraintTemplateParameterList()->getParam(0) 12255 ->setDeclContext(Body); 12256 } 12257 } 12258 } 12259 12260 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12261 TransParams, TransReqs, 12262 E->getRBraceLoc()); 12263 } 12264 12265 template<typename Derived> 12266 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12267 ArrayRef<concepts::Requirement *> Reqs, 12268 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12269 for (concepts::Requirement *Req : Reqs) { 12270 concepts::Requirement *TransReq = nullptr; 12271 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12272 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12273 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12274 TransReq = getDerived().TransformExprRequirement(ExprReq); 12275 else 12276 TransReq = getDerived().TransformNestedRequirement( 12277 cast<concepts::NestedRequirement>(Req)); 12278 if (!TransReq) 12279 return true; 12280 Transformed.push_back(TransReq); 12281 } 12282 return false; 12283 } 12284 12285 template<typename Derived> 12286 concepts::TypeRequirement * 12287 TreeTransform<Derived>::TransformTypeRequirement( 12288 concepts::TypeRequirement *Req) { 12289 if (Req->isSubstitutionFailure()) { 12290 if (getDerived().AlwaysRebuild()) 12291 return getDerived().RebuildTypeRequirement( 12292 Req->getSubstitutionDiagnostic()); 12293 return Req; 12294 } 12295 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12296 if (!TransType) 12297 return nullptr; 12298 return getDerived().RebuildTypeRequirement(TransType); 12299 } 12300 12301 template<typename Derived> 12302 concepts::ExprRequirement * 12303 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12304 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12305 if (Req->isExprSubstitutionFailure()) 12306 TransExpr = Req->getExprSubstitutionDiagnostic(); 12307 else { 12308 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12309 if (TransExprRes.isInvalid()) 12310 return nullptr; 12311 TransExpr = TransExprRes.get(); 12312 } 12313 12314 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12315 const auto &RetReq = Req->getReturnTypeRequirement(); 12316 if (RetReq.isEmpty()) 12317 TransRetReq.emplace(); 12318 else if (RetReq.isSubstitutionFailure()) 12319 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12320 else if (RetReq.isTypeConstraint()) { 12321 TemplateParameterList *OrigTPL = 12322 RetReq.getTypeConstraintTemplateParameterList(); 12323 TemplateParameterList *TPL = 12324 getDerived().TransformTemplateParameterList(OrigTPL); 12325 if (!TPL) 12326 return nullptr; 12327 TransRetReq.emplace(TPL); 12328 } 12329 assert(TransRetReq.hasValue() && 12330 "All code paths leading here must set TransRetReq"); 12331 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12332 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12333 Req->getNoexceptLoc(), 12334 std::move(*TransRetReq)); 12335 return getDerived().RebuildExprRequirement( 12336 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12337 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12338 } 12339 12340 template<typename Derived> 12341 concepts::NestedRequirement * 12342 TreeTransform<Derived>::TransformNestedRequirement( 12343 concepts::NestedRequirement *Req) { 12344 if (Req->isSubstitutionFailure()) { 12345 if (getDerived().AlwaysRebuild()) 12346 return getDerived().RebuildNestedRequirement( 12347 Req->getSubstitutionDiagnostic()); 12348 return Req; 12349 } 12350 ExprResult TransConstraint = 12351 getDerived().TransformExpr(Req->getConstraintExpr()); 12352 if (TransConstraint.isInvalid()) 12353 return nullptr; 12354 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12355 } 12356 12357 template<typename Derived> 12358 ExprResult 12359 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12360 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12361 if (!T) 12362 return ExprError(); 12363 12364 if (!getDerived().AlwaysRebuild() && 12365 T == E->getQueriedTypeSourceInfo()) 12366 return E; 12367 12368 ExprResult SubExpr; 12369 { 12370 EnterExpressionEvaluationContext Unevaluated( 12371 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12372 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12373 if (SubExpr.isInvalid()) 12374 return ExprError(); 12375 12376 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12377 return E; 12378 } 12379 12380 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12381 SubExpr.get(), E->getEndLoc()); 12382 } 12383 12384 template<typename Derived> 12385 ExprResult 12386 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12387 ExprResult SubExpr; 12388 { 12389 EnterExpressionEvaluationContext Unevaluated( 12390 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12391 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12392 if (SubExpr.isInvalid()) 12393 return ExprError(); 12394 12395 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12396 return E; 12397 } 12398 12399 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12400 SubExpr.get(), E->getEndLoc()); 12401 } 12402 12403 template <typename Derived> 12404 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12405 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12406 TypeSourceInfo **RecoveryTSI) { 12407 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12408 DRE, AddrTaken, RecoveryTSI); 12409 12410 // Propagate both errors and recovered types, which return ExprEmpty. 12411 if (!NewDRE.isUsable()) 12412 return NewDRE; 12413 12414 // We got an expr, wrap it up in parens. 12415 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12416 return PE; 12417 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12418 PE->getRParen()); 12419 } 12420 12421 template <typename Derived> 12422 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12423 DependentScopeDeclRefExpr *E) { 12424 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12425 nullptr); 12426 } 12427 12428 template<typename Derived> 12429 ExprResult 12430 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12431 DependentScopeDeclRefExpr *E, 12432 bool IsAddressOfOperand, 12433 TypeSourceInfo **RecoveryTSI) { 12434 assert(E->getQualifierLoc()); 12435 NestedNameSpecifierLoc QualifierLoc 12436 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12437 if (!QualifierLoc) 12438 return ExprError(); 12439 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12440 12441 // TODO: If this is a conversion-function-id, verify that the 12442 // destination type name (if present) resolves the same way after 12443 // instantiation as it did in the local scope. 12444 12445 DeclarationNameInfo NameInfo 12446 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12447 if (!NameInfo.getName()) 12448 return ExprError(); 12449 12450 if (!E->hasExplicitTemplateArgs()) { 12451 if (!getDerived().AlwaysRebuild() && 12452 QualifierLoc == E->getQualifierLoc() && 12453 // Note: it is sufficient to compare the Name component of NameInfo: 12454 // if name has not changed, DNLoc has not changed either. 12455 NameInfo.getName() == E->getDeclName()) 12456 return E; 12457 12458 return getDerived().RebuildDependentScopeDeclRefExpr( 12459 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12460 IsAddressOfOperand, RecoveryTSI); 12461 } 12462 12463 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12464 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12465 E->getNumTemplateArgs(), 12466 TransArgs)) 12467 return ExprError(); 12468 12469 return getDerived().RebuildDependentScopeDeclRefExpr( 12470 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12471 RecoveryTSI); 12472 } 12473 12474 template<typename Derived> 12475 ExprResult 12476 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12477 // CXXConstructExprs other than for list-initialization and 12478 // CXXTemporaryObjectExpr are always implicit, so when we have 12479 // a 1-argument construction we just transform that argument. 12480 if (getDerived().AllowSkippingCXXConstructExpr() && 12481 ((E->getNumArgs() == 1 || 12482 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12483 (!getDerived().DropCallArgument(E->getArg(0))) && 12484 !E->isListInitialization())) 12485 return getDerived().TransformInitializer(E->getArg(0), 12486 /*DirectInit*/ false); 12487 12488 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12489 12490 QualType T = getDerived().TransformType(E->getType()); 12491 if (T.isNull()) 12492 return ExprError(); 12493 12494 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12495 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12496 if (!Constructor) 12497 return ExprError(); 12498 12499 bool ArgumentChanged = false; 12500 SmallVector<Expr*, 8> Args; 12501 { 12502 EnterExpressionEvaluationContext Context( 12503 getSema(), EnterExpressionEvaluationContext::InitList, 12504 E->isListInitialization()); 12505 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12506 &ArgumentChanged)) 12507 return ExprError(); 12508 } 12509 12510 if (!getDerived().AlwaysRebuild() && 12511 T == E->getType() && 12512 Constructor == E->getConstructor() && 12513 !ArgumentChanged) { 12514 // Mark the constructor as referenced. 12515 // FIXME: Instantiation-specific 12516 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12517 return E; 12518 } 12519 12520 return getDerived().RebuildCXXConstructExpr( 12521 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12522 E->hadMultipleCandidates(), E->isListInitialization(), 12523 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12524 E->getConstructionKind(), E->getParenOrBraceRange()); 12525 } 12526 12527 template<typename Derived> 12528 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12529 CXXInheritedCtorInitExpr *E) { 12530 QualType T = getDerived().TransformType(E->getType()); 12531 if (T.isNull()) 12532 return ExprError(); 12533 12534 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12535 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12536 if (!Constructor) 12537 return ExprError(); 12538 12539 if (!getDerived().AlwaysRebuild() && 12540 T == E->getType() && 12541 Constructor == E->getConstructor()) { 12542 // Mark the constructor as referenced. 12543 // FIXME: Instantiation-specific 12544 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12545 return E; 12546 } 12547 12548 return getDerived().RebuildCXXInheritedCtorInitExpr( 12549 T, E->getLocation(), Constructor, 12550 E->constructsVBase(), E->inheritedFromVBase()); 12551 } 12552 12553 /// Transform a C++ temporary-binding expression. 12554 /// 12555 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12556 /// transform the subexpression and return that. 12557 template<typename Derived> 12558 ExprResult 12559 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12560 return getDerived().TransformExpr(E->getSubExpr()); 12561 } 12562 12563 /// Transform a C++ expression that contains cleanups that should 12564 /// be run after the expression is evaluated. 12565 /// 12566 /// Since ExprWithCleanups nodes are implicitly generated, we 12567 /// just transform the subexpression and return that. 12568 template<typename Derived> 12569 ExprResult 12570 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12571 return getDerived().TransformExpr(E->getSubExpr()); 12572 } 12573 12574 template<typename Derived> 12575 ExprResult 12576 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12577 CXXTemporaryObjectExpr *E) { 12578 TypeSourceInfo *T = 12579 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12580 if (!T) 12581 return ExprError(); 12582 12583 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12584 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12585 if (!Constructor) 12586 return ExprError(); 12587 12588 bool ArgumentChanged = false; 12589 SmallVector<Expr*, 8> Args; 12590 Args.reserve(E->getNumArgs()); 12591 { 12592 EnterExpressionEvaluationContext Context( 12593 getSema(), EnterExpressionEvaluationContext::InitList, 12594 E->isListInitialization()); 12595 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12596 &ArgumentChanged)) 12597 return ExprError(); 12598 } 12599 12600 if (!getDerived().AlwaysRebuild() && 12601 T == E->getTypeSourceInfo() && 12602 Constructor == E->getConstructor() && 12603 !ArgumentChanged) { 12604 // FIXME: Instantiation-specific 12605 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12606 return SemaRef.MaybeBindToTemporary(E); 12607 } 12608 12609 // FIXME: We should just pass E->isListInitialization(), but we're not 12610 // prepared to handle list-initialization without a child InitListExpr. 12611 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12612 return getDerived().RebuildCXXTemporaryObjectExpr( 12613 T, LParenLoc, Args, E->getEndLoc(), 12614 /*ListInitialization=*/LParenLoc.isInvalid()); 12615 } 12616 12617 template<typename Derived> 12618 ExprResult 12619 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12620 // Transform any init-capture expressions before entering the scope of the 12621 // lambda body, because they are not semantically within that scope. 12622 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12623 struct TransformedInitCapture { 12624 // The location of the ... if the result is retaining a pack expansion. 12625 SourceLocation EllipsisLoc; 12626 // Zero or more expansions of the init-capture. 12627 SmallVector<InitCaptureInfoTy, 4> Expansions; 12628 }; 12629 SmallVector<TransformedInitCapture, 4> InitCaptures; 12630 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12631 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12632 CEnd = E->capture_end(); 12633 C != CEnd; ++C) { 12634 if (!E->isInitCapture(C)) 12635 continue; 12636 12637 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12638 VarDecl *OldVD = C->getCapturedVar(); 12639 12640 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12641 Optional<unsigned> NumExpansions) { 12642 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12643 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12644 12645 if (NewExprInitResult.isInvalid()) { 12646 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12647 return; 12648 } 12649 Expr *NewExprInit = NewExprInitResult.get(); 12650 12651 QualType NewInitCaptureType = 12652 getSema().buildLambdaInitCaptureInitialization( 12653 C->getLocation(), OldVD->getType()->isReferenceType(), 12654 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12655 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12656 NewExprInit); 12657 Result.Expansions.push_back( 12658 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12659 }; 12660 12661 // If this is an init-capture pack, consider expanding the pack now. 12662 if (OldVD->isParameterPack()) { 12663 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12664 ->getTypeLoc() 12665 .castAs<PackExpansionTypeLoc>(); 12666 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12667 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12668 12669 // Determine whether the set of unexpanded parameter packs can and should 12670 // be expanded. 12671 bool Expand = true; 12672 bool RetainExpansion = false; 12673 Optional<unsigned> OrigNumExpansions = 12674 ExpansionTL.getTypePtr()->getNumExpansions(); 12675 Optional<unsigned> NumExpansions = OrigNumExpansions; 12676 if (getDerived().TryExpandParameterPacks( 12677 ExpansionTL.getEllipsisLoc(), 12678 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12679 RetainExpansion, NumExpansions)) 12680 return ExprError(); 12681 if (Expand) { 12682 for (unsigned I = 0; I != *NumExpansions; ++I) { 12683 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12684 SubstInitCapture(SourceLocation(), None); 12685 } 12686 } 12687 if (!Expand || RetainExpansion) { 12688 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12689 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12690 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12691 } 12692 } else { 12693 SubstInitCapture(SourceLocation(), None); 12694 } 12695 } 12696 12697 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12698 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12699 12700 // Transform the template parameters, and add them to the current 12701 // instantiation scope. The null case is handled correctly. 12702 auto TPL = getDerived().TransformTemplateParameterList( 12703 E->getTemplateParameterList()); 12704 LSI->GLTemplateParameterList = TPL; 12705 12706 // Transform the type of the original lambda's call operator. 12707 // The transformation MUST be done in the CurrentInstantiationScope since 12708 // it introduces a mapping of the original to the newly created 12709 // transformed parameters. 12710 TypeSourceInfo *NewCallOpTSI = nullptr; 12711 { 12712 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12713 FunctionProtoTypeLoc OldCallOpFPTL = 12714 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12715 12716 TypeLocBuilder NewCallOpTLBuilder; 12717 SmallVector<QualType, 4> ExceptionStorage; 12718 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12719 QualType NewCallOpType = TransformFunctionProtoType( 12720 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12721 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12722 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12723 ExceptionStorage, Changed); 12724 }); 12725 if (NewCallOpType.isNull()) 12726 return ExprError(); 12727 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12728 NewCallOpType); 12729 } 12730 12731 // Transform the trailing requires clause 12732 ExprResult NewTrailingRequiresClause; 12733 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12734 // FIXME: Concepts: Substitution into requires clause should only happen 12735 // when checking satisfaction. 12736 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12737 12738 // Create the local class that will describe the lambda. 12739 // FIXME: KnownDependent below is wrong when substituting inside a templated 12740 // context that isn't a DeclContext (such as a variable template). 12741 CXXRecordDecl *OldClass = E->getLambdaClass(); 12742 CXXRecordDecl *Class 12743 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12744 NewCallOpTSI, 12745 /*KnownDependent=*/false, 12746 E->getCaptureDefault()); 12747 getDerived().transformedLocalDecl(OldClass, {Class}); 12748 12749 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12750 if (getDerived().ReplacingOriginal()) 12751 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12752 OldClass->getLambdaManglingNumber(), 12753 OldClass->getDeviceLambdaManglingNumber(), 12754 OldClass->getLambdaContextDecl()); 12755 12756 // Build the call operator. 12757 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12758 Class, E->getIntroducerRange(), NewCallOpTSI, 12759 E->getCallOperator()->getEndLoc(), 12760 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12761 E->getCallOperator()->getConstexprKind(), 12762 NewTrailingRequiresClause.get()); 12763 12764 LSI->CallOperator = NewCallOperator; 12765 12766 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12767 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12768 12769 // Number the lambda for linkage purposes if necessary. 12770 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12771 12772 // Introduce the context of the call operator. 12773 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12774 /*NewThisContext*/false); 12775 12776 // Enter the scope of the lambda. 12777 getSema().buildLambdaScope(LSI, NewCallOperator, 12778 E->getIntroducerRange(), 12779 E->getCaptureDefault(), 12780 E->getCaptureDefaultLoc(), 12781 E->hasExplicitParameters(), 12782 E->hasExplicitResultType(), 12783 E->isMutable()); 12784 12785 bool Invalid = false; 12786 12787 // Transform captures. 12788 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12789 CEnd = E->capture_end(); 12790 C != CEnd; ++C) { 12791 // When we hit the first implicit capture, tell Sema that we've finished 12792 // the list of explicit captures. 12793 if (C->isImplicit()) 12794 break; 12795 12796 // Capturing 'this' is trivial. 12797 if (C->capturesThis()) { 12798 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12799 /*BuildAndDiagnose*/ true, nullptr, 12800 C->getCaptureKind() == LCK_StarThis); 12801 continue; 12802 } 12803 // Captured expression will be recaptured during captured variables 12804 // rebuilding. 12805 if (C->capturesVLAType()) 12806 continue; 12807 12808 // Rebuild init-captures, including the implied field declaration. 12809 if (E->isInitCapture(C)) { 12810 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12811 12812 VarDecl *OldVD = C->getCapturedVar(); 12813 llvm::SmallVector<Decl*, 4> NewVDs; 12814 12815 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12816 ExprResult Init = Info.first; 12817 QualType InitQualType = Info.second; 12818 if (Init.isInvalid() || InitQualType.isNull()) { 12819 Invalid = true; 12820 break; 12821 } 12822 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12823 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12824 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12825 if (!NewVD) { 12826 Invalid = true; 12827 break; 12828 } 12829 NewVDs.push_back(NewVD); 12830 getSema().addInitCapture(LSI, NewVD); 12831 } 12832 12833 if (Invalid) 12834 break; 12835 12836 getDerived().transformedLocalDecl(OldVD, NewVDs); 12837 continue; 12838 } 12839 12840 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12841 12842 // Determine the capture kind for Sema. 12843 Sema::TryCaptureKind Kind 12844 = C->isImplicit()? Sema::TryCapture_Implicit 12845 : C->getCaptureKind() == LCK_ByCopy 12846 ? Sema::TryCapture_ExplicitByVal 12847 : Sema::TryCapture_ExplicitByRef; 12848 SourceLocation EllipsisLoc; 12849 if (C->isPackExpansion()) { 12850 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12851 bool ShouldExpand = false; 12852 bool RetainExpansion = false; 12853 Optional<unsigned> NumExpansions; 12854 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12855 C->getLocation(), 12856 Unexpanded, 12857 ShouldExpand, RetainExpansion, 12858 NumExpansions)) { 12859 Invalid = true; 12860 continue; 12861 } 12862 12863 if (ShouldExpand) { 12864 // The transform has determined that we should perform an expansion; 12865 // transform and capture each of the arguments. 12866 // expansion of the pattern. Do so. 12867 VarDecl *Pack = C->getCapturedVar(); 12868 for (unsigned I = 0; I != *NumExpansions; ++I) { 12869 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12870 VarDecl *CapturedVar 12871 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12872 Pack)); 12873 if (!CapturedVar) { 12874 Invalid = true; 12875 continue; 12876 } 12877 12878 // Capture the transformed variable. 12879 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12880 } 12881 12882 // FIXME: Retain a pack expansion if RetainExpansion is true. 12883 12884 continue; 12885 } 12886 12887 EllipsisLoc = C->getEllipsisLoc(); 12888 } 12889 12890 // Transform the captured variable. 12891 VarDecl *CapturedVar 12892 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12893 C->getCapturedVar())); 12894 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12895 Invalid = true; 12896 continue; 12897 } 12898 12899 // Capture the transformed variable. 12900 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12901 EllipsisLoc); 12902 } 12903 getSema().finishLambdaExplicitCaptures(LSI); 12904 12905 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12906 // evaluation context even if we're not transforming the function body. 12907 getSema().PushExpressionEvaluationContext( 12908 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12909 12910 // Instantiate the body of the lambda expression. 12911 StmtResult Body = 12912 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12913 12914 // ActOnLambda* will pop the function scope for us. 12915 FuncScopeCleanup.disable(); 12916 12917 if (Body.isInvalid()) { 12918 SavedContext.pop(); 12919 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12920 /*IsInstantiation=*/true); 12921 return ExprError(); 12922 } 12923 12924 // Copy the LSI before ActOnFinishFunctionBody removes it. 12925 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12926 // the call operator. 12927 auto LSICopy = *LSI; 12928 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12929 /*IsInstantiation*/ true); 12930 SavedContext.pop(); 12931 12932 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12933 &LSICopy); 12934 } 12935 12936 template<typename Derived> 12937 StmtResult 12938 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12939 return TransformStmt(S); 12940 } 12941 12942 template<typename Derived> 12943 StmtResult 12944 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12945 // Transform captures. 12946 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12947 CEnd = E->capture_end(); 12948 C != CEnd; ++C) { 12949 // When we hit the first implicit capture, tell Sema that we've finished 12950 // the list of explicit captures. 12951 if (!C->isImplicit()) 12952 continue; 12953 12954 // Capturing 'this' is trivial. 12955 if (C->capturesThis()) { 12956 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12957 /*BuildAndDiagnose*/ true, nullptr, 12958 C->getCaptureKind() == LCK_StarThis); 12959 continue; 12960 } 12961 // Captured expression will be recaptured during captured variables 12962 // rebuilding. 12963 if (C->capturesVLAType()) 12964 continue; 12965 12966 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12967 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12968 12969 // Transform the captured variable. 12970 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12971 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12972 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12973 return StmtError(); 12974 12975 // Capture the transformed variable. 12976 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12977 } 12978 12979 return S; 12980 } 12981 12982 template<typename Derived> 12983 ExprResult 12984 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12985 CXXUnresolvedConstructExpr *E) { 12986 TypeSourceInfo *T = 12987 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12988 if (!T) 12989 return ExprError(); 12990 12991 bool ArgumentChanged = false; 12992 SmallVector<Expr*, 8> Args; 12993 Args.reserve(E->getNumArgs()); 12994 { 12995 EnterExpressionEvaluationContext Context( 12996 getSema(), EnterExpressionEvaluationContext::InitList, 12997 E->isListInitialization()); 12998 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 12999 &ArgumentChanged)) 13000 return ExprError(); 13001 } 13002 13003 if (!getDerived().AlwaysRebuild() && 13004 T == E->getTypeSourceInfo() && 13005 !ArgumentChanged) 13006 return E; 13007 13008 // FIXME: we're faking the locations of the commas 13009 return getDerived().RebuildCXXUnresolvedConstructExpr( 13010 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13011 } 13012 13013 template<typename Derived> 13014 ExprResult 13015 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13016 CXXDependentScopeMemberExpr *E) { 13017 // Transform the base of the expression. 13018 ExprResult Base((Expr*) nullptr); 13019 Expr *OldBase; 13020 QualType BaseType; 13021 QualType ObjectType; 13022 if (!E->isImplicitAccess()) { 13023 OldBase = E->getBase(); 13024 Base = getDerived().TransformExpr(OldBase); 13025 if (Base.isInvalid()) 13026 return ExprError(); 13027 13028 // Start the member reference and compute the object's type. 13029 ParsedType ObjectTy; 13030 bool MayBePseudoDestructor = false; 13031 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13032 E->getOperatorLoc(), 13033 E->isArrow()? tok::arrow : tok::period, 13034 ObjectTy, 13035 MayBePseudoDestructor); 13036 if (Base.isInvalid()) 13037 return ExprError(); 13038 13039 ObjectType = ObjectTy.get(); 13040 BaseType = ((Expr*) Base.get())->getType(); 13041 } else { 13042 OldBase = nullptr; 13043 BaseType = getDerived().TransformType(E->getBaseType()); 13044 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13045 } 13046 13047 // Transform the first part of the nested-name-specifier that qualifies 13048 // the member name. 13049 NamedDecl *FirstQualifierInScope 13050 = getDerived().TransformFirstQualifierInScope( 13051 E->getFirstQualifierFoundInScope(), 13052 E->getQualifierLoc().getBeginLoc()); 13053 13054 NestedNameSpecifierLoc QualifierLoc; 13055 if (E->getQualifier()) { 13056 QualifierLoc 13057 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13058 ObjectType, 13059 FirstQualifierInScope); 13060 if (!QualifierLoc) 13061 return ExprError(); 13062 } 13063 13064 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13065 13066 // TODO: If this is a conversion-function-id, verify that the 13067 // destination type name (if present) resolves the same way after 13068 // instantiation as it did in the local scope. 13069 13070 DeclarationNameInfo NameInfo 13071 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13072 if (!NameInfo.getName()) 13073 return ExprError(); 13074 13075 if (!E->hasExplicitTemplateArgs()) { 13076 // This is a reference to a member without an explicitly-specified 13077 // template argument list. Optimize for this common case. 13078 if (!getDerived().AlwaysRebuild() && 13079 Base.get() == OldBase && 13080 BaseType == E->getBaseType() && 13081 QualifierLoc == E->getQualifierLoc() && 13082 NameInfo.getName() == E->getMember() && 13083 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13084 return E; 13085 13086 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13087 BaseType, 13088 E->isArrow(), 13089 E->getOperatorLoc(), 13090 QualifierLoc, 13091 TemplateKWLoc, 13092 FirstQualifierInScope, 13093 NameInfo, 13094 /*TemplateArgs*/nullptr); 13095 } 13096 13097 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13098 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13099 E->getNumTemplateArgs(), 13100 TransArgs)) 13101 return ExprError(); 13102 13103 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13104 BaseType, 13105 E->isArrow(), 13106 E->getOperatorLoc(), 13107 QualifierLoc, 13108 TemplateKWLoc, 13109 FirstQualifierInScope, 13110 NameInfo, 13111 &TransArgs); 13112 } 13113 13114 template<typename Derived> 13115 ExprResult 13116 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 13117 // Transform the base of the expression. 13118 ExprResult Base((Expr*) nullptr); 13119 QualType BaseType; 13120 if (!Old->isImplicitAccess()) { 13121 Base = getDerived().TransformExpr(Old->getBase()); 13122 if (Base.isInvalid()) 13123 return ExprError(); 13124 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 13125 Old->isArrow()); 13126 if (Base.isInvalid()) 13127 return ExprError(); 13128 BaseType = Base.get()->getType(); 13129 } else { 13130 BaseType = getDerived().TransformType(Old->getBaseType()); 13131 } 13132 13133 NestedNameSpecifierLoc QualifierLoc; 13134 if (Old->getQualifierLoc()) { 13135 QualifierLoc 13136 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13137 if (!QualifierLoc) 13138 return ExprError(); 13139 } 13140 13141 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13142 13143 LookupResult R(SemaRef, Old->getMemberNameInfo(), 13144 Sema::LookupOrdinaryName); 13145 13146 // Transform the declaration set. 13147 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 13148 return ExprError(); 13149 13150 // Determine the naming class. 13151 if (Old->getNamingClass()) { 13152 CXXRecordDecl *NamingClass 13153 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 13154 Old->getMemberLoc(), 13155 Old->getNamingClass())); 13156 if (!NamingClass) 13157 return ExprError(); 13158 13159 R.setNamingClass(NamingClass); 13160 } 13161 13162 TemplateArgumentListInfo TransArgs; 13163 if (Old->hasExplicitTemplateArgs()) { 13164 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13165 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13166 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 13167 Old->getNumTemplateArgs(), 13168 TransArgs)) 13169 return ExprError(); 13170 } 13171 13172 // FIXME: to do this check properly, we will need to preserve the 13173 // first-qualifier-in-scope here, just in case we had a dependent 13174 // base (and therefore couldn't do the check) and a 13175 // nested-name-qualifier (and therefore could do the lookup). 13176 NamedDecl *FirstQualifierInScope = nullptr; 13177 13178 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 13179 BaseType, 13180 Old->getOperatorLoc(), 13181 Old->isArrow(), 13182 QualifierLoc, 13183 TemplateKWLoc, 13184 FirstQualifierInScope, 13185 R, 13186 (Old->hasExplicitTemplateArgs() 13187 ? &TransArgs : nullptr)); 13188 } 13189 13190 template<typename Derived> 13191 ExprResult 13192 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13193 EnterExpressionEvaluationContext Unevaluated( 13194 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13195 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13196 if (SubExpr.isInvalid()) 13197 return ExprError(); 13198 13199 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13200 return E; 13201 13202 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13203 } 13204 13205 template<typename Derived> 13206 ExprResult 13207 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13208 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13209 if (Pattern.isInvalid()) 13210 return ExprError(); 13211 13212 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13213 return E; 13214 13215 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13216 E->getNumExpansions()); 13217 } 13218 13219 template<typename Derived> 13220 ExprResult 13221 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13222 // If E is not value-dependent, then nothing will change when we transform it. 13223 // Note: This is an instantiation-centric view. 13224 if (!E->isValueDependent()) 13225 return E; 13226 13227 EnterExpressionEvaluationContext Unevaluated( 13228 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13229 13230 ArrayRef<TemplateArgument> PackArgs; 13231 TemplateArgument ArgStorage; 13232 13233 // Find the argument list to transform. 13234 if (E->isPartiallySubstituted()) { 13235 PackArgs = E->getPartialArguments(); 13236 } else if (E->isValueDependent()) { 13237 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13238 bool ShouldExpand = false; 13239 bool RetainExpansion = false; 13240 Optional<unsigned> NumExpansions; 13241 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13242 Unexpanded, 13243 ShouldExpand, RetainExpansion, 13244 NumExpansions)) 13245 return ExprError(); 13246 13247 // If we need to expand the pack, build a template argument from it and 13248 // expand that. 13249 if (ShouldExpand) { 13250 auto *Pack = E->getPack(); 13251 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13252 ArgStorage = getSema().Context.getPackExpansionType( 13253 getSema().Context.getTypeDeclType(TTPD), None); 13254 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13255 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13256 } else { 13257 auto *VD = cast<ValueDecl>(Pack); 13258 ExprResult DRE = getSema().BuildDeclRefExpr( 13259 VD, VD->getType().getNonLValueExprType(getSema().Context), 13260 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 13261 E->getPackLoc()); 13262 if (DRE.isInvalid()) 13263 return ExprError(); 13264 ArgStorage = new (getSema().Context) PackExpansionExpr( 13265 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13266 } 13267 PackArgs = ArgStorage; 13268 } 13269 } 13270 13271 // If we're not expanding the pack, just transform the decl. 13272 if (!PackArgs.size()) { 13273 auto *Pack = cast_or_null<NamedDecl>( 13274 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13275 if (!Pack) 13276 return ExprError(); 13277 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13278 E->getPackLoc(), 13279 E->getRParenLoc(), None, None); 13280 } 13281 13282 // Try to compute the result without performing a partial substitution. 13283 Optional<unsigned> Result = 0; 13284 for (const TemplateArgument &Arg : PackArgs) { 13285 if (!Arg.isPackExpansion()) { 13286 Result = *Result + 1; 13287 continue; 13288 } 13289 13290 TemplateArgumentLoc ArgLoc; 13291 InventTemplateArgumentLoc(Arg, ArgLoc); 13292 13293 // Find the pattern of the pack expansion. 13294 SourceLocation Ellipsis; 13295 Optional<unsigned> OrigNumExpansions; 13296 TemplateArgumentLoc Pattern = 13297 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13298 OrigNumExpansions); 13299 13300 // Substitute under the pack expansion. Do not expand the pack (yet). 13301 TemplateArgumentLoc OutPattern; 13302 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13303 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13304 /*Uneval*/ true)) 13305 return true; 13306 13307 // See if we can determine the number of arguments from the result. 13308 Optional<unsigned> NumExpansions = 13309 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13310 if (!NumExpansions) { 13311 // No: we must be in an alias template expansion, and we're going to need 13312 // to actually expand the packs. 13313 Result = None; 13314 break; 13315 } 13316 13317 Result = *Result + *NumExpansions; 13318 } 13319 13320 // Common case: we could determine the number of expansions without 13321 // substituting. 13322 if (Result) 13323 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13324 E->getPackLoc(), 13325 E->getRParenLoc(), *Result, None); 13326 13327 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13328 E->getPackLoc()); 13329 { 13330 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13331 typedef TemplateArgumentLocInventIterator< 13332 Derived, const TemplateArgument*> PackLocIterator; 13333 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13334 PackLocIterator(*this, PackArgs.end()), 13335 TransformedPackArgs, /*Uneval*/true)) 13336 return ExprError(); 13337 } 13338 13339 // Check whether we managed to fully-expand the pack. 13340 // FIXME: Is it possible for us to do so and not hit the early exit path? 13341 SmallVector<TemplateArgument, 8> Args; 13342 bool PartialSubstitution = false; 13343 for (auto &Loc : TransformedPackArgs.arguments()) { 13344 Args.push_back(Loc.getArgument()); 13345 if (Loc.getArgument().isPackExpansion()) 13346 PartialSubstitution = true; 13347 } 13348 13349 if (PartialSubstitution) 13350 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13351 E->getPackLoc(), 13352 E->getRParenLoc(), None, Args); 13353 13354 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13355 E->getPackLoc(), E->getRParenLoc(), 13356 Args.size(), None); 13357 } 13358 13359 template<typename Derived> 13360 ExprResult 13361 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13362 SubstNonTypeTemplateParmPackExpr *E) { 13363 // Default behavior is to do nothing with this transformation. 13364 return E; 13365 } 13366 13367 template<typename Derived> 13368 ExprResult 13369 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13370 SubstNonTypeTemplateParmExpr *E) { 13371 // Default behavior is to do nothing with this transformation. 13372 return E; 13373 } 13374 13375 template<typename Derived> 13376 ExprResult 13377 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13378 // Default behavior is to do nothing with this transformation. 13379 return E; 13380 } 13381 13382 template<typename Derived> 13383 ExprResult 13384 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13385 MaterializeTemporaryExpr *E) { 13386 return getDerived().TransformExpr(E->getSubExpr()); 13387 } 13388 13389 template<typename Derived> 13390 ExprResult 13391 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13392 UnresolvedLookupExpr *Callee = nullptr; 13393 if (Expr *OldCallee = E->getCallee()) { 13394 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13395 if (CalleeResult.isInvalid()) 13396 return ExprError(); 13397 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13398 } 13399 13400 Expr *Pattern = E->getPattern(); 13401 13402 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13403 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13404 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13405 13406 // Determine whether the set of unexpanded parameter packs can and should 13407 // be expanded. 13408 bool Expand = true; 13409 bool RetainExpansion = false; 13410 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13411 NumExpansions = OrigNumExpansions; 13412 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13413 Pattern->getSourceRange(), 13414 Unexpanded, 13415 Expand, RetainExpansion, 13416 NumExpansions)) 13417 return true; 13418 13419 if (!Expand) { 13420 // Do not expand any packs here, just transform and rebuild a fold 13421 // expression. 13422 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13423 13424 ExprResult LHS = 13425 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13426 if (LHS.isInvalid()) 13427 return true; 13428 13429 ExprResult RHS = 13430 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13431 if (RHS.isInvalid()) 13432 return true; 13433 13434 if (!getDerived().AlwaysRebuild() && 13435 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13436 return E; 13437 13438 return getDerived().RebuildCXXFoldExpr( 13439 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13440 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13441 } 13442 13443 // Formally a fold expression expands to nested parenthesized expressions. 13444 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13445 // them. 13446 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13447 SemaRef.Diag(E->getEllipsisLoc(), 13448 clang::diag::err_fold_expression_limit_exceeded) 13449 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13450 << E->getSourceRange(); 13451 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13452 return ExprError(); 13453 } 13454 13455 // The transform has determined that we should perform an elementwise 13456 // expansion of the pattern. Do so. 13457 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13458 if (Result.isInvalid()) 13459 return true; 13460 bool LeftFold = E->isLeftFold(); 13461 13462 // If we're retaining an expansion for a right fold, it is the innermost 13463 // component and takes the init (if any). 13464 if (!LeftFold && RetainExpansion) { 13465 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13466 13467 ExprResult Out = getDerived().TransformExpr(Pattern); 13468 if (Out.isInvalid()) 13469 return true; 13470 13471 Result = getDerived().RebuildCXXFoldExpr( 13472 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13473 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13474 if (Result.isInvalid()) 13475 return true; 13476 } 13477 13478 for (unsigned I = 0; I != *NumExpansions; ++I) { 13479 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13480 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13481 ExprResult Out = getDerived().TransformExpr(Pattern); 13482 if (Out.isInvalid()) 13483 return true; 13484 13485 if (Out.get()->containsUnexpandedParameterPack()) { 13486 // We still have a pack; retain a pack expansion for this slice. 13487 Result = getDerived().RebuildCXXFoldExpr( 13488 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13489 E->getOperator(), E->getEllipsisLoc(), 13490 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13491 OrigNumExpansions); 13492 } else if (Result.isUsable()) { 13493 // We've got down to a single element; build a binary operator. 13494 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13495 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13496 if (Callee) 13497 Result = getDerived().RebuildCXXOperatorCallExpr( 13498 BinaryOperator::getOverloadedOperator(E->getOperator()), 13499 E->getEllipsisLoc(), Callee, LHS, RHS); 13500 else 13501 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13502 E->getOperator(), LHS, RHS); 13503 } else 13504 Result = Out; 13505 13506 if (Result.isInvalid()) 13507 return true; 13508 } 13509 13510 // If we're retaining an expansion for a left fold, it is the outermost 13511 // component and takes the complete expansion so far as its init (if any). 13512 if (LeftFold && RetainExpansion) { 13513 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13514 13515 ExprResult Out = getDerived().TransformExpr(Pattern); 13516 if (Out.isInvalid()) 13517 return true; 13518 13519 Result = getDerived().RebuildCXXFoldExpr( 13520 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13521 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13522 if (Result.isInvalid()) 13523 return true; 13524 } 13525 13526 // If we had no init and an empty pack, and we're not retaining an expansion, 13527 // then produce a fallback value or error. 13528 if (Result.isUnset()) 13529 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13530 E->getOperator()); 13531 13532 return Result; 13533 } 13534 13535 template<typename Derived> 13536 ExprResult 13537 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13538 CXXStdInitializerListExpr *E) { 13539 return getDerived().TransformExpr(E->getSubExpr()); 13540 } 13541 13542 template<typename Derived> 13543 ExprResult 13544 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13545 return SemaRef.MaybeBindToTemporary(E); 13546 } 13547 13548 template<typename Derived> 13549 ExprResult 13550 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13551 return E; 13552 } 13553 13554 template<typename Derived> 13555 ExprResult 13556 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13557 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13558 if (SubExpr.isInvalid()) 13559 return ExprError(); 13560 13561 if (!getDerived().AlwaysRebuild() && 13562 SubExpr.get() == E->getSubExpr()) 13563 return E; 13564 13565 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13566 } 13567 13568 template<typename Derived> 13569 ExprResult 13570 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13571 // Transform each of the elements. 13572 SmallVector<Expr *, 8> Elements; 13573 bool ArgChanged = false; 13574 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13575 /*IsCall=*/false, Elements, &ArgChanged)) 13576 return ExprError(); 13577 13578 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13579 return SemaRef.MaybeBindToTemporary(E); 13580 13581 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13582 Elements.data(), 13583 Elements.size()); 13584 } 13585 13586 template<typename Derived> 13587 ExprResult 13588 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13589 ObjCDictionaryLiteral *E) { 13590 // Transform each of the elements. 13591 SmallVector<ObjCDictionaryElement, 8> Elements; 13592 bool ArgChanged = false; 13593 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13594 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13595 13596 if (OrigElement.isPackExpansion()) { 13597 // This key/value element is a pack expansion. 13598 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13599 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13600 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13601 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13602 13603 // Determine whether the set of unexpanded parameter packs can 13604 // and should be expanded. 13605 bool Expand = true; 13606 bool RetainExpansion = false; 13607 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13608 Optional<unsigned> NumExpansions = OrigNumExpansions; 13609 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13610 OrigElement.Value->getEndLoc()); 13611 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13612 PatternRange, Unexpanded, Expand, 13613 RetainExpansion, NumExpansions)) 13614 return ExprError(); 13615 13616 if (!Expand) { 13617 // The transform has determined that we should perform a simple 13618 // transformation on the pack expansion, producing another pack 13619 // expansion. 13620 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13621 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13622 if (Key.isInvalid()) 13623 return ExprError(); 13624 13625 if (Key.get() != OrigElement.Key) 13626 ArgChanged = true; 13627 13628 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13629 if (Value.isInvalid()) 13630 return ExprError(); 13631 13632 if (Value.get() != OrigElement.Value) 13633 ArgChanged = true; 13634 13635 ObjCDictionaryElement Expansion = { 13636 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13637 }; 13638 Elements.push_back(Expansion); 13639 continue; 13640 } 13641 13642 // Record right away that the argument was changed. This needs 13643 // to happen even if the array expands to nothing. 13644 ArgChanged = true; 13645 13646 // The transform has determined that we should perform an elementwise 13647 // expansion of the pattern. Do so. 13648 for (unsigned I = 0; I != *NumExpansions; ++I) { 13649 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13650 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13651 if (Key.isInvalid()) 13652 return ExprError(); 13653 13654 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13655 if (Value.isInvalid()) 13656 return ExprError(); 13657 13658 ObjCDictionaryElement Element = { 13659 Key.get(), Value.get(), SourceLocation(), NumExpansions 13660 }; 13661 13662 // If any unexpanded parameter packs remain, we still have a 13663 // pack expansion. 13664 // FIXME: Can this really happen? 13665 if (Key.get()->containsUnexpandedParameterPack() || 13666 Value.get()->containsUnexpandedParameterPack()) 13667 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13668 13669 Elements.push_back(Element); 13670 } 13671 13672 // FIXME: Retain a pack expansion if RetainExpansion is true. 13673 13674 // We've finished with this pack expansion. 13675 continue; 13676 } 13677 13678 // Transform and check key. 13679 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13680 if (Key.isInvalid()) 13681 return ExprError(); 13682 13683 if (Key.get() != OrigElement.Key) 13684 ArgChanged = true; 13685 13686 // Transform and check value. 13687 ExprResult Value 13688 = getDerived().TransformExpr(OrigElement.Value); 13689 if (Value.isInvalid()) 13690 return ExprError(); 13691 13692 if (Value.get() != OrigElement.Value) 13693 ArgChanged = true; 13694 13695 ObjCDictionaryElement Element = { 13696 Key.get(), Value.get(), SourceLocation(), None 13697 }; 13698 Elements.push_back(Element); 13699 } 13700 13701 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13702 return SemaRef.MaybeBindToTemporary(E); 13703 13704 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13705 Elements); 13706 } 13707 13708 template<typename Derived> 13709 ExprResult 13710 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13711 TypeSourceInfo *EncodedTypeInfo 13712 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13713 if (!EncodedTypeInfo) 13714 return ExprError(); 13715 13716 if (!getDerived().AlwaysRebuild() && 13717 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13718 return E; 13719 13720 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13721 EncodedTypeInfo, 13722 E->getRParenLoc()); 13723 } 13724 13725 template<typename Derived> 13726 ExprResult TreeTransform<Derived>:: 13727 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13728 // This is a kind of implicit conversion, and it needs to get dropped 13729 // and recomputed for the same general reasons that ImplicitCastExprs 13730 // do, as well a more specific one: this expression is only valid when 13731 // it appears *immediately* as an argument expression. 13732 return getDerived().TransformExpr(E->getSubExpr()); 13733 } 13734 13735 template<typename Derived> 13736 ExprResult TreeTransform<Derived>:: 13737 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13738 TypeSourceInfo *TSInfo 13739 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13740 if (!TSInfo) 13741 return ExprError(); 13742 13743 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13744 if (Result.isInvalid()) 13745 return ExprError(); 13746 13747 if (!getDerived().AlwaysRebuild() && 13748 TSInfo == E->getTypeInfoAsWritten() && 13749 Result.get() == E->getSubExpr()) 13750 return E; 13751 13752 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13753 E->getBridgeKeywordLoc(), TSInfo, 13754 Result.get()); 13755 } 13756 13757 template <typename Derived> 13758 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13759 ObjCAvailabilityCheckExpr *E) { 13760 return E; 13761 } 13762 13763 template<typename Derived> 13764 ExprResult 13765 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13766 // Transform arguments. 13767 bool ArgChanged = false; 13768 SmallVector<Expr*, 8> Args; 13769 Args.reserve(E->getNumArgs()); 13770 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13771 &ArgChanged)) 13772 return ExprError(); 13773 13774 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13775 // Class message: transform the receiver type. 13776 TypeSourceInfo *ReceiverTypeInfo 13777 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13778 if (!ReceiverTypeInfo) 13779 return ExprError(); 13780 13781 // If nothing changed, just retain the existing message send. 13782 if (!getDerived().AlwaysRebuild() && 13783 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13784 return SemaRef.MaybeBindToTemporary(E); 13785 13786 // Build a new class message send. 13787 SmallVector<SourceLocation, 16> SelLocs; 13788 E->getSelectorLocs(SelLocs); 13789 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13790 E->getSelector(), 13791 SelLocs, 13792 E->getMethodDecl(), 13793 E->getLeftLoc(), 13794 Args, 13795 E->getRightLoc()); 13796 } 13797 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13798 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13799 if (!E->getMethodDecl()) 13800 return ExprError(); 13801 13802 // Build a new class message send to 'super'. 13803 SmallVector<SourceLocation, 16> SelLocs; 13804 E->getSelectorLocs(SelLocs); 13805 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13806 E->getSelector(), 13807 SelLocs, 13808 E->getReceiverType(), 13809 E->getMethodDecl(), 13810 E->getLeftLoc(), 13811 Args, 13812 E->getRightLoc()); 13813 } 13814 13815 // Instance message: transform the receiver 13816 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13817 "Only class and instance messages may be instantiated"); 13818 ExprResult Receiver 13819 = getDerived().TransformExpr(E->getInstanceReceiver()); 13820 if (Receiver.isInvalid()) 13821 return ExprError(); 13822 13823 // If nothing changed, just retain the existing message send. 13824 if (!getDerived().AlwaysRebuild() && 13825 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13826 return SemaRef.MaybeBindToTemporary(E); 13827 13828 // Build a new instance message send. 13829 SmallVector<SourceLocation, 16> SelLocs; 13830 E->getSelectorLocs(SelLocs); 13831 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13832 E->getSelector(), 13833 SelLocs, 13834 E->getMethodDecl(), 13835 E->getLeftLoc(), 13836 Args, 13837 E->getRightLoc()); 13838 } 13839 13840 template<typename Derived> 13841 ExprResult 13842 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13843 return E; 13844 } 13845 13846 template<typename Derived> 13847 ExprResult 13848 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13849 return E; 13850 } 13851 13852 template<typename Derived> 13853 ExprResult 13854 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13855 // Transform the base expression. 13856 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13857 if (Base.isInvalid()) 13858 return ExprError(); 13859 13860 // We don't need to transform the ivar; it will never change. 13861 13862 // If nothing changed, just retain the existing expression. 13863 if (!getDerived().AlwaysRebuild() && 13864 Base.get() == E->getBase()) 13865 return E; 13866 13867 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13868 E->getLocation(), 13869 E->isArrow(), E->isFreeIvar()); 13870 } 13871 13872 template<typename Derived> 13873 ExprResult 13874 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13875 // 'super' and types never change. Property never changes. Just 13876 // retain the existing expression. 13877 if (!E->isObjectReceiver()) 13878 return E; 13879 13880 // Transform the base expression. 13881 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13882 if (Base.isInvalid()) 13883 return ExprError(); 13884 13885 // We don't need to transform the property; it will never change. 13886 13887 // If nothing changed, just retain the existing expression. 13888 if (!getDerived().AlwaysRebuild() && 13889 Base.get() == E->getBase()) 13890 return E; 13891 13892 if (E->isExplicitProperty()) 13893 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13894 E->getExplicitProperty(), 13895 E->getLocation()); 13896 13897 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13898 SemaRef.Context.PseudoObjectTy, 13899 E->getImplicitPropertyGetter(), 13900 E->getImplicitPropertySetter(), 13901 E->getLocation()); 13902 } 13903 13904 template<typename Derived> 13905 ExprResult 13906 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13907 // Transform the base expression. 13908 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13909 if (Base.isInvalid()) 13910 return ExprError(); 13911 13912 // Transform the key expression. 13913 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13914 if (Key.isInvalid()) 13915 return ExprError(); 13916 13917 // If nothing changed, just retain the existing expression. 13918 if (!getDerived().AlwaysRebuild() && 13919 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13920 return E; 13921 13922 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13923 Base.get(), Key.get(), 13924 E->getAtIndexMethodDecl(), 13925 E->setAtIndexMethodDecl()); 13926 } 13927 13928 template<typename Derived> 13929 ExprResult 13930 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13931 // Transform the base expression. 13932 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13933 if (Base.isInvalid()) 13934 return ExprError(); 13935 13936 // If nothing changed, just retain the existing expression. 13937 if (!getDerived().AlwaysRebuild() && 13938 Base.get() == E->getBase()) 13939 return E; 13940 13941 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13942 E->getOpLoc(), 13943 E->isArrow()); 13944 } 13945 13946 template<typename Derived> 13947 ExprResult 13948 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13949 bool ArgumentChanged = false; 13950 SmallVector<Expr*, 8> SubExprs; 13951 SubExprs.reserve(E->getNumSubExprs()); 13952 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13953 SubExprs, &ArgumentChanged)) 13954 return ExprError(); 13955 13956 if (!getDerived().AlwaysRebuild() && 13957 !ArgumentChanged) 13958 return E; 13959 13960 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13961 SubExprs, 13962 E->getRParenLoc()); 13963 } 13964 13965 template<typename Derived> 13966 ExprResult 13967 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13968 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13969 if (SrcExpr.isInvalid()) 13970 return ExprError(); 13971 13972 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13973 if (!Type) 13974 return ExprError(); 13975 13976 if (!getDerived().AlwaysRebuild() && 13977 Type == E->getTypeSourceInfo() && 13978 SrcExpr.get() == E->getSrcExpr()) 13979 return E; 13980 13981 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13982 SrcExpr.get(), Type, 13983 E->getRParenLoc()); 13984 } 13985 13986 template<typename Derived> 13987 ExprResult 13988 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13989 BlockDecl *oldBlock = E->getBlockDecl(); 13990 13991 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13992 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13993 13994 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13995 blockScope->TheDecl->setBlockMissingReturnType( 13996 oldBlock->blockMissingReturnType()); 13997 13998 SmallVector<ParmVarDecl*, 4> params; 13999 SmallVector<QualType, 4> paramTypes; 14000 14001 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14002 14003 // Parameter substitution. 14004 Sema::ExtParameterInfoBuilder extParamInfos; 14005 if (getDerived().TransformFunctionTypeParams( 14006 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14007 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14008 extParamInfos)) { 14009 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14010 return ExprError(); 14011 } 14012 14013 QualType exprResultType = 14014 getDerived().TransformType(exprFunctionType->getReturnType()); 14015 14016 auto epi = exprFunctionType->getExtProtoInfo(); 14017 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14018 14019 QualType functionType = 14020 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14021 blockScope->FunctionType = functionType; 14022 14023 // Set the parameters on the block decl. 14024 if (!params.empty()) 14025 blockScope->TheDecl->setParams(params); 14026 14027 if (!oldBlock->blockMissingReturnType()) { 14028 blockScope->HasImplicitReturnType = false; 14029 blockScope->ReturnType = exprResultType; 14030 } 14031 14032 // Transform the body 14033 StmtResult body = getDerived().TransformStmt(E->getBody()); 14034 if (body.isInvalid()) { 14035 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14036 return ExprError(); 14037 } 14038 14039 #ifndef NDEBUG 14040 // In builds with assertions, make sure that we captured everything we 14041 // captured before. 14042 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14043 for (const auto &I : oldBlock->captures()) { 14044 VarDecl *oldCapture = I.getVariable(); 14045 14046 // Ignore parameter packs. 14047 if (oldCapture->isParameterPack()) 14048 continue; 14049 14050 VarDecl *newCapture = 14051 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14052 oldCapture)); 14053 assert(blockScope->CaptureMap.count(newCapture)); 14054 } 14055 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14056 } 14057 #endif 14058 14059 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14060 /*Scope=*/nullptr); 14061 } 14062 14063 template<typename Derived> 14064 ExprResult 14065 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14066 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14067 if (SrcExpr.isInvalid()) 14068 return ExprError(); 14069 14070 QualType Type = getDerived().TransformType(E->getType()); 14071 14072 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14073 E->getRParenLoc()); 14074 } 14075 14076 template<typename Derived> 14077 ExprResult 14078 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14079 bool ArgumentChanged = false; 14080 SmallVector<Expr*, 8> SubExprs; 14081 SubExprs.reserve(E->getNumSubExprs()); 14082 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14083 SubExprs, &ArgumentChanged)) 14084 return ExprError(); 14085 14086 if (!getDerived().AlwaysRebuild() && 14087 !ArgumentChanged) 14088 return E; 14089 14090 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14091 E->getOp(), E->getRParenLoc()); 14092 } 14093 14094 //===----------------------------------------------------------------------===// 14095 // Type reconstruction 14096 //===----------------------------------------------------------------------===// 14097 14098 template<typename Derived> 14099 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14100 SourceLocation Star) { 14101 return SemaRef.BuildPointerType(PointeeType, Star, 14102 getDerived().getBaseEntity()); 14103 } 14104 14105 template<typename Derived> 14106 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14107 SourceLocation Star) { 14108 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14109 getDerived().getBaseEntity()); 14110 } 14111 14112 template<typename Derived> 14113 QualType 14114 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14115 bool WrittenAsLValue, 14116 SourceLocation Sigil) { 14117 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14118 Sigil, getDerived().getBaseEntity()); 14119 } 14120 14121 template<typename Derived> 14122 QualType 14123 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14124 QualType ClassType, 14125 SourceLocation Sigil) { 14126 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14127 getDerived().getBaseEntity()); 14128 } 14129 14130 template<typename Derived> 14131 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14132 const ObjCTypeParamDecl *Decl, 14133 SourceLocation ProtocolLAngleLoc, 14134 ArrayRef<ObjCProtocolDecl *> Protocols, 14135 ArrayRef<SourceLocation> ProtocolLocs, 14136 SourceLocation ProtocolRAngleLoc) { 14137 return SemaRef.BuildObjCTypeParamType(Decl, 14138 ProtocolLAngleLoc, Protocols, 14139 ProtocolLocs, ProtocolRAngleLoc, 14140 /*FailOnError=*/true); 14141 } 14142 14143 template<typename Derived> 14144 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14145 QualType BaseType, 14146 SourceLocation Loc, 14147 SourceLocation TypeArgsLAngleLoc, 14148 ArrayRef<TypeSourceInfo *> TypeArgs, 14149 SourceLocation TypeArgsRAngleLoc, 14150 SourceLocation ProtocolLAngleLoc, 14151 ArrayRef<ObjCProtocolDecl *> Protocols, 14152 ArrayRef<SourceLocation> ProtocolLocs, 14153 SourceLocation ProtocolRAngleLoc) { 14154 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14155 TypeArgs, TypeArgsRAngleLoc, 14156 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14157 ProtocolRAngleLoc, 14158 /*FailOnError=*/true); 14159 } 14160 14161 template<typename Derived> 14162 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14163 QualType PointeeType, 14164 SourceLocation Star) { 14165 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14166 } 14167 14168 template<typename Derived> 14169 QualType 14170 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14171 ArrayType::ArraySizeModifier SizeMod, 14172 const llvm::APInt *Size, 14173 Expr *SizeExpr, 14174 unsigned IndexTypeQuals, 14175 SourceRange BracketsRange) { 14176 if (SizeExpr || !Size) 14177 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14178 IndexTypeQuals, BracketsRange, 14179 getDerived().getBaseEntity()); 14180 14181 QualType Types[] = { 14182 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14183 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14184 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14185 }; 14186 const unsigned NumTypes = llvm::array_lengthof(Types); 14187 QualType SizeType; 14188 for (unsigned I = 0; I != NumTypes; ++I) 14189 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14190 SizeType = Types[I]; 14191 break; 14192 } 14193 14194 // Note that we can return a VariableArrayType here in the case where 14195 // the element type was a dependent VariableArrayType. 14196 IntegerLiteral *ArraySize 14197 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14198 /*FIXME*/BracketsRange.getBegin()); 14199 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14200 IndexTypeQuals, BracketsRange, 14201 getDerived().getBaseEntity()); 14202 } 14203 14204 template<typename Derived> 14205 QualType 14206 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14207 ArrayType::ArraySizeModifier SizeMod, 14208 const llvm::APInt &Size, 14209 Expr *SizeExpr, 14210 unsigned IndexTypeQuals, 14211 SourceRange BracketsRange) { 14212 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14213 IndexTypeQuals, BracketsRange); 14214 } 14215 14216 template<typename Derived> 14217 QualType 14218 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14219 ArrayType::ArraySizeModifier SizeMod, 14220 unsigned IndexTypeQuals, 14221 SourceRange BracketsRange) { 14222 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14223 IndexTypeQuals, BracketsRange); 14224 } 14225 14226 template<typename Derived> 14227 QualType 14228 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14229 ArrayType::ArraySizeModifier SizeMod, 14230 Expr *SizeExpr, 14231 unsigned IndexTypeQuals, 14232 SourceRange BracketsRange) { 14233 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14234 SizeExpr, 14235 IndexTypeQuals, BracketsRange); 14236 } 14237 14238 template<typename Derived> 14239 QualType 14240 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14241 ArrayType::ArraySizeModifier SizeMod, 14242 Expr *SizeExpr, 14243 unsigned IndexTypeQuals, 14244 SourceRange BracketsRange) { 14245 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14246 SizeExpr, 14247 IndexTypeQuals, BracketsRange); 14248 } 14249 14250 template <typename Derived> 14251 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14252 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14253 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14254 AttributeLoc); 14255 } 14256 14257 template <typename Derived> 14258 QualType 14259 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14260 unsigned NumElements, 14261 VectorType::VectorKind VecKind) { 14262 // FIXME: semantic checking! 14263 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14264 } 14265 14266 template <typename Derived> 14267 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14268 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14269 VectorType::VectorKind VecKind) { 14270 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14271 } 14272 14273 template<typename Derived> 14274 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14275 unsigned NumElements, 14276 SourceLocation AttributeLoc) { 14277 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14278 NumElements, true); 14279 IntegerLiteral *VectorSize 14280 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14281 AttributeLoc); 14282 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14283 } 14284 14285 template<typename Derived> 14286 QualType 14287 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14288 Expr *SizeExpr, 14289 SourceLocation AttributeLoc) { 14290 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14291 } 14292 14293 template <typename Derived> 14294 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14295 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14296 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14297 NumColumns); 14298 } 14299 14300 template <typename Derived> 14301 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14302 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14303 SourceLocation AttributeLoc) { 14304 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14305 AttributeLoc); 14306 } 14307 14308 template<typename Derived> 14309 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14310 QualType T, 14311 MutableArrayRef<QualType> ParamTypes, 14312 const FunctionProtoType::ExtProtoInfo &EPI) { 14313 return SemaRef.BuildFunctionType(T, ParamTypes, 14314 getDerived().getBaseLocation(), 14315 getDerived().getBaseEntity(), 14316 EPI); 14317 } 14318 14319 template<typename Derived> 14320 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14321 return SemaRef.Context.getFunctionNoProtoType(T); 14322 } 14323 14324 template<typename Derived> 14325 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14326 Decl *D) { 14327 assert(D && "no decl found"); 14328 if (D->isInvalidDecl()) return QualType(); 14329 14330 // FIXME: Doesn't account for ObjCInterfaceDecl! 14331 TypeDecl *Ty; 14332 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14333 // A valid resolved using typename pack expansion decl can have multiple 14334 // UsingDecls, but they must each have exactly one type, and it must be 14335 // the same type in every case. But we must have at least one expansion! 14336 if (UPD->expansions().empty()) { 14337 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14338 << UPD->isCXXClassMember() << UPD; 14339 return QualType(); 14340 } 14341 14342 // We might still have some unresolved types. Try to pick a resolved type 14343 // if we can. The final instantiation will check that the remaining 14344 // unresolved types instantiate to the type we pick. 14345 QualType FallbackT; 14346 QualType T; 14347 for (auto *E : UPD->expansions()) { 14348 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14349 if (ThisT.isNull()) 14350 continue; 14351 else if (ThisT->getAs<UnresolvedUsingType>()) 14352 FallbackT = ThisT; 14353 else if (T.isNull()) 14354 T = ThisT; 14355 else 14356 assert(getSema().Context.hasSameType(ThisT, T) && 14357 "mismatched resolved types in using pack expansion"); 14358 } 14359 return T.isNull() ? FallbackT : T; 14360 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14361 assert(Using->hasTypename() && 14362 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14363 14364 // A valid resolved using typename decl points to exactly one type decl. 14365 assert(++Using->shadow_begin() == Using->shadow_end()); 14366 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 14367 } else { 14368 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14369 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14370 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14371 } 14372 14373 return SemaRef.Context.getTypeDeclType(Ty); 14374 } 14375 14376 template<typename Derived> 14377 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14378 SourceLocation Loc) { 14379 return SemaRef.BuildTypeofExprType(E, Loc); 14380 } 14381 14382 template<typename Derived> 14383 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14384 return SemaRef.Context.getTypeOfType(Underlying); 14385 } 14386 14387 template<typename Derived> 14388 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14389 SourceLocation Loc) { 14390 return SemaRef.BuildDecltypeType(E, Loc); 14391 } 14392 14393 template<typename Derived> 14394 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14395 UnaryTransformType::UTTKind UKind, 14396 SourceLocation Loc) { 14397 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14398 } 14399 14400 template<typename Derived> 14401 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14402 TemplateName Template, 14403 SourceLocation TemplateNameLoc, 14404 TemplateArgumentListInfo &TemplateArgs) { 14405 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14406 } 14407 14408 template<typename Derived> 14409 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14410 SourceLocation KWLoc) { 14411 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14412 } 14413 14414 template<typename Derived> 14415 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14416 SourceLocation KWLoc, 14417 bool isReadPipe) { 14418 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14419 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14420 } 14421 14422 template <typename Derived> 14423 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14424 unsigned NumBits, 14425 SourceLocation Loc) { 14426 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14427 NumBits, true); 14428 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14429 SemaRef.Context.IntTy, Loc); 14430 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14431 } 14432 14433 template <typename Derived> 14434 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14435 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14436 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14437 } 14438 14439 template<typename Derived> 14440 TemplateName 14441 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14442 bool TemplateKW, 14443 TemplateDecl *Template) { 14444 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14445 Template); 14446 } 14447 14448 template<typename Derived> 14449 TemplateName 14450 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14451 SourceLocation TemplateKWLoc, 14452 const IdentifierInfo &Name, 14453 SourceLocation NameLoc, 14454 QualType ObjectType, 14455 NamedDecl *FirstQualifierInScope, 14456 bool AllowInjectedClassName) { 14457 UnqualifiedId TemplateName; 14458 TemplateName.setIdentifier(&Name, NameLoc); 14459 Sema::TemplateTy Template; 14460 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14461 TemplateName, ParsedType::make(ObjectType), 14462 /*EnteringContext=*/false, Template, 14463 AllowInjectedClassName); 14464 return Template.get(); 14465 } 14466 14467 template<typename Derived> 14468 TemplateName 14469 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14470 SourceLocation TemplateKWLoc, 14471 OverloadedOperatorKind Operator, 14472 SourceLocation NameLoc, 14473 QualType ObjectType, 14474 bool AllowInjectedClassName) { 14475 UnqualifiedId Name; 14476 // FIXME: Bogus location information. 14477 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14478 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14479 Sema::TemplateTy Template; 14480 getSema().ActOnTemplateName( 14481 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14482 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14483 return Template.get(); 14484 } 14485 14486 template<typename Derived> 14487 ExprResult 14488 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14489 SourceLocation OpLoc, 14490 Expr *OrigCallee, 14491 Expr *First, 14492 Expr *Second) { 14493 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14494 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14495 14496 if (First->getObjectKind() == OK_ObjCProperty) { 14497 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14498 if (BinaryOperator::isAssignmentOp(Opc)) 14499 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14500 First, Second); 14501 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14502 if (Result.isInvalid()) 14503 return ExprError(); 14504 First = Result.get(); 14505 } 14506 14507 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14508 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14509 if (Result.isInvalid()) 14510 return ExprError(); 14511 Second = Result.get(); 14512 } 14513 14514 // Determine whether this should be a builtin operation. 14515 if (Op == OO_Subscript) { 14516 if (!First->getType()->isOverloadableType() && 14517 !Second->getType()->isOverloadableType()) 14518 return getSema().CreateBuiltinArraySubscriptExpr( 14519 First, Callee->getBeginLoc(), Second, OpLoc); 14520 } else if (Op == OO_Arrow) { 14521 // -> is never a builtin operation. 14522 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14523 } else if (Second == nullptr || isPostIncDec) { 14524 if (!First->getType()->isOverloadableType() || 14525 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14526 // The argument is not of overloadable type, or this is an expression 14527 // of the form &Class::member, so try to create a built-in unary 14528 // operation. 14529 UnaryOperatorKind Opc 14530 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14531 14532 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14533 } 14534 } else { 14535 if (!First->getType()->isOverloadableType() && 14536 !Second->getType()->isOverloadableType()) { 14537 // Neither of the arguments is an overloadable type, so try to 14538 // create a built-in binary operation. 14539 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14540 ExprResult Result 14541 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14542 if (Result.isInvalid()) 14543 return ExprError(); 14544 14545 return Result; 14546 } 14547 } 14548 14549 // Compute the transformed set of functions (and function templates) to be 14550 // used during overload resolution. 14551 UnresolvedSet<16> Functions; 14552 bool RequiresADL; 14553 14554 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14555 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14556 // If the overload could not be resolved in the template definition 14557 // (because we had a dependent argument), ADL is performed as part of 14558 // template instantiation. 14559 RequiresADL = ULE->requiresADL(); 14560 } else { 14561 // If we've resolved this to a particular non-member function, just call 14562 // that function. If we resolved it to a member function, 14563 // CreateOverloaded* will find that function for us. 14564 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14565 if (!isa<CXXMethodDecl>(ND)) 14566 Functions.addDecl(ND); 14567 RequiresADL = false; 14568 } 14569 14570 // Add any functions found via argument-dependent lookup. 14571 Expr *Args[2] = { First, Second }; 14572 unsigned NumArgs = 1 + (Second != nullptr); 14573 14574 // Create the overloaded operator invocation for unary operators. 14575 if (NumArgs == 1 || isPostIncDec) { 14576 UnaryOperatorKind Opc 14577 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14578 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14579 RequiresADL); 14580 } 14581 14582 if (Op == OO_Subscript) { 14583 SourceLocation LBrace; 14584 SourceLocation RBrace; 14585 14586 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14587 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14588 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14589 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14590 } else { 14591 LBrace = Callee->getBeginLoc(); 14592 RBrace = OpLoc; 14593 } 14594 14595 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14596 First, Second); 14597 } 14598 14599 // Create the overloaded operator invocation for binary operators. 14600 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14601 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14602 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14603 if (Result.isInvalid()) 14604 return ExprError(); 14605 14606 return Result; 14607 } 14608 14609 template<typename Derived> 14610 ExprResult 14611 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14612 SourceLocation OperatorLoc, 14613 bool isArrow, 14614 CXXScopeSpec &SS, 14615 TypeSourceInfo *ScopeType, 14616 SourceLocation CCLoc, 14617 SourceLocation TildeLoc, 14618 PseudoDestructorTypeStorage Destroyed) { 14619 QualType BaseType = Base->getType(); 14620 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14621 (!isArrow && !BaseType->getAs<RecordType>()) || 14622 (isArrow && BaseType->getAs<PointerType>() && 14623 !BaseType->castAs<PointerType>()->getPointeeType() 14624 ->template getAs<RecordType>())){ 14625 // This pseudo-destructor expression is still a pseudo-destructor. 14626 return SemaRef.BuildPseudoDestructorExpr( 14627 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14628 CCLoc, TildeLoc, Destroyed); 14629 } 14630 14631 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14632 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14633 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14634 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14635 NameInfo.setNamedTypeInfo(DestroyedType); 14636 14637 // The scope type is now known to be a valid nested name specifier 14638 // component. Tack it on to the end of the nested name specifier. 14639 if (ScopeType) { 14640 if (!ScopeType->getType()->getAs<TagType>()) { 14641 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14642 diag::err_expected_class_or_namespace) 14643 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14644 return ExprError(); 14645 } 14646 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14647 CCLoc); 14648 } 14649 14650 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14651 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14652 OperatorLoc, isArrow, 14653 SS, TemplateKWLoc, 14654 /*FIXME: FirstQualifier*/ nullptr, 14655 NameInfo, 14656 /*TemplateArgs*/ nullptr, 14657 /*S*/nullptr); 14658 } 14659 14660 template<typename Derived> 14661 StmtResult 14662 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14663 SourceLocation Loc = S->getBeginLoc(); 14664 CapturedDecl *CD = S->getCapturedDecl(); 14665 unsigned NumParams = CD->getNumParams(); 14666 unsigned ContextParamPos = CD->getContextParamPosition(); 14667 SmallVector<Sema::CapturedParamNameType, 4> Params; 14668 for (unsigned I = 0; I < NumParams; ++I) { 14669 if (I != ContextParamPos) { 14670 Params.push_back( 14671 std::make_pair( 14672 CD->getParam(I)->getName(), 14673 getDerived().TransformType(CD->getParam(I)->getType()))); 14674 } else { 14675 Params.push_back(std::make_pair(StringRef(), QualType())); 14676 } 14677 } 14678 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14679 S->getCapturedRegionKind(), Params); 14680 StmtResult Body; 14681 { 14682 Sema::CompoundScopeRAII CompoundScope(getSema()); 14683 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14684 } 14685 14686 if (Body.isInvalid()) { 14687 getSema().ActOnCapturedRegionError(); 14688 return StmtError(); 14689 } 14690 14691 return getSema().ActOnCapturedRegionEnd(Body.get()); 14692 } 14693 14694 } // end namespace clang 14695 14696 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14697