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 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2403 SourceLocation LParen, 2404 SourceLocation RParen, 2405 TypeSourceInfo *TSI) { 2406 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2407 } 2408 2409 /// Build a new predefined expression. 2410 /// 2411 /// By default, performs semantic analysis to build the new expression. 2412 /// Subclasses may override this routine to provide different behavior. 2413 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2414 PredefinedExpr::IdentKind IK) { 2415 return getSema().BuildPredefinedExpr(Loc, IK); 2416 } 2417 2418 /// Build a new expression that references a declaration. 2419 /// 2420 /// By default, performs semantic analysis to build the new expression. 2421 /// Subclasses may override this routine to provide different behavior. 2422 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2423 LookupResult &R, 2424 bool RequiresADL) { 2425 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2426 } 2427 2428 2429 /// Build a new expression that references a declaration. 2430 /// 2431 /// By default, performs semantic analysis to build the new expression. 2432 /// Subclasses may override this routine to provide different behavior. 2433 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2434 ValueDecl *VD, 2435 const DeclarationNameInfo &NameInfo, 2436 NamedDecl *Found, 2437 TemplateArgumentListInfo *TemplateArgs) { 2438 CXXScopeSpec SS; 2439 SS.Adopt(QualifierLoc); 2440 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2441 TemplateArgs); 2442 } 2443 2444 /// Build a new expression in parentheses. 2445 /// 2446 /// By default, performs semantic analysis to build the new expression. 2447 /// Subclasses may override this routine to provide different behavior. 2448 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2449 SourceLocation RParen) { 2450 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2451 } 2452 2453 /// Build a new pseudo-destructor expression. 2454 /// 2455 /// By default, performs semantic analysis to build the new expression. 2456 /// Subclasses may override this routine to provide different behavior. 2457 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2458 SourceLocation OperatorLoc, 2459 bool isArrow, 2460 CXXScopeSpec &SS, 2461 TypeSourceInfo *ScopeType, 2462 SourceLocation CCLoc, 2463 SourceLocation TildeLoc, 2464 PseudoDestructorTypeStorage Destroyed); 2465 2466 /// Build a new unary operator expression. 2467 /// 2468 /// By default, performs semantic analysis to build the new expression. 2469 /// Subclasses may override this routine to provide different behavior. 2470 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2471 UnaryOperatorKind Opc, 2472 Expr *SubExpr) { 2473 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2474 } 2475 2476 /// Build a new builtin offsetof expression. 2477 /// 2478 /// By default, performs semantic analysis to build the new expression. 2479 /// Subclasses may override this routine to provide different behavior. 2480 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2481 TypeSourceInfo *Type, 2482 ArrayRef<Sema::OffsetOfComponent> Components, 2483 SourceLocation RParenLoc) { 2484 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2485 RParenLoc); 2486 } 2487 2488 /// Build a new sizeof, alignof or vec_step expression with a 2489 /// type argument. 2490 /// 2491 /// By default, performs semantic analysis to build the new expression. 2492 /// Subclasses may override this routine to provide different behavior. 2493 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2494 SourceLocation OpLoc, 2495 UnaryExprOrTypeTrait ExprKind, 2496 SourceRange R) { 2497 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2498 } 2499 2500 /// Build a new sizeof, alignof or vec step expression with an 2501 /// expression argument. 2502 /// 2503 /// By default, performs semantic analysis to build the new expression. 2504 /// Subclasses may override this routine to provide different behavior. 2505 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2506 UnaryExprOrTypeTrait ExprKind, 2507 SourceRange R) { 2508 ExprResult Result 2509 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2510 if (Result.isInvalid()) 2511 return ExprError(); 2512 2513 return Result; 2514 } 2515 2516 /// Build a new array subscript expression. 2517 /// 2518 /// By default, performs semantic analysis to build the new expression. 2519 /// Subclasses may override this routine to provide different behavior. 2520 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2521 SourceLocation LBracketLoc, 2522 Expr *RHS, 2523 SourceLocation RBracketLoc) { 2524 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2525 LBracketLoc, RHS, 2526 RBracketLoc); 2527 } 2528 2529 /// Build a new matrix subscript expression. 2530 /// 2531 /// By default, performs semantic analysis to build the new expression. 2532 /// Subclasses may override this routine to provide different behavior. 2533 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2534 Expr *ColumnIdx, 2535 SourceLocation RBracketLoc) { 2536 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2537 RBracketLoc); 2538 } 2539 2540 /// Build a new array section expression. 2541 /// 2542 /// By default, performs semantic analysis to build the new expression. 2543 /// Subclasses may override this routine to provide different behavior. 2544 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2545 Expr *LowerBound, 2546 SourceLocation ColonLocFirst, 2547 SourceLocation ColonLocSecond, 2548 Expr *Length, Expr *Stride, 2549 SourceLocation RBracketLoc) { 2550 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2551 ColonLocFirst, ColonLocSecond, 2552 Length, Stride, RBracketLoc); 2553 } 2554 2555 /// Build a new array shaping expression. 2556 /// 2557 /// By default, performs semantic analysis to build the new expression. 2558 /// Subclasses may override this routine to provide different behavior. 2559 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2560 SourceLocation RParenLoc, 2561 ArrayRef<Expr *> Dims, 2562 ArrayRef<SourceRange> BracketsRanges) { 2563 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2564 BracketsRanges); 2565 } 2566 2567 /// Build a new iterator expression. 2568 /// 2569 /// By default, performs semantic analysis to build the new expression. 2570 /// Subclasses may override this routine to provide different behavior. 2571 ExprResult RebuildOMPIteratorExpr( 2572 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2573 ArrayRef<Sema::OMPIteratorData> Data) { 2574 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2575 LLoc, RLoc, Data); 2576 } 2577 2578 /// Build a new call expression. 2579 /// 2580 /// By default, performs semantic analysis to build the new expression. 2581 /// Subclasses may override this routine to provide different behavior. 2582 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2583 MultiExprArg Args, 2584 SourceLocation RParenLoc, 2585 Expr *ExecConfig = nullptr) { 2586 return getSema().ActOnCallExpr( 2587 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2588 } 2589 2590 /// Build a new member access expression. 2591 /// 2592 /// By default, performs semantic analysis to build the new expression. 2593 /// Subclasses may override this routine to provide different behavior. 2594 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2595 bool isArrow, 2596 NestedNameSpecifierLoc QualifierLoc, 2597 SourceLocation TemplateKWLoc, 2598 const DeclarationNameInfo &MemberNameInfo, 2599 ValueDecl *Member, 2600 NamedDecl *FoundDecl, 2601 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2602 NamedDecl *FirstQualifierInScope) { 2603 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2604 isArrow); 2605 if (!Member->getDeclName()) { 2606 // We have a reference to an unnamed field. This is always the 2607 // base of an anonymous struct/union member access, i.e. the 2608 // field is always of record type. 2609 assert(Member->getType()->isRecordType() && 2610 "unnamed member not of record type?"); 2611 2612 BaseResult = 2613 getSema().PerformObjectMemberConversion(BaseResult.get(), 2614 QualifierLoc.getNestedNameSpecifier(), 2615 FoundDecl, Member); 2616 if (BaseResult.isInvalid()) 2617 return ExprError(); 2618 Base = BaseResult.get(); 2619 2620 CXXScopeSpec EmptySS; 2621 return getSema().BuildFieldReferenceExpr( 2622 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2623 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2624 } 2625 2626 CXXScopeSpec SS; 2627 SS.Adopt(QualifierLoc); 2628 2629 Base = BaseResult.get(); 2630 QualType BaseType = Base->getType(); 2631 2632 if (isArrow && !BaseType->isPointerType()) 2633 return ExprError(); 2634 2635 // FIXME: this involves duplicating earlier analysis in a lot of 2636 // cases; we should avoid this when possible. 2637 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2638 R.addDecl(FoundDecl); 2639 R.resolveKind(); 2640 2641 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2642 SS, TemplateKWLoc, 2643 FirstQualifierInScope, 2644 R, ExplicitTemplateArgs, 2645 /*S*/nullptr); 2646 } 2647 2648 /// Build a new binary operator expression. 2649 /// 2650 /// By default, performs semantic analysis to build the new expression. 2651 /// Subclasses may override this routine to provide different behavior. 2652 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2653 BinaryOperatorKind Opc, 2654 Expr *LHS, Expr *RHS) { 2655 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2656 } 2657 2658 /// Build a new rewritten operator expression. 2659 /// 2660 /// By default, performs semantic analysis to build the new expression. 2661 /// Subclasses may override this routine to provide different behavior. 2662 ExprResult RebuildCXXRewrittenBinaryOperator( 2663 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2664 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2665 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2666 RHS, /*RequiresADL*/false); 2667 } 2668 2669 /// Build a new conditional operator expression. 2670 /// 2671 /// By default, performs semantic analysis to build the new expression. 2672 /// Subclasses may override this routine to provide different behavior. 2673 ExprResult RebuildConditionalOperator(Expr *Cond, 2674 SourceLocation QuestionLoc, 2675 Expr *LHS, 2676 SourceLocation ColonLoc, 2677 Expr *RHS) { 2678 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2679 LHS, RHS); 2680 } 2681 2682 /// Build a new C-style cast expression. 2683 /// 2684 /// By default, performs semantic analysis to build the new expression. 2685 /// Subclasses may override this routine to provide different behavior. 2686 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2687 TypeSourceInfo *TInfo, 2688 SourceLocation RParenLoc, 2689 Expr *SubExpr) { 2690 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2691 SubExpr); 2692 } 2693 2694 /// Build a new compound literal expression. 2695 /// 2696 /// By default, performs semantic analysis to build the new expression. 2697 /// Subclasses may override this routine to provide different behavior. 2698 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2699 TypeSourceInfo *TInfo, 2700 SourceLocation RParenLoc, 2701 Expr *Init) { 2702 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2703 Init); 2704 } 2705 2706 /// Build a new extended vector element access expression. 2707 /// 2708 /// By default, performs semantic analysis to build the new expression. 2709 /// Subclasses may override this routine to provide different behavior. 2710 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2711 SourceLocation OpLoc, 2712 SourceLocation AccessorLoc, 2713 IdentifierInfo &Accessor) { 2714 2715 CXXScopeSpec SS; 2716 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2717 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2718 OpLoc, /*IsArrow*/ false, 2719 SS, SourceLocation(), 2720 /*FirstQualifierInScope*/ nullptr, 2721 NameInfo, 2722 /* TemplateArgs */ nullptr, 2723 /*S*/ nullptr); 2724 } 2725 2726 /// Build a new initializer list expression. 2727 /// 2728 /// By default, performs semantic analysis to build the new expression. 2729 /// Subclasses may override this routine to provide different behavior. 2730 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2731 MultiExprArg Inits, 2732 SourceLocation RBraceLoc) { 2733 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2734 } 2735 2736 /// Build a new designated initializer expression. 2737 /// 2738 /// By default, performs semantic analysis to build the new expression. 2739 /// Subclasses may override this routine to provide different behavior. 2740 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2741 MultiExprArg ArrayExprs, 2742 SourceLocation EqualOrColonLoc, 2743 bool GNUSyntax, 2744 Expr *Init) { 2745 ExprResult Result 2746 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2747 Init); 2748 if (Result.isInvalid()) 2749 return ExprError(); 2750 2751 return Result; 2752 } 2753 2754 /// Build a new value-initialized expression. 2755 /// 2756 /// By default, builds the implicit value initialization without performing 2757 /// any semantic analysis. Subclasses may override this routine to provide 2758 /// different behavior. 2759 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2760 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2761 } 2762 2763 /// Build a new \c va_arg expression. 2764 /// 2765 /// By default, performs semantic analysis to build the new expression. 2766 /// Subclasses may override this routine to provide different behavior. 2767 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2768 Expr *SubExpr, TypeSourceInfo *TInfo, 2769 SourceLocation RParenLoc) { 2770 return getSema().BuildVAArgExpr(BuiltinLoc, 2771 SubExpr, TInfo, 2772 RParenLoc); 2773 } 2774 2775 /// Build a new expression list in parentheses. 2776 /// 2777 /// By default, performs semantic analysis to build the new expression. 2778 /// Subclasses may override this routine to provide different behavior. 2779 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2780 MultiExprArg SubExprs, 2781 SourceLocation RParenLoc) { 2782 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2783 } 2784 2785 /// Build a new address-of-label expression. 2786 /// 2787 /// By default, performs semantic analysis, using the name of the label 2788 /// rather than attempting to map the label statement itself. 2789 /// Subclasses may override this routine to provide different behavior. 2790 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2791 SourceLocation LabelLoc, LabelDecl *Label) { 2792 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2793 } 2794 2795 /// Build a new GNU statement expression. 2796 /// 2797 /// By default, performs semantic analysis to build the new expression. 2798 /// Subclasses may override this routine to provide different behavior. 2799 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2800 SourceLocation RParenLoc, unsigned TemplateDepth) { 2801 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2802 TemplateDepth); 2803 } 2804 2805 /// Build a new __builtin_choose_expr expression. 2806 /// 2807 /// By default, performs semantic analysis to build the new expression. 2808 /// Subclasses may override this routine to provide different behavior. 2809 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2810 Expr *Cond, Expr *LHS, Expr *RHS, 2811 SourceLocation RParenLoc) { 2812 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2813 Cond, LHS, RHS, 2814 RParenLoc); 2815 } 2816 2817 /// Build a new generic selection expression. 2818 /// 2819 /// By default, performs semantic analysis to build the new expression. 2820 /// Subclasses may override this routine to provide different behavior. 2821 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2822 SourceLocation DefaultLoc, 2823 SourceLocation RParenLoc, 2824 Expr *ControllingExpr, 2825 ArrayRef<TypeSourceInfo *> Types, 2826 ArrayRef<Expr *> Exprs) { 2827 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2828 ControllingExpr, Types, Exprs); 2829 } 2830 2831 /// Build a new overloaded operator call expression. 2832 /// 2833 /// By default, performs semantic analysis to build the new expression. 2834 /// The semantic analysis provides the behavior of template instantiation, 2835 /// copying with transformations that turn what looks like an overloaded 2836 /// operator call into a use of a builtin operator, performing 2837 /// argument-dependent lookup, etc. Subclasses may override this routine to 2838 /// provide different behavior. 2839 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2840 SourceLocation OpLoc, 2841 Expr *Callee, 2842 Expr *First, 2843 Expr *Second); 2844 2845 /// Build a new C++ "named" cast expression, such as static_cast or 2846 /// reinterpret_cast. 2847 /// 2848 /// By default, this routine dispatches to one of the more-specific routines 2849 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2850 /// Subclasses may override this routine to provide different behavior. 2851 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2852 Stmt::StmtClass Class, 2853 SourceLocation LAngleLoc, 2854 TypeSourceInfo *TInfo, 2855 SourceLocation RAngleLoc, 2856 SourceLocation LParenLoc, 2857 Expr *SubExpr, 2858 SourceLocation RParenLoc) { 2859 switch (Class) { 2860 case Stmt::CXXStaticCastExprClass: 2861 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2862 RAngleLoc, LParenLoc, 2863 SubExpr, RParenLoc); 2864 2865 case Stmt::CXXDynamicCastExprClass: 2866 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2867 RAngleLoc, LParenLoc, 2868 SubExpr, RParenLoc); 2869 2870 case Stmt::CXXReinterpretCastExprClass: 2871 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2872 RAngleLoc, LParenLoc, 2873 SubExpr, 2874 RParenLoc); 2875 2876 case Stmt::CXXConstCastExprClass: 2877 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2878 RAngleLoc, LParenLoc, 2879 SubExpr, RParenLoc); 2880 2881 case Stmt::CXXAddrspaceCastExprClass: 2882 return getDerived().RebuildCXXAddrspaceCastExpr( 2883 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2884 2885 default: 2886 llvm_unreachable("Invalid C++ named cast"); 2887 } 2888 } 2889 2890 /// Build a new C++ static_cast expression. 2891 /// 2892 /// By default, performs semantic analysis to build the new expression. 2893 /// Subclasses may override this routine to provide different behavior. 2894 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2895 SourceLocation LAngleLoc, 2896 TypeSourceInfo *TInfo, 2897 SourceLocation RAngleLoc, 2898 SourceLocation LParenLoc, 2899 Expr *SubExpr, 2900 SourceLocation RParenLoc) { 2901 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2902 TInfo, SubExpr, 2903 SourceRange(LAngleLoc, RAngleLoc), 2904 SourceRange(LParenLoc, RParenLoc)); 2905 } 2906 2907 /// Build a new C++ dynamic_cast expression. 2908 /// 2909 /// By default, performs semantic analysis to build the new expression. 2910 /// Subclasses may override this routine to provide different behavior. 2911 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2912 SourceLocation LAngleLoc, 2913 TypeSourceInfo *TInfo, 2914 SourceLocation RAngleLoc, 2915 SourceLocation LParenLoc, 2916 Expr *SubExpr, 2917 SourceLocation RParenLoc) { 2918 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2919 TInfo, SubExpr, 2920 SourceRange(LAngleLoc, RAngleLoc), 2921 SourceRange(LParenLoc, RParenLoc)); 2922 } 2923 2924 /// Build a new C++ reinterpret_cast expression. 2925 /// 2926 /// By default, performs semantic analysis to build the new expression. 2927 /// Subclasses may override this routine to provide different behavior. 2928 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2929 SourceLocation LAngleLoc, 2930 TypeSourceInfo *TInfo, 2931 SourceLocation RAngleLoc, 2932 SourceLocation LParenLoc, 2933 Expr *SubExpr, 2934 SourceLocation RParenLoc) { 2935 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2936 TInfo, SubExpr, 2937 SourceRange(LAngleLoc, RAngleLoc), 2938 SourceRange(LParenLoc, RParenLoc)); 2939 } 2940 2941 /// Build a new C++ const_cast expression. 2942 /// 2943 /// By default, performs semantic analysis to build the new expression. 2944 /// Subclasses may override this routine to provide different behavior. 2945 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2946 SourceLocation LAngleLoc, 2947 TypeSourceInfo *TInfo, 2948 SourceLocation RAngleLoc, 2949 SourceLocation LParenLoc, 2950 Expr *SubExpr, 2951 SourceLocation RParenLoc) { 2952 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2953 TInfo, SubExpr, 2954 SourceRange(LAngleLoc, RAngleLoc), 2955 SourceRange(LParenLoc, RParenLoc)); 2956 } 2957 2958 ExprResult 2959 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2960 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2961 SourceLocation LParenLoc, Expr *SubExpr, 2962 SourceLocation RParenLoc) { 2963 return getSema().BuildCXXNamedCast( 2964 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2965 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2966 } 2967 2968 /// Build a new C++ functional-style cast expression. 2969 /// 2970 /// By default, performs semantic analysis to build the new expression. 2971 /// Subclasses may override this routine to provide different behavior. 2972 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2973 SourceLocation LParenLoc, 2974 Expr *Sub, 2975 SourceLocation RParenLoc, 2976 bool ListInitialization) { 2977 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2978 MultiExprArg(&Sub, 1), RParenLoc, 2979 ListInitialization); 2980 } 2981 2982 /// Build a new C++ __builtin_bit_cast expression. 2983 /// 2984 /// By default, performs semantic analysis to build the new expression. 2985 /// Subclasses may override this routine to provide different behavior. 2986 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2987 TypeSourceInfo *TSI, Expr *Sub, 2988 SourceLocation RParenLoc) { 2989 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2990 } 2991 2992 /// Build a new C++ typeid(type) expression. 2993 /// 2994 /// By default, performs semantic analysis to build the new expression. 2995 /// Subclasses may override this routine to provide different behavior. 2996 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2997 SourceLocation TypeidLoc, 2998 TypeSourceInfo *Operand, 2999 SourceLocation RParenLoc) { 3000 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3001 RParenLoc); 3002 } 3003 3004 3005 /// Build a new C++ typeid(expr) expression. 3006 /// 3007 /// By default, performs semantic analysis to build the new expression. 3008 /// Subclasses may override this routine to provide different behavior. 3009 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3010 SourceLocation TypeidLoc, 3011 Expr *Operand, 3012 SourceLocation RParenLoc) { 3013 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3014 RParenLoc); 3015 } 3016 3017 /// Build a new C++ __uuidof(type) expression. 3018 /// 3019 /// By default, performs semantic analysis to build the new expression. 3020 /// Subclasses may override this routine to provide different behavior. 3021 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3022 TypeSourceInfo *Operand, 3023 SourceLocation RParenLoc) { 3024 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3025 } 3026 3027 /// Build a new C++ __uuidof(expr) expression. 3028 /// 3029 /// By default, performs semantic analysis to build the new expression. 3030 /// Subclasses may override this routine to provide different behavior. 3031 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3032 Expr *Operand, SourceLocation RParenLoc) { 3033 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3034 } 3035 3036 /// Build a new C++ "this" expression. 3037 /// 3038 /// By default, builds a new "this" expression without performing any 3039 /// semantic analysis. Subclasses may override this routine to provide 3040 /// different behavior. 3041 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3042 QualType ThisType, 3043 bool isImplicit) { 3044 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3045 } 3046 3047 /// Build a new C++ throw expression. 3048 /// 3049 /// By default, performs semantic analysis to build the new expression. 3050 /// Subclasses may override this routine to provide different behavior. 3051 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3052 bool IsThrownVariableInScope) { 3053 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3054 } 3055 3056 /// Build a new C++ default-argument expression. 3057 /// 3058 /// By default, builds a new default-argument expression, which does not 3059 /// require any semantic analysis. Subclasses may override this routine to 3060 /// provide different behavior. 3061 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3062 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3063 getSema().CurContext); 3064 } 3065 3066 /// Build a new C++11 default-initialization expression. 3067 /// 3068 /// By default, builds a new default field initialization expression, which 3069 /// does not require any semantic analysis. Subclasses may override this 3070 /// routine to provide different behavior. 3071 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3072 FieldDecl *Field) { 3073 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3074 getSema().CurContext); 3075 } 3076 3077 /// Build a new C++ zero-initialization expression. 3078 /// 3079 /// By default, performs semantic analysis to build the new expression. 3080 /// Subclasses may override this routine to provide different behavior. 3081 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3082 SourceLocation LParenLoc, 3083 SourceLocation RParenLoc) { 3084 return getSema().BuildCXXTypeConstructExpr( 3085 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3086 } 3087 3088 /// Build a new C++ "new" expression. 3089 /// 3090 /// By default, performs semantic analysis to build the new expression. 3091 /// Subclasses may override this routine to provide different behavior. 3092 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3093 bool UseGlobal, 3094 SourceLocation PlacementLParen, 3095 MultiExprArg PlacementArgs, 3096 SourceLocation PlacementRParen, 3097 SourceRange TypeIdParens, 3098 QualType AllocatedType, 3099 TypeSourceInfo *AllocatedTypeInfo, 3100 Optional<Expr *> ArraySize, 3101 SourceRange DirectInitRange, 3102 Expr *Initializer) { 3103 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3104 PlacementLParen, 3105 PlacementArgs, 3106 PlacementRParen, 3107 TypeIdParens, 3108 AllocatedType, 3109 AllocatedTypeInfo, 3110 ArraySize, 3111 DirectInitRange, 3112 Initializer); 3113 } 3114 3115 /// Build a new C++ "delete" expression. 3116 /// 3117 /// By default, performs semantic analysis to build the new expression. 3118 /// Subclasses may override this routine to provide different behavior. 3119 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3120 bool IsGlobalDelete, 3121 bool IsArrayForm, 3122 Expr *Operand) { 3123 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3124 Operand); 3125 } 3126 3127 /// Build a new type trait expression. 3128 /// 3129 /// By default, performs semantic analysis to build the new expression. 3130 /// Subclasses may override this routine to provide different behavior. 3131 ExprResult RebuildTypeTrait(TypeTrait Trait, 3132 SourceLocation StartLoc, 3133 ArrayRef<TypeSourceInfo *> Args, 3134 SourceLocation RParenLoc) { 3135 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3136 } 3137 3138 /// Build a new array type trait expression. 3139 /// 3140 /// By default, performs semantic analysis to build the new expression. 3141 /// Subclasses may override this routine to provide different behavior. 3142 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3143 SourceLocation StartLoc, 3144 TypeSourceInfo *TSInfo, 3145 Expr *DimExpr, 3146 SourceLocation RParenLoc) { 3147 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3148 } 3149 3150 /// Build a new expression trait expression. 3151 /// 3152 /// By default, performs semantic analysis to build the new expression. 3153 /// Subclasses may override this routine to provide different behavior. 3154 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3155 SourceLocation StartLoc, 3156 Expr *Queried, 3157 SourceLocation RParenLoc) { 3158 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3159 } 3160 3161 /// Build a new (previously unresolved) declaration reference 3162 /// expression. 3163 /// 3164 /// By default, performs semantic analysis to build the new expression. 3165 /// Subclasses may override this routine to provide different behavior. 3166 ExprResult RebuildDependentScopeDeclRefExpr( 3167 NestedNameSpecifierLoc QualifierLoc, 3168 SourceLocation TemplateKWLoc, 3169 const DeclarationNameInfo &NameInfo, 3170 const TemplateArgumentListInfo *TemplateArgs, 3171 bool IsAddressOfOperand, 3172 TypeSourceInfo **RecoveryTSI) { 3173 CXXScopeSpec SS; 3174 SS.Adopt(QualifierLoc); 3175 3176 if (TemplateArgs || TemplateKWLoc.isValid()) 3177 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3178 TemplateArgs); 3179 3180 return getSema().BuildQualifiedDeclarationNameExpr( 3181 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3182 } 3183 3184 /// Build a new template-id expression. 3185 /// 3186 /// By default, performs semantic analysis to build the new expression. 3187 /// Subclasses may override this routine to provide different behavior. 3188 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3189 SourceLocation TemplateKWLoc, 3190 LookupResult &R, 3191 bool RequiresADL, 3192 const TemplateArgumentListInfo *TemplateArgs) { 3193 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3194 TemplateArgs); 3195 } 3196 3197 /// Build a new object-construction expression. 3198 /// 3199 /// By default, performs semantic analysis to build the new expression. 3200 /// Subclasses may override this routine to provide different behavior. 3201 ExprResult RebuildCXXConstructExpr(QualType T, 3202 SourceLocation Loc, 3203 CXXConstructorDecl *Constructor, 3204 bool IsElidable, 3205 MultiExprArg Args, 3206 bool HadMultipleCandidates, 3207 bool ListInitialization, 3208 bool StdInitListInitialization, 3209 bool RequiresZeroInit, 3210 CXXConstructExpr::ConstructionKind ConstructKind, 3211 SourceRange ParenRange) { 3212 // Reconstruct the constructor we originally found, which might be 3213 // different if this is a call to an inherited constructor. 3214 CXXConstructorDecl *FoundCtor = Constructor; 3215 if (Constructor->isInheritingConstructor()) 3216 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3217 3218 SmallVector<Expr *, 8> ConvertedArgs; 3219 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3220 ConvertedArgs)) 3221 return ExprError(); 3222 3223 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3224 IsElidable, 3225 ConvertedArgs, 3226 HadMultipleCandidates, 3227 ListInitialization, 3228 StdInitListInitialization, 3229 RequiresZeroInit, ConstructKind, 3230 ParenRange); 3231 } 3232 3233 /// Build a new implicit construction via inherited constructor 3234 /// expression. 3235 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3236 CXXConstructorDecl *Constructor, 3237 bool ConstructsVBase, 3238 bool InheritedFromVBase) { 3239 return new (getSema().Context) CXXInheritedCtorInitExpr( 3240 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3241 } 3242 3243 /// Build a new object-construction expression. 3244 /// 3245 /// By default, performs semantic analysis to build the new expression. 3246 /// Subclasses may override this routine to provide different behavior. 3247 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3248 SourceLocation LParenOrBraceLoc, 3249 MultiExprArg Args, 3250 SourceLocation RParenOrBraceLoc, 3251 bool ListInitialization) { 3252 return getSema().BuildCXXTypeConstructExpr( 3253 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3254 } 3255 3256 /// Build a new object-construction expression. 3257 /// 3258 /// By default, performs semantic analysis to build the new expression. 3259 /// Subclasses may override this routine to provide different behavior. 3260 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3261 SourceLocation LParenLoc, 3262 MultiExprArg Args, 3263 SourceLocation RParenLoc, 3264 bool ListInitialization) { 3265 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3266 RParenLoc, ListInitialization); 3267 } 3268 3269 /// Build a new member reference expression. 3270 /// 3271 /// By default, performs semantic analysis to build the new expression. 3272 /// Subclasses may override this routine to provide different behavior. 3273 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3274 QualType BaseType, 3275 bool IsArrow, 3276 SourceLocation OperatorLoc, 3277 NestedNameSpecifierLoc QualifierLoc, 3278 SourceLocation TemplateKWLoc, 3279 NamedDecl *FirstQualifierInScope, 3280 const DeclarationNameInfo &MemberNameInfo, 3281 const TemplateArgumentListInfo *TemplateArgs) { 3282 CXXScopeSpec SS; 3283 SS.Adopt(QualifierLoc); 3284 3285 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3286 OperatorLoc, IsArrow, 3287 SS, TemplateKWLoc, 3288 FirstQualifierInScope, 3289 MemberNameInfo, 3290 TemplateArgs, /*S*/nullptr); 3291 } 3292 3293 /// Build a new member reference expression. 3294 /// 3295 /// By default, performs semantic analysis to build the new expression. 3296 /// Subclasses may override this routine to provide different behavior. 3297 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3298 SourceLocation OperatorLoc, 3299 bool IsArrow, 3300 NestedNameSpecifierLoc QualifierLoc, 3301 SourceLocation TemplateKWLoc, 3302 NamedDecl *FirstQualifierInScope, 3303 LookupResult &R, 3304 const TemplateArgumentListInfo *TemplateArgs) { 3305 CXXScopeSpec SS; 3306 SS.Adopt(QualifierLoc); 3307 3308 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3309 OperatorLoc, IsArrow, 3310 SS, TemplateKWLoc, 3311 FirstQualifierInScope, 3312 R, TemplateArgs, /*S*/nullptr); 3313 } 3314 3315 /// Build a new noexcept expression. 3316 /// 3317 /// By default, performs semantic analysis to build the new expression. 3318 /// Subclasses may override this routine to provide different behavior. 3319 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3320 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3321 } 3322 3323 /// Build a new expression to compute the length of a parameter pack. 3324 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3325 NamedDecl *Pack, 3326 SourceLocation PackLoc, 3327 SourceLocation RParenLoc, 3328 Optional<unsigned> Length, 3329 ArrayRef<TemplateArgument> PartialArgs) { 3330 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3331 RParenLoc, Length, PartialArgs); 3332 } 3333 3334 /// Build a new expression representing a call to a source location 3335 /// builtin. 3336 /// 3337 /// By default, performs semantic analysis to build the new expression. 3338 /// Subclasses may override this routine to provide different behavior. 3339 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3340 SourceLocation BuiltinLoc, 3341 SourceLocation RPLoc, 3342 DeclContext *ParentContext) { 3343 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3344 } 3345 3346 /// Build a new Objective-C boxed expression. 3347 /// 3348 /// By default, performs semantic analysis to build the new expression. 3349 /// Subclasses may override this routine to provide different behavior. 3350 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3351 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3352 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3353 TemplateArgumentListInfo *TALI) { 3354 CXXScopeSpec SS; 3355 SS.Adopt(NNS); 3356 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3357 ConceptNameInfo, 3358 FoundDecl, 3359 NamedConcept, TALI); 3360 if (Result.isInvalid()) 3361 return ExprError(); 3362 return Result; 3363 } 3364 3365 /// \brief Build a new requires expression. 3366 /// 3367 /// By default, performs semantic analysis to build the new expression. 3368 /// Subclasses may override this routine to provide different behavior. 3369 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3370 RequiresExprBodyDecl *Body, 3371 ArrayRef<ParmVarDecl *> LocalParameters, 3372 ArrayRef<concepts::Requirement *> Requirements, 3373 SourceLocation ClosingBraceLoc) { 3374 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3375 LocalParameters, Requirements, ClosingBraceLoc); 3376 } 3377 3378 concepts::TypeRequirement * 3379 RebuildTypeRequirement( 3380 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3381 return SemaRef.BuildTypeRequirement(SubstDiag); 3382 } 3383 3384 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3385 return SemaRef.BuildTypeRequirement(T); 3386 } 3387 3388 concepts::ExprRequirement * 3389 RebuildExprRequirement( 3390 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3391 SourceLocation NoexceptLoc, 3392 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3393 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3394 std::move(Ret)); 3395 } 3396 3397 concepts::ExprRequirement * 3398 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3399 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3400 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3401 std::move(Ret)); 3402 } 3403 3404 concepts::NestedRequirement * 3405 RebuildNestedRequirement( 3406 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3407 return SemaRef.BuildNestedRequirement(SubstDiag); 3408 } 3409 3410 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3411 return SemaRef.BuildNestedRequirement(Constraint); 3412 } 3413 3414 /// \brief Build a new Objective-C boxed expression. 3415 /// 3416 /// By default, performs semantic analysis to build the new expression. 3417 /// Subclasses may override this routine to provide different behavior. 3418 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3419 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3420 } 3421 3422 /// Build a new Objective-C array literal. 3423 /// 3424 /// By default, performs semantic analysis to build the new expression. 3425 /// Subclasses may override this routine to provide different behavior. 3426 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3427 Expr **Elements, unsigned NumElements) { 3428 return getSema().BuildObjCArrayLiteral(Range, 3429 MultiExprArg(Elements, NumElements)); 3430 } 3431 3432 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3433 Expr *Base, Expr *Key, 3434 ObjCMethodDecl *getterMethod, 3435 ObjCMethodDecl *setterMethod) { 3436 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3437 getterMethod, setterMethod); 3438 } 3439 3440 /// Build a new Objective-C dictionary literal. 3441 /// 3442 /// By default, performs semantic analysis to build the new expression. 3443 /// Subclasses may override this routine to provide different behavior. 3444 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3445 MutableArrayRef<ObjCDictionaryElement> Elements) { 3446 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3447 } 3448 3449 /// Build a new Objective-C \@encode expression. 3450 /// 3451 /// By default, performs semantic analysis to build the new expression. 3452 /// Subclasses may override this routine to provide different behavior. 3453 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3454 TypeSourceInfo *EncodeTypeInfo, 3455 SourceLocation RParenLoc) { 3456 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3457 } 3458 3459 /// Build a new Objective-C class message. 3460 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3461 Selector Sel, 3462 ArrayRef<SourceLocation> SelectorLocs, 3463 ObjCMethodDecl *Method, 3464 SourceLocation LBracLoc, 3465 MultiExprArg Args, 3466 SourceLocation RBracLoc) { 3467 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3468 ReceiverTypeInfo->getType(), 3469 /*SuperLoc=*/SourceLocation(), 3470 Sel, Method, LBracLoc, SelectorLocs, 3471 RBracLoc, Args); 3472 } 3473 3474 /// Build a new Objective-C instance message. 3475 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3476 Selector Sel, 3477 ArrayRef<SourceLocation> SelectorLocs, 3478 ObjCMethodDecl *Method, 3479 SourceLocation LBracLoc, 3480 MultiExprArg Args, 3481 SourceLocation RBracLoc) { 3482 return SemaRef.BuildInstanceMessage(Receiver, 3483 Receiver->getType(), 3484 /*SuperLoc=*/SourceLocation(), 3485 Sel, Method, LBracLoc, SelectorLocs, 3486 RBracLoc, Args); 3487 } 3488 3489 /// Build a new Objective-C instance/class message to 'super'. 3490 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3491 Selector Sel, 3492 ArrayRef<SourceLocation> SelectorLocs, 3493 QualType SuperType, 3494 ObjCMethodDecl *Method, 3495 SourceLocation LBracLoc, 3496 MultiExprArg Args, 3497 SourceLocation RBracLoc) { 3498 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3499 SuperType, 3500 SuperLoc, 3501 Sel, Method, LBracLoc, SelectorLocs, 3502 RBracLoc, Args) 3503 : SemaRef.BuildClassMessage(nullptr, 3504 SuperType, 3505 SuperLoc, 3506 Sel, Method, LBracLoc, SelectorLocs, 3507 RBracLoc, Args); 3508 3509 3510 } 3511 3512 /// Build a new Objective-C ivar reference expression. 3513 /// 3514 /// By default, performs semantic analysis to build the new expression. 3515 /// Subclasses may override this routine to provide different behavior. 3516 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3517 SourceLocation IvarLoc, 3518 bool IsArrow, bool IsFreeIvar) { 3519 CXXScopeSpec SS; 3520 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3521 ExprResult Result = getSema().BuildMemberReferenceExpr( 3522 BaseArg, BaseArg->getType(), 3523 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3524 /*FirstQualifierInScope=*/nullptr, NameInfo, 3525 /*TemplateArgs=*/nullptr, 3526 /*S=*/nullptr); 3527 if (IsFreeIvar && Result.isUsable()) 3528 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3529 return Result; 3530 } 3531 3532 /// Build a new Objective-C property reference expression. 3533 /// 3534 /// By default, performs semantic analysis to build the new expression. 3535 /// Subclasses may override this routine to provide different behavior. 3536 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3537 ObjCPropertyDecl *Property, 3538 SourceLocation PropertyLoc) { 3539 CXXScopeSpec SS; 3540 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3541 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3542 /*FIXME:*/PropertyLoc, 3543 /*IsArrow=*/false, 3544 SS, SourceLocation(), 3545 /*FirstQualifierInScope=*/nullptr, 3546 NameInfo, 3547 /*TemplateArgs=*/nullptr, 3548 /*S=*/nullptr); 3549 } 3550 3551 /// Build a new Objective-C property reference expression. 3552 /// 3553 /// By default, performs semantic analysis to build the new expression. 3554 /// Subclasses may override this routine to provide different behavior. 3555 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3556 ObjCMethodDecl *Getter, 3557 ObjCMethodDecl *Setter, 3558 SourceLocation PropertyLoc) { 3559 // Since these expressions can only be value-dependent, we do not 3560 // need to perform semantic analysis again. 3561 return Owned( 3562 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3563 VK_LValue, OK_ObjCProperty, 3564 PropertyLoc, Base)); 3565 } 3566 3567 /// Build a new Objective-C "isa" expression. 3568 /// 3569 /// By default, performs semantic analysis to build the new expression. 3570 /// Subclasses may override this routine to provide different behavior. 3571 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3572 SourceLocation OpLoc, bool IsArrow) { 3573 CXXScopeSpec SS; 3574 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3575 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3576 OpLoc, IsArrow, 3577 SS, SourceLocation(), 3578 /*FirstQualifierInScope=*/nullptr, 3579 NameInfo, 3580 /*TemplateArgs=*/nullptr, 3581 /*S=*/nullptr); 3582 } 3583 3584 /// Build a new shuffle vector expression. 3585 /// 3586 /// By default, performs semantic analysis to build the new expression. 3587 /// Subclasses may override this routine to provide different behavior. 3588 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3589 MultiExprArg SubExprs, 3590 SourceLocation RParenLoc) { 3591 // Find the declaration for __builtin_shufflevector 3592 const IdentifierInfo &Name 3593 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3594 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3595 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3596 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3597 3598 // Build a reference to the __builtin_shufflevector builtin 3599 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3600 Expr *Callee = new (SemaRef.Context) 3601 DeclRefExpr(SemaRef.Context, Builtin, false, 3602 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3603 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3604 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3605 CK_BuiltinFnToFnPtr).get(); 3606 3607 // Build the CallExpr 3608 ExprResult TheCall = CallExpr::Create( 3609 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3610 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3611 FPOptionsOverride()); 3612 3613 // Type-check the __builtin_shufflevector expression. 3614 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3615 } 3616 3617 /// Build a new convert vector expression. 3618 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3619 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3620 SourceLocation RParenLoc) { 3621 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3622 BuiltinLoc, RParenLoc); 3623 } 3624 3625 /// Build a new template argument pack expansion. 3626 /// 3627 /// By default, performs semantic analysis to build a new pack expansion 3628 /// for a template argument. Subclasses may override this routine to provide 3629 /// different behavior. 3630 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3631 SourceLocation EllipsisLoc, 3632 Optional<unsigned> NumExpansions) { 3633 switch (Pattern.getArgument().getKind()) { 3634 case TemplateArgument::Expression: { 3635 ExprResult Result 3636 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3637 EllipsisLoc, NumExpansions); 3638 if (Result.isInvalid()) 3639 return TemplateArgumentLoc(); 3640 3641 return TemplateArgumentLoc(Result.get(), Result.get()); 3642 } 3643 3644 case TemplateArgument::Template: 3645 return TemplateArgumentLoc( 3646 SemaRef.Context, 3647 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3648 NumExpansions), 3649 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3650 EllipsisLoc); 3651 3652 case TemplateArgument::Null: 3653 case TemplateArgument::Integral: 3654 case TemplateArgument::Declaration: 3655 case TemplateArgument::Pack: 3656 case TemplateArgument::TemplateExpansion: 3657 case TemplateArgument::NullPtr: 3658 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3659 3660 case TemplateArgument::Type: 3661 if (TypeSourceInfo *Expansion 3662 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3663 EllipsisLoc, 3664 NumExpansions)) 3665 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3666 Expansion); 3667 break; 3668 } 3669 3670 return TemplateArgumentLoc(); 3671 } 3672 3673 /// Build a new expression pack expansion. 3674 /// 3675 /// By default, performs semantic analysis to build a new pack expansion 3676 /// for an expression. Subclasses may override this routine to provide 3677 /// different behavior. 3678 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3679 Optional<unsigned> NumExpansions) { 3680 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3681 } 3682 3683 /// Build a new C++1z fold-expression. 3684 /// 3685 /// By default, performs semantic analysis in order to build a new fold 3686 /// expression. 3687 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3688 SourceLocation LParenLoc, Expr *LHS, 3689 BinaryOperatorKind Operator, 3690 SourceLocation EllipsisLoc, Expr *RHS, 3691 SourceLocation RParenLoc, 3692 Optional<unsigned> NumExpansions) { 3693 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3694 EllipsisLoc, RHS, RParenLoc, 3695 NumExpansions); 3696 } 3697 3698 /// Build an empty C++1z fold-expression with the given operator. 3699 /// 3700 /// By default, produces the fallback value for the fold-expression, or 3701 /// produce an error if there is no fallback value. 3702 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3703 BinaryOperatorKind Operator) { 3704 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3705 } 3706 3707 /// Build a new atomic operation expression. 3708 /// 3709 /// By default, performs semantic analysis to build the new expression. 3710 /// Subclasses may override this routine to provide different behavior. 3711 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3712 AtomicExpr::AtomicOp Op, 3713 SourceLocation RParenLoc) { 3714 // Use this for all of the locations, since we don't know the difference 3715 // between the call and the expr at this point. 3716 SourceRange Range{BuiltinLoc, RParenLoc}; 3717 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3718 Sema::AtomicArgumentOrder::AST); 3719 } 3720 3721 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3722 ArrayRef<Expr *> SubExprs, QualType Type) { 3723 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3724 } 3725 3726 private: 3727 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3728 QualType ObjectType, 3729 NamedDecl *FirstQualifierInScope, 3730 CXXScopeSpec &SS); 3731 3732 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3733 QualType ObjectType, 3734 NamedDecl *FirstQualifierInScope, 3735 CXXScopeSpec &SS); 3736 3737 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3738 NamedDecl *FirstQualifierInScope, 3739 CXXScopeSpec &SS); 3740 3741 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3742 DependentNameTypeLoc TL, 3743 bool DeducibleTSTContext); 3744 }; 3745 3746 template <typename Derived> 3747 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3748 if (!S) 3749 return S; 3750 3751 switch (S->getStmtClass()) { 3752 case Stmt::NoStmtClass: break; 3753 3754 // Transform individual statement nodes 3755 // Pass SDK into statements that can produce a value 3756 #define STMT(Node, Parent) \ 3757 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3758 #define VALUESTMT(Node, Parent) \ 3759 case Stmt::Node##Class: \ 3760 return getDerived().Transform##Node(cast<Node>(S), SDK); 3761 #define ABSTRACT_STMT(Node) 3762 #define EXPR(Node, Parent) 3763 #include "clang/AST/StmtNodes.inc" 3764 3765 // Transform expressions by calling TransformExpr. 3766 #define STMT(Node, Parent) 3767 #define ABSTRACT_STMT(Stmt) 3768 #define EXPR(Node, Parent) case Stmt::Node##Class: 3769 #include "clang/AST/StmtNodes.inc" 3770 { 3771 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3772 3773 if (SDK == SDK_StmtExprResult) 3774 E = getSema().ActOnStmtExprResult(E); 3775 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3776 } 3777 } 3778 3779 return S; 3780 } 3781 3782 template<typename Derived> 3783 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3784 if (!S) 3785 return S; 3786 3787 switch (S->getClauseKind()) { 3788 default: break; 3789 // Transform individual clause nodes 3790 #define GEN_CLANG_CLAUSE_CLASS 3791 #define CLAUSE_CLASS(Enum, Str, Class) \ 3792 case Enum: \ 3793 return getDerived().Transform##Class(cast<Class>(S)); 3794 #include "llvm/Frontend/OpenMP/OMP.inc" 3795 } 3796 3797 return S; 3798 } 3799 3800 3801 template<typename Derived> 3802 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3803 if (!E) 3804 return E; 3805 3806 switch (E->getStmtClass()) { 3807 case Stmt::NoStmtClass: break; 3808 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3809 #define ABSTRACT_STMT(Stmt) 3810 #define EXPR(Node, Parent) \ 3811 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3812 #include "clang/AST/StmtNodes.inc" 3813 } 3814 3815 return E; 3816 } 3817 3818 template<typename Derived> 3819 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3820 bool NotCopyInit) { 3821 // Initializers are instantiated like expressions, except that various outer 3822 // layers are stripped. 3823 if (!Init) 3824 return Init; 3825 3826 if (auto *FE = dyn_cast<FullExpr>(Init)) 3827 Init = FE->getSubExpr(); 3828 3829 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3830 Init = AIL->getCommonExpr(); 3831 3832 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3833 Init = MTE->getSubExpr(); 3834 3835 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3836 Init = Binder->getSubExpr(); 3837 3838 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3839 Init = ICE->getSubExprAsWritten(); 3840 3841 if (CXXStdInitializerListExpr *ILE = 3842 dyn_cast<CXXStdInitializerListExpr>(Init)) 3843 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3844 3845 // If this is copy-initialization, we only need to reconstruct 3846 // InitListExprs. Other forms of copy-initialization will be a no-op if 3847 // the initializer is already the right type. 3848 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3849 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3850 return getDerived().TransformExpr(Init); 3851 3852 // Revert value-initialization back to empty parens. 3853 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3854 SourceRange Parens = VIE->getSourceRange(); 3855 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3856 Parens.getEnd()); 3857 } 3858 3859 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3860 if (isa<ImplicitValueInitExpr>(Init)) 3861 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3862 SourceLocation()); 3863 3864 // Revert initialization by constructor back to a parenthesized or braced list 3865 // of expressions. Any other form of initializer can just be reused directly. 3866 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3867 return getDerived().TransformExpr(Init); 3868 3869 // If the initialization implicitly converted an initializer list to a 3870 // std::initializer_list object, unwrap the std::initializer_list too. 3871 if (Construct && Construct->isStdInitListInitialization()) 3872 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3873 3874 // Enter a list-init context if this was list initialization. 3875 EnterExpressionEvaluationContext Context( 3876 getSema(), EnterExpressionEvaluationContext::InitList, 3877 Construct->isListInitialization()); 3878 3879 SmallVector<Expr*, 8> NewArgs; 3880 bool ArgChanged = false; 3881 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3882 /*IsCall*/true, NewArgs, &ArgChanged)) 3883 return ExprError(); 3884 3885 // If this was list initialization, revert to syntactic list form. 3886 if (Construct->isListInitialization()) 3887 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3888 Construct->getEndLoc()); 3889 3890 // Build a ParenListExpr to represent anything else. 3891 SourceRange Parens = Construct->getParenOrBraceRange(); 3892 if (Parens.isInvalid()) { 3893 // This was a variable declaration's initialization for which no initializer 3894 // was specified. 3895 assert(NewArgs.empty() && 3896 "no parens or braces but have direct init with arguments?"); 3897 return ExprEmpty(); 3898 } 3899 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3900 Parens.getEnd()); 3901 } 3902 3903 template<typename Derived> 3904 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3905 unsigned NumInputs, 3906 bool IsCall, 3907 SmallVectorImpl<Expr *> &Outputs, 3908 bool *ArgChanged) { 3909 for (unsigned I = 0; I != NumInputs; ++I) { 3910 // If requested, drop call arguments that need to be dropped. 3911 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3912 if (ArgChanged) 3913 *ArgChanged = true; 3914 3915 break; 3916 } 3917 3918 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3919 Expr *Pattern = Expansion->getPattern(); 3920 3921 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3922 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3923 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3924 3925 // Determine whether the set of unexpanded parameter packs can and should 3926 // be expanded. 3927 bool Expand = true; 3928 bool RetainExpansion = false; 3929 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3930 Optional<unsigned> NumExpansions = OrigNumExpansions; 3931 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3932 Pattern->getSourceRange(), 3933 Unexpanded, 3934 Expand, RetainExpansion, 3935 NumExpansions)) 3936 return true; 3937 3938 if (!Expand) { 3939 // The transform has determined that we should perform a simple 3940 // transformation on the pack expansion, producing another pack 3941 // expansion. 3942 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3943 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3944 if (OutPattern.isInvalid()) 3945 return true; 3946 3947 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3948 Expansion->getEllipsisLoc(), 3949 NumExpansions); 3950 if (Out.isInvalid()) 3951 return true; 3952 3953 if (ArgChanged) 3954 *ArgChanged = true; 3955 Outputs.push_back(Out.get()); 3956 continue; 3957 } 3958 3959 // Record right away that the argument was changed. This needs 3960 // to happen even if the array expands to nothing. 3961 if (ArgChanged) *ArgChanged = true; 3962 3963 // The transform has determined that we should perform an elementwise 3964 // expansion of the pattern. Do so. 3965 for (unsigned I = 0; I != *NumExpansions; ++I) { 3966 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3967 ExprResult Out = getDerived().TransformExpr(Pattern); 3968 if (Out.isInvalid()) 3969 return true; 3970 3971 if (Out.get()->containsUnexpandedParameterPack()) { 3972 Out = getDerived().RebuildPackExpansion( 3973 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3974 if (Out.isInvalid()) 3975 return true; 3976 } 3977 3978 Outputs.push_back(Out.get()); 3979 } 3980 3981 // If we're supposed to retain a pack expansion, do so by temporarily 3982 // forgetting the partially-substituted parameter pack. 3983 if (RetainExpansion) { 3984 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3985 3986 ExprResult Out = getDerived().TransformExpr(Pattern); 3987 if (Out.isInvalid()) 3988 return true; 3989 3990 Out = getDerived().RebuildPackExpansion( 3991 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3992 if (Out.isInvalid()) 3993 return true; 3994 3995 Outputs.push_back(Out.get()); 3996 } 3997 3998 continue; 3999 } 4000 4001 ExprResult Result = 4002 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4003 : getDerived().TransformExpr(Inputs[I]); 4004 if (Result.isInvalid()) 4005 return true; 4006 4007 if (Result.get() != Inputs[I] && ArgChanged) 4008 *ArgChanged = true; 4009 4010 Outputs.push_back(Result.get()); 4011 } 4012 4013 return false; 4014 } 4015 4016 template <typename Derived> 4017 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4018 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4019 if (Var) { 4020 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4021 getDerived().TransformDefinition(Var->getLocation(), Var)); 4022 4023 if (!ConditionVar) 4024 return Sema::ConditionError(); 4025 4026 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4027 } 4028 4029 if (Expr) { 4030 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4031 4032 if (CondExpr.isInvalid()) 4033 return Sema::ConditionError(); 4034 4035 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 4036 } 4037 4038 return Sema::ConditionResult(); 4039 } 4040 4041 template <typename Derived> 4042 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4043 NestedNameSpecifierLoc NNS, QualType ObjectType, 4044 NamedDecl *FirstQualifierInScope) { 4045 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4046 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4047 Qualifier = Qualifier.getPrefix()) 4048 Qualifiers.push_back(Qualifier); 4049 4050 CXXScopeSpec SS; 4051 while (!Qualifiers.empty()) { 4052 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4053 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4054 4055 switch (QNNS->getKind()) { 4056 case NestedNameSpecifier::Identifier: { 4057 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4058 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4059 ObjectType); 4060 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4061 SS, FirstQualifierInScope, false)) 4062 return NestedNameSpecifierLoc(); 4063 break; 4064 } 4065 4066 case NestedNameSpecifier::Namespace: { 4067 NamespaceDecl *NS = 4068 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4069 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4070 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4071 break; 4072 } 4073 4074 case NestedNameSpecifier::NamespaceAlias: { 4075 NamespaceAliasDecl *Alias = 4076 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4077 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4078 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4079 Q.getLocalEndLoc()); 4080 break; 4081 } 4082 4083 case NestedNameSpecifier::Global: 4084 // There is no meaningful transformation that one could perform on the 4085 // global scope. 4086 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4087 break; 4088 4089 case NestedNameSpecifier::Super: { 4090 CXXRecordDecl *RD = 4091 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4092 SourceLocation(), QNNS->getAsRecordDecl())); 4093 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4094 break; 4095 } 4096 4097 case NestedNameSpecifier::TypeSpecWithTemplate: 4098 case NestedNameSpecifier::TypeSpec: { 4099 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4100 FirstQualifierInScope, SS); 4101 4102 if (!TL) 4103 return NestedNameSpecifierLoc(); 4104 4105 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4106 (SemaRef.getLangOpts().CPlusPlus11 && 4107 TL.getType()->isEnumeralType())) { 4108 assert(!TL.getType().hasLocalQualifiers() && 4109 "Can't get cv-qualifiers here"); 4110 if (TL.getType()->isEnumeralType()) 4111 SemaRef.Diag(TL.getBeginLoc(), 4112 diag::warn_cxx98_compat_enum_nested_name_spec); 4113 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4114 Q.getLocalEndLoc()); 4115 break; 4116 } 4117 // If the nested-name-specifier is an invalid type def, don't emit an 4118 // error because a previous error should have already been emitted. 4119 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4120 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4121 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4122 << TL.getType() << SS.getRange(); 4123 } 4124 return NestedNameSpecifierLoc(); 4125 } 4126 } 4127 4128 // The qualifier-in-scope and object type only apply to the leftmost entity. 4129 FirstQualifierInScope = nullptr; 4130 ObjectType = QualType(); 4131 } 4132 4133 // Don't rebuild the nested-name-specifier if we don't have to. 4134 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4135 !getDerived().AlwaysRebuild()) 4136 return NNS; 4137 4138 // If we can re-use the source-location data from the original 4139 // nested-name-specifier, do so. 4140 if (SS.location_size() == NNS.getDataLength() && 4141 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4142 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4143 4144 // Allocate new nested-name-specifier location information. 4145 return SS.getWithLocInContext(SemaRef.Context); 4146 } 4147 4148 template<typename Derived> 4149 DeclarationNameInfo 4150 TreeTransform<Derived> 4151 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4152 DeclarationName Name = NameInfo.getName(); 4153 if (!Name) 4154 return DeclarationNameInfo(); 4155 4156 switch (Name.getNameKind()) { 4157 case DeclarationName::Identifier: 4158 case DeclarationName::ObjCZeroArgSelector: 4159 case DeclarationName::ObjCOneArgSelector: 4160 case DeclarationName::ObjCMultiArgSelector: 4161 case DeclarationName::CXXOperatorName: 4162 case DeclarationName::CXXLiteralOperatorName: 4163 case DeclarationName::CXXUsingDirective: 4164 return NameInfo; 4165 4166 case DeclarationName::CXXDeductionGuideName: { 4167 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4168 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4169 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4170 if (!NewTemplate) 4171 return DeclarationNameInfo(); 4172 4173 DeclarationNameInfo NewNameInfo(NameInfo); 4174 NewNameInfo.setName( 4175 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4176 return NewNameInfo; 4177 } 4178 4179 case DeclarationName::CXXConstructorName: 4180 case DeclarationName::CXXDestructorName: 4181 case DeclarationName::CXXConversionFunctionName: { 4182 TypeSourceInfo *NewTInfo; 4183 CanQualType NewCanTy; 4184 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4185 NewTInfo = getDerived().TransformType(OldTInfo); 4186 if (!NewTInfo) 4187 return DeclarationNameInfo(); 4188 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4189 } 4190 else { 4191 NewTInfo = nullptr; 4192 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4193 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4194 if (NewT.isNull()) 4195 return DeclarationNameInfo(); 4196 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4197 } 4198 4199 DeclarationName NewName 4200 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4201 NewCanTy); 4202 DeclarationNameInfo NewNameInfo(NameInfo); 4203 NewNameInfo.setName(NewName); 4204 NewNameInfo.setNamedTypeInfo(NewTInfo); 4205 return NewNameInfo; 4206 } 4207 } 4208 4209 llvm_unreachable("Unknown name kind."); 4210 } 4211 4212 template<typename Derived> 4213 TemplateName 4214 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4215 TemplateName Name, 4216 SourceLocation NameLoc, 4217 QualType ObjectType, 4218 NamedDecl *FirstQualifierInScope, 4219 bool AllowInjectedClassName) { 4220 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4221 TemplateDecl *Template = QTN->getTemplateDecl(); 4222 assert(Template && "qualified template name must refer to a template"); 4223 4224 TemplateDecl *TransTemplate 4225 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4226 Template)); 4227 if (!TransTemplate) 4228 return TemplateName(); 4229 4230 if (!getDerived().AlwaysRebuild() && 4231 SS.getScopeRep() == QTN->getQualifier() && 4232 TransTemplate == Template) 4233 return Name; 4234 4235 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4236 TransTemplate); 4237 } 4238 4239 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4240 if (SS.getScopeRep()) { 4241 // These apply to the scope specifier, not the template. 4242 ObjectType = QualType(); 4243 FirstQualifierInScope = nullptr; 4244 } 4245 4246 if (!getDerived().AlwaysRebuild() && 4247 SS.getScopeRep() == DTN->getQualifier() && 4248 ObjectType.isNull()) 4249 return Name; 4250 4251 // FIXME: Preserve the location of the "template" keyword. 4252 SourceLocation TemplateKWLoc = NameLoc; 4253 4254 if (DTN->isIdentifier()) { 4255 return getDerived().RebuildTemplateName(SS, 4256 TemplateKWLoc, 4257 *DTN->getIdentifier(), 4258 NameLoc, 4259 ObjectType, 4260 FirstQualifierInScope, 4261 AllowInjectedClassName); 4262 } 4263 4264 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4265 DTN->getOperator(), NameLoc, 4266 ObjectType, AllowInjectedClassName); 4267 } 4268 4269 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4270 TemplateDecl *TransTemplate 4271 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4272 Template)); 4273 if (!TransTemplate) 4274 return TemplateName(); 4275 4276 if (!getDerived().AlwaysRebuild() && 4277 TransTemplate == Template) 4278 return Name; 4279 4280 return TemplateName(TransTemplate); 4281 } 4282 4283 if (SubstTemplateTemplateParmPackStorage *SubstPack 4284 = Name.getAsSubstTemplateTemplateParmPack()) { 4285 TemplateTemplateParmDecl *TransParam 4286 = cast_or_null<TemplateTemplateParmDecl>( 4287 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4288 if (!TransParam) 4289 return TemplateName(); 4290 4291 if (!getDerived().AlwaysRebuild() && 4292 TransParam == SubstPack->getParameterPack()) 4293 return Name; 4294 4295 return getDerived().RebuildTemplateName(TransParam, 4296 SubstPack->getArgumentPack()); 4297 } 4298 4299 // These should be getting filtered out before they reach the AST. 4300 llvm_unreachable("overloaded function decl survived to here"); 4301 } 4302 4303 template<typename Derived> 4304 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4305 const TemplateArgument &Arg, 4306 TemplateArgumentLoc &Output) { 4307 Output = getSema().getTrivialTemplateArgumentLoc( 4308 Arg, QualType(), getDerived().getBaseLocation()); 4309 } 4310 4311 template<typename Derived> 4312 bool TreeTransform<Derived>::TransformTemplateArgument( 4313 const TemplateArgumentLoc &Input, 4314 TemplateArgumentLoc &Output, bool Uneval) { 4315 const TemplateArgument &Arg = Input.getArgument(); 4316 switch (Arg.getKind()) { 4317 case TemplateArgument::Null: 4318 case TemplateArgument::Pack: 4319 llvm_unreachable("Unexpected TemplateArgument"); 4320 4321 case TemplateArgument::Integral: 4322 case TemplateArgument::NullPtr: 4323 case TemplateArgument::Declaration: { 4324 // Transform a resolved template argument straight to a resolved template 4325 // argument. We get here when substituting into an already-substituted 4326 // template type argument during concept satisfaction checking. 4327 QualType T = Arg.getNonTypeTemplateArgumentType(); 4328 QualType NewT = getDerived().TransformType(T); 4329 if (NewT.isNull()) 4330 return true; 4331 4332 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4333 ? Arg.getAsDecl() 4334 : nullptr; 4335 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4336 getDerived().getBaseLocation(), D)) 4337 : nullptr; 4338 if (D && !NewD) 4339 return true; 4340 4341 if (NewT == T && D == NewD) 4342 Output = Input; 4343 else if (Arg.getKind() == TemplateArgument::Integral) 4344 Output = TemplateArgumentLoc( 4345 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4346 TemplateArgumentLocInfo()); 4347 else if (Arg.getKind() == TemplateArgument::NullPtr) 4348 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4349 TemplateArgumentLocInfo()); 4350 else 4351 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4352 TemplateArgumentLocInfo()); 4353 4354 return false; 4355 } 4356 4357 case TemplateArgument::Type: { 4358 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4359 if (!DI) 4360 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4361 4362 DI = getDerived().TransformType(DI); 4363 if (!DI) return true; 4364 4365 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4366 return false; 4367 } 4368 4369 case TemplateArgument::Template: { 4370 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4371 if (QualifierLoc) { 4372 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4373 if (!QualifierLoc) 4374 return true; 4375 } 4376 4377 CXXScopeSpec SS; 4378 SS.Adopt(QualifierLoc); 4379 TemplateName Template 4380 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4381 Input.getTemplateNameLoc()); 4382 if (Template.isNull()) 4383 return true; 4384 4385 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4386 QualifierLoc, Input.getTemplateNameLoc()); 4387 return false; 4388 } 4389 4390 case TemplateArgument::TemplateExpansion: 4391 llvm_unreachable("Caller should expand pack expansions"); 4392 4393 case TemplateArgument::Expression: { 4394 // Template argument expressions are constant expressions. 4395 EnterExpressionEvaluationContext Unevaluated( 4396 getSema(), 4397 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4398 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4399 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4400 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4401 4402 Expr *InputExpr = Input.getSourceExpression(); 4403 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4404 4405 ExprResult E = getDerived().TransformExpr(InputExpr); 4406 E = SemaRef.ActOnConstantExpression(E); 4407 if (E.isInvalid()) return true; 4408 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4409 return false; 4410 } 4411 } 4412 4413 // Work around bogus GCC warning 4414 return true; 4415 } 4416 4417 /// Iterator adaptor that invents template argument location information 4418 /// for each of the template arguments in its underlying iterator. 4419 template<typename Derived, typename InputIterator> 4420 class TemplateArgumentLocInventIterator { 4421 TreeTransform<Derived> &Self; 4422 InputIterator Iter; 4423 4424 public: 4425 typedef TemplateArgumentLoc value_type; 4426 typedef TemplateArgumentLoc reference; 4427 typedef typename std::iterator_traits<InputIterator>::difference_type 4428 difference_type; 4429 typedef std::input_iterator_tag iterator_category; 4430 4431 class pointer { 4432 TemplateArgumentLoc Arg; 4433 4434 public: 4435 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4436 4437 const TemplateArgumentLoc *operator->() const { return &Arg; } 4438 }; 4439 4440 TemplateArgumentLocInventIterator() { } 4441 4442 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4443 InputIterator Iter) 4444 : Self(Self), Iter(Iter) { } 4445 4446 TemplateArgumentLocInventIterator &operator++() { 4447 ++Iter; 4448 return *this; 4449 } 4450 4451 TemplateArgumentLocInventIterator operator++(int) { 4452 TemplateArgumentLocInventIterator Old(*this); 4453 ++(*this); 4454 return Old; 4455 } 4456 4457 reference operator*() const { 4458 TemplateArgumentLoc Result; 4459 Self.InventTemplateArgumentLoc(*Iter, Result); 4460 return Result; 4461 } 4462 4463 pointer operator->() const { return pointer(**this); } 4464 4465 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4466 const TemplateArgumentLocInventIterator &Y) { 4467 return X.Iter == Y.Iter; 4468 } 4469 4470 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4471 const TemplateArgumentLocInventIterator &Y) { 4472 return X.Iter != Y.Iter; 4473 } 4474 }; 4475 4476 template<typename Derived> 4477 template<typename InputIterator> 4478 bool TreeTransform<Derived>::TransformTemplateArguments( 4479 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4480 bool Uneval) { 4481 for (; First != Last; ++First) { 4482 TemplateArgumentLoc Out; 4483 TemplateArgumentLoc In = *First; 4484 4485 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4486 // Unpack argument packs, which we translate them into separate 4487 // arguments. 4488 // FIXME: We could do much better if we could guarantee that the 4489 // TemplateArgumentLocInfo for the pack expansion would be usable for 4490 // all of the template arguments in the argument pack. 4491 typedef TemplateArgumentLocInventIterator<Derived, 4492 TemplateArgument::pack_iterator> 4493 PackLocIterator; 4494 if (TransformTemplateArguments(PackLocIterator(*this, 4495 In.getArgument().pack_begin()), 4496 PackLocIterator(*this, 4497 In.getArgument().pack_end()), 4498 Outputs, Uneval)) 4499 return true; 4500 4501 continue; 4502 } 4503 4504 if (In.getArgument().isPackExpansion()) { 4505 // We have a pack expansion, for which we will be substituting into 4506 // the pattern. 4507 SourceLocation Ellipsis; 4508 Optional<unsigned> OrigNumExpansions; 4509 TemplateArgumentLoc Pattern 4510 = getSema().getTemplateArgumentPackExpansionPattern( 4511 In, Ellipsis, OrigNumExpansions); 4512 4513 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4514 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4515 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4516 4517 // Determine whether the set of unexpanded parameter packs can and should 4518 // be expanded. 4519 bool Expand = true; 4520 bool RetainExpansion = false; 4521 Optional<unsigned> NumExpansions = OrigNumExpansions; 4522 if (getDerived().TryExpandParameterPacks(Ellipsis, 4523 Pattern.getSourceRange(), 4524 Unexpanded, 4525 Expand, 4526 RetainExpansion, 4527 NumExpansions)) 4528 return true; 4529 4530 if (!Expand) { 4531 // The transform has determined that we should perform a simple 4532 // transformation on the pack expansion, producing another pack 4533 // expansion. 4534 TemplateArgumentLoc OutPattern; 4535 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4536 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4537 return true; 4538 4539 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4540 NumExpansions); 4541 if (Out.getArgument().isNull()) 4542 return true; 4543 4544 Outputs.addArgument(Out); 4545 continue; 4546 } 4547 4548 // The transform has determined that we should perform an elementwise 4549 // expansion of the pattern. Do so. 4550 for (unsigned I = 0; I != *NumExpansions; ++I) { 4551 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4552 4553 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4554 return true; 4555 4556 if (Out.getArgument().containsUnexpandedParameterPack()) { 4557 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4558 OrigNumExpansions); 4559 if (Out.getArgument().isNull()) 4560 return true; 4561 } 4562 4563 Outputs.addArgument(Out); 4564 } 4565 4566 // If we're supposed to retain a pack expansion, do so by temporarily 4567 // forgetting the partially-substituted parameter pack. 4568 if (RetainExpansion) { 4569 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4570 4571 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4572 return true; 4573 4574 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4575 OrigNumExpansions); 4576 if (Out.getArgument().isNull()) 4577 return true; 4578 4579 Outputs.addArgument(Out); 4580 } 4581 4582 continue; 4583 } 4584 4585 // The simple case: 4586 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4587 return true; 4588 4589 Outputs.addArgument(Out); 4590 } 4591 4592 return false; 4593 4594 } 4595 4596 //===----------------------------------------------------------------------===// 4597 // Type transformation 4598 //===----------------------------------------------------------------------===// 4599 4600 template<typename Derived> 4601 QualType TreeTransform<Derived>::TransformType(QualType T) { 4602 if (getDerived().AlreadyTransformed(T)) 4603 return T; 4604 4605 // Temporary workaround. All of these transformations should 4606 // eventually turn into transformations on TypeLocs. 4607 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4608 getDerived().getBaseLocation()); 4609 4610 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4611 4612 if (!NewDI) 4613 return QualType(); 4614 4615 return NewDI->getType(); 4616 } 4617 4618 template<typename Derived> 4619 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4620 // Refine the base location to the type's location. 4621 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4622 getDerived().getBaseEntity()); 4623 if (getDerived().AlreadyTransformed(DI->getType())) 4624 return DI; 4625 4626 TypeLocBuilder TLB; 4627 4628 TypeLoc TL = DI->getTypeLoc(); 4629 TLB.reserve(TL.getFullDataSize()); 4630 4631 QualType Result = getDerived().TransformType(TLB, TL); 4632 if (Result.isNull()) 4633 return nullptr; 4634 4635 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4636 } 4637 4638 template<typename Derived> 4639 QualType 4640 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4641 switch (T.getTypeLocClass()) { 4642 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4643 #define TYPELOC(CLASS, PARENT) \ 4644 case TypeLoc::CLASS: \ 4645 return getDerived().Transform##CLASS##Type(TLB, \ 4646 T.castAs<CLASS##TypeLoc>()); 4647 #include "clang/AST/TypeLocNodes.def" 4648 } 4649 4650 llvm_unreachable("unhandled type loc!"); 4651 } 4652 4653 template<typename Derived> 4654 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4655 if (!isa<DependentNameType>(T)) 4656 return TransformType(T); 4657 4658 if (getDerived().AlreadyTransformed(T)) 4659 return T; 4660 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4661 getDerived().getBaseLocation()); 4662 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4663 return NewDI ? NewDI->getType() : QualType(); 4664 } 4665 4666 template<typename Derived> 4667 TypeSourceInfo * 4668 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4669 if (!isa<DependentNameType>(DI->getType())) 4670 return TransformType(DI); 4671 4672 // Refine the base location to the type's location. 4673 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4674 getDerived().getBaseEntity()); 4675 if (getDerived().AlreadyTransformed(DI->getType())) 4676 return DI; 4677 4678 TypeLocBuilder TLB; 4679 4680 TypeLoc TL = DI->getTypeLoc(); 4681 TLB.reserve(TL.getFullDataSize()); 4682 4683 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4684 if (QTL) 4685 TL = QTL.getUnqualifiedLoc(); 4686 4687 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4688 4689 QualType Result = getDerived().TransformDependentNameType( 4690 TLB, DNTL, /*DeducedTSTContext*/true); 4691 if (Result.isNull()) 4692 return nullptr; 4693 4694 if (QTL) { 4695 Result = getDerived().RebuildQualifiedType(Result, QTL); 4696 if (Result.isNull()) 4697 return nullptr; 4698 TLB.TypeWasModifiedSafely(Result); 4699 } 4700 4701 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4702 } 4703 4704 template<typename Derived> 4705 QualType 4706 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4707 QualifiedTypeLoc T) { 4708 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4709 if (Result.isNull()) 4710 return QualType(); 4711 4712 Result = getDerived().RebuildQualifiedType(Result, T); 4713 4714 if (Result.isNull()) 4715 return QualType(); 4716 4717 // RebuildQualifiedType might have updated the type, but not in a way 4718 // that invalidates the TypeLoc. (There's no location information for 4719 // qualifiers.) 4720 TLB.TypeWasModifiedSafely(Result); 4721 4722 return Result; 4723 } 4724 4725 template <typename Derived> 4726 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4727 QualifiedTypeLoc TL) { 4728 4729 SourceLocation Loc = TL.getBeginLoc(); 4730 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4731 4732 if (((T.getAddressSpace() != LangAS::Default && 4733 Quals.getAddressSpace() != LangAS::Default)) && 4734 T.getAddressSpace() != Quals.getAddressSpace()) { 4735 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4736 << TL.getType() << T; 4737 return QualType(); 4738 } 4739 4740 // C++ [dcl.fct]p7: 4741 // [When] adding cv-qualifications on top of the function type [...] the 4742 // cv-qualifiers are ignored. 4743 if (T->isFunctionType()) { 4744 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4745 Quals.getAddressSpace()); 4746 return T; 4747 } 4748 4749 // C++ [dcl.ref]p1: 4750 // when the cv-qualifiers are introduced through the use of a typedef-name 4751 // or decltype-specifier [...] the cv-qualifiers are ignored. 4752 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4753 // applied to a reference type. 4754 if (T->isReferenceType()) { 4755 // The only qualifier that applies to a reference type is restrict. 4756 if (!Quals.hasRestrict()) 4757 return T; 4758 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4759 } 4760 4761 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4762 // resulting type. 4763 if (Quals.hasObjCLifetime()) { 4764 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4765 Quals.removeObjCLifetime(); 4766 else if (T.getObjCLifetime()) { 4767 // Objective-C ARC: 4768 // A lifetime qualifier applied to a substituted template parameter 4769 // overrides the lifetime qualifier from the template argument. 4770 const AutoType *AutoTy; 4771 if (const SubstTemplateTypeParmType *SubstTypeParam 4772 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4773 QualType Replacement = SubstTypeParam->getReplacementType(); 4774 Qualifiers Qs = Replacement.getQualifiers(); 4775 Qs.removeObjCLifetime(); 4776 Replacement = SemaRef.Context.getQualifiedType( 4777 Replacement.getUnqualifiedType(), Qs); 4778 T = SemaRef.Context.getSubstTemplateTypeParmType( 4779 SubstTypeParam->getReplacedParameter(), Replacement); 4780 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4781 // 'auto' types behave the same way as template parameters. 4782 QualType Deduced = AutoTy->getDeducedType(); 4783 Qualifiers Qs = Deduced.getQualifiers(); 4784 Qs.removeObjCLifetime(); 4785 Deduced = 4786 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4787 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4788 AutoTy->isDependentType(), 4789 /*isPack=*/false, 4790 AutoTy->getTypeConstraintConcept(), 4791 AutoTy->getTypeConstraintArguments()); 4792 } else { 4793 // Otherwise, complain about the addition of a qualifier to an 4794 // already-qualified type. 4795 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4796 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4797 Quals.removeObjCLifetime(); 4798 } 4799 } 4800 } 4801 4802 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4803 } 4804 4805 template<typename Derived> 4806 TypeLoc 4807 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4808 QualType ObjectType, 4809 NamedDecl *UnqualLookup, 4810 CXXScopeSpec &SS) { 4811 if (getDerived().AlreadyTransformed(TL.getType())) 4812 return TL; 4813 4814 TypeSourceInfo *TSI = 4815 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4816 if (TSI) 4817 return TSI->getTypeLoc(); 4818 return TypeLoc(); 4819 } 4820 4821 template<typename Derived> 4822 TypeSourceInfo * 4823 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4824 QualType ObjectType, 4825 NamedDecl *UnqualLookup, 4826 CXXScopeSpec &SS) { 4827 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4828 return TSInfo; 4829 4830 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4831 UnqualLookup, SS); 4832 } 4833 4834 template <typename Derived> 4835 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4836 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4837 CXXScopeSpec &SS) { 4838 QualType T = TL.getType(); 4839 assert(!getDerived().AlreadyTransformed(T)); 4840 4841 TypeLocBuilder TLB; 4842 QualType Result; 4843 4844 if (isa<TemplateSpecializationType>(T)) { 4845 TemplateSpecializationTypeLoc SpecTL = 4846 TL.castAs<TemplateSpecializationTypeLoc>(); 4847 4848 TemplateName Template = getDerived().TransformTemplateName( 4849 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4850 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4851 if (Template.isNull()) 4852 return nullptr; 4853 4854 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4855 Template); 4856 } else if (isa<DependentTemplateSpecializationType>(T)) { 4857 DependentTemplateSpecializationTypeLoc SpecTL = 4858 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4859 4860 TemplateName Template 4861 = getDerived().RebuildTemplateName(SS, 4862 SpecTL.getTemplateKeywordLoc(), 4863 *SpecTL.getTypePtr()->getIdentifier(), 4864 SpecTL.getTemplateNameLoc(), 4865 ObjectType, UnqualLookup, 4866 /*AllowInjectedClassName*/true); 4867 if (Template.isNull()) 4868 return nullptr; 4869 4870 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4871 SpecTL, 4872 Template, 4873 SS); 4874 } else { 4875 // Nothing special needs to be done for these. 4876 Result = getDerived().TransformType(TLB, TL); 4877 } 4878 4879 if (Result.isNull()) 4880 return nullptr; 4881 4882 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4883 } 4884 4885 template <class TyLoc> static inline 4886 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4887 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4888 NewT.setNameLoc(T.getNameLoc()); 4889 return T.getType(); 4890 } 4891 4892 template<typename Derived> 4893 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4894 BuiltinTypeLoc T) { 4895 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4896 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4897 if (T.needsExtraLocalData()) 4898 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4899 return T.getType(); 4900 } 4901 4902 template<typename Derived> 4903 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4904 ComplexTypeLoc T) { 4905 // FIXME: recurse? 4906 return TransformTypeSpecType(TLB, T); 4907 } 4908 4909 template <typename Derived> 4910 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4911 AdjustedTypeLoc TL) { 4912 // Adjustments applied during transformation are handled elsewhere. 4913 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4914 } 4915 4916 template<typename Derived> 4917 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4918 DecayedTypeLoc TL) { 4919 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4920 if (OriginalType.isNull()) 4921 return QualType(); 4922 4923 QualType Result = TL.getType(); 4924 if (getDerived().AlwaysRebuild() || 4925 OriginalType != TL.getOriginalLoc().getType()) 4926 Result = SemaRef.Context.getDecayedType(OriginalType); 4927 TLB.push<DecayedTypeLoc>(Result); 4928 // Nothing to set for DecayedTypeLoc. 4929 return Result; 4930 } 4931 4932 template<typename Derived> 4933 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4934 PointerTypeLoc TL) { 4935 QualType PointeeType 4936 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4937 if (PointeeType.isNull()) 4938 return QualType(); 4939 4940 QualType Result = TL.getType(); 4941 if (PointeeType->getAs<ObjCObjectType>()) { 4942 // A dependent pointer type 'T *' has is being transformed such 4943 // that an Objective-C class type is being replaced for 'T'. The 4944 // resulting pointer type is an ObjCObjectPointerType, not a 4945 // PointerType. 4946 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4947 4948 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4949 NewT.setStarLoc(TL.getStarLoc()); 4950 return Result; 4951 } 4952 4953 if (getDerived().AlwaysRebuild() || 4954 PointeeType != TL.getPointeeLoc().getType()) { 4955 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4956 if (Result.isNull()) 4957 return QualType(); 4958 } 4959 4960 // Objective-C ARC can add lifetime qualifiers to the type that we're 4961 // pointing to. 4962 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4963 4964 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4965 NewT.setSigilLoc(TL.getSigilLoc()); 4966 return Result; 4967 } 4968 4969 template<typename Derived> 4970 QualType 4971 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4972 BlockPointerTypeLoc TL) { 4973 QualType PointeeType 4974 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4975 if (PointeeType.isNull()) 4976 return QualType(); 4977 4978 QualType Result = TL.getType(); 4979 if (getDerived().AlwaysRebuild() || 4980 PointeeType != TL.getPointeeLoc().getType()) { 4981 Result = getDerived().RebuildBlockPointerType(PointeeType, 4982 TL.getSigilLoc()); 4983 if (Result.isNull()) 4984 return QualType(); 4985 } 4986 4987 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4988 NewT.setSigilLoc(TL.getSigilLoc()); 4989 return Result; 4990 } 4991 4992 /// Transforms a reference type. Note that somewhat paradoxically we 4993 /// don't care whether the type itself is an l-value type or an r-value 4994 /// type; we only care if the type was *written* as an l-value type 4995 /// or an r-value type. 4996 template<typename Derived> 4997 QualType 4998 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4999 ReferenceTypeLoc TL) { 5000 const ReferenceType *T = TL.getTypePtr(); 5001 5002 // Note that this works with the pointee-as-written. 5003 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5004 if (PointeeType.isNull()) 5005 return QualType(); 5006 5007 QualType Result = TL.getType(); 5008 if (getDerived().AlwaysRebuild() || 5009 PointeeType != T->getPointeeTypeAsWritten()) { 5010 Result = getDerived().RebuildReferenceType(PointeeType, 5011 T->isSpelledAsLValue(), 5012 TL.getSigilLoc()); 5013 if (Result.isNull()) 5014 return QualType(); 5015 } 5016 5017 // Objective-C ARC can add lifetime qualifiers to the type that we're 5018 // referring to. 5019 TLB.TypeWasModifiedSafely( 5020 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5021 5022 // r-value references can be rebuilt as l-value references. 5023 ReferenceTypeLoc NewTL; 5024 if (isa<LValueReferenceType>(Result)) 5025 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5026 else 5027 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5028 NewTL.setSigilLoc(TL.getSigilLoc()); 5029 5030 return Result; 5031 } 5032 5033 template<typename Derived> 5034 QualType 5035 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5036 LValueReferenceTypeLoc TL) { 5037 return TransformReferenceType(TLB, TL); 5038 } 5039 5040 template<typename Derived> 5041 QualType 5042 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5043 RValueReferenceTypeLoc TL) { 5044 return TransformReferenceType(TLB, TL); 5045 } 5046 5047 template<typename Derived> 5048 QualType 5049 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5050 MemberPointerTypeLoc TL) { 5051 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5052 if (PointeeType.isNull()) 5053 return QualType(); 5054 5055 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5056 TypeSourceInfo *NewClsTInfo = nullptr; 5057 if (OldClsTInfo) { 5058 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5059 if (!NewClsTInfo) 5060 return QualType(); 5061 } 5062 5063 const MemberPointerType *T = TL.getTypePtr(); 5064 QualType OldClsType = QualType(T->getClass(), 0); 5065 QualType NewClsType; 5066 if (NewClsTInfo) 5067 NewClsType = NewClsTInfo->getType(); 5068 else { 5069 NewClsType = getDerived().TransformType(OldClsType); 5070 if (NewClsType.isNull()) 5071 return QualType(); 5072 } 5073 5074 QualType Result = TL.getType(); 5075 if (getDerived().AlwaysRebuild() || 5076 PointeeType != T->getPointeeType() || 5077 NewClsType != OldClsType) { 5078 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5079 TL.getStarLoc()); 5080 if (Result.isNull()) 5081 return QualType(); 5082 } 5083 5084 // If we had to adjust the pointee type when building a member pointer, make 5085 // sure to push TypeLoc info for it. 5086 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5087 if (MPT && PointeeType != MPT->getPointeeType()) { 5088 assert(isa<AdjustedType>(MPT->getPointeeType())); 5089 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5090 } 5091 5092 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5093 NewTL.setSigilLoc(TL.getSigilLoc()); 5094 NewTL.setClassTInfo(NewClsTInfo); 5095 5096 return Result; 5097 } 5098 5099 template<typename Derived> 5100 QualType 5101 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5102 ConstantArrayTypeLoc TL) { 5103 const ConstantArrayType *T = TL.getTypePtr(); 5104 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5105 if (ElementType.isNull()) 5106 return QualType(); 5107 5108 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5109 Expr *OldSize = TL.getSizeExpr(); 5110 if (!OldSize) 5111 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5112 Expr *NewSize = nullptr; 5113 if (OldSize) { 5114 EnterExpressionEvaluationContext Unevaluated( 5115 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5116 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5117 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5118 } 5119 5120 QualType Result = TL.getType(); 5121 if (getDerived().AlwaysRebuild() || 5122 ElementType != T->getElementType() || 5123 (T->getSizeExpr() && NewSize != OldSize)) { 5124 Result = getDerived().RebuildConstantArrayType(ElementType, 5125 T->getSizeModifier(), 5126 T->getSize(), NewSize, 5127 T->getIndexTypeCVRQualifiers(), 5128 TL.getBracketsRange()); 5129 if (Result.isNull()) 5130 return QualType(); 5131 } 5132 5133 // We might have either a ConstantArrayType or a VariableArrayType now: 5134 // a ConstantArrayType is allowed to have an element type which is a 5135 // VariableArrayType if the type is dependent. Fortunately, all array 5136 // types have the same location layout. 5137 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5138 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5139 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5140 NewTL.setSizeExpr(NewSize); 5141 5142 return Result; 5143 } 5144 5145 template<typename Derived> 5146 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5147 TypeLocBuilder &TLB, 5148 IncompleteArrayTypeLoc TL) { 5149 const IncompleteArrayType *T = TL.getTypePtr(); 5150 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5151 if (ElementType.isNull()) 5152 return QualType(); 5153 5154 QualType Result = TL.getType(); 5155 if (getDerived().AlwaysRebuild() || 5156 ElementType != T->getElementType()) { 5157 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5158 T->getSizeModifier(), 5159 T->getIndexTypeCVRQualifiers(), 5160 TL.getBracketsRange()); 5161 if (Result.isNull()) 5162 return QualType(); 5163 } 5164 5165 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5166 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5167 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5168 NewTL.setSizeExpr(nullptr); 5169 5170 return Result; 5171 } 5172 5173 template<typename Derived> 5174 QualType 5175 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5176 VariableArrayTypeLoc TL) { 5177 const VariableArrayType *T = TL.getTypePtr(); 5178 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5179 if (ElementType.isNull()) 5180 return QualType(); 5181 5182 ExprResult SizeResult; 5183 { 5184 EnterExpressionEvaluationContext Context( 5185 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5186 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5187 } 5188 if (SizeResult.isInvalid()) 5189 return QualType(); 5190 SizeResult = 5191 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5192 if (SizeResult.isInvalid()) 5193 return QualType(); 5194 5195 Expr *Size = SizeResult.get(); 5196 5197 QualType Result = TL.getType(); 5198 if (getDerived().AlwaysRebuild() || 5199 ElementType != T->getElementType() || 5200 Size != T->getSizeExpr()) { 5201 Result = getDerived().RebuildVariableArrayType(ElementType, 5202 T->getSizeModifier(), 5203 Size, 5204 T->getIndexTypeCVRQualifiers(), 5205 TL.getBracketsRange()); 5206 if (Result.isNull()) 5207 return QualType(); 5208 } 5209 5210 // We might have constant size array now, but fortunately it has the same 5211 // location layout. 5212 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5213 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5214 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5215 NewTL.setSizeExpr(Size); 5216 5217 return Result; 5218 } 5219 5220 template<typename Derived> 5221 QualType 5222 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5223 DependentSizedArrayTypeLoc TL) { 5224 const DependentSizedArrayType *T = TL.getTypePtr(); 5225 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5226 if (ElementType.isNull()) 5227 return QualType(); 5228 5229 // Array bounds are constant expressions. 5230 EnterExpressionEvaluationContext Unevaluated( 5231 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5232 5233 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5234 Expr *origSize = TL.getSizeExpr(); 5235 if (!origSize) origSize = T->getSizeExpr(); 5236 5237 ExprResult sizeResult 5238 = getDerived().TransformExpr(origSize); 5239 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5240 if (sizeResult.isInvalid()) 5241 return QualType(); 5242 5243 Expr *size = sizeResult.get(); 5244 5245 QualType Result = TL.getType(); 5246 if (getDerived().AlwaysRebuild() || 5247 ElementType != T->getElementType() || 5248 size != origSize) { 5249 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5250 T->getSizeModifier(), 5251 size, 5252 T->getIndexTypeCVRQualifiers(), 5253 TL.getBracketsRange()); 5254 if (Result.isNull()) 5255 return QualType(); 5256 } 5257 5258 // We might have any sort of array type now, but fortunately they 5259 // all have the same location layout. 5260 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5261 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5262 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5263 NewTL.setSizeExpr(size); 5264 5265 return Result; 5266 } 5267 5268 template <typename Derived> 5269 QualType TreeTransform<Derived>::TransformDependentVectorType( 5270 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5271 const DependentVectorType *T = TL.getTypePtr(); 5272 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5273 if (ElementType.isNull()) 5274 return QualType(); 5275 5276 EnterExpressionEvaluationContext Unevaluated( 5277 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5278 5279 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5280 Size = SemaRef.ActOnConstantExpression(Size); 5281 if (Size.isInvalid()) 5282 return QualType(); 5283 5284 QualType Result = TL.getType(); 5285 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5286 Size.get() != T->getSizeExpr()) { 5287 Result = getDerived().RebuildDependentVectorType( 5288 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5289 if (Result.isNull()) 5290 return QualType(); 5291 } 5292 5293 // Result might be dependent or not. 5294 if (isa<DependentVectorType>(Result)) { 5295 DependentVectorTypeLoc NewTL = 5296 TLB.push<DependentVectorTypeLoc>(Result); 5297 NewTL.setNameLoc(TL.getNameLoc()); 5298 } else { 5299 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5300 NewTL.setNameLoc(TL.getNameLoc()); 5301 } 5302 5303 return Result; 5304 } 5305 5306 template<typename Derived> 5307 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5308 TypeLocBuilder &TLB, 5309 DependentSizedExtVectorTypeLoc TL) { 5310 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5311 5312 // FIXME: ext vector locs should be nested 5313 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5314 if (ElementType.isNull()) 5315 return QualType(); 5316 5317 // Vector sizes are constant expressions. 5318 EnterExpressionEvaluationContext Unevaluated( 5319 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5320 5321 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5322 Size = SemaRef.ActOnConstantExpression(Size); 5323 if (Size.isInvalid()) 5324 return QualType(); 5325 5326 QualType Result = TL.getType(); 5327 if (getDerived().AlwaysRebuild() || 5328 ElementType != T->getElementType() || 5329 Size.get() != T->getSizeExpr()) { 5330 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5331 Size.get(), 5332 T->getAttributeLoc()); 5333 if (Result.isNull()) 5334 return QualType(); 5335 } 5336 5337 // Result might be dependent or not. 5338 if (isa<DependentSizedExtVectorType>(Result)) { 5339 DependentSizedExtVectorTypeLoc NewTL 5340 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5341 NewTL.setNameLoc(TL.getNameLoc()); 5342 } else { 5343 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5344 NewTL.setNameLoc(TL.getNameLoc()); 5345 } 5346 5347 return Result; 5348 } 5349 5350 template <typename Derived> 5351 QualType 5352 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5353 ConstantMatrixTypeLoc TL) { 5354 const ConstantMatrixType *T = TL.getTypePtr(); 5355 QualType ElementType = getDerived().TransformType(T->getElementType()); 5356 if (ElementType.isNull()) 5357 return QualType(); 5358 5359 QualType Result = TL.getType(); 5360 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5361 Result = getDerived().RebuildConstantMatrixType( 5362 ElementType, T->getNumRows(), T->getNumColumns()); 5363 if (Result.isNull()) 5364 return QualType(); 5365 } 5366 5367 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5368 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5369 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5370 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5371 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5372 5373 return Result; 5374 } 5375 5376 template <typename Derived> 5377 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5378 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5379 const DependentSizedMatrixType *T = TL.getTypePtr(); 5380 5381 QualType ElementType = getDerived().TransformType(T->getElementType()); 5382 if (ElementType.isNull()) { 5383 return QualType(); 5384 } 5385 5386 // Matrix dimensions are constant expressions. 5387 EnterExpressionEvaluationContext Unevaluated( 5388 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5389 5390 Expr *origRows = TL.getAttrRowOperand(); 5391 if (!origRows) 5392 origRows = T->getRowExpr(); 5393 Expr *origColumns = TL.getAttrColumnOperand(); 5394 if (!origColumns) 5395 origColumns = T->getColumnExpr(); 5396 5397 ExprResult rowResult = getDerived().TransformExpr(origRows); 5398 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5399 if (rowResult.isInvalid()) 5400 return QualType(); 5401 5402 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5403 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5404 if (columnResult.isInvalid()) 5405 return QualType(); 5406 5407 Expr *rows = rowResult.get(); 5408 Expr *columns = columnResult.get(); 5409 5410 QualType Result = TL.getType(); 5411 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5412 rows != origRows || columns != origColumns) { 5413 Result = getDerived().RebuildDependentSizedMatrixType( 5414 ElementType, rows, columns, T->getAttributeLoc()); 5415 5416 if (Result.isNull()) 5417 return QualType(); 5418 } 5419 5420 // We might have any sort of matrix type now, but fortunately they 5421 // all have the same location layout. 5422 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5423 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5424 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5425 NewTL.setAttrRowOperand(rows); 5426 NewTL.setAttrColumnOperand(columns); 5427 return Result; 5428 } 5429 5430 template <typename Derived> 5431 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5432 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5433 const DependentAddressSpaceType *T = TL.getTypePtr(); 5434 5435 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5436 5437 if (pointeeType.isNull()) 5438 return QualType(); 5439 5440 // Address spaces are constant expressions. 5441 EnterExpressionEvaluationContext Unevaluated( 5442 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5443 5444 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5445 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5446 if (AddrSpace.isInvalid()) 5447 return QualType(); 5448 5449 QualType Result = TL.getType(); 5450 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5451 AddrSpace.get() != T->getAddrSpaceExpr()) { 5452 Result = getDerived().RebuildDependentAddressSpaceType( 5453 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5454 if (Result.isNull()) 5455 return QualType(); 5456 } 5457 5458 // Result might be dependent or not. 5459 if (isa<DependentAddressSpaceType>(Result)) { 5460 DependentAddressSpaceTypeLoc NewTL = 5461 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5462 5463 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5464 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5465 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5466 5467 } else { 5468 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5469 Result, getDerived().getBaseLocation()); 5470 TransformType(TLB, DI->getTypeLoc()); 5471 } 5472 5473 return Result; 5474 } 5475 5476 template <typename Derived> 5477 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5478 VectorTypeLoc TL) { 5479 const VectorType *T = TL.getTypePtr(); 5480 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5481 if (ElementType.isNull()) 5482 return QualType(); 5483 5484 QualType Result = TL.getType(); 5485 if (getDerived().AlwaysRebuild() || 5486 ElementType != T->getElementType()) { 5487 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5488 T->getVectorKind()); 5489 if (Result.isNull()) 5490 return QualType(); 5491 } 5492 5493 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5494 NewTL.setNameLoc(TL.getNameLoc()); 5495 5496 return Result; 5497 } 5498 5499 template<typename Derived> 5500 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5501 ExtVectorTypeLoc TL) { 5502 const VectorType *T = TL.getTypePtr(); 5503 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5504 if (ElementType.isNull()) 5505 return QualType(); 5506 5507 QualType Result = TL.getType(); 5508 if (getDerived().AlwaysRebuild() || 5509 ElementType != T->getElementType()) { 5510 Result = getDerived().RebuildExtVectorType(ElementType, 5511 T->getNumElements(), 5512 /*FIXME*/ SourceLocation()); 5513 if (Result.isNull()) 5514 return QualType(); 5515 } 5516 5517 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5518 NewTL.setNameLoc(TL.getNameLoc()); 5519 5520 return Result; 5521 } 5522 5523 template <typename Derived> 5524 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5525 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5526 bool ExpectParameterPack) { 5527 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5528 TypeSourceInfo *NewDI = nullptr; 5529 5530 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5531 // If we're substituting into a pack expansion type and we know the 5532 // length we want to expand to, just substitute for the pattern. 5533 TypeLoc OldTL = OldDI->getTypeLoc(); 5534 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5535 5536 TypeLocBuilder TLB; 5537 TypeLoc NewTL = OldDI->getTypeLoc(); 5538 TLB.reserve(NewTL.getFullDataSize()); 5539 5540 QualType Result = getDerived().TransformType(TLB, 5541 OldExpansionTL.getPatternLoc()); 5542 if (Result.isNull()) 5543 return nullptr; 5544 5545 Result = RebuildPackExpansionType(Result, 5546 OldExpansionTL.getPatternLoc().getSourceRange(), 5547 OldExpansionTL.getEllipsisLoc(), 5548 NumExpansions); 5549 if (Result.isNull()) 5550 return nullptr; 5551 5552 PackExpansionTypeLoc NewExpansionTL 5553 = TLB.push<PackExpansionTypeLoc>(Result); 5554 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5555 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5556 } else 5557 NewDI = getDerived().TransformType(OldDI); 5558 if (!NewDI) 5559 return nullptr; 5560 5561 if (NewDI == OldDI && indexAdjustment == 0) 5562 return OldParm; 5563 5564 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5565 OldParm->getDeclContext(), 5566 OldParm->getInnerLocStart(), 5567 OldParm->getLocation(), 5568 OldParm->getIdentifier(), 5569 NewDI->getType(), 5570 NewDI, 5571 OldParm->getStorageClass(), 5572 /* DefArg */ nullptr); 5573 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5574 OldParm->getFunctionScopeIndex() + indexAdjustment); 5575 transformedLocalDecl(OldParm, {newParm}); 5576 return newParm; 5577 } 5578 5579 template <typename Derived> 5580 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5581 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5582 const QualType *ParamTypes, 5583 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5584 SmallVectorImpl<QualType> &OutParamTypes, 5585 SmallVectorImpl<ParmVarDecl *> *PVars, 5586 Sema::ExtParameterInfoBuilder &PInfos) { 5587 int indexAdjustment = 0; 5588 5589 unsigned NumParams = Params.size(); 5590 for (unsigned i = 0; i != NumParams; ++i) { 5591 if (ParmVarDecl *OldParm = Params[i]) { 5592 assert(OldParm->getFunctionScopeIndex() == i); 5593 5594 Optional<unsigned> NumExpansions; 5595 ParmVarDecl *NewParm = nullptr; 5596 if (OldParm->isParameterPack()) { 5597 // We have a function parameter pack that may need to be expanded. 5598 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5599 5600 // Find the parameter packs that could be expanded. 5601 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5602 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5603 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5604 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5605 5606 // Determine whether we should expand the parameter packs. 5607 bool ShouldExpand = false; 5608 bool RetainExpansion = false; 5609 Optional<unsigned> OrigNumExpansions; 5610 if (Unexpanded.size() > 0) { 5611 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5612 NumExpansions = OrigNumExpansions; 5613 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5614 Pattern.getSourceRange(), 5615 Unexpanded, 5616 ShouldExpand, 5617 RetainExpansion, 5618 NumExpansions)) { 5619 return true; 5620 } 5621 } else { 5622 #ifndef NDEBUG 5623 const AutoType *AT = 5624 Pattern.getType().getTypePtr()->getContainedAutoType(); 5625 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5626 "Could not find parameter packs or undeduced auto type!"); 5627 #endif 5628 } 5629 5630 if (ShouldExpand) { 5631 // Expand the function parameter pack into multiple, separate 5632 // parameters. 5633 getDerived().ExpandingFunctionParameterPack(OldParm); 5634 for (unsigned I = 0; I != *NumExpansions; ++I) { 5635 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5636 ParmVarDecl *NewParm 5637 = getDerived().TransformFunctionTypeParam(OldParm, 5638 indexAdjustment++, 5639 OrigNumExpansions, 5640 /*ExpectParameterPack=*/false); 5641 if (!NewParm) 5642 return true; 5643 5644 if (ParamInfos) 5645 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5646 OutParamTypes.push_back(NewParm->getType()); 5647 if (PVars) 5648 PVars->push_back(NewParm); 5649 } 5650 5651 // If we're supposed to retain a pack expansion, do so by temporarily 5652 // forgetting the partially-substituted parameter pack. 5653 if (RetainExpansion) { 5654 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5655 ParmVarDecl *NewParm 5656 = getDerived().TransformFunctionTypeParam(OldParm, 5657 indexAdjustment++, 5658 OrigNumExpansions, 5659 /*ExpectParameterPack=*/false); 5660 if (!NewParm) 5661 return true; 5662 5663 if (ParamInfos) 5664 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5665 OutParamTypes.push_back(NewParm->getType()); 5666 if (PVars) 5667 PVars->push_back(NewParm); 5668 } 5669 5670 // The next parameter should have the same adjustment as the 5671 // last thing we pushed, but we post-incremented indexAdjustment 5672 // on every push. Also, if we push nothing, the adjustment should 5673 // go down by one. 5674 indexAdjustment--; 5675 5676 // We're done with the pack expansion. 5677 continue; 5678 } 5679 5680 // We'll substitute the parameter now without expanding the pack 5681 // expansion. 5682 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5683 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5684 indexAdjustment, 5685 NumExpansions, 5686 /*ExpectParameterPack=*/true); 5687 assert(NewParm->isParameterPack() && 5688 "Parameter pack no longer a parameter pack after " 5689 "transformation."); 5690 } else { 5691 NewParm = getDerived().TransformFunctionTypeParam( 5692 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5693 } 5694 5695 if (!NewParm) 5696 return true; 5697 5698 if (ParamInfos) 5699 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5700 OutParamTypes.push_back(NewParm->getType()); 5701 if (PVars) 5702 PVars->push_back(NewParm); 5703 continue; 5704 } 5705 5706 // Deal with the possibility that we don't have a parameter 5707 // declaration for this parameter. 5708 QualType OldType = ParamTypes[i]; 5709 bool IsPackExpansion = false; 5710 Optional<unsigned> NumExpansions; 5711 QualType NewType; 5712 if (const PackExpansionType *Expansion 5713 = dyn_cast<PackExpansionType>(OldType)) { 5714 // We have a function parameter pack that may need to be expanded. 5715 QualType Pattern = Expansion->getPattern(); 5716 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5717 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5718 5719 // Determine whether we should expand the parameter packs. 5720 bool ShouldExpand = false; 5721 bool RetainExpansion = false; 5722 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5723 Unexpanded, 5724 ShouldExpand, 5725 RetainExpansion, 5726 NumExpansions)) { 5727 return true; 5728 } 5729 5730 if (ShouldExpand) { 5731 // Expand the function parameter pack into multiple, separate 5732 // parameters. 5733 for (unsigned I = 0; I != *NumExpansions; ++I) { 5734 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5735 QualType NewType = getDerived().TransformType(Pattern); 5736 if (NewType.isNull()) 5737 return true; 5738 5739 if (NewType->containsUnexpandedParameterPack()) { 5740 NewType = 5741 getSema().getASTContext().getPackExpansionType(NewType, None); 5742 5743 if (NewType.isNull()) 5744 return true; 5745 } 5746 5747 if (ParamInfos) 5748 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5749 OutParamTypes.push_back(NewType); 5750 if (PVars) 5751 PVars->push_back(nullptr); 5752 } 5753 5754 // We're done with the pack expansion. 5755 continue; 5756 } 5757 5758 // If we're supposed to retain a pack expansion, do so by temporarily 5759 // forgetting the partially-substituted parameter pack. 5760 if (RetainExpansion) { 5761 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5762 QualType NewType = getDerived().TransformType(Pattern); 5763 if (NewType.isNull()) 5764 return true; 5765 5766 if (ParamInfos) 5767 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5768 OutParamTypes.push_back(NewType); 5769 if (PVars) 5770 PVars->push_back(nullptr); 5771 } 5772 5773 // We'll substitute the parameter now without expanding the pack 5774 // expansion. 5775 OldType = Expansion->getPattern(); 5776 IsPackExpansion = true; 5777 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5778 NewType = getDerived().TransformType(OldType); 5779 } else { 5780 NewType = getDerived().TransformType(OldType); 5781 } 5782 5783 if (NewType.isNull()) 5784 return true; 5785 5786 if (IsPackExpansion) 5787 NewType = getSema().Context.getPackExpansionType(NewType, 5788 NumExpansions); 5789 5790 if (ParamInfos) 5791 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5792 OutParamTypes.push_back(NewType); 5793 if (PVars) 5794 PVars->push_back(nullptr); 5795 } 5796 5797 #ifndef NDEBUG 5798 if (PVars) { 5799 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5800 if (ParmVarDecl *parm = (*PVars)[i]) 5801 assert(parm->getFunctionScopeIndex() == i); 5802 } 5803 #endif 5804 5805 return false; 5806 } 5807 5808 template<typename Derived> 5809 QualType 5810 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5811 FunctionProtoTypeLoc TL) { 5812 SmallVector<QualType, 4> ExceptionStorage; 5813 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5814 return getDerived().TransformFunctionProtoType( 5815 TLB, TL, nullptr, Qualifiers(), 5816 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5817 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5818 ExceptionStorage, Changed); 5819 }); 5820 } 5821 5822 template<typename Derived> template<typename Fn> 5823 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5824 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5825 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5826 5827 // Transform the parameters and return type. 5828 // 5829 // We are required to instantiate the params and return type in source order. 5830 // When the function has a trailing return type, we instantiate the 5831 // parameters before the return type, since the return type can then refer 5832 // to the parameters themselves (via decltype, sizeof, etc.). 5833 // 5834 SmallVector<QualType, 4> ParamTypes; 5835 SmallVector<ParmVarDecl*, 4> ParamDecls; 5836 Sema::ExtParameterInfoBuilder ExtParamInfos; 5837 const FunctionProtoType *T = TL.getTypePtr(); 5838 5839 QualType ResultType; 5840 5841 if (T->hasTrailingReturn()) { 5842 if (getDerived().TransformFunctionTypeParams( 5843 TL.getBeginLoc(), TL.getParams(), 5844 TL.getTypePtr()->param_type_begin(), 5845 T->getExtParameterInfosOrNull(), 5846 ParamTypes, &ParamDecls, ExtParamInfos)) 5847 return QualType(); 5848 5849 { 5850 // C++11 [expr.prim.general]p3: 5851 // If a declaration declares a member function or member function 5852 // template of a class X, the expression this is a prvalue of type 5853 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5854 // and the end of the function-definition, member-declarator, or 5855 // declarator. 5856 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5857 5858 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5859 if (ResultType.isNull()) 5860 return QualType(); 5861 } 5862 } 5863 else { 5864 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5865 if (ResultType.isNull()) 5866 return QualType(); 5867 5868 if (getDerived().TransformFunctionTypeParams( 5869 TL.getBeginLoc(), TL.getParams(), 5870 TL.getTypePtr()->param_type_begin(), 5871 T->getExtParameterInfosOrNull(), 5872 ParamTypes, &ParamDecls, ExtParamInfos)) 5873 return QualType(); 5874 } 5875 5876 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5877 5878 bool EPIChanged = false; 5879 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5880 return QualType(); 5881 5882 // Handle extended parameter information. 5883 if (auto NewExtParamInfos = 5884 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5885 if (!EPI.ExtParameterInfos || 5886 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5887 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5888 EPIChanged = true; 5889 } 5890 EPI.ExtParameterInfos = NewExtParamInfos; 5891 } else if (EPI.ExtParameterInfos) { 5892 EPIChanged = true; 5893 EPI.ExtParameterInfos = nullptr; 5894 } 5895 5896 QualType Result = TL.getType(); 5897 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5898 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5899 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5900 if (Result.isNull()) 5901 return QualType(); 5902 } 5903 5904 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5905 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5906 NewTL.setLParenLoc(TL.getLParenLoc()); 5907 NewTL.setRParenLoc(TL.getRParenLoc()); 5908 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5909 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5910 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5911 NewTL.setParam(i, ParamDecls[i]); 5912 5913 return Result; 5914 } 5915 5916 template<typename Derived> 5917 bool TreeTransform<Derived>::TransformExceptionSpec( 5918 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5919 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5920 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5921 5922 // Instantiate a dynamic noexcept expression, if any. 5923 if (isComputedNoexcept(ESI.Type)) { 5924 EnterExpressionEvaluationContext Unevaluated( 5925 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5926 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5927 if (NoexceptExpr.isInvalid()) 5928 return true; 5929 5930 ExceptionSpecificationType EST = ESI.Type; 5931 NoexceptExpr = 5932 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5933 if (NoexceptExpr.isInvalid()) 5934 return true; 5935 5936 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5937 Changed = true; 5938 ESI.NoexceptExpr = NoexceptExpr.get(); 5939 ESI.Type = EST; 5940 } 5941 5942 if (ESI.Type != EST_Dynamic) 5943 return false; 5944 5945 // Instantiate a dynamic exception specification's type. 5946 for (QualType T : ESI.Exceptions) { 5947 if (const PackExpansionType *PackExpansion = 5948 T->getAs<PackExpansionType>()) { 5949 Changed = true; 5950 5951 // We have a pack expansion. Instantiate it. 5952 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5953 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5954 Unexpanded); 5955 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5956 5957 // Determine whether the set of unexpanded parameter packs can and 5958 // should 5959 // be expanded. 5960 bool Expand = false; 5961 bool RetainExpansion = false; 5962 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5963 // FIXME: Track the location of the ellipsis (and track source location 5964 // information for the types in the exception specification in general). 5965 if (getDerived().TryExpandParameterPacks( 5966 Loc, SourceRange(), Unexpanded, Expand, 5967 RetainExpansion, NumExpansions)) 5968 return true; 5969 5970 if (!Expand) { 5971 // We can't expand this pack expansion into separate arguments yet; 5972 // just substitute into the pattern and create a new pack expansion 5973 // type. 5974 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5975 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5976 if (U.isNull()) 5977 return true; 5978 5979 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5980 Exceptions.push_back(U); 5981 continue; 5982 } 5983 5984 // Substitute into the pack expansion pattern for each slice of the 5985 // pack. 5986 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5987 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5988 5989 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5990 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5991 return true; 5992 5993 Exceptions.push_back(U); 5994 } 5995 } else { 5996 QualType U = getDerived().TransformType(T); 5997 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5998 return true; 5999 if (T != U) 6000 Changed = true; 6001 6002 Exceptions.push_back(U); 6003 } 6004 } 6005 6006 ESI.Exceptions = Exceptions; 6007 if (ESI.Exceptions.empty()) 6008 ESI.Type = EST_DynamicNone; 6009 return false; 6010 } 6011 6012 template<typename Derived> 6013 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6014 TypeLocBuilder &TLB, 6015 FunctionNoProtoTypeLoc TL) { 6016 const FunctionNoProtoType *T = TL.getTypePtr(); 6017 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6018 if (ResultType.isNull()) 6019 return QualType(); 6020 6021 QualType Result = TL.getType(); 6022 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6023 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6024 6025 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6026 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6027 NewTL.setLParenLoc(TL.getLParenLoc()); 6028 NewTL.setRParenLoc(TL.getRParenLoc()); 6029 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6030 6031 return Result; 6032 } 6033 6034 template<typename Derived> QualType 6035 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 6036 UnresolvedUsingTypeLoc TL) { 6037 const UnresolvedUsingType *T = TL.getTypePtr(); 6038 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6039 if (!D) 6040 return QualType(); 6041 6042 QualType Result = TL.getType(); 6043 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6044 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6045 if (Result.isNull()) 6046 return QualType(); 6047 } 6048 6049 // We might get an arbitrary type spec type back. We should at 6050 // least always get a type spec type, though. 6051 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6052 NewTL.setNameLoc(TL.getNameLoc()); 6053 6054 return Result; 6055 } 6056 6057 template<typename Derived> 6058 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6059 TypedefTypeLoc TL) { 6060 const TypedefType *T = TL.getTypePtr(); 6061 TypedefNameDecl *Typedef 6062 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6063 T->getDecl())); 6064 if (!Typedef) 6065 return QualType(); 6066 6067 QualType Result = TL.getType(); 6068 if (getDerived().AlwaysRebuild() || 6069 Typedef != T->getDecl()) { 6070 Result = getDerived().RebuildTypedefType(Typedef); 6071 if (Result.isNull()) 6072 return QualType(); 6073 } 6074 6075 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6076 NewTL.setNameLoc(TL.getNameLoc()); 6077 6078 return Result; 6079 } 6080 6081 template<typename Derived> 6082 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6083 TypeOfExprTypeLoc TL) { 6084 // typeof expressions are not potentially evaluated contexts 6085 EnterExpressionEvaluationContext Unevaluated( 6086 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6087 Sema::ReuseLambdaContextDecl); 6088 6089 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6090 if (E.isInvalid()) 6091 return QualType(); 6092 6093 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6094 if (E.isInvalid()) 6095 return QualType(); 6096 6097 QualType Result = TL.getType(); 6098 if (getDerived().AlwaysRebuild() || 6099 E.get() != TL.getUnderlyingExpr()) { 6100 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6101 if (Result.isNull()) 6102 return QualType(); 6103 } 6104 else E.get(); 6105 6106 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6107 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6108 NewTL.setLParenLoc(TL.getLParenLoc()); 6109 NewTL.setRParenLoc(TL.getRParenLoc()); 6110 6111 return Result; 6112 } 6113 6114 template<typename Derived> 6115 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6116 TypeOfTypeLoc TL) { 6117 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6118 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6119 if (!New_Under_TI) 6120 return QualType(); 6121 6122 QualType Result = TL.getType(); 6123 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6124 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6125 if (Result.isNull()) 6126 return QualType(); 6127 } 6128 6129 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6130 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6131 NewTL.setLParenLoc(TL.getLParenLoc()); 6132 NewTL.setRParenLoc(TL.getRParenLoc()); 6133 NewTL.setUnderlyingTInfo(New_Under_TI); 6134 6135 return Result; 6136 } 6137 6138 template<typename Derived> 6139 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6140 DecltypeTypeLoc TL) { 6141 const DecltypeType *T = TL.getTypePtr(); 6142 6143 // decltype expressions are not potentially evaluated contexts 6144 EnterExpressionEvaluationContext Unevaluated( 6145 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6146 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6147 6148 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6149 if (E.isInvalid()) 6150 return QualType(); 6151 6152 E = getSema().ActOnDecltypeExpression(E.get()); 6153 if (E.isInvalid()) 6154 return QualType(); 6155 6156 QualType Result = TL.getType(); 6157 if (getDerived().AlwaysRebuild() || 6158 E.get() != T->getUnderlyingExpr()) { 6159 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6160 if (Result.isNull()) 6161 return QualType(); 6162 } 6163 else E.get(); 6164 6165 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6166 NewTL.setNameLoc(TL.getNameLoc()); 6167 6168 return Result; 6169 } 6170 6171 template<typename Derived> 6172 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6173 TypeLocBuilder &TLB, 6174 UnaryTransformTypeLoc TL) { 6175 QualType Result = TL.getType(); 6176 if (Result->isDependentType()) { 6177 const UnaryTransformType *T = TL.getTypePtr(); 6178 QualType NewBase = 6179 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6180 Result = getDerived().RebuildUnaryTransformType(NewBase, 6181 T->getUTTKind(), 6182 TL.getKWLoc()); 6183 if (Result.isNull()) 6184 return QualType(); 6185 } 6186 6187 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6188 NewTL.setKWLoc(TL.getKWLoc()); 6189 NewTL.setParensRange(TL.getParensRange()); 6190 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6191 return Result; 6192 } 6193 6194 template<typename Derived> 6195 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6196 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6197 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6198 6199 CXXScopeSpec SS; 6200 TemplateName TemplateName = getDerived().TransformTemplateName( 6201 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6202 if (TemplateName.isNull()) 6203 return QualType(); 6204 6205 QualType OldDeduced = T->getDeducedType(); 6206 QualType NewDeduced; 6207 if (!OldDeduced.isNull()) { 6208 NewDeduced = getDerived().TransformType(OldDeduced); 6209 if (NewDeduced.isNull()) 6210 return QualType(); 6211 } 6212 6213 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6214 TemplateName, NewDeduced); 6215 if (Result.isNull()) 6216 return QualType(); 6217 6218 DeducedTemplateSpecializationTypeLoc NewTL = 6219 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6220 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6221 6222 return Result; 6223 } 6224 6225 template<typename Derived> 6226 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6227 RecordTypeLoc TL) { 6228 const RecordType *T = TL.getTypePtr(); 6229 RecordDecl *Record 6230 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6231 T->getDecl())); 6232 if (!Record) 6233 return QualType(); 6234 6235 QualType Result = TL.getType(); 6236 if (getDerived().AlwaysRebuild() || 6237 Record != T->getDecl()) { 6238 Result = getDerived().RebuildRecordType(Record); 6239 if (Result.isNull()) 6240 return QualType(); 6241 } 6242 6243 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6244 NewTL.setNameLoc(TL.getNameLoc()); 6245 6246 return Result; 6247 } 6248 6249 template<typename Derived> 6250 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6251 EnumTypeLoc TL) { 6252 const EnumType *T = TL.getTypePtr(); 6253 EnumDecl *Enum 6254 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6255 T->getDecl())); 6256 if (!Enum) 6257 return QualType(); 6258 6259 QualType Result = TL.getType(); 6260 if (getDerived().AlwaysRebuild() || 6261 Enum != T->getDecl()) { 6262 Result = getDerived().RebuildEnumType(Enum); 6263 if (Result.isNull()) 6264 return QualType(); 6265 } 6266 6267 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6268 NewTL.setNameLoc(TL.getNameLoc()); 6269 6270 return Result; 6271 } 6272 6273 template<typename Derived> 6274 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6275 TypeLocBuilder &TLB, 6276 InjectedClassNameTypeLoc TL) { 6277 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6278 TL.getTypePtr()->getDecl()); 6279 if (!D) return QualType(); 6280 6281 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6282 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6283 return T; 6284 } 6285 6286 template<typename Derived> 6287 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6288 TypeLocBuilder &TLB, 6289 TemplateTypeParmTypeLoc TL) { 6290 return TransformTypeSpecType(TLB, TL); 6291 } 6292 6293 template<typename Derived> 6294 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6295 TypeLocBuilder &TLB, 6296 SubstTemplateTypeParmTypeLoc TL) { 6297 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6298 6299 // Substitute into the replacement type, which itself might involve something 6300 // that needs to be transformed. This only tends to occur with default 6301 // template arguments of template template parameters. 6302 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6303 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6304 if (Replacement.isNull()) 6305 return QualType(); 6306 6307 // Always canonicalize the replacement type. 6308 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6309 QualType Result 6310 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6311 Replacement); 6312 6313 // Propagate type-source information. 6314 SubstTemplateTypeParmTypeLoc NewTL 6315 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6316 NewTL.setNameLoc(TL.getNameLoc()); 6317 return Result; 6318 6319 } 6320 6321 template<typename Derived> 6322 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6323 TypeLocBuilder &TLB, 6324 SubstTemplateTypeParmPackTypeLoc TL) { 6325 return TransformTypeSpecType(TLB, TL); 6326 } 6327 6328 template<typename Derived> 6329 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6330 TypeLocBuilder &TLB, 6331 TemplateSpecializationTypeLoc TL) { 6332 const TemplateSpecializationType *T = TL.getTypePtr(); 6333 6334 // The nested-name-specifier never matters in a TemplateSpecializationType, 6335 // because we can't have a dependent nested-name-specifier anyway. 6336 CXXScopeSpec SS; 6337 TemplateName Template 6338 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6339 TL.getTemplateNameLoc()); 6340 if (Template.isNull()) 6341 return QualType(); 6342 6343 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6344 } 6345 6346 template<typename Derived> 6347 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6348 AtomicTypeLoc TL) { 6349 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6350 if (ValueType.isNull()) 6351 return QualType(); 6352 6353 QualType Result = TL.getType(); 6354 if (getDerived().AlwaysRebuild() || 6355 ValueType != TL.getValueLoc().getType()) { 6356 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6357 if (Result.isNull()) 6358 return QualType(); 6359 } 6360 6361 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6362 NewTL.setKWLoc(TL.getKWLoc()); 6363 NewTL.setLParenLoc(TL.getLParenLoc()); 6364 NewTL.setRParenLoc(TL.getRParenLoc()); 6365 6366 return Result; 6367 } 6368 6369 template <typename Derived> 6370 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6371 PipeTypeLoc TL) { 6372 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6373 if (ValueType.isNull()) 6374 return QualType(); 6375 6376 QualType Result = TL.getType(); 6377 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6378 const PipeType *PT = Result->castAs<PipeType>(); 6379 bool isReadPipe = PT->isReadOnly(); 6380 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6381 if (Result.isNull()) 6382 return QualType(); 6383 } 6384 6385 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6386 NewTL.setKWLoc(TL.getKWLoc()); 6387 6388 return Result; 6389 } 6390 6391 template <typename Derived> 6392 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6393 ExtIntTypeLoc TL) { 6394 const ExtIntType *EIT = TL.getTypePtr(); 6395 QualType Result = TL.getType(); 6396 6397 if (getDerived().AlwaysRebuild()) { 6398 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6399 EIT->getNumBits(), TL.getNameLoc()); 6400 if (Result.isNull()) 6401 return QualType(); 6402 } 6403 6404 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6405 NewTL.setNameLoc(TL.getNameLoc()); 6406 return Result; 6407 } 6408 6409 template <typename Derived> 6410 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6411 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6412 const DependentExtIntType *EIT = TL.getTypePtr(); 6413 6414 EnterExpressionEvaluationContext Unevaluated( 6415 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6416 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6417 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6418 6419 if (BitsExpr.isInvalid()) 6420 return QualType(); 6421 6422 QualType Result = TL.getType(); 6423 6424 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6425 Result = getDerived().RebuildDependentExtIntType( 6426 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6427 6428 if (Result.isNull()) 6429 return QualType(); 6430 } 6431 6432 if (isa<DependentExtIntType>(Result)) { 6433 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6434 NewTL.setNameLoc(TL.getNameLoc()); 6435 } else { 6436 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6437 NewTL.setNameLoc(TL.getNameLoc()); 6438 } 6439 return Result; 6440 } 6441 6442 /// Simple iterator that traverses the template arguments in a 6443 /// container that provides a \c getArgLoc() member function. 6444 /// 6445 /// This iterator is intended to be used with the iterator form of 6446 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6447 template<typename ArgLocContainer> 6448 class TemplateArgumentLocContainerIterator { 6449 ArgLocContainer *Container; 6450 unsigned Index; 6451 6452 public: 6453 typedef TemplateArgumentLoc value_type; 6454 typedef TemplateArgumentLoc reference; 6455 typedef int difference_type; 6456 typedef std::input_iterator_tag iterator_category; 6457 6458 class pointer { 6459 TemplateArgumentLoc Arg; 6460 6461 public: 6462 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6463 6464 const TemplateArgumentLoc *operator->() const { 6465 return &Arg; 6466 } 6467 }; 6468 6469 6470 TemplateArgumentLocContainerIterator() {} 6471 6472 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6473 unsigned Index) 6474 : Container(&Container), Index(Index) { } 6475 6476 TemplateArgumentLocContainerIterator &operator++() { 6477 ++Index; 6478 return *this; 6479 } 6480 6481 TemplateArgumentLocContainerIterator operator++(int) { 6482 TemplateArgumentLocContainerIterator Old(*this); 6483 ++(*this); 6484 return Old; 6485 } 6486 6487 TemplateArgumentLoc operator*() const { 6488 return Container->getArgLoc(Index); 6489 } 6490 6491 pointer operator->() const { 6492 return pointer(Container->getArgLoc(Index)); 6493 } 6494 6495 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6496 const TemplateArgumentLocContainerIterator &Y) { 6497 return X.Container == Y.Container && X.Index == Y.Index; 6498 } 6499 6500 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6501 const TemplateArgumentLocContainerIterator &Y) { 6502 return !(X == Y); 6503 } 6504 }; 6505 6506 template<typename Derived> 6507 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6508 AutoTypeLoc TL) { 6509 const AutoType *T = TL.getTypePtr(); 6510 QualType OldDeduced = T->getDeducedType(); 6511 QualType NewDeduced; 6512 if (!OldDeduced.isNull()) { 6513 NewDeduced = getDerived().TransformType(OldDeduced); 6514 if (NewDeduced.isNull()) 6515 return QualType(); 6516 } 6517 6518 ConceptDecl *NewCD = nullptr; 6519 TemplateArgumentListInfo NewTemplateArgs; 6520 NestedNameSpecifierLoc NewNestedNameSpec; 6521 if (T->isConstrained()) { 6522 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6523 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6524 6525 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6526 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6527 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6528 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6529 ArgIterator(TL, 6530 TL.getNumArgs()), 6531 NewTemplateArgs)) 6532 return QualType(); 6533 6534 if (TL.getNestedNameSpecifierLoc()) { 6535 NewNestedNameSpec 6536 = getDerived().TransformNestedNameSpecifierLoc( 6537 TL.getNestedNameSpecifierLoc()); 6538 if (!NewNestedNameSpec) 6539 return QualType(); 6540 } 6541 } 6542 6543 QualType Result = TL.getType(); 6544 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6545 T->isDependentType() || T->isConstrained()) { 6546 // FIXME: Maybe don't rebuild if all template arguments are the same. 6547 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6548 NewArgList.reserve(NewArgList.size()); 6549 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6550 NewArgList.push_back(ArgLoc.getArgument()); 6551 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6552 NewArgList); 6553 if (Result.isNull()) 6554 return QualType(); 6555 } 6556 6557 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6558 NewTL.setNameLoc(TL.getNameLoc()); 6559 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6560 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6561 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6562 NewTL.setFoundDecl(TL.getFoundDecl()); 6563 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6564 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6565 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6566 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6567 6568 return Result; 6569 } 6570 6571 template <typename Derived> 6572 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6573 TypeLocBuilder &TLB, 6574 TemplateSpecializationTypeLoc TL, 6575 TemplateName Template) { 6576 TemplateArgumentListInfo NewTemplateArgs; 6577 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6578 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6579 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6580 ArgIterator; 6581 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6582 ArgIterator(TL, TL.getNumArgs()), 6583 NewTemplateArgs)) 6584 return QualType(); 6585 6586 // FIXME: maybe don't rebuild if all the template arguments are the same. 6587 6588 QualType Result = 6589 getDerived().RebuildTemplateSpecializationType(Template, 6590 TL.getTemplateNameLoc(), 6591 NewTemplateArgs); 6592 6593 if (!Result.isNull()) { 6594 // Specializations of template template parameters are represented as 6595 // TemplateSpecializationTypes, and substitution of type alias templates 6596 // within a dependent context can transform them into 6597 // DependentTemplateSpecializationTypes. 6598 if (isa<DependentTemplateSpecializationType>(Result)) { 6599 DependentTemplateSpecializationTypeLoc NewTL 6600 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6601 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6602 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6603 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6604 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6605 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6606 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6607 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6608 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6609 return Result; 6610 } 6611 6612 TemplateSpecializationTypeLoc NewTL 6613 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6614 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6615 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6616 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6617 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6618 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6619 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6620 } 6621 6622 return Result; 6623 } 6624 6625 template <typename Derived> 6626 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6627 TypeLocBuilder &TLB, 6628 DependentTemplateSpecializationTypeLoc TL, 6629 TemplateName Template, 6630 CXXScopeSpec &SS) { 6631 TemplateArgumentListInfo NewTemplateArgs; 6632 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6633 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6634 typedef TemplateArgumentLocContainerIterator< 6635 DependentTemplateSpecializationTypeLoc> ArgIterator; 6636 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6637 ArgIterator(TL, TL.getNumArgs()), 6638 NewTemplateArgs)) 6639 return QualType(); 6640 6641 // FIXME: maybe don't rebuild if all the template arguments are the same. 6642 6643 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6644 QualType Result 6645 = getSema().Context.getDependentTemplateSpecializationType( 6646 TL.getTypePtr()->getKeyword(), 6647 DTN->getQualifier(), 6648 DTN->getIdentifier(), 6649 NewTemplateArgs); 6650 6651 DependentTemplateSpecializationTypeLoc NewTL 6652 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6653 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6654 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6655 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6656 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6657 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6658 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6659 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6660 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6661 return Result; 6662 } 6663 6664 QualType Result 6665 = getDerived().RebuildTemplateSpecializationType(Template, 6666 TL.getTemplateNameLoc(), 6667 NewTemplateArgs); 6668 6669 if (!Result.isNull()) { 6670 /// FIXME: Wrap this in an elaborated-type-specifier? 6671 TemplateSpecializationTypeLoc NewTL 6672 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6673 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6674 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6675 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6676 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6677 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6678 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6679 } 6680 6681 return Result; 6682 } 6683 6684 template<typename Derived> 6685 QualType 6686 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6687 ElaboratedTypeLoc TL) { 6688 const ElaboratedType *T = TL.getTypePtr(); 6689 6690 NestedNameSpecifierLoc QualifierLoc; 6691 // NOTE: the qualifier in an ElaboratedType is optional. 6692 if (TL.getQualifierLoc()) { 6693 QualifierLoc 6694 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6695 if (!QualifierLoc) 6696 return QualType(); 6697 } 6698 6699 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6700 if (NamedT.isNull()) 6701 return QualType(); 6702 6703 // C++0x [dcl.type.elab]p2: 6704 // If the identifier resolves to a typedef-name or the simple-template-id 6705 // resolves to an alias template specialization, the 6706 // elaborated-type-specifier is ill-formed. 6707 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6708 if (const TemplateSpecializationType *TST = 6709 NamedT->getAs<TemplateSpecializationType>()) { 6710 TemplateName Template = TST->getTemplateName(); 6711 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6712 Template.getAsTemplateDecl())) { 6713 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6714 diag::err_tag_reference_non_tag) 6715 << TAT << Sema::NTK_TypeAliasTemplate 6716 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6717 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6718 } 6719 } 6720 } 6721 6722 QualType Result = TL.getType(); 6723 if (getDerived().AlwaysRebuild() || 6724 QualifierLoc != TL.getQualifierLoc() || 6725 NamedT != T->getNamedType()) { 6726 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6727 T->getKeyword(), 6728 QualifierLoc, NamedT); 6729 if (Result.isNull()) 6730 return QualType(); 6731 } 6732 6733 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6734 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6735 NewTL.setQualifierLoc(QualifierLoc); 6736 return Result; 6737 } 6738 6739 template<typename Derived> 6740 QualType TreeTransform<Derived>::TransformAttributedType( 6741 TypeLocBuilder &TLB, 6742 AttributedTypeLoc TL) { 6743 const AttributedType *oldType = TL.getTypePtr(); 6744 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6745 if (modifiedType.isNull()) 6746 return QualType(); 6747 6748 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6749 const Attr *oldAttr = TL.getAttr(); 6750 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6751 if (oldAttr && !newAttr) 6752 return QualType(); 6753 6754 QualType result = TL.getType(); 6755 6756 // FIXME: dependent operand expressions? 6757 if (getDerived().AlwaysRebuild() || 6758 modifiedType != oldType->getModifiedType()) { 6759 // TODO: this is really lame; we should really be rebuilding the 6760 // equivalent type from first principles. 6761 QualType equivalentType 6762 = getDerived().TransformType(oldType->getEquivalentType()); 6763 if (equivalentType.isNull()) 6764 return QualType(); 6765 6766 // Check whether we can add nullability; it is only represented as 6767 // type sugar, and therefore cannot be diagnosed in any other way. 6768 if (auto nullability = oldType->getImmediateNullability()) { 6769 if (!modifiedType->canHaveNullability()) { 6770 SemaRef.Diag(TL.getAttr()->getLocation(), 6771 diag::err_nullability_nonpointer) 6772 << DiagNullabilityKind(*nullability, false) << modifiedType; 6773 return QualType(); 6774 } 6775 } 6776 6777 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6778 modifiedType, 6779 equivalentType); 6780 } 6781 6782 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6783 newTL.setAttr(newAttr); 6784 return result; 6785 } 6786 6787 template<typename Derived> 6788 QualType 6789 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6790 ParenTypeLoc TL) { 6791 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6792 if (Inner.isNull()) 6793 return QualType(); 6794 6795 QualType Result = TL.getType(); 6796 if (getDerived().AlwaysRebuild() || 6797 Inner != TL.getInnerLoc().getType()) { 6798 Result = getDerived().RebuildParenType(Inner); 6799 if (Result.isNull()) 6800 return QualType(); 6801 } 6802 6803 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6804 NewTL.setLParenLoc(TL.getLParenLoc()); 6805 NewTL.setRParenLoc(TL.getRParenLoc()); 6806 return Result; 6807 } 6808 6809 template <typename Derived> 6810 QualType 6811 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6812 MacroQualifiedTypeLoc TL) { 6813 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6814 if (Inner.isNull()) 6815 return QualType(); 6816 6817 QualType Result = TL.getType(); 6818 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6819 Result = 6820 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6821 if (Result.isNull()) 6822 return QualType(); 6823 } 6824 6825 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6826 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6827 return Result; 6828 } 6829 6830 template<typename Derived> 6831 QualType TreeTransform<Derived>::TransformDependentNameType( 6832 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6833 return TransformDependentNameType(TLB, TL, false); 6834 } 6835 6836 template<typename Derived> 6837 QualType TreeTransform<Derived>::TransformDependentNameType( 6838 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6839 const DependentNameType *T = TL.getTypePtr(); 6840 6841 NestedNameSpecifierLoc QualifierLoc 6842 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6843 if (!QualifierLoc) 6844 return QualType(); 6845 6846 QualType Result 6847 = getDerived().RebuildDependentNameType(T->getKeyword(), 6848 TL.getElaboratedKeywordLoc(), 6849 QualifierLoc, 6850 T->getIdentifier(), 6851 TL.getNameLoc(), 6852 DeducedTSTContext); 6853 if (Result.isNull()) 6854 return QualType(); 6855 6856 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6857 QualType NamedT = ElabT->getNamedType(); 6858 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6859 6860 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6861 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6862 NewTL.setQualifierLoc(QualifierLoc); 6863 } else { 6864 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6865 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6866 NewTL.setQualifierLoc(QualifierLoc); 6867 NewTL.setNameLoc(TL.getNameLoc()); 6868 } 6869 return Result; 6870 } 6871 6872 template<typename Derived> 6873 QualType TreeTransform<Derived>:: 6874 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6875 DependentTemplateSpecializationTypeLoc TL) { 6876 NestedNameSpecifierLoc QualifierLoc; 6877 if (TL.getQualifierLoc()) { 6878 QualifierLoc 6879 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6880 if (!QualifierLoc) 6881 return QualType(); 6882 } 6883 6884 return getDerived() 6885 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6886 } 6887 6888 template<typename Derived> 6889 QualType TreeTransform<Derived>:: 6890 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6891 DependentTemplateSpecializationTypeLoc TL, 6892 NestedNameSpecifierLoc QualifierLoc) { 6893 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6894 6895 TemplateArgumentListInfo NewTemplateArgs; 6896 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6897 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6898 6899 typedef TemplateArgumentLocContainerIterator< 6900 DependentTemplateSpecializationTypeLoc> ArgIterator; 6901 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6902 ArgIterator(TL, TL.getNumArgs()), 6903 NewTemplateArgs)) 6904 return QualType(); 6905 6906 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6907 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6908 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6909 /*AllowInjectedClassName*/ false); 6910 if (Result.isNull()) 6911 return QualType(); 6912 6913 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6914 QualType NamedT = ElabT->getNamedType(); 6915 6916 // Copy information relevant to the template specialization. 6917 TemplateSpecializationTypeLoc NamedTL 6918 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6919 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6920 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6921 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6922 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6923 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6924 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6925 6926 // Copy information relevant to the elaborated type. 6927 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6928 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6929 NewTL.setQualifierLoc(QualifierLoc); 6930 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6931 DependentTemplateSpecializationTypeLoc SpecTL 6932 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6933 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6934 SpecTL.setQualifierLoc(QualifierLoc); 6935 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6936 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6937 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6938 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6939 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6940 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6941 } else { 6942 TemplateSpecializationTypeLoc SpecTL 6943 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6944 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6945 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6946 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6947 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6948 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6949 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6950 } 6951 return Result; 6952 } 6953 6954 template<typename Derived> 6955 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6956 PackExpansionTypeLoc TL) { 6957 QualType Pattern 6958 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6959 if (Pattern.isNull()) 6960 return QualType(); 6961 6962 QualType Result = TL.getType(); 6963 if (getDerived().AlwaysRebuild() || 6964 Pattern != TL.getPatternLoc().getType()) { 6965 Result = getDerived().RebuildPackExpansionType(Pattern, 6966 TL.getPatternLoc().getSourceRange(), 6967 TL.getEllipsisLoc(), 6968 TL.getTypePtr()->getNumExpansions()); 6969 if (Result.isNull()) 6970 return QualType(); 6971 } 6972 6973 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6974 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6975 return Result; 6976 } 6977 6978 template<typename Derived> 6979 QualType 6980 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6981 ObjCInterfaceTypeLoc TL) { 6982 // ObjCInterfaceType is never dependent. 6983 TLB.pushFullCopy(TL); 6984 return TL.getType(); 6985 } 6986 6987 template<typename Derived> 6988 QualType 6989 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6990 ObjCTypeParamTypeLoc TL) { 6991 const ObjCTypeParamType *T = TL.getTypePtr(); 6992 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6993 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6994 if (!OTP) 6995 return QualType(); 6996 6997 QualType Result = TL.getType(); 6998 if (getDerived().AlwaysRebuild() || 6999 OTP != T->getDecl()) { 7000 Result = getDerived().RebuildObjCTypeParamType(OTP, 7001 TL.getProtocolLAngleLoc(), 7002 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7003 TL.getNumProtocols()), 7004 TL.getProtocolLocs(), 7005 TL.getProtocolRAngleLoc()); 7006 if (Result.isNull()) 7007 return QualType(); 7008 } 7009 7010 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7011 if (TL.getNumProtocols()) { 7012 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7013 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7014 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7015 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7016 } 7017 return Result; 7018 } 7019 7020 template<typename Derived> 7021 QualType 7022 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7023 ObjCObjectTypeLoc TL) { 7024 // Transform base type. 7025 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7026 if (BaseType.isNull()) 7027 return QualType(); 7028 7029 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7030 7031 // Transform type arguments. 7032 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7033 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7034 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7035 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7036 QualType TypeArg = TypeArgInfo->getType(); 7037 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7038 AnyChanged = true; 7039 7040 // We have a pack expansion. Instantiate it. 7041 const auto *PackExpansion = PackExpansionLoc.getType() 7042 ->castAs<PackExpansionType>(); 7043 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7044 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7045 Unexpanded); 7046 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7047 7048 // Determine whether the set of unexpanded parameter packs can 7049 // and should be expanded. 7050 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7051 bool Expand = false; 7052 bool RetainExpansion = false; 7053 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7054 if (getDerived().TryExpandParameterPacks( 7055 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7056 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7057 return QualType(); 7058 7059 if (!Expand) { 7060 // We can't expand this pack expansion into separate arguments yet; 7061 // just substitute into the pattern and create a new pack expansion 7062 // type. 7063 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7064 7065 TypeLocBuilder TypeArgBuilder; 7066 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7067 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7068 PatternLoc); 7069 if (NewPatternType.isNull()) 7070 return QualType(); 7071 7072 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7073 NewPatternType, NumExpansions); 7074 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7075 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7076 NewTypeArgInfos.push_back( 7077 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7078 continue; 7079 } 7080 7081 // Substitute into the pack expansion pattern for each slice of the 7082 // pack. 7083 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7084 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7085 7086 TypeLocBuilder TypeArgBuilder; 7087 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7088 7089 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7090 PatternLoc); 7091 if (NewTypeArg.isNull()) 7092 return QualType(); 7093 7094 NewTypeArgInfos.push_back( 7095 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7096 } 7097 7098 continue; 7099 } 7100 7101 TypeLocBuilder TypeArgBuilder; 7102 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7103 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7104 if (NewTypeArg.isNull()) 7105 return QualType(); 7106 7107 // If nothing changed, just keep the old TypeSourceInfo. 7108 if (NewTypeArg == TypeArg) { 7109 NewTypeArgInfos.push_back(TypeArgInfo); 7110 continue; 7111 } 7112 7113 NewTypeArgInfos.push_back( 7114 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7115 AnyChanged = true; 7116 } 7117 7118 QualType Result = TL.getType(); 7119 if (getDerived().AlwaysRebuild() || AnyChanged) { 7120 // Rebuild the type. 7121 Result = getDerived().RebuildObjCObjectType( 7122 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7123 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7124 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7125 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7126 7127 if (Result.isNull()) 7128 return QualType(); 7129 } 7130 7131 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7132 NewT.setHasBaseTypeAsWritten(true); 7133 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7134 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7135 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7136 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7137 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7138 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7139 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7140 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7141 return Result; 7142 } 7143 7144 template<typename Derived> 7145 QualType 7146 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7147 ObjCObjectPointerTypeLoc TL) { 7148 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7149 if (PointeeType.isNull()) 7150 return QualType(); 7151 7152 QualType Result = TL.getType(); 7153 if (getDerived().AlwaysRebuild() || 7154 PointeeType != TL.getPointeeLoc().getType()) { 7155 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7156 TL.getStarLoc()); 7157 if (Result.isNull()) 7158 return QualType(); 7159 } 7160 7161 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7162 NewT.setStarLoc(TL.getStarLoc()); 7163 return Result; 7164 } 7165 7166 //===----------------------------------------------------------------------===// 7167 // Statement transformation 7168 //===----------------------------------------------------------------------===// 7169 template<typename Derived> 7170 StmtResult 7171 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7172 return S; 7173 } 7174 7175 template<typename Derived> 7176 StmtResult 7177 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7178 return getDerived().TransformCompoundStmt(S, false); 7179 } 7180 7181 template<typename Derived> 7182 StmtResult 7183 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7184 bool IsStmtExpr) { 7185 Sema::CompoundScopeRAII CompoundScope(getSema()); 7186 7187 const Stmt *ExprResult = S->getStmtExprResult(); 7188 bool SubStmtInvalid = false; 7189 bool SubStmtChanged = false; 7190 SmallVector<Stmt*, 8> Statements; 7191 for (auto *B : S->body()) { 7192 StmtResult Result = getDerived().TransformStmt( 7193 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7194 7195 if (Result.isInvalid()) { 7196 // Immediately fail if this was a DeclStmt, since it's very 7197 // likely that this will cause problems for future statements. 7198 if (isa<DeclStmt>(B)) 7199 return StmtError(); 7200 7201 // Otherwise, just keep processing substatements and fail later. 7202 SubStmtInvalid = true; 7203 continue; 7204 } 7205 7206 SubStmtChanged = SubStmtChanged || Result.get() != B; 7207 Statements.push_back(Result.getAs<Stmt>()); 7208 } 7209 7210 if (SubStmtInvalid) 7211 return StmtError(); 7212 7213 if (!getDerived().AlwaysRebuild() && 7214 !SubStmtChanged) 7215 return S; 7216 7217 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7218 Statements, 7219 S->getRBracLoc(), 7220 IsStmtExpr); 7221 } 7222 7223 template<typename Derived> 7224 StmtResult 7225 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7226 ExprResult LHS, RHS; 7227 { 7228 EnterExpressionEvaluationContext Unevaluated( 7229 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7230 7231 // Transform the left-hand case value. 7232 LHS = getDerived().TransformExpr(S->getLHS()); 7233 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7234 if (LHS.isInvalid()) 7235 return StmtError(); 7236 7237 // Transform the right-hand case value (for the GNU case-range extension). 7238 RHS = getDerived().TransformExpr(S->getRHS()); 7239 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7240 if (RHS.isInvalid()) 7241 return StmtError(); 7242 } 7243 7244 // Build the case statement. 7245 // Case statements are always rebuilt so that they will attached to their 7246 // transformed switch statement. 7247 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7248 LHS.get(), 7249 S->getEllipsisLoc(), 7250 RHS.get(), 7251 S->getColonLoc()); 7252 if (Case.isInvalid()) 7253 return StmtError(); 7254 7255 // Transform the statement following the case 7256 StmtResult SubStmt = 7257 getDerived().TransformStmt(S->getSubStmt()); 7258 if (SubStmt.isInvalid()) 7259 return StmtError(); 7260 7261 // Attach the body to the case statement 7262 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7263 } 7264 7265 template <typename Derived> 7266 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7267 // Transform the statement following the default case 7268 StmtResult SubStmt = 7269 getDerived().TransformStmt(S->getSubStmt()); 7270 if (SubStmt.isInvalid()) 7271 return StmtError(); 7272 7273 // Default statements are always rebuilt 7274 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7275 SubStmt.get()); 7276 } 7277 7278 template<typename Derived> 7279 StmtResult 7280 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7281 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7282 if (SubStmt.isInvalid()) 7283 return StmtError(); 7284 7285 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7286 S->getDecl()); 7287 if (!LD) 7288 return StmtError(); 7289 7290 // If we're transforming "in-place" (we're not creating new local 7291 // declarations), assume we're replacing the old label statement 7292 // and clear out the reference to it. 7293 if (LD == S->getDecl()) 7294 S->getDecl()->setStmt(nullptr); 7295 7296 // FIXME: Pass the real colon location in. 7297 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7298 cast<LabelDecl>(LD), SourceLocation(), 7299 SubStmt.get()); 7300 } 7301 7302 template <typename Derived> 7303 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7304 if (!R) 7305 return R; 7306 7307 switch (R->getKind()) { 7308 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7309 #define ATTR(X) 7310 #define PRAGMA_SPELLING_ATTR(X) \ 7311 case attr::X: \ 7312 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7313 #include "clang/Basic/AttrList.inc" 7314 default: 7315 return R; 7316 } 7317 } 7318 7319 template <typename Derived> 7320 StmtResult 7321 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7322 StmtDiscardKind SDK) { 7323 bool AttrsChanged = false; 7324 SmallVector<const Attr *, 1> Attrs; 7325 7326 // Visit attributes and keep track if any are transformed. 7327 for (const auto *I : S->getAttrs()) { 7328 const Attr *R = getDerived().TransformAttr(I); 7329 AttrsChanged |= (I != R); 7330 if (R) 7331 Attrs.push_back(R); 7332 } 7333 7334 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7335 if (SubStmt.isInvalid()) 7336 return StmtError(); 7337 7338 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7339 return S; 7340 7341 // If transforming the attributes failed for all of the attributes in the 7342 // statement, don't make an AttributedStmt without attributes. 7343 if (Attrs.empty()) 7344 return SubStmt; 7345 7346 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7347 SubStmt.get()); 7348 } 7349 7350 template<typename Derived> 7351 StmtResult 7352 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7353 // Transform the initialization statement 7354 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7355 if (Init.isInvalid()) 7356 return StmtError(); 7357 7358 // Transform the condition 7359 Sema::ConditionResult Cond = getDerived().TransformCondition( 7360 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7361 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7362 : Sema::ConditionKind::Boolean); 7363 if (Cond.isInvalid()) 7364 return StmtError(); 7365 7366 // If this is a constexpr if, determine which arm we should instantiate. 7367 llvm::Optional<bool> ConstexprConditionValue; 7368 if (S->isConstexpr()) 7369 ConstexprConditionValue = Cond.getKnownValue(); 7370 7371 // Transform the "then" branch. 7372 StmtResult Then; 7373 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7374 Then = getDerived().TransformStmt(S->getThen()); 7375 if (Then.isInvalid()) 7376 return StmtError(); 7377 } else { 7378 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7379 } 7380 7381 // Transform the "else" branch. 7382 StmtResult Else; 7383 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7384 Else = getDerived().TransformStmt(S->getElse()); 7385 if (Else.isInvalid()) 7386 return StmtError(); 7387 } 7388 7389 if (!getDerived().AlwaysRebuild() && 7390 Init.get() == S->getInit() && 7391 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7392 Then.get() == S->getThen() && 7393 Else.get() == S->getElse()) 7394 return S; 7395 7396 return getDerived().RebuildIfStmt( 7397 S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, 7398 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7399 } 7400 7401 template<typename Derived> 7402 StmtResult 7403 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7404 // Transform the initialization statement 7405 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7406 if (Init.isInvalid()) 7407 return StmtError(); 7408 7409 // Transform the condition. 7410 Sema::ConditionResult Cond = getDerived().TransformCondition( 7411 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7412 Sema::ConditionKind::Switch); 7413 if (Cond.isInvalid()) 7414 return StmtError(); 7415 7416 // Rebuild the switch statement. 7417 StmtResult Switch = 7418 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7419 Init.get(), Cond, S->getRParenLoc()); 7420 if (Switch.isInvalid()) 7421 return StmtError(); 7422 7423 // Transform the body of the switch statement. 7424 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7425 if (Body.isInvalid()) 7426 return StmtError(); 7427 7428 // Complete the switch statement. 7429 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7430 Body.get()); 7431 } 7432 7433 template<typename Derived> 7434 StmtResult 7435 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7436 // Transform the condition 7437 Sema::ConditionResult Cond = getDerived().TransformCondition( 7438 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7439 Sema::ConditionKind::Boolean); 7440 if (Cond.isInvalid()) 7441 return StmtError(); 7442 7443 // Transform the body 7444 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7445 if (Body.isInvalid()) 7446 return StmtError(); 7447 7448 if (!getDerived().AlwaysRebuild() && 7449 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7450 Body.get() == S->getBody()) 7451 return Owned(S); 7452 7453 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7454 Cond, S->getRParenLoc(), Body.get()); 7455 } 7456 7457 template<typename Derived> 7458 StmtResult 7459 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7460 // Transform the body 7461 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7462 if (Body.isInvalid()) 7463 return StmtError(); 7464 7465 // Transform the condition 7466 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7467 if (Cond.isInvalid()) 7468 return StmtError(); 7469 7470 if (!getDerived().AlwaysRebuild() && 7471 Cond.get() == S->getCond() && 7472 Body.get() == S->getBody()) 7473 return S; 7474 7475 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7476 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7477 S->getRParenLoc()); 7478 } 7479 7480 template<typename Derived> 7481 StmtResult 7482 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7483 if (getSema().getLangOpts().OpenMP) 7484 getSema().startOpenMPLoop(); 7485 7486 // Transform the initialization statement 7487 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7488 if (Init.isInvalid()) 7489 return StmtError(); 7490 7491 // In OpenMP loop region loop control variable must be captured and be 7492 // private. Perform analysis of first part (if any). 7493 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7494 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7495 7496 // Transform the condition 7497 Sema::ConditionResult Cond = getDerived().TransformCondition( 7498 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7499 Sema::ConditionKind::Boolean); 7500 if (Cond.isInvalid()) 7501 return StmtError(); 7502 7503 // Transform the increment 7504 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7505 if (Inc.isInvalid()) 7506 return StmtError(); 7507 7508 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7509 if (S->getInc() && !FullInc.get()) 7510 return StmtError(); 7511 7512 // Transform the body 7513 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7514 if (Body.isInvalid()) 7515 return StmtError(); 7516 7517 if (!getDerived().AlwaysRebuild() && 7518 Init.get() == S->getInit() && 7519 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7520 Inc.get() == S->getInc() && 7521 Body.get() == S->getBody()) 7522 return S; 7523 7524 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7525 Init.get(), Cond, FullInc, 7526 S->getRParenLoc(), Body.get()); 7527 } 7528 7529 template<typename Derived> 7530 StmtResult 7531 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7532 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7533 S->getLabel()); 7534 if (!LD) 7535 return StmtError(); 7536 7537 // Goto statements must always be rebuilt, to resolve the label. 7538 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7539 cast<LabelDecl>(LD)); 7540 } 7541 7542 template<typename Derived> 7543 StmtResult 7544 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7545 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7546 if (Target.isInvalid()) 7547 return StmtError(); 7548 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7549 7550 if (!getDerived().AlwaysRebuild() && 7551 Target.get() == S->getTarget()) 7552 return S; 7553 7554 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7555 Target.get()); 7556 } 7557 7558 template<typename Derived> 7559 StmtResult 7560 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7561 return S; 7562 } 7563 7564 template<typename Derived> 7565 StmtResult 7566 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7567 return S; 7568 } 7569 7570 template<typename Derived> 7571 StmtResult 7572 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7573 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7574 /*NotCopyInit*/false); 7575 if (Result.isInvalid()) 7576 return StmtError(); 7577 7578 // FIXME: We always rebuild the return statement because there is no way 7579 // to tell whether the return type of the function has changed. 7580 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7581 } 7582 7583 template<typename Derived> 7584 StmtResult 7585 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7586 bool DeclChanged = false; 7587 SmallVector<Decl *, 4> Decls; 7588 for (auto *D : S->decls()) { 7589 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7590 if (!Transformed) 7591 return StmtError(); 7592 7593 if (Transformed != D) 7594 DeclChanged = true; 7595 7596 Decls.push_back(Transformed); 7597 } 7598 7599 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7600 return S; 7601 7602 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7603 } 7604 7605 template<typename Derived> 7606 StmtResult 7607 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7608 7609 SmallVector<Expr*, 8> Constraints; 7610 SmallVector<Expr*, 8> Exprs; 7611 SmallVector<IdentifierInfo *, 4> Names; 7612 7613 ExprResult AsmString; 7614 SmallVector<Expr*, 8> Clobbers; 7615 7616 bool ExprsChanged = false; 7617 7618 // Go through the outputs. 7619 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7620 Names.push_back(S->getOutputIdentifier(I)); 7621 7622 // No need to transform the constraint literal. 7623 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7624 7625 // Transform the output expr. 7626 Expr *OutputExpr = S->getOutputExpr(I); 7627 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7628 if (Result.isInvalid()) 7629 return StmtError(); 7630 7631 ExprsChanged |= Result.get() != OutputExpr; 7632 7633 Exprs.push_back(Result.get()); 7634 } 7635 7636 // Go through the inputs. 7637 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7638 Names.push_back(S->getInputIdentifier(I)); 7639 7640 // No need to transform the constraint literal. 7641 Constraints.push_back(S->getInputConstraintLiteral(I)); 7642 7643 // Transform the input expr. 7644 Expr *InputExpr = S->getInputExpr(I); 7645 ExprResult Result = getDerived().TransformExpr(InputExpr); 7646 if (Result.isInvalid()) 7647 return StmtError(); 7648 7649 ExprsChanged |= Result.get() != InputExpr; 7650 7651 Exprs.push_back(Result.get()); 7652 } 7653 7654 // Go through the Labels. 7655 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7656 Names.push_back(S->getLabelIdentifier(I)); 7657 7658 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7659 if (Result.isInvalid()) 7660 return StmtError(); 7661 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7662 Exprs.push_back(Result.get()); 7663 } 7664 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7665 return S; 7666 7667 // Go through the clobbers. 7668 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7669 Clobbers.push_back(S->getClobberStringLiteral(I)); 7670 7671 // No need to transform the asm string literal. 7672 AsmString = S->getAsmString(); 7673 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7674 S->isVolatile(), S->getNumOutputs(), 7675 S->getNumInputs(), Names.data(), 7676 Constraints, Exprs, AsmString.get(), 7677 Clobbers, S->getNumLabels(), 7678 S->getRParenLoc()); 7679 } 7680 7681 template<typename Derived> 7682 StmtResult 7683 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7684 ArrayRef<Token> AsmToks = 7685 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7686 7687 bool HadError = false, HadChange = false; 7688 7689 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7690 SmallVector<Expr*, 8> TransformedExprs; 7691 TransformedExprs.reserve(SrcExprs.size()); 7692 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7693 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7694 if (!Result.isUsable()) { 7695 HadError = true; 7696 } else { 7697 HadChange |= (Result.get() != SrcExprs[i]); 7698 TransformedExprs.push_back(Result.get()); 7699 } 7700 } 7701 7702 if (HadError) return StmtError(); 7703 if (!HadChange && !getDerived().AlwaysRebuild()) 7704 return Owned(S); 7705 7706 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7707 AsmToks, S->getAsmString(), 7708 S->getNumOutputs(), S->getNumInputs(), 7709 S->getAllConstraints(), S->getClobbers(), 7710 TransformedExprs, S->getEndLoc()); 7711 } 7712 7713 // C++ Coroutines TS 7714 7715 template<typename Derived> 7716 StmtResult 7717 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7718 auto *ScopeInfo = SemaRef.getCurFunction(); 7719 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7720 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7721 ScopeInfo->NeedsCoroutineSuspends && 7722 ScopeInfo->CoroutineSuspends.first == nullptr && 7723 ScopeInfo->CoroutineSuspends.second == nullptr && 7724 "expected clean scope info"); 7725 7726 // Set that we have (possibly-invalid) suspend points before we do anything 7727 // that may fail. 7728 ScopeInfo->setNeedsCoroutineSuspends(false); 7729 7730 // We re-build the coroutine promise object (and the coroutine parameters its 7731 // type and constructor depend on) based on the types used in our current 7732 // function. We must do so, and set it on the current FunctionScopeInfo, 7733 // before attempting to transform the other parts of the coroutine body 7734 // statement, such as the implicit suspend statements (because those 7735 // statements reference the FunctionScopeInfo::CoroutinePromise). 7736 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7737 return StmtError(); 7738 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7739 if (!Promise) 7740 return StmtError(); 7741 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7742 ScopeInfo->CoroutinePromise = Promise; 7743 7744 // Transform the implicit coroutine statements constructed using dependent 7745 // types during the previous parse: initial and final suspensions, the return 7746 // object, and others. We also transform the coroutine function's body. 7747 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7748 if (InitSuspend.isInvalid()) 7749 return StmtError(); 7750 StmtResult FinalSuspend = 7751 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7752 if (FinalSuspend.isInvalid() || 7753 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7754 return StmtError(); 7755 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7756 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7757 7758 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7759 if (BodyRes.isInvalid()) 7760 return StmtError(); 7761 7762 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7763 if (Builder.isInvalid()) 7764 return StmtError(); 7765 7766 Expr *ReturnObject = S->getReturnValueInit(); 7767 assert(ReturnObject && "the return object is expected to be valid"); 7768 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7769 /*NoCopyInit*/ false); 7770 if (Res.isInvalid()) 7771 return StmtError(); 7772 Builder.ReturnValue = Res.get(); 7773 7774 // If during the previous parse the coroutine still had a dependent promise 7775 // statement, we may need to build some implicit coroutine statements 7776 // (such as exception and fallthrough handlers) for the first time. 7777 if (S->hasDependentPromiseType()) { 7778 // We can only build these statements, however, if the current promise type 7779 // is not dependent. 7780 if (!Promise->getType()->isDependentType()) { 7781 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7782 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7783 "these nodes should not have been built yet"); 7784 if (!Builder.buildDependentStatements()) 7785 return StmtError(); 7786 } 7787 } else { 7788 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7789 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7790 if (Res.isInvalid()) 7791 return StmtError(); 7792 Builder.OnFallthrough = Res.get(); 7793 } 7794 7795 if (auto *OnException = S->getExceptionHandler()) { 7796 StmtResult Res = getDerived().TransformStmt(OnException); 7797 if (Res.isInvalid()) 7798 return StmtError(); 7799 Builder.OnException = Res.get(); 7800 } 7801 7802 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7803 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7804 if (Res.isInvalid()) 7805 return StmtError(); 7806 Builder.ReturnStmtOnAllocFailure = Res.get(); 7807 } 7808 7809 // Transform any additional statements we may have already built 7810 assert(S->getAllocate() && S->getDeallocate() && 7811 "allocation and deallocation calls must already be built"); 7812 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7813 if (AllocRes.isInvalid()) 7814 return StmtError(); 7815 Builder.Allocate = AllocRes.get(); 7816 7817 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7818 if (DeallocRes.isInvalid()) 7819 return StmtError(); 7820 Builder.Deallocate = DeallocRes.get(); 7821 7822 assert(S->getResultDecl() && "ResultDecl must already be built"); 7823 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7824 if (ResultDecl.isInvalid()) 7825 return StmtError(); 7826 Builder.ResultDecl = ResultDecl.get(); 7827 7828 if (auto *ReturnStmt = S->getReturnStmt()) { 7829 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7830 if (Res.isInvalid()) 7831 return StmtError(); 7832 Builder.ReturnStmt = Res.get(); 7833 } 7834 } 7835 7836 return getDerived().RebuildCoroutineBodyStmt(Builder); 7837 } 7838 7839 template<typename Derived> 7840 StmtResult 7841 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7842 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7843 /*NotCopyInit*/false); 7844 if (Result.isInvalid()) 7845 return StmtError(); 7846 7847 // Always rebuild; we don't know if this needs to be injected into a new 7848 // context or if the promise type has changed. 7849 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7850 S->isImplicit()); 7851 } 7852 7853 template<typename Derived> 7854 ExprResult 7855 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7856 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7857 /*NotCopyInit*/false); 7858 if (Result.isInvalid()) 7859 return ExprError(); 7860 7861 // Always rebuild; we don't know if this needs to be injected into a new 7862 // context or if the promise type has changed. 7863 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7864 E->isImplicit()); 7865 } 7866 7867 template <typename Derived> 7868 ExprResult 7869 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7870 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7871 /*NotCopyInit*/ false); 7872 if (OperandResult.isInvalid()) 7873 return ExprError(); 7874 7875 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7876 E->getOperatorCoawaitLookup()); 7877 7878 if (LookupResult.isInvalid()) 7879 return ExprError(); 7880 7881 // Always rebuild; we don't know if this needs to be injected into a new 7882 // context or if the promise type has changed. 7883 return getDerived().RebuildDependentCoawaitExpr( 7884 E->getKeywordLoc(), OperandResult.get(), 7885 cast<UnresolvedLookupExpr>(LookupResult.get())); 7886 } 7887 7888 template<typename Derived> 7889 ExprResult 7890 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7891 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7892 /*NotCopyInit*/false); 7893 if (Result.isInvalid()) 7894 return ExprError(); 7895 7896 // Always rebuild; we don't know if this needs to be injected into a new 7897 // context or if the promise type has changed. 7898 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7899 } 7900 7901 // Objective-C Statements. 7902 7903 template<typename Derived> 7904 StmtResult 7905 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7906 // Transform the body of the @try. 7907 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7908 if (TryBody.isInvalid()) 7909 return StmtError(); 7910 7911 // Transform the @catch statements (if present). 7912 bool AnyCatchChanged = false; 7913 SmallVector<Stmt*, 8> CatchStmts; 7914 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7915 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7916 if (Catch.isInvalid()) 7917 return StmtError(); 7918 if (Catch.get() != S->getCatchStmt(I)) 7919 AnyCatchChanged = true; 7920 CatchStmts.push_back(Catch.get()); 7921 } 7922 7923 // Transform the @finally statement (if present). 7924 StmtResult Finally; 7925 if (S->getFinallyStmt()) { 7926 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7927 if (Finally.isInvalid()) 7928 return StmtError(); 7929 } 7930 7931 // If nothing changed, just retain this statement. 7932 if (!getDerived().AlwaysRebuild() && 7933 TryBody.get() == S->getTryBody() && 7934 !AnyCatchChanged && 7935 Finally.get() == S->getFinallyStmt()) 7936 return S; 7937 7938 // Build a new statement. 7939 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7940 CatchStmts, Finally.get()); 7941 } 7942 7943 template<typename Derived> 7944 StmtResult 7945 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7946 // Transform the @catch parameter, if there is one. 7947 VarDecl *Var = nullptr; 7948 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7949 TypeSourceInfo *TSInfo = nullptr; 7950 if (FromVar->getTypeSourceInfo()) { 7951 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7952 if (!TSInfo) 7953 return StmtError(); 7954 } 7955 7956 QualType T; 7957 if (TSInfo) 7958 T = TSInfo->getType(); 7959 else { 7960 T = getDerived().TransformType(FromVar->getType()); 7961 if (T.isNull()) 7962 return StmtError(); 7963 } 7964 7965 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7966 if (!Var) 7967 return StmtError(); 7968 } 7969 7970 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7971 if (Body.isInvalid()) 7972 return StmtError(); 7973 7974 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7975 S->getRParenLoc(), 7976 Var, Body.get()); 7977 } 7978 7979 template<typename Derived> 7980 StmtResult 7981 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7982 // Transform the body. 7983 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7984 if (Body.isInvalid()) 7985 return StmtError(); 7986 7987 // If nothing changed, just retain this statement. 7988 if (!getDerived().AlwaysRebuild() && 7989 Body.get() == S->getFinallyBody()) 7990 return S; 7991 7992 // Build a new statement. 7993 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7994 Body.get()); 7995 } 7996 7997 template<typename Derived> 7998 StmtResult 7999 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8000 ExprResult Operand; 8001 if (S->getThrowExpr()) { 8002 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8003 if (Operand.isInvalid()) 8004 return StmtError(); 8005 } 8006 8007 if (!getDerived().AlwaysRebuild() && 8008 Operand.get() == S->getThrowExpr()) 8009 return S; 8010 8011 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8012 } 8013 8014 template<typename Derived> 8015 StmtResult 8016 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8017 ObjCAtSynchronizedStmt *S) { 8018 // Transform the object we are locking. 8019 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8020 if (Object.isInvalid()) 8021 return StmtError(); 8022 Object = 8023 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8024 Object.get()); 8025 if (Object.isInvalid()) 8026 return StmtError(); 8027 8028 // Transform the body. 8029 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8030 if (Body.isInvalid()) 8031 return StmtError(); 8032 8033 // If nothing change, just retain the current statement. 8034 if (!getDerived().AlwaysRebuild() && 8035 Object.get() == S->getSynchExpr() && 8036 Body.get() == S->getSynchBody()) 8037 return S; 8038 8039 // Build a new statement. 8040 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8041 Object.get(), Body.get()); 8042 } 8043 8044 template<typename Derived> 8045 StmtResult 8046 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8047 ObjCAutoreleasePoolStmt *S) { 8048 // Transform the body. 8049 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8050 if (Body.isInvalid()) 8051 return StmtError(); 8052 8053 // If nothing changed, just retain this statement. 8054 if (!getDerived().AlwaysRebuild() && 8055 Body.get() == S->getSubStmt()) 8056 return S; 8057 8058 // Build a new statement. 8059 return getDerived().RebuildObjCAutoreleasePoolStmt( 8060 S->getAtLoc(), Body.get()); 8061 } 8062 8063 template<typename Derived> 8064 StmtResult 8065 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8066 ObjCForCollectionStmt *S) { 8067 // Transform the element statement. 8068 StmtResult Element = 8069 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8070 if (Element.isInvalid()) 8071 return StmtError(); 8072 8073 // Transform the collection expression. 8074 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8075 if (Collection.isInvalid()) 8076 return StmtError(); 8077 8078 // Transform the body. 8079 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8080 if (Body.isInvalid()) 8081 return StmtError(); 8082 8083 // If nothing changed, just retain this statement. 8084 if (!getDerived().AlwaysRebuild() && 8085 Element.get() == S->getElement() && 8086 Collection.get() == S->getCollection() && 8087 Body.get() == S->getBody()) 8088 return S; 8089 8090 // Build a new statement. 8091 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8092 Element.get(), 8093 Collection.get(), 8094 S->getRParenLoc(), 8095 Body.get()); 8096 } 8097 8098 template <typename Derived> 8099 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8100 // Transform the exception declaration, if any. 8101 VarDecl *Var = nullptr; 8102 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8103 TypeSourceInfo *T = 8104 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8105 if (!T) 8106 return StmtError(); 8107 8108 Var = getDerived().RebuildExceptionDecl( 8109 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8110 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8111 if (!Var || Var->isInvalidDecl()) 8112 return StmtError(); 8113 } 8114 8115 // Transform the actual exception handler. 8116 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8117 if (Handler.isInvalid()) 8118 return StmtError(); 8119 8120 if (!getDerived().AlwaysRebuild() && !Var && 8121 Handler.get() == S->getHandlerBlock()) 8122 return S; 8123 8124 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8125 } 8126 8127 template <typename Derived> 8128 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8129 // Transform the try block itself. 8130 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8131 if (TryBlock.isInvalid()) 8132 return StmtError(); 8133 8134 // Transform the handlers. 8135 bool HandlerChanged = false; 8136 SmallVector<Stmt *, 8> Handlers; 8137 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8138 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8139 if (Handler.isInvalid()) 8140 return StmtError(); 8141 8142 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8143 Handlers.push_back(Handler.getAs<Stmt>()); 8144 } 8145 8146 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8147 !HandlerChanged) 8148 return S; 8149 8150 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8151 Handlers); 8152 } 8153 8154 template<typename Derived> 8155 StmtResult 8156 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8157 StmtResult Init = 8158 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8159 if (Init.isInvalid()) 8160 return StmtError(); 8161 8162 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8163 if (Range.isInvalid()) 8164 return StmtError(); 8165 8166 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8167 if (Begin.isInvalid()) 8168 return StmtError(); 8169 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8170 if (End.isInvalid()) 8171 return StmtError(); 8172 8173 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8174 if (Cond.isInvalid()) 8175 return StmtError(); 8176 if (Cond.get()) 8177 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8178 if (Cond.isInvalid()) 8179 return StmtError(); 8180 if (Cond.get()) 8181 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8182 8183 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8184 if (Inc.isInvalid()) 8185 return StmtError(); 8186 if (Inc.get()) 8187 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8188 8189 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8190 if (LoopVar.isInvalid()) 8191 return StmtError(); 8192 8193 StmtResult NewStmt = S; 8194 if (getDerived().AlwaysRebuild() || 8195 Init.get() != S->getInit() || 8196 Range.get() != S->getRangeStmt() || 8197 Begin.get() != S->getBeginStmt() || 8198 End.get() != S->getEndStmt() || 8199 Cond.get() != S->getCond() || 8200 Inc.get() != S->getInc() || 8201 LoopVar.get() != S->getLoopVarStmt()) { 8202 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8203 S->getCoawaitLoc(), Init.get(), 8204 S->getColonLoc(), Range.get(), 8205 Begin.get(), End.get(), 8206 Cond.get(), 8207 Inc.get(), LoopVar.get(), 8208 S->getRParenLoc()); 8209 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8210 // Might not have attached any initializer to the loop variable. 8211 getSema().ActOnInitializerError( 8212 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8213 return StmtError(); 8214 } 8215 } 8216 8217 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8218 if (Body.isInvalid()) 8219 return StmtError(); 8220 8221 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8222 // it now so we have a new statement to attach the body to. 8223 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8224 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8225 S->getCoawaitLoc(), Init.get(), 8226 S->getColonLoc(), Range.get(), 8227 Begin.get(), End.get(), 8228 Cond.get(), 8229 Inc.get(), LoopVar.get(), 8230 S->getRParenLoc()); 8231 if (NewStmt.isInvalid()) 8232 return StmtError(); 8233 } 8234 8235 if (NewStmt.get() == S) 8236 return S; 8237 8238 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8239 } 8240 8241 template<typename Derived> 8242 StmtResult 8243 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8244 MSDependentExistsStmt *S) { 8245 // Transform the nested-name-specifier, if any. 8246 NestedNameSpecifierLoc QualifierLoc; 8247 if (S->getQualifierLoc()) { 8248 QualifierLoc 8249 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8250 if (!QualifierLoc) 8251 return StmtError(); 8252 } 8253 8254 // Transform the declaration name. 8255 DeclarationNameInfo NameInfo = S->getNameInfo(); 8256 if (NameInfo.getName()) { 8257 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8258 if (!NameInfo.getName()) 8259 return StmtError(); 8260 } 8261 8262 // Check whether anything changed. 8263 if (!getDerived().AlwaysRebuild() && 8264 QualifierLoc == S->getQualifierLoc() && 8265 NameInfo.getName() == S->getNameInfo().getName()) 8266 return S; 8267 8268 // Determine whether this name exists, if we can. 8269 CXXScopeSpec SS; 8270 SS.Adopt(QualifierLoc); 8271 bool Dependent = false; 8272 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8273 case Sema::IER_Exists: 8274 if (S->isIfExists()) 8275 break; 8276 8277 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8278 8279 case Sema::IER_DoesNotExist: 8280 if (S->isIfNotExists()) 8281 break; 8282 8283 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8284 8285 case Sema::IER_Dependent: 8286 Dependent = true; 8287 break; 8288 8289 case Sema::IER_Error: 8290 return StmtError(); 8291 } 8292 8293 // We need to continue with the instantiation, so do so now. 8294 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8295 if (SubStmt.isInvalid()) 8296 return StmtError(); 8297 8298 // If we have resolved the name, just transform to the substatement. 8299 if (!Dependent) 8300 return SubStmt; 8301 8302 // The name is still dependent, so build a dependent expression again. 8303 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8304 S->isIfExists(), 8305 QualifierLoc, 8306 NameInfo, 8307 SubStmt.get()); 8308 } 8309 8310 template<typename Derived> 8311 ExprResult 8312 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8313 NestedNameSpecifierLoc QualifierLoc; 8314 if (E->getQualifierLoc()) { 8315 QualifierLoc 8316 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8317 if (!QualifierLoc) 8318 return ExprError(); 8319 } 8320 8321 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8322 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8323 if (!PD) 8324 return ExprError(); 8325 8326 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8327 if (Base.isInvalid()) 8328 return ExprError(); 8329 8330 return new (SemaRef.getASTContext()) 8331 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8332 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8333 QualifierLoc, E->getMemberLoc()); 8334 } 8335 8336 template <typename Derived> 8337 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8338 MSPropertySubscriptExpr *E) { 8339 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8340 if (BaseRes.isInvalid()) 8341 return ExprError(); 8342 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8343 if (IdxRes.isInvalid()) 8344 return ExprError(); 8345 8346 if (!getDerived().AlwaysRebuild() && 8347 BaseRes.get() == E->getBase() && 8348 IdxRes.get() == E->getIdx()) 8349 return E; 8350 8351 return getDerived().RebuildArraySubscriptExpr( 8352 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8353 } 8354 8355 template <typename Derived> 8356 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8357 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8358 if (TryBlock.isInvalid()) 8359 return StmtError(); 8360 8361 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8362 if (Handler.isInvalid()) 8363 return StmtError(); 8364 8365 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8366 Handler.get() == S->getHandler()) 8367 return S; 8368 8369 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8370 TryBlock.get(), Handler.get()); 8371 } 8372 8373 template <typename Derived> 8374 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8375 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8376 if (Block.isInvalid()) 8377 return StmtError(); 8378 8379 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8380 } 8381 8382 template <typename Derived> 8383 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8384 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8385 if (FilterExpr.isInvalid()) 8386 return StmtError(); 8387 8388 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8389 if (Block.isInvalid()) 8390 return StmtError(); 8391 8392 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8393 Block.get()); 8394 } 8395 8396 template <typename Derived> 8397 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8398 if (isa<SEHFinallyStmt>(Handler)) 8399 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8400 else 8401 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8402 } 8403 8404 template<typename Derived> 8405 StmtResult 8406 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8407 return S; 8408 } 8409 8410 //===----------------------------------------------------------------------===// 8411 // OpenMP directive transformation 8412 //===----------------------------------------------------------------------===// 8413 8414 template <typename Derived> 8415 StmtResult 8416 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8417 // OMPCanonicalLoops are eliminated during transformation, since they will be 8418 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8419 // after transformation. 8420 return getDerived().TransformStmt(L->getLoopStmt()); 8421 } 8422 8423 template <typename Derived> 8424 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8425 OMPExecutableDirective *D) { 8426 8427 // Transform the clauses 8428 llvm::SmallVector<OMPClause *, 16> TClauses; 8429 ArrayRef<OMPClause *> Clauses = D->clauses(); 8430 TClauses.reserve(Clauses.size()); 8431 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8432 I != E; ++I) { 8433 if (*I) { 8434 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8435 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8436 getDerived().getSema().EndOpenMPClause(); 8437 if (Clause) 8438 TClauses.push_back(Clause); 8439 } else { 8440 TClauses.push_back(nullptr); 8441 } 8442 } 8443 StmtResult AssociatedStmt; 8444 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8445 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8446 /*CurScope=*/nullptr); 8447 StmtResult Body; 8448 { 8449 Sema::CompoundScopeRAII CompoundScope(getSema()); 8450 Stmt *CS; 8451 if (D->getDirectiveKind() == OMPD_atomic || 8452 D->getDirectiveKind() == OMPD_critical || 8453 D->getDirectiveKind() == OMPD_section || 8454 D->getDirectiveKind() == OMPD_master) 8455 CS = D->getAssociatedStmt(); 8456 else 8457 CS = D->getRawStmt(); 8458 Body = getDerived().TransformStmt(CS); 8459 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8460 getSema().getLangOpts().OpenMPIRBuilder) 8461 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8462 } 8463 AssociatedStmt = 8464 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8465 if (AssociatedStmt.isInvalid()) { 8466 return StmtError(); 8467 } 8468 } 8469 if (TClauses.size() != Clauses.size()) { 8470 return StmtError(); 8471 } 8472 8473 // Transform directive name for 'omp critical' directive. 8474 DeclarationNameInfo DirName; 8475 if (D->getDirectiveKind() == OMPD_critical) { 8476 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8477 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8478 } 8479 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8480 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8481 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8482 } else if (D->getDirectiveKind() == OMPD_cancel) { 8483 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8484 } 8485 8486 return getDerived().RebuildOMPExecutableDirective( 8487 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8488 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8489 } 8490 8491 template <typename Derived> 8492 StmtResult 8493 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8494 DeclarationNameInfo DirName; 8495 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8496 D->getBeginLoc()); 8497 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8498 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8499 return Res; 8500 } 8501 8502 template <typename Derived> 8503 StmtResult 8504 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8505 DeclarationNameInfo DirName; 8506 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8507 D->getBeginLoc()); 8508 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8509 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8510 return Res; 8511 } 8512 8513 template <typename Derived> 8514 StmtResult 8515 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8516 DeclarationNameInfo DirName; 8517 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8518 nullptr, D->getBeginLoc()); 8519 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8520 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8521 return Res; 8522 } 8523 8524 template <typename Derived> 8525 StmtResult 8526 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8527 DeclarationNameInfo DirName; 8528 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8529 D->getBeginLoc()); 8530 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8531 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8532 return Res; 8533 } 8534 8535 template <typename Derived> 8536 StmtResult 8537 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8538 DeclarationNameInfo DirName; 8539 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8540 D->getBeginLoc()); 8541 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8542 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8543 return Res; 8544 } 8545 8546 template <typename Derived> 8547 StmtResult 8548 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8549 DeclarationNameInfo DirName; 8550 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8551 D->getBeginLoc()); 8552 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8553 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8554 return Res; 8555 } 8556 8557 template <typename Derived> 8558 StmtResult 8559 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8560 DeclarationNameInfo DirName; 8561 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8562 D->getBeginLoc()); 8563 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8564 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8565 return Res; 8566 } 8567 8568 template <typename Derived> 8569 StmtResult 8570 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8571 DeclarationNameInfo DirName; 8572 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8573 D->getBeginLoc()); 8574 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8575 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8576 return Res; 8577 } 8578 8579 template <typename Derived> 8580 StmtResult 8581 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8582 DeclarationNameInfo DirName; 8583 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8584 D->getBeginLoc()); 8585 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8586 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8587 return Res; 8588 } 8589 8590 template <typename Derived> 8591 StmtResult 8592 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8593 getDerived().getSema().StartOpenMPDSABlock( 8594 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8595 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8596 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8597 return Res; 8598 } 8599 8600 template <typename Derived> 8601 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8602 OMPParallelForDirective *D) { 8603 DeclarationNameInfo DirName; 8604 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8605 nullptr, D->getBeginLoc()); 8606 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8607 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8608 return Res; 8609 } 8610 8611 template <typename Derived> 8612 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8613 OMPParallelForSimdDirective *D) { 8614 DeclarationNameInfo DirName; 8615 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8616 nullptr, D->getBeginLoc()); 8617 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8618 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8619 return Res; 8620 } 8621 8622 template <typename Derived> 8623 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8624 OMPParallelMasterDirective *D) { 8625 DeclarationNameInfo DirName; 8626 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8627 nullptr, D->getBeginLoc()); 8628 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8629 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8630 return Res; 8631 } 8632 8633 template <typename Derived> 8634 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8635 OMPParallelSectionsDirective *D) { 8636 DeclarationNameInfo DirName; 8637 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8638 nullptr, D->getBeginLoc()); 8639 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8640 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8641 return Res; 8642 } 8643 8644 template <typename Derived> 8645 StmtResult 8646 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8647 DeclarationNameInfo DirName; 8648 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8649 D->getBeginLoc()); 8650 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8651 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8652 return Res; 8653 } 8654 8655 template <typename Derived> 8656 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8657 OMPTaskyieldDirective *D) { 8658 DeclarationNameInfo DirName; 8659 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8660 D->getBeginLoc()); 8661 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8662 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8663 return Res; 8664 } 8665 8666 template <typename Derived> 8667 StmtResult 8668 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8669 DeclarationNameInfo DirName; 8670 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8671 D->getBeginLoc()); 8672 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8673 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8674 return Res; 8675 } 8676 8677 template <typename Derived> 8678 StmtResult 8679 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8680 DeclarationNameInfo DirName; 8681 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8682 D->getBeginLoc()); 8683 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8684 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8685 return Res; 8686 } 8687 8688 template <typename Derived> 8689 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8690 OMPTaskgroupDirective *D) { 8691 DeclarationNameInfo DirName; 8692 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8693 D->getBeginLoc()); 8694 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8695 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8696 return Res; 8697 } 8698 8699 template <typename Derived> 8700 StmtResult 8701 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8702 DeclarationNameInfo DirName; 8703 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8704 D->getBeginLoc()); 8705 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8706 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8707 return Res; 8708 } 8709 8710 template <typename Derived> 8711 StmtResult 8712 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8713 DeclarationNameInfo DirName; 8714 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8715 D->getBeginLoc()); 8716 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8717 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8718 return Res; 8719 } 8720 8721 template <typename Derived> 8722 StmtResult 8723 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8724 DeclarationNameInfo DirName; 8725 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8726 D->getBeginLoc()); 8727 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8728 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8729 return Res; 8730 } 8731 8732 template <typename Derived> 8733 StmtResult 8734 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8735 DeclarationNameInfo DirName; 8736 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8737 D->getBeginLoc()); 8738 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8739 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8740 return Res; 8741 } 8742 8743 template <typename Derived> 8744 StmtResult 8745 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8746 DeclarationNameInfo DirName; 8747 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8748 D->getBeginLoc()); 8749 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8750 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8751 return Res; 8752 } 8753 8754 template <typename Derived> 8755 StmtResult 8756 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8757 DeclarationNameInfo DirName; 8758 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8759 D->getBeginLoc()); 8760 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8761 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8762 return Res; 8763 } 8764 8765 template <typename Derived> 8766 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8767 OMPTargetDataDirective *D) { 8768 DeclarationNameInfo DirName; 8769 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8770 D->getBeginLoc()); 8771 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8772 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8773 return Res; 8774 } 8775 8776 template <typename Derived> 8777 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8778 OMPTargetEnterDataDirective *D) { 8779 DeclarationNameInfo DirName; 8780 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8781 nullptr, D->getBeginLoc()); 8782 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8783 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8784 return Res; 8785 } 8786 8787 template <typename Derived> 8788 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8789 OMPTargetExitDataDirective *D) { 8790 DeclarationNameInfo DirName; 8791 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8792 nullptr, D->getBeginLoc()); 8793 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8794 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8795 return Res; 8796 } 8797 8798 template <typename Derived> 8799 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8800 OMPTargetParallelDirective *D) { 8801 DeclarationNameInfo DirName; 8802 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8803 nullptr, D->getBeginLoc()); 8804 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8805 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8806 return Res; 8807 } 8808 8809 template <typename Derived> 8810 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8811 OMPTargetParallelForDirective *D) { 8812 DeclarationNameInfo DirName; 8813 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8814 nullptr, D->getBeginLoc()); 8815 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8816 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8817 return Res; 8818 } 8819 8820 template <typename Derived> 8821 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8822 OMPTargetUpdateDirective *D) { 8823 DeclarationNameInfo DirName; 8824 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8825 nullptr, D->getBeginLoc()); 8826 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8827 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8828 return Res; 8829 } 8830 8831 template <typename Derived> 8832 StmtResult 8833 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8834 DeclarationNameInfo DirName; 8835 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8836 D->getBeginLoc()); 8837 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8838 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8839 return Res; 8840 } 8841 8842 template <typename Derived> 8843 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8844 OMPCancellationPointDirective *D) { 8845 DeclarationNameInfo DirName; 8846 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8847 nullptr, D->getBeginLoc()); 8848 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8849 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8850 return Res; 8851 } 8852 8853 template <typename Derived> 8854 StmtResult 8855 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8856 DeclarationNameInfo DirName; 8857 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8858 D->getBeginLoc()); 8859 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8860 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8861 return Res; 8862 } 8863 8864 template <typename Derived> 8865 StmtResult 8866 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8867 DeclarationNameInfo DirName; 8868 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8869 D->getBeginLoc()); 8870 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8871 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8872 return Res; 8873 } 8874 8875 template <typename Derived> 8876 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8877 OMPTaskLoopSimdDirective *D) { 8878 DeclarationNameInfo DirName; 8879 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8880 nullptr, D->getBeginLoc()); 8881 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8882 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8883 return Res; 8884 } 8885 8886 template <typename Derived> 8887 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8888 OMPMasterTaskLoopDirective *D) { 8889 DeclarationNameInfo DirName; 8890 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8891 nullptr, D->getBeginLoc()); 8892 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8893 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8894 return Res; 8895 } 8896 8897 template <typename Derived> 8898 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8899 OMPMasterTaskLoopSimdDirective *D) { 8900 DeclarationNameInfo DirName; 8901 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8902 nullptr, D->getBeginLoc()); 8903 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8904 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8905 return Res; 8906 } 8907 8908 template <typename Derived> 8909 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8910 OMPParallelMasterTaskLoopDirective *D) { 8911 DeclarationNameInfo DirName; 8912 getDerived().getSema().StartOpenMPDSABlock( 8913 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8914 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8915 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8916 return Res; 8917 } 8918 8919 template <typename Derived> 8920 StmtResult 8921 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8922 OMPParallelMasterTaskLoopSimdDirective *D) { 8923 DeclarationNameInfo DirName; 8924 getDerived().getSema().StartOpenMPDSABlock( 8925 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8926 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8927 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8928 return Res; 8929 } 8930 8931 template <typename Derived> 8932 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8933 OMPDistributeDirective *D) { 8934 DeclarationNameInfo DirName; 8935 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8936 D->getBeginLoc()); 8937 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8938 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8939 return Res; 8940 } 8941 8942 template <typename Derived> 8943 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8944 OMPDistributeParallelForDirective *D) { 8945 DeclarationNameInfo DirName; 8946 getDerived().getSema().StartOpenMPDSABlock( 8947 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8948 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8949 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8950 return Res; 8951 } 8952 8953 template <typename Derived> 8954 StmtResult 8955 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8956 OMPDistributeParallelForSimdDirective *D) { 8957 DeclarationNameInfo DirName; 8958 getDerived().getSema().StartOpenMPDSABlock( 8959 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8960 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8961 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8962 return Res; 8963 } 8964 8965 template <typename Derived> 8966 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8967 OMPDistributeSimdDirective *D) { 8968 DeclarationNameInfo DirName; 8969 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8970 nullptr, D->getBeginLoc()); 8971 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8972 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8973 return Res; 8974 } 8975 8976 template <typename Derived> 8977 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8978 OMPTargetParallelForSimdDirective *D) { 8979 DeclarationNameInfo DirName; 8980 getDerived().getSema().StartOpenMPDSABlock( 8981 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8982 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8983 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8984 return Res; 8985 } 8986 8987 template <typename Derived> 8988 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8989 OMPTargetSimdDirective *D) { 8990 DeclarationNameInfo DirName; 8991 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8992 D->getBeginLoc()); 8993 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8994 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8995 return Res; 8996 } 8997 8998 template <typename Derived> 8999 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9000 OMPTeamsDistributeDirective *D) { 9001 DeclarationNameInfo DirName; 9002 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9003 nullptr, D->getBeginLoc()); 9004 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9005 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9006 return Res; 9007 } 9008 9009 template <typename Derived> 9010 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9011 OMPTeamsDistributeSimdDirective *D) { 9012 DeclarationNameInfo DirName; 9013 getDerived().getSema().StartOpenMPDSABlock( 9014 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9015 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9016 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9017 return Res; 9018 } 9019 9020 template <typename Derived> 9021 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9022 OMPTeamsDistributeParallelForSimdDirective *D) { 9023 DeclarationNameInfo DirName; 9024 getDerived().getSema().StartOpenMPDSABlock( 9025 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9026 D->getBeginLoc()); 9027 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9028 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9029 return Res; 9030 } 9031 9032 template <typename Derived> 9033 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9034 OMPTeamsDistributeParallelForDirective *D) { 9035 DeclarationNameInfo DirName; 9036 getDerived().getSema().StartOpenMPDSABlock( 9037 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9038 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9039 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9040 return Res; 9041 } 9042 9043 template <typename Derived> 9044 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9045 OMPTargetTeamsDirective *D) { 9046 DeclarationNameInfo DirName; 9047 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9048 nullptr, D->getBeginLoc()); 9049 auto Res = getDerived().TransformOMPExecutableDirective(D); 9050 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9051 return Res; 9052 } 9053 9054 template <typename Derived> 9055 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9056 OMPTargetTeamsDistributeDirective *D) { 9057 DeclarationNameInfo DirName; 9058 getDerived().getSema().StartOpenMPDSABlock( 9059 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9060 auto Res = getDerived().TransformOMPExecutableDirective(D); 9061 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9062 return Res; 9063 } 9064 9065 template <typename Derived> 9066 StmtResult 9067 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9068 OMPTargetTeamsDistributeParallelForDirective *D) { 9069 DeclarationNameInfo DirName; 9070 getDerived().getSema().StartOpenMPDSABlock( 9071 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9072 D->getBeginLoc()); 9073 auto Res = getDerived().TransformOMPExecutableDirective(D); 9074 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9075 return Res; 9076 } 9077 9078 template <typename Derived> 9079 StmtResult TreeTransform<Derived>:: 9080 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9081 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9082 DeclarationNameInfo DirName; 9083 getDerived().getSema().StartOpenMPDSABlock( 9084 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9085 D->getBeginLoc()); 9086 auto Res = getDerived().TransformOMPExecutableDirective(D); 9087 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9088 return Res; 9089 } 9090 9091 template <typename Derived> 9092 StmtResult 9093 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9094 OMPTargetTeamsDistributeSimdDirective *D) { 9095 DeclarationNameInfo DirName; 9096 getDerived().getSema().StartOpenMPDSABlock( 9097 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9098 auto Res = getDerived().TransformOMPExecutableDirective(D); 9099 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9100 return Res; 9101 } 9102 9103 template <typename Derived> 9104 StmtResult 9105 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9106 DeclarationNameInfo DirName; 9107 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9108 D->getBeginLoc()); 9109 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9110 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9111 return Res; 9112 } 9113 9114 template <typename Derived> 9115 StmtResult 9116 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9117 DeclarationNameInfo DirName; 9118 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9119 D->getBeginLoc()); 9120 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9121 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9122 return Res; 9123 } 9124 9125 template <typename Derived> 9126 StmtResult 9127 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9128 DeclarationNameInfo DirName; 9129 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9130 D->getBeginLoc()); 9131 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9132 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9133 return Res; 9134 } 9135 9136 //===----------------------------------------------------------------------===// 9137 // OpenMP clause transformation 9138 //===----------------------------------------------------------------------===// 9139 template <typename Derived> 9140 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9141 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9142 if (Cond.isInvalid()) 9143 return nullptr; 9144 return getDerived().RebuildOMPIfClause( 9145 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9146 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9147 } 9148 9149 template <typename Derived> 9150 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9151 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9152 if (Cond.isInvalid()) 9153 return nullptr; 9154 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9155 C->getLParenLoc(), C->getEndLoc()); 9156 } 9157 9158 template <typename Derived> 9159 OMPClause * 9160 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9161 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9162 if (NumThreads.isInvalid()) 9163 return nullptr; 9164 return getDerived().RebuildOMPNumThreadsClause( 9165 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9166 } 9167 9168 template <typename Derived> 9169 OMPClause * 9170 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9171 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9172 if (E.isInvalid()) 9173 return nullptr; 9174 return getDerived().RebuildOMPSafelenClause( 9175 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9176 } 9177 9178 template <typename Derived> 9179 OMPClause * 9180 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9181 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9182 if (E.isInvalid()) 9183 return nullptr; 9184 return getDerived().RebuildOMPAllocatorClause( 9185 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9186 } 9187 9188 template <typename Derived> 9189 OMPClause * 9190 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9191 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9192 if (E.isInvalid()) 9193 return nullptr; 9194 return getDerived().RebuildOMPSimdlenClause( 9195 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9196 } 9197 9198 template <typename Derived> 9199 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9200 SmallVector<Expr *, 4> TransformedSizes; 9201 TransformedSizes.reserve(C->getNumSizes()); 9202 bool Changed = false; 9203 for (Expr *E : C->getSizesRefs()) { 9204 if (!E) { 9205 TransformedSizes.push_back(nullptr); 9206 continue; 9207 } 9208 9209 ExprResult T = getDerived().TransformExpr(E); 9210 if (T.isInvalid()) 9211 return nullptr; 9212 if (E != T.get()) 9213 Changed = true; 9214 TransformedSizes.push_back(T.get()); 9215 } 9216 9217 if (!Changed && !getDerived().AlwaysRebuild()) 9218 return C; 9219 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9220 C->getLParenLoc(), C->getEndLoc()); 9221 } 9222 9223 template <typename Derived> 9224 OMPClause * 9225 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9226 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9227 if (E.isInvalid()) 9228 return nullptr; 9229 return getDerived().RebuildOMPCollapseClause( 9230 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9231 } 9232 9233 template <typename Derived> 9234 OMPClause * 9235 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9236 return getDerived().RebuildOMPDefaultClause( 9237 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9238 C->getLParenLoc(), C->getEndLoc()); 9239 } 9240 9241 template <typename Derived> 9242 OMPClause * 9243 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9244 return getDerived().RebuildOMPProcBindClause( 9245 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9246 C->getLParenLoc(), C->getEndLoc()); 9247 } 9248 9249 template <typename Derived> 9250 OMPClause * 9251 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9252 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9253 if (E.isInvalid()) 9254 return nullptr; 9255 return getDerived().RebuildOMPScheduleClause( 9256 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9257 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9258 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9259 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9260 } 9261 9262 template <typename Derived> 9263 OMPClause * 9264 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9265 ExprResult E; 9266 if (auto *Num = C->getNumForLoops()) { 9267 E = getDerived().TransformExpr(Num); 9268 if (E.isInvalid()) 9269 return nullptr; 9270 } 9271 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9272 C->getLParenLoc(), E.get()); 9273 } 9274 9275 template <typename Derived> 9276 OMPClause * 9277 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9278 ExprResult E; 9279 if (Expr *Evt = C->getEventHandler()) { 9280 E = getDerived().TransformExpr(Evt); 9281 if (E.isInvalid()) 9282 return nullptr; 9283 } 9284 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9285 C->getLParenLoc(), C->getEndLoc()); 9286 } 9287 9288 template <typename Derived> 9289 OMPClause * 9290 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9291 // No need to rebuild this clause, no template-dependent parameters. 9292 return C; 9293 } 9294 9295 template <typename Derived> 9296 OMPClause * 9297 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9298 // No need to rebuild this clause, no template-dependent parameters. 9299 return C; 9300 } 9301 9302 template <typename Derived> 9303 OMPClause * 9304 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9305 // No need to rebuild this clause, no template-dependent parameters. 9306 return C; 9307 } 9308 9309 template <typename Derived> 9310 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9311 // No need to rebuild this clause, no template-dependent parameters. 9312 return C; 9313 } 9314 9315 template <typename Derived> 9316 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9317 // No need to rebuild this clause, no template-dependent parameters. 9318 return C; 9319 } 9320 9321 template <typename Derived> 9322 OMPClause * 9323 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9324 // No need to rebuild this clause, no template-dependent parameters. 9325 return C; 9326 } 9327 9328 template <typename Derived> 9329 OMPClause * 9330 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9331 // No need to rebuild this clause, no template-dependent parameters. 9332 return C; 9333 } 9334 9335 template <typename Derived> 9336 OMPClause * 9337 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9338 // No need to rebuild this clause, no template-dependent parameters. 9339 return C; 9340 } 9341 9342 template <typename Derived> 9343 OMPClause * 9344 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9345 // No need to rebuild this clause, no template-dependent parameters. 9346 return C; 9347 } 9348 9349 template <typename Derived> 9350 OMPClause * 9351 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9352 // No need to rebuild this clause, no template-dependent parameters. 9353 return C; 9354 } 9355 9356 template <typename Derived> 9357 OMPClause * 9358 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9359 // No need to rebuild this clause, no template-dependent parameters. 9360 return C; 9361 } 9362 9363 template <typename Derived> 9364 OMPClause * 9365 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9366 // No need to rebuild this clause, no template-dependent parameters. 9367 return C; 9368 } 9369 9370 template <typename Derived> 9371 OMPClause * 9372 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9373 // No need to rebuild this clause, no template-dependent parameters. 9374 return C; 9375 } 9376 9377 template <typename Derived> 9378 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9379 // No need to rebuild this clause, no template-dependent parameters. 9380 return C; 9381 } 9382 9383 template <typename Derived> 9384 OMPClause * 9385 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9386 // No need to rebuild this clause, no template-dependent parameters. 9387 return C; 9388 } 9389 9390 template <typename Derived> 9391 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9392 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9393 if (IVR.isInvalid()) 9394 return nullptr; 9395 9396 llvm::SmallVector<Expr *, 8> PrefExprs; 9397 PrefExprs.reserve(C->varlist_size() - 1); 9398 for (Expr *E : llvm::drop_begin(C->varlists())) { 9399 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9400 if (ER.isInvalid()) 9401 return nullptr; 9402 PrefExprs.push_back(ER.get()); 9403 } 9404 return getDerived().RebuildOMPInitClause( 9405 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9406 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9407 } 9408 9409 template <typename Derived> 9410 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9411 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9412 if (ER.isInvalid()) 9413 return nullptr; 9414 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9415 C->getLParenLoc(), C->getVarLoc(), 9416 C->getEndLoc()); 9417 } 9418 9419 template <typename Derived> 9420 OMPClause * 9421 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9422 ExprResult ER; 9423 if (Expr *IV = C->getInteropVar()) { 9424 ER = getDerived().TransformExpr(IV); 9425 if (ER.isInvalid()) 9426 return nullptr; 9427 } 9428 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9429 C->getLParenLoc(), C->getVarLoc(), 9430 C->getEndLoc()); 9431 } 9432 9433 template <typename Derived> 9434 OMPClause * 9435 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9436 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9437 if (Cond.isInvalid()) 9438 return nullptr; 9439 return getDerived().RebuildOMPNovariantsClause( 9440 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9441 } 9442 9443 template <typename Derived> 9444 OMPClause * 9445 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9446 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9447 if (Cond.isInvalid()) 9448 return nullptr; 9449 return getDerived().RebuildOMPNocontextClause( 9450 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9451 } 9452 9453 template <typename Derived> 9454 OMPClause * 9455 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9456 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9457 if (ThreadID.isInvalid()) 9458 return nullptr; 9459 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9460 C->getLParenLoc(), C->getEndLoc()); 9461 } 9462 9463 template <typename Derived> 9464 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9465 OMPUnifiedAddressClause *C) { 9466 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9467 } 9468 9469 template <typename Derived> 9470 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9471 OMPUnifiedSharedMemoryClause *C) { 9472 llvm_unreachable( 9473 "unified_shared_memory clause cannot appear in dependent context"); 9474 } 9475 9476 template <typename Derived> 9477 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9478 OMPReverseOffloadClause *C) { 9479 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9480 } 9481 9482 template <typename Derived> 9483 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9484 OMPDynamicAllocatorsClause *C) { 9485 llvm_unreachable( 9486 "dynamic_allocators clause cannot appear in dependent context"); 9487 } 9488 9489 template <typename Derived> 9490 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9491 OMPAtomicDefaultMemOrderClause *C) { 9492 llvm_unreachable( 9493 "atomic_default_mem_order clause cannot appear in dependent context"); 9494 } 9495 9496 template <typename Derived> 9497 OMPClause * 9498 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9499 llvm::SmallVector<Expr *, 16> Vars; 9500 Vars.reserve(C->varlist_size()); 9501 for (auto *VE : C->varlists()) { 9502 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9503 if (EVar.isInvalid()) 9504 return nullptr; 9505 Vars.push_back(EVar.get()); 9506 } 9507 return getDerived().RebuildOMPPrivateClause( 9508 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9509 } 9510 9511 template <typename Derived> 9512 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9513 OMPFirstprivateClause *C) { 9514 llvm::SmallVector<Expr *, 16> Vars; 9515 Vars.reserve(C->varlist_size()); 9516 for (auto *VE : C->varlists()) { 9517 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9518 if (EVar.isInvalid()) 9519 return nullptr; 9520 Vars.push_back(EVar.get()); 9521 } 9522 return getDerived().RebuildOMPFirstprivateClause( 9523 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9524 } 9525 9526 template <typename Derived> 9527 OMPClause * 9528 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9529 llvm::SmallVector<Expr *, 16> Vars; 9530 Vars.reserve(C->varlist_size()); 9531 for (auto *VE : C->varlists()) { 9532 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9533 if (EVar.isInvalid()) 9534 return nullptr; 9535 Vars.push_back(EVar.get()); 9536 } 9537 return getDerived().RebuildOMPLastprivateClause( 9538 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9539 C->getLParenLoc(), C->getEndLoc()); 9540 } 9541 9542 template <typename Derived> 9543 OMPClause * 9544 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9545 llvm::SmallVector<Expr *, 16> Vars; 9546 Vars.reserve(C->varlist_size()); 9547 for (auto *VE : C->varlists()) { 9548 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9549 if (EVar.isInvalid()) 9550 return nullptr; 9551 Vars.push_back(EVar.get()); 9552 } 9553 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9554 C->getLParenLoc(), C->getEndLoc()); 9555 } 9556 9557 template <typename Derived> 9558 OMPClause * 9559 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9560 llvm::SmallVector<Expr *, 16> Vars; 9561 Vars.reserve(C->varlist_size()); 9562 for (auto *VE : C->varlists()) { 9563 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9564 if (EVar.isInvalid()) 9565 return nullptr; 9566 Vars.push_back(EVar.get()); 9567 } 9568 CXXScopeSpec ReductionIdScopeSpec; 9569 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9570 9571 DeclarationNameInfo NameInfo = C->getNameInfo(); 9572 if (NameInfo.getName()) { 9573 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9574 if (!NameInfo.getName()) 9575 return nullptr; 9576 } 9577 // Build a list of all UDR decls with the same names ranged by the Scopes. 9578 // The Scope boundary is a duplication of the previous decl. 9579 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9580 for (auto *E : C->reduction_ops()) { 9581 // Transform all the decls. 9582 if (E) { 9583 auto *ULE = cast<UnresolvedLookupExpr>(E); 9584 UnresolvedSet<8> Decls; 9585 for (auto *D : ULE->decls()) { 9586 NamedDecl *InstD = 9587 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9588 Decls.addDecl(InstD, InstD->getAccess()); 9589 } 9590 UnresolvedReductions.push_back( 9591 UnresolvedLookupExpr::Create( 9592 SemaRef.Context, /*NamingClass=*/nullptr, 9593 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9594 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9595 Decls.begin(), Decls.end())); 9596 } else 9597 UnresolvedReductions.push_back(nullptr); 9598 } 9599 return getDerived().RebuildOMPReductionClause( 9600 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9601 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9602 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9603 } 9604 9605 template <typename Derived> 9606 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9607 OMPTaskReductionClause *C) { 9608 llvm::SmallVector<Expr *, 16> Vars; 9609 Vars.reserve(C->varlist_size()); 9610 for (auto *VE : C->varlists()) { 9611 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9612 if (EVar.isInvalid()) 9613 return nullptr; 9614 Vars.push_back(EVar.get()); 9615 } 9616 CXXScopeSpec ReductionIdScopeSpec; 9617 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9618 9619 DeclarationNameInfo NameInfo = C->getNameInfo(); 9620 if (NameInfo.getName()) { 9621 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9622 if (!NameInfo.getName()) 9623 return nullptr; 9624 } 9625 // Build a list of all UDR decls with the same names ranged by the Scopes. 9626 // The Scope boundary is a duplication of the previous decl. 9627 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9628 for (auto *E : C->reduction_ops()) { 9629 // Transform all the decls. 9630 if (E) { 9631 auto *ULE = cast<UnresolvedLookupExpr>(E); 9632 UnresolvedSet<8> Decls; 9633 for (auto *D : ULE->decls()) { 9634 NamedDecl *InstD = 9635 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9636 Decls.addDecl(InstD, InstD->getAccess()); 9637 } 9638 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9639 SemaRef.Context, /*NamingClass=*/nullptr, 9640 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9641 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9642 } else 9643 UnresolvedReductions.push_back(nullptr); 9644 } 9645 return getDerived().RebuildOMPTaskReductionClause( 9646 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9647 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9648 } 9649 9650 template <typename Derived> 9651 OMPClause * 9652 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9653 llvm::SmallVector<Expr *, 16> Vars; 9654 Vars.reserve(C->varlist_size()); 9655 for (auto *VE : C->varlists()) { 9656 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9657 if (EVar.isInvalid()) 9658 return nullptr; 9659 Vars.push_back(EVar.get()); 9660 } 9661 CXXScopeSpec ReductionIdScopeSpec; 9662 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9663 9664 DeclarationNameInfo NameInfo = C->getNameInfo(); 9665 if (NameInfo.getName()) { 9666 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9667 if (!NameInfo.getName()) 9668 return nullptr; 9669 } 9670 // Build a list of all UDR decls with the same names ranged by the Scopes. 9671 // The Scope boundary is a duplication of the previous decl. 9672 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9673 for (auto *E : C->reduction_ops()) { 9674 // Transform all the decls. 9675 if (E) { 9676 auto *ULE = cast<UnresolvedLookupExpr>(E); 9677 UnresolvedSet<8> Decls; 9678 for (auto *D : ULE->decls()) { 9679 NamedDecl *InstD = 9680 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9681 Decls.addDecl(InstD, InstD->getAccess()); 9682 } 9683 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9684 SemaRef.Context, /*NamingClass=*/nullptr, 9685 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9686 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9687 } else 9688 UnresolvedReductions.push_back(nullptr); 9689 } 9690 return getDerived().RebuildOMPInReductionClause( 9691 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9692 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9693 } 9694 9695 template <typename Derived> 9696 OMPClause * 9697 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9698 llvm::SmallVector<Expr *, 16> Vars; 9699 Vars.reserve(C->varlist_size()); 9700 for (auto *VE : C->varlists()) { 9701 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9702 if (EVar.isInvalid()) 9703 return nullptr; 9704 Vars.push_back(EVar.get()); 9705 } 9706 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9707 if (Step.isInvalid()) 9708 return nullptr; 9709 return getDerived().RebuildOMPLinearClause( 9710 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9711 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9712 } 9713 9714 template <typename Derived> 9715 OMPClause * 9716 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9717 llvm::SmallVector<Expr *, 16> Vars; 9718 Vars.reserve(C->varlist_size()); 9719 for (auto *VE : C->varlists()) { 9720 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9721 if (EVar.isInvalid()) 9722 return nullptr; 9723 Vars.push_back(EVar.get()); 9724 } 9725 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9726 if (Alignment.isInvalid()) 9727 return nullptr; 9728 return getDerived().RebuildOMPAlignedClause( 9729 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9730 C->getColonLoc(), C->getEndLoc()); 9731 } 9732 9733 template <typename Derived> 9734 OMPClause * 9735 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9736 llvm::SmallVector<Expr *, 16> Vars; 9737 Vars.reserve(C->varlist_size()); 9738 for (auto *VE : C->varlists()) { 9739 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9740 if (EVar.isInvalid()) 9741 return nullptr; 9742 Vars.push_back(EVar.get()); 9743 } 9744 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9745 C->getLParenLoc(), C->getEndLoc()); 9746 } 9747 9748 template <typename Derived> 9749 OMPClause * 9750 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9751 llvm::SmallVector<Expr *, 16> Vars; 9752 Vars.reserve(C->varlist_size()); 9753 for (auto *VE : C->varlists()) { 9754 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9755 if (EVar.isInvalid()) 9756 return nullptr; 9757 Vars.push_back(EVar.get()); 9758 } 9759 return getDerived().RebuildOMPCopyprivateClause( 9760 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9761 } 9762 9763 template <typename Derived> 9764 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9765 llvm::SmallVector<Expr *, 16> Vars; 9766 Vars.reserve(C->varlist_size()); 9767 for (auto *VE : C->varlists()) { 9768 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9769 if (EVar.isInvalid()) 9770 return nullptr; 9771 Vars.push_back(EVar.get()); 9772 } 9773 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9774 C->getLParenLoc(), C->getEndLoc()); 9775 } 9776 9777 template <typename Derived> 9778 OMPClause * 9779 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9780 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9781 if (E.isInvalid()) 9782 return nullptr; 9783 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9784 C->getLParenLoc(), C->getEndLoc()); 9785 } 9786 9787 template <typename Derived> 9788 OMPClause * 9789 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9790 llvm::SmallVector<Expr *, 16> Vars; 9791 Expr *DepModifier = C->getModifier(); 9792 if (DepModifier) { 9793 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9794 if (DepModRes.isInvalid()) 9795 return nullptr; 9796 DepModifier = DepModRes.get(); 9797 } 9798 Vars.reserve(C->varlist_size()); 9799 for (auto *VE : C->varlists()) { 9800 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9801 if (EVar.isInvalid()) 9802 return nullptr; 9803 Vars.push_back(EVar.get()); 9804 } 9805 return getDerived().RebuildOMPDependClause( 9806 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9807 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9808 C->getEndLoc()); 9809 } 9810 9811 template <typename Derived> 9812 OMPClause * 9813 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9814 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9815 if (E.isInvalid()) 9816 return nullptr; 9817 return getDerived().RebuildOMPDeviceClause( 9818 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9819 C->getModifierLoc(), C->getEndLoc()); 9820 } 9821 9822 template <typename Derived, class T> 9823 bool transformOMPMappableExprListClause( 9824 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9825 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9826 DeclarationNameInfo &MapperIdInfo, 9827 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9828 // Transform expressions in the list. 9829 Vars.reserve(C->varlist_size()); 9830 for (auto *VE : C->varlists()) { 9831 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9832 if (EVar.isInvalid()) 9833 return true; 9834 Vars.push_back(EVar.get()); 9835 } 9836 // Transform mapper scope specifier and identifier. 9837 NestedNameSpecifierLoc QualifierLoc; 9838 if (C->getMapperQualifierLoc()) { 9839 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9840 C->getMapperQualifierLoc()); 9841 if (!QualifierLoc) 9842 return true; 9843 } 9844 MapperIdScopeSpec.Adopt(QualifierLoc); 9845 MapperIdInfo = C->getMapperIdInfo(); 9846 if (MapperIdInfo.getName()) { 9847 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9848 if (!MapperIdInfo.getName()) 9849 return true; 9850 } 9851 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9852 // the previous user-defined mapper lookup in dependent environment. 9853 for (auto *E : C->mapperlists()) { 9854 // Transform all the decls. 9855 if (E) { 9856 auto *ULE = cast<UnresolvedLookupExpr>(E); 9857 UnresolvedSet<8> Decls; 9858 for (auto *D : ULE->decls()) { 9859 NamedDecl *InstD = 9860 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9861 Decls.addDecl(InstD, InstD->getAccess()); 9862 } 9863 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9864 TT.getSema().Context, /*NamingClass=*/nullptr, 9865 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9866 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9867 Decls.end())); 9868 } else { 9869 UnresolvedMappers.push_back(nullptr); 9870 } 9871 } 9872 return false; 9873 } 9874 9875 template <typename Derived> 9876 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9877 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9878 llvm::SmallVector<Expr *, 16> Vars; 9879 CXXScopeSpec MapperIdScopeSpec; 9880 DeclarationNameInfo MapperIdInfo; 9881 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9882 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9883 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9884 return nullptr; 9885 return getDerived().RebuildOMPMapClause( 9886 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9887 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9888 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9889 } 9890 9891 template <typename Derived> 9892 OMPClause * 9893 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9894 Expr *Allocator = C->getAllocator(); 9895 if (Allocator) { 9896 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9897 if (AllocatorRes.isInvalid()) 9898 return nullptr; 9899 Allocator = AllocatorRes.get(); 9900 } 9901 llvm::SmallVector<Expr *, 16> Vars; 9902 Vars.reserve(C->varlist_size()); 9903 for (auto *VE : C->varlists()) { 9904 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9905 if (EVar.isInvalid()) 9906 return nullptr; 9907 Vars.push_back(EVar.get()); 9908 } 9909 return getDerived().RebuildOMPAllocateClause( 9910 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9911 C->getEndLoc()); 9912 } 9913 9914 template <typename Derived> 9915 OMPClause * 9916 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9917 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9918 if (E.isInvalid()) 9919 return nullptr; 9920 return getDerived().RebuildOMPNumTeamsClause( 9921 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9922 } 9923 9924 template <typename Derived> 9925 OMPClause * 9926 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9927 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9928 if (E.isInvalid()) 9929 return nullptr; 9930 return getDerived().RebuildOMPThreadLimitClause( 9931 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9932 } 9933 9934 template <typename Derived> 9935 OMPClause * 9936 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9937 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9938 if (E.isInvalid()) 9939 return nullptr; 9940 return getDerived().RebuildOMPPriorityClause( 9941 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9942 } 9943 9944 template <typename Derived> 9945 OMPClause * 9946 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9947 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9948 if (E.isInvalid()) 9949 return nullptr; 9950 return getDerived().RebuildOMPGrainsizeClause( 9951 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9952 } 9953 9954 template <typename Derived> 9955 OMPClause * 9956 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9957 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9958 if (E.isInvalid()) 9959 return nullptr; 9960 return getDerived().RebuildOMPNumTasksClause( 9961 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9962 } 9963 9964 template <typename Derived> 9965 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9966 ExprResult E = getDerived().TransformExpr(C->getHint()); 9967 if (E.isInvalid()) 9968 return nullptr; 9969 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9970 C->getLParenLoc(), C->getEndLoc()); 9971 } 9972 9973 template <typename Derived> 9974 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9975 OMPDistScheduleClause *C) { 9976 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9977 if (E.isInvalid()) 9978 return nullptr; 9979 return getDerived().RebuildOMPDistScheduleClause( 9980 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9981 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9982 } 9983 9984 template <typename Derived> 9985 OMPClause * 9986 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9987 // Rebuild Defaultmap Clause since we need to invoke the checking of 9988 // defaultmap(none:variable-category) after template initialization. 9989 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9990 C->getDefaultmapKind(), 9991 C->getBeginLoc(), 9992 C->getLParenLoc(), 9993 C->getDefaultmapModifierLoc(), 9994 C->getDefaultmapKindLoc(), 9995 C->getEndLoc()); 9996 } 9997 9998 template <typename Derived> 9999 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10000 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10001 llvm::SmallVector<Expr *, 16> Vars; 10002 CXXScopeSpec MapperIdScopeSpec; 10003 DeclarationNameInfo MapperIdInfo; 10004 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10005 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10006 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10007 return nullptr; 10008 return getDerived().RebuildOMPToClause( 10009 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10010 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10011 } 10012 10013 template <typename Derived> 10014 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10015 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10016 llvm::SmallVector<Expr *, 16> Vars; 10017 CXXScopeSpec MapperIdScopeSpec; 10018 DeclarationNameInfo MapperIdInfo; 10019 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10020 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10021 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10022 return nullptr; 10023 return getDerived().RebuildOMPFromClause( 10024 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10025 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10026 } 10027 10028 template <typename Derived> 10029 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10030 OMPUseDevicePtrClause *C) { 10031 llvm::SmallVector<Expr *, 16> Vars; 10032 Vars.reserve(C->varlist_size()); 10033 for (auto *VE : C->varlists()) { 10034 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10035 if (EVar.isInvalid()) 10036 return nullptr; 10037 Vars.push_back(EVar.get()); 10038 } 10039 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10040 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10041 } 10042 10043 template <typename Derived> 10044 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10045 OMPUseDeviceAddrClause *C) { 10046 llvm::SmallVector<Expr *, 16> Vars; 10047 Vars.reserve(C->varlist_size()); 10048 for (auto *VE : C->varlists()) { 10049 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10050 if (EVar.isInvalid()) 10051 return nullptr; 10052 Vars.push_back(EVar.get()); 10053 } 10054 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10055 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10056 } 10057 10058 template <typename Derived> 10059 OMPClause * 10060 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10061 llvm::SmallVector<Expr *, 16> Vars; 10062 Vars.reserve(C->varlist_size()); 10063 for (auto *VE : C->varlists()) { 10064 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10065 if (EVar.isInvalid()) 10066 return nullptr; 10067 Vars.push_back(EVar.get()); 10068 } 10069 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10070 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10071 } 10072 10073 template <typename Derived> 10074 OMPClause * 10075 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10076 llvm::SmallVector<Expr *, 16> Vars; 10077 Vars.reserve(C->varlist_size()); 10078 for (auto *VE : C->varlists()) { 10079 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10080 if (EVar.isInvalid()) 10081 return nullptr; 10082 Vars.push_back(EVar.get()); 10083 } 10084 return getDerived().RebuildOMPNontemporalClause( 10085 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10086 } 10087 10088 template <typename Derived> 10089 OMPClause * 10090 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10091 llvm::SmallVector<Expr *, 16> Vars; 10092 Vars.reserve(C->varlist_size()); 10093 for (auto *VE : C->varlists()) { 10094 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10095 if (EVar.isInvalid()) 10096 return nullptr; 10097 Vars.push_back(EVar.get()); 10098 } 10099 return getDerived().RebuildOMPInclusiveClause( 10100 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10101 } 10102 10103 template <typename Derived> 10104 OMPClause * 10105 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10106 llvm::SmallVector<Expr *, 16> Vars; 10107 Vars.reserve(C->varlist_size()); 10108 for (auto *VE : C->varlists()) { 10109 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10110 if (EVar.isInvalid()) 10111 return nullptr; 10112 Vars.push_back(EVar.get()); 10113 } 10114 return getDerived().RebuildOMPExclusiveClause( 10115 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10116 } 10117 10118 template <typename Derived> 10119 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10120 OMPUsesAllocatorsClause *C) { 10121 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10122 Data.reserve(C->getNumberOfAllocators()); 10123 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10124 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10125 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10126 if (Allocator.isInvalid()) 10127 continue; 10128 ExprResult AllocatorTraits; 10129 if (Expr *AT = D.AllocatorTraits) { 10130 AllocatorTraits = getDerived().TransformExpr(AT); 10131 if (AllocatorTraits.isInvalid()) 10132 continue; 10133 } 10134 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10135 NewD.Allocator = Allocator.get(); 10136 NewD.AllocatorTraits = AllocatorTraits.get(); 10137 NewD.LParenLoc = D.LParenLoc; 10138 NewD.RParenLoc = D.RParenLoc; 10139 } 10140 return getDerived().RebuildOMPUsesAllocatorsClause( 10141 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10142 } 10143 10144 template <typename Derived> 10145 OMPClause * 10146 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10147 SmallVector<Expr *, 4> Locators; 10148 Locators.reserve(C->varlist_size()); 10149 ExprResult ModifierRes; 10150 if (Expr *Modifier = C->getModifier()) { 10151 ModifierRes = getDerived().TransformExpr(Modifier); 10152 if (ModifierRes.isInvalid()) 10153 return nullptr; 10154 } 10155 for (Expr *E : C->varlists()) { 10156 ExprResult Locator = getDerived().TransformExpr(E); 10157 if (Locator.isInvalid()) 10158 continue; 10159 Locators.push_back(Locator.get()); 10160 } 10161 return getDerived().RebuildOMPAffinityClause( 10162 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10163 ModifierRes.get(), Locators); 10164 } 10165 10166 template <typename Derived> 10167 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10168 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10169 C->getBeginLoc(), C->getLParenLoc(), 10170 C->getEndLoc()); 10171 } 10172 10173 //===----------------------------------------------------------------------===// 10174 // Expression transformation 10175 //===----------------------------------------------------------------------===// 10176 template<typename Derived> 10177 ExprResult 10178 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10179 return TransformExpr(E->getSubExpr()); 10180 } 10181 10182 template <typename Derived> 10183 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10184 SYCLUniqueStableNameExpr *E) { 10185 if (!E->isTypeDependent()) 10186 return E; 10187 10188 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10189 10190 if (!NewT) 10191 return ExprError(); 10192 10193 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10194 return E; 10195 10196 return getDerived().RebuildSYCLUniqueStableNameExpr( 10197 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10198 } 10199 10200 template<typename Derived> 10201 ExprResult 10202 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10203 if (!E->isTypeDependent()) 10204 return E; 10205 10206 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10207 E->getIdentKind()); 10208 } 10209 10210 template<typename Derived> 10211 ExprResult 10212 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10213 NestedNameSpecifierLoc QualifierLoc; 10214 if (E->getQualifierLoc()) { 10215 QualifierLoc 10216 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10217 if (!QualifierLoc) 10218 return ExprError(); 10219 } 10220 10221 ValueDecl *ND 10222 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10223 E->getDecl())); 10224 if (!ND) 10225 return ExprError(); 10226 10227 NamedDecl *Found = ND; 10228 if (E->getFoundDecl() != E->getDecl()) { 10229 Found = cast_or_null<NamedDecl>( 10230 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10231 if (!Found) 10232 return ExprError(); 10233 } 10234 10235 DeclarationNameInfo NameInfo = E->getNameInfo(); 10236 if (NameInfo.getName()) { 10237 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10238 if (!NameInfo.getName()) 10239 return ExprError(); 10240 } 10241 10242 if (!getDerived().AlwaysRebuild() && 10243 QualifierLoc == E->getQualifierLoc() && 10244 ND == E->getDecl() && 10245 Found == E->getFoundDecl() && 10246 NameInfo.getName() == E->getDecl()->getDeclName() && 10247 !E->hasExplicitTemplateArgs()) { 10248 10249 // Mark it referenced in the new context regardless. 10250 // FIXME: this is a bit instantiation-specific. 10251 SemaRef.MarkDeclRefReferenced(E); 10252 10253 return E; 10254 } 10255 10256 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10257 if (E->hasExplicitTemplateArgs()) { 10258 TemplateArgs = &TransArgs; 10259 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10260 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10261 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10262 E->getNumTemplateArgs(), 10263 TransArgs)) 10264 return ExprError(); 10265 } 10266 10267 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10268 Found, TemplateArgs); 10269 } 10270 10271 template<typename Derived> 10272 ExprResult 10273 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10274 return E; 10275 } 10276 10277 template <typename Derived> 10278 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10279 FixedPointLiteral *E) { 10280 return E; 10281 } 10282 10283 template<typename Derived> 10284 ExprResult 10285 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10286 return E; 10287 } 10288 10289 template<typename Derived> 10290 ExprResult 10291 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10292 return E; 10293 } 10294 10295 template<typename Derived> 10296 ExprResult 10297 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10298 return E; 10299 } 10300 10301 template<typename Derived> 10302 ExprResult 10303 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10304 return E; 10305 } 10306 10307 template<typename Derived> 10308 ExprResult 10309 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10310 if (FunctionDecl *FD = E->getDirectCallee()) 10311 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10312 return SemaRef.MaybeBindToTemporary(E); 10313 } 10314 10315 template<typename Derived> 10316 ExprResult 10317 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10318 ExprResult ControllingExpr = 10319 getDerived().TransformExpr(E->getControllingExpr()); 10320 if (ControllingExpr.isInvalid()) 10321 return ExprError(); 10322 10323 SmallVector<Expr *, 4> AssocExprs; 10324 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10325 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10326 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10327 if (TSI) { 10328 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10329 if (!AssocType) 10330 return ExprError(); 10331 AssocTypes.push_back(AssocType); 10332 } else { 10333 AssocTypes.push_back(nullptr); 10334 } 10335 10336 ExprResult AssocExpr = 10337 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10338 if (AssocExpr.isInvalid()) 10339 return ExprError(); 10340 AssocExprs.push_back(AssocExpr.get()); 10341 } 10342 10343 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10344 E->getDefaultLoc(), 10345 E->getRParenLoc(), 10346 ControllingExpr.get(), 10347 AssocTypes, 10348 AssocExprs); 10349 } 10350 10351 template<typename Derived> 10352 ExprResult 10353 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10354 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10355 if (SubExpr.isInvalid()) 10356 return ExprError(); 10357 10358 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10359 return E; 10360 10361 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10362 E->getRParen()); 10363 } 10364 10365 /// The operand of a unary address-of operator has special rules: it's 10366 /// allowed to refer to a non-static member of a class even if there's no 'this' 10367 /// object available. 10368 template<typename Derived> 10369 ExprResult 10370 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10371 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10372 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10373 else 10374 return getDerived().TransformExpr(E); 10375 } 10376 10377 template<typename Derived> 10378 ExprResult 10379 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10380 ExprResult SubExpr; 10381 if (E->getOpcode() == UO_AddrOf) 10382 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10383 else 10384 SubExpr = TransformExpr(E->getSubExpr()); 10385 if (SubExpr.isInvalid()) 10386 return ExprError(); 10387 10388 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10389 return E; 10390 10391 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10392 E->getOpcode(), 10393 SubExpr.get()); 10394 } 10395 10396 template<typename Derived> 10397 ExprResult 10398 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10399 // Transform the type. 10400 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10401 if (!Type) 10402 return ExprError(); 10403 10404 // Transform all of the components into components similar to what the 10405 // parser uses. 10406 // FIXME: It would be slightly more efficient in the non-dependent case to 10407 // just map FieldDecls, rather than requiring the rebuilder to look for 10408 // the fields again. However, __builtin_offsetof is rare enough in 10409 // template code that we don't care. 10410 bool ExprChanged = false; 10411 typedef Sema::OffsetOfComponent Component; 10412 SmallVector<Component, 4> Components; 10413 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10414 const OffsetOfNode &ON = E->getComponent(I); 10415 Component Comp; 10416 Comp.isBrackets = true; 10417 Comp.LocStart = ON.getSourceRange().getBegin(); 10418 Comp.LocEnd = ON.getSourceRange().getEnd(); 10419 switch (ON.getKind()) { 10420 case OffsetOfNode::Array: { 10421 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10422 ExprResult Index = getDerived().TransformExpr(FromIndex); 10423 if (Index.isInvalid()) 10424 return ExprError(); 10425 10426 ExprChanged = ExprChanged || Index.get() != FromIndex; 10427 Comp.isBrackets = true; 10428 Comp.U.E = Index.get(); 10429 break; 10430 } 10431 10432 case OffsetOfNode::Field: 10433 case OffsetOfNode::Identifier: 10434 Comp.isBrackets = false; 10435 Comp.U.IdentInfo = ON.getFieldName(); 10436 if (!Comp.U.IdentInfo) 10437 continue; 10438 10439 break; 10440 10441 case OffsetOfNode::Base: 10442 // Will be recomputed during the rebuild. 10443 continue; 10444 } 10445 10446 Components.push_back(Comp); 10447 } 10448 10449 // If nothing changed, retain the existing expression. 10450 if (!getDerived().AlwaysRebuild() && 10451 Type == E->getTypeSourceInfo() && 10452 !ExprChanged) 10453 return E; 10454 10455 // Build a new offsetof expression. 10456 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10457 Components, E->getRParenLoc()); 10458 } 10459 10460 template<typename Derived> 10461 ExprResult 10462 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10463 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10464 "opaque value expression requires transformation"); 10465 return E; 10466 } 10467 10468 template<typename Derived> 10469 ExprResult 10470 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10471 return E; 10472 } 10473 10474 template <typename Derived> 10475 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10476 llvm::SmallVector<Expr *, 8> Children; 10477 bool Changed = false; 10478 for (Expr *C : E->subExpressions()) { 10479 ExprResult NewC = getDerived().TransformExpr(C); 10480 if (NewC.isInvalid()) 10481 return ExprError(); 10482 Children.push_back(NewC.get()); 10483 10484 Changed |= NewC.get() != C; 10485 } 10486 if (!getDerived().AlwaysRebuild() && !Changed) 10487 return E; 10488 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10489 Children, E->getType()); 10490 } 10491 10492 template<typename Derived> 10493 ExprResult 10494 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10495 // Rebuild the syntactic form. The original syntactic form has 10496 // opaque-value expressions in it, so strip those away and rebuild 10497 // the result. This is a really awful way of doing this, but the 10498 // better solution (rebuilding the semantic expressions and 10499 // rebinding OVEs as necessary) doesn't work; we'd need 10500 // TreeTransform to not strip away implicit conversions. 10501 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10502 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10503 if (result.isInvalid()) return ExprError(); 10504 10505 // If that gives us a pseudo-object result back, the pseudo-object 10506 // expression must have been an lvalue-to-rvalue conversion which we 10507 // should reapply. 10508 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10509 result = SemaRef.checkPseudoObjectRValue(result.get()); 10510 10511 return result; 10512 } 10513 10514 template<typename Derived> 10515 ExprResult 10516 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10517 UnaryExprOrTypeTraitExpr *E) { 10518 if (E->isArgumentType()) { 10519 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10520 10521 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10522 if (!NewT) 10523 return ExprError(); 10524 10525 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10526 return E; 10527 10528 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10529 E->getKind(), 10530 E->getSourceRange()); 10531 } 10532 10533 // C++0x [expr.sizeof]p1: 10534 // The operand is either an expression, which is an unevaluated operand 10535 // [...] 10536 EnterExpressionEvaluationContext Unevaluated( 10537 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10538 Sema::ReuseLambdaContextDecl); 10539 10540 // Try to recover if we have something like sizeof(T::X) where X is a type. 10541 // Notably, there must be *exactly* one set of parens if X is a type. 10542 TypeSourceInfo *RecoveryTSI = nullptr; 10543 ExprResult SubExpr; 10544 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10545 if (auto *DRE = 10546 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10547 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10548 PE, DRE, false, &RecoveryTSI); 10549 else 10550 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10551 10552 if (RecoveryTSI) { 10553 return getDerived().RebuildUnaryExprOrTypeTrait( 10554 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10555 } else if (SubExpr.isInvalid()) 10556 return ExprError(); 10557 10558 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10559 return E; 10560 10561 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10562 E->getOperatorLoc(), 10563 E->getKind(), 10564 E->getSourceRange()); 10565 } 10566 10567 template<typename Derived> 10568 ExprResult 10569 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10570 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10571 if (LHS.isInvalid()) 10572 return ExprError(); 10573 10574 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10575 if (RHS.isInvalid()) 10576 return ExprError(); 10577 10578 10579 if (!getDerived().AlwaysRebuild() && 10580 LHS.get() == E->getLHS() && 10581 RHS.get() == E->getRHS()) 10582 return E; 10583 10584 return getDerived().RebuildArraySubscriptExpr( 10585 LHS.get(), 10586 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10587 } 10588 10589 template <typename Derived> 10590 ExprResult 10591 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10592 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10593 if (Base.isInvalid()) 10594 return ExprError(); 10595 10596 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10597 if (RowIdx.isInvalid()) 10598 return ExprError(); 10599 10600 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10601 if (ColumnIdx.isInvalid()) 10602 return ExprError(); 10603 10604 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10605 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10606 return E; 10607 10608 return getDerived().RebuildMatrixSubscriptExpr( 10609 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10610 } 10611 10612 template <typename Derived> 10613 ExprResult 10614 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10615 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10616 if (Base.isInvalid()) 10617 return ExprError(); 10618 10619 ExprResult LowerBound; 10620 if (E->getLowerBound()) { 10621 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10622 if (LowerBound.isInvalid()) 10623 return ExprError(); 10624 } 10625 10626 ExprResult Length; 10627 if (E->getLength()) { 10628 Length = getDerived().TransformExpr(E->getLength()); 10629 if (Length.isInvalid()) 10630 return ExprError(); 10631 } 10632 10633 ExprResult Stride; 10634 if (Expr *Str = E->getStride()) { 10635 Stride = getDerived().TransformExpr(Str); 10636 if (Stride.isInvalid()) 10637 return ExprError(); 10638 } 10639 10640 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10641 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10642 return E; 10643 10644 return getDerived().RebuildOMPArraySectionExpr( 10645 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10646 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10647 E->getRBracketLoc()); 10648 } 10649 10650 template <typename Derived> 10651 ExprResult 10652 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10653 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10654 if (Base.isInvalid()) 10655 return ExprError(); 10656 10657 SmallVector<Expr *, 4> Dims; 10658 bool ErrorFound = false; 10659 for (Expr *Dim : E->getDimensions()) { 10660 ExprResult DimRes = getDerived().TransformExpr(Dim); 10661 if (DimRes.isInvalid()) { 10662 ErrorFound = true; 10663 continue; 10664 } 10665 Dims.push_back(DimRes.get()); 10666 } 10667 10668 if (ErrorFound) 10669 return ExprError(); 10670 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10671 E->getRParenLoc(), Dims, 10672 E->getBracketsRanges()); 10673 } 10674 10675 template <typename Derived> 10676 ExprResult 10677 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10678 unsigned NumIterators = E->numOfIterators(); 10679 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10680 10681 bool ErrorFound = false; 10682 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10683 for (unsigned I = 0; I < NumIterators; ++I) { 10684 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10685 Data[I].DeclIdent = D->getIdentifier(); 10686 Data[I].DeclIdentLoc = D->getLocation(); 10687 if (D->getLocation() == D->getBeginLoc()) { 10688 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10689 "Implicit type must be int."); 10690 } else { 10691 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10692 QualType DeclTy = getDerived().TransformType(D->getType()); 10693 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10694 } 10695 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10696 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10697 ExprResult End = getDerived().TransformExpr(Range.End); 10698 ExprResult Step = getDerived().TransformExpr(Range.Step); 10699 ErrorFound = ErrorFound || 10700 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10701 !Data[I].Type.get().isNull())) || 10702 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10703 if (ErrorFound) 10704 continue; 10705 Data[I].Range.Begin = Begin.get(); 10706 Data[I].Range.End = End.get(); 10707 Data[I].Range.Step = Step.get(); 10708 Data[I].AssignLoc = E->getAssignLoc(I); 10709 Data[I].ColonLoc = E->getColonLoc(I); 10710 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10711 NeedToRebuild = 10712 NeedToRebuild || 10713 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10714 D->getType().getTypePtrOrNull()) || 10715 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10716 Range.Step != Data[I].Range.Step; 10717 } 10718 if (ErrorFound) 10719 return ExprError(); 10720 if (!NeedToRebuild) 10721 return E; 10722 10723 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10724 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10725 if (!Res.isUsable()) 10726 return Res; 10727 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10728 for (unsigned I = 0; I < NumIterators; ++I) 10729 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10730 IE->getIteratorDecl(I)); 10731 return Res; 10732 } 10733 10734 template<typename Derived> 10735 ExprResult 10736 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10737 // Transform the callee. 10738 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10739 if (Callee.isInvalid()) 10740 return ExprError(); 10741 10742 // Transform arguments. 10743 bool ArgChanged = false; 10744 SmallVector<Expr*, 8> Args; 10745 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10746 &ArgChanged)) 10747 return ExprError(); 10748 10749 if (!getDerived().AlwaysRebuild() && 10750 Callee.get() == E->getCallee() && 10751 !ArgChanged) 10752 return SemaRef.MaybeBindToTemporary(E); 10753 10754 // FIXME: Wrong source location information for the '('. 10755 SourceLocation FakeLParenLoc 10756 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10757 10758 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10759 if (E->hasStoredFPFeatures()) { 10760 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10761 getSema().CurFPFeatures = 10762 NewOverrides.applyOverrides(getSema().getLangOpts()); 10763 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10764 } 10765 10766 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10767 Args, 10768 E->getRParenLoc()); 10769 } 10770 10771 template<typename Derived> 10772 ExprResult 10773 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10774 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10775 if (Base.isInvalid()) 10776 return ExprError(); 10777 10778 NestedNameSpecifierLoc QualifierLoc; 10779 if (E->hasQualifier()) { 10780 QualifierLoc 10781 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10782 10783 if (!QualifierLoc) 10784 return ExprError(); 10785 } 10786 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10787 10788 ValueDecl *Member 10789 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10790 E->getMemberDecl())); 10791 if (!Member) 10792 return ExprError(); 10793 10794 NamedDecl *FoundDecl = E->getFoundDecl(); 10795 if (FoundDecl == E->getMemberDecl()) { 10796 FoundDecl = Member; 10797 } else { 10798 FoundDecl = cast_or_null<NamedDecl>( 10799 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10800 if (!FoundDecl) 10801 return ExprError(); 10802 } 10803 10804 if (!getDerived().AlwaysRebuild() && 10805 Base.get() == E->getBase() && 10806 QualifierLoc == E->getQualifierLoc() && 10807 Member == E->getMemberDecl() && 10808 FoundDecl == E->getFoundDecl() && 10809 !E->hasExplicitTemplateArgs()) { 10810 10811 // Mark it referenced in the new context regardless. 10812 // FIXME: this is a bit instantiation-specific. 10813 SemaRef.MarkMemberReferenced(E); 10814 10815 return E; 10816 } 10817 10818 TemplateArgumentListInfo TransArgs; 10819 if (E->hasExplicitTemplateArgs()) { 10820 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10821 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10822 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10823 E->getNumTemplateArgs(), 10824 TransArgs)) 10825 return ExprError(); 10826 } 10827 10828 // FIXME: Bogus source location for the operator 10829 SourceLocation FakeOperatorLoc = 10830 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10831 10832 // FIXME: to do this check properly, we will need to preserve the 10833 // first-qualifier-in-scope here, just in case we had a dependent 10834 // base (and therefore couldn't do the check) and a 10835 // nested-name-qualifier (and therefore could do the lookup). 10836 NamedDecl *FirstQualifierInScope = nullptr; 10837 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10838 if (MemberNameInfo.getName()) { 10839 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10840 if (!MemberNameInfo.getName()) 10841 return ExprError(); 10842 } 10843 10844 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10845 E->isArrow(), 10846 QualifierLoc, 10847 TemplateKWLoc, 10848 MemberNameInfo, 10849 Member, 10850 FoundDecl, 10851 (E->hasExplicitTemplateArgs() 10852 ? &TransArgs : nullptr), 10853 FirstQualifierInScope); 10854 } 10855 10856 template<typename Derived> 10857 ExprResult 10858 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10859 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10860 if (LHS.isInvalid()) 10861 return ExprError(); 10862 10863 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10864 if (RHS.isInvalid()) 10865 return ExprError(); 10866 10867 if (!getDerived().AlwaysRebuild() && 10868 LHS.get() == E->getLHS() && 10869 RHS.get() == E->getRHS()) 10870 return E; 10871 10872 if (E->isCompoundAssignmentOp()) 10873 // FPFeatures has already been established from trailing storage 10874 return getDerived().RebuildBinaryOperator( 10875 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10876 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10877 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10878 getSema().CurFPFeatures = 10879 NewOverrides.applyOverrides(getSema().getLangOpts()); 10880 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10881 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10882 LHS.get(), RHS.get()); 10883 } 10884 10885 template <typename Derived> 10886 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10887 CXXRewrittenBinaryOperator *E) { 10888 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10889 10890 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10891 if (LHS.isInvalid()) 10892 return ExprError(); 10893 10894 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10895 if (RHS.isInvalid()) 10896 return ExprError(); 10897 10898 if (!getDerived().AlwaysRebuild() && 10899 LHS.get() == Decomp.LHS && 10900 RHS.get() == Decomp.RHS) 10901 return E; 10902 10903 // Extract the already-resolved callee declarations so that we can restrict 10904 // ourselves to using them as the unqualified lookup results when rebuilding. 10905 UnresolvedSet<2> UnqualLookups; 10906 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10907 const_cast<Expr *>(Decomp.InnerBinOp)}; 10908 for (Expr *PossibleBinOp : PossibleBinOps) { 10909 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10910 if (!Op) 10911 continue; 10912 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10913 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10914 continue; 10915 10916 // Transform the callee in case we built a call to a local extern 10917 // declaration. 10918 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10919 E->getOperatorLoc(), Callee->getFoundDecl())); 10920 if (!Found) 10921 return ExprError(); 10922 UnqualLookups.addDecl(Found); 10923 } 10924 10925 return getDerived().RebuildCXXRewrittenBinaryOperator( 10926 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10927 } 10928 10929 template<typename Derived> 10930 ExprResult 10931 TreeTransform<Derived>::TransformCompoundAssignOperator( 10932 CompoundAssignOperator *E) { 10933 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10934 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10935 getSema().CurFPFeatures = 10936 NewOverrides.applyOverrides(getSema().getLangOpts()); 10937 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10938 return getDerived().TransformBinaryOperator(E); 10939 } 10940 10941 template<typename Derived> 10942 ExprResult TreeTransform<Derived>:: 10943 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10944 // Just rebuild the common and RHS expressions and see whether we 10945 // get any changes. 10946 10947 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10948 if (commonExpr.isInvalid()) 10949 return ExprError(); 10950 10951 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10952 if (rhs.isInvalid()) 10953 return ExprError(); 10954 10955 if (!getDerived().AlwaysRebuild() && 10956 commonExpr.get() == e->getCommon() && 10957 rhs.get() == e->getFalseExpr()) 10958 return e; 10959 10960 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10961 e->getQuestionLoc(), 10962 nullptr, 10963 e->getColonLoc(), 10964 rhs.get()); 10965 } 10966 10967 template<typename Derived> 10968 ExprResult 10969 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10970 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10971 if (Cond.isInvalid()) 10972 return ExprError(); 10973 10974 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10975 if (LHS.isInvalid()) 10976 return ExprError(); 10977 10978 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10979 if (RHS.isInvalid()) 10980 return ExprError(); 10981 10982 if (!getDerived().AlwaysRebuild() && 10983 Cond.get() == E->getCond() && 10984 LHS.get() == E->getLHS() && 10985 RHS.get() == E->getRHS()) 10986 return E; 10987 10988 return getDerived().RebuildConditionalOperator(Cond.get(), 10989 E->getQuestionLoc(), 10990 LHS.get(), 10991 E->getColonLoc(), 10992 RHS.get()); 10993 } 10994 10995 template<typename Derived> 10996 ExprResult 10997 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10998 // Implicit casts are eliminated during transformation, since they 10999 // will be recomputed by semantic analysis after transformation. 11000 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11001 } 11002 11003 template<typename Derived> 11004 ExprResult 11005 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11006 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11007 if (!Type) 11008 return ExprError(); 11009 11010 ExprResult SubExpr 11011 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11012 if (SubExpr.isInvalid()) 11013 return ExprError(); 11014 11015 if (!getDerived().AlwaysRebuild() && 11016 Type == E->getTypeInfoAsWritten() && 11017 SubExpr.get() == E->getSubExpr()) 11018 return E; 11019 11020 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11021 Type, 11022 E->getRParenLoc(), 11023 SubExpr.get()); 11024 } 11025 11026 template<typename Derived> 11027 ExprResult 11028 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11029 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11030 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11031 if (!NewT) 11032 return ExprError(); 11033 11034 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11035 if (Init.isInvalid()) 11036 return ExprError(); 11037 11038 if (!getDerived().AlwaysRebuild() && 11039 OldT == NewT && 11040 Init.get() == E->getInitializer()) 11041 return SemaRef.MaybeBindToTemporary(E); 11042 11043 // Note: the expression type doesn't necessarily match the 11044 // type-as-written, but that's okay, because it should always be 11045 // derivable from the initializer. 11046 11047 return getDerived().RebuildCompoundLiteralExpr( 11048 E->getLParenLoc(), NewT, 11049 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11050 } 11051 11052 template<typename Derived> 11053 ExprResult 11054 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11055 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11056 if (Base.isInvalid()) 11057 return ExprError(); 11058 11059 if (!getDerived().AlwaysRebuild() && 11060 Base.get() == E->getBase()) 11061 return E; 11062 11063 // FIXME: Bad source location 11064 SourceLocation FakeOperatorLoc = 11065 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11066 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11067 E->getAccessorLoc(), 11068 E->getAccessor()); 11069 } 11070 11071 template<typename Derived> 11072 ExprResult 11073 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11074 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11075 E = Syntactic; 11076 11077 bool InitChanged = false; 11078 11079 EnterExpressionEvaluationContext Context( 11080 getSema(), EnterExpressionEvaluationContext::InitList); 11081 11082 SmallVector<Expr*, 4> Inits; 11083 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11084 Inits, &InitChanged)) 11085 return ExprError(); 11086 11087 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11088 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11089 // in some cases. We can't reuse it in general, because the syntactic and 11090 // semantic forms are linked, and we can't know that semantic form will 11091 // match even if the syntactic form does. 11092 } 11093 11094 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11095 E->getRBraceLoc()); 11096 } 11097 11098 template<typename Derived> 11099 ExprResult 11100 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11101 Designation Desig; 11102 11103 // transform the initializer value 11104 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11105 if (Init.isInvalid()) 11106 return ExprError(); 11107 11108 // transform the designators. 11109 SmallVector<Expr*, 4> ArrayExprs; 11110 bool ExprChanged = false; 11111 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11112 if (D.isFieldDesignator()) { 11113 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11114 D.getDotLoc(), 11115 D.getFieldLoc())); 11116 if (D.getField()) { 11117 FieldDecl *Field = cast_or_null<FieldDecl>( 11118 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11119 if (Field != D.getField()) 11120 // Rebuild the expression when the transformed FieldDecl is 11121 // different to the already assigned FieldDecl. 11122 ExprChanged = true; 11123 } else { 11124 // Ensure that the designator expression is rebuilt when there isn't 11125 // a resolved FieldDecl in the designator as we don't want to assign 11126 // a FieldDecl to a pattern designator that will be instantiated again. 11127 ExprChanged = true; 11128 } 11129 continue; 11130 } 11131 11132 if (D.isArrayDesignator()) { 11133 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11134 if (Index.isInvalid()) 11135 return ExprError(); 11136 11137 Desig.AddDesignator( 11138 Designator::getArray(Index.get(), D.getLBracketLoc())); 11139 11140 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11141 ArrayExprs.push_back(Index.get()); 11142 continue; 11143 } 11144 11145 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11146 ExprResult Start 11147 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11148 if (Start.isInvalid()) 11149 return ExprError(); 11150 11151 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11152 if (End.isInvalid()) 11153 return ExprError(); 11154 11155 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11156 End.get(), 11157 D.getLBracketLoc(), 11158 D.getEllipsisLoc())); 11159 11160 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11161 End.get() != E->getArrayRangeEnd(D); 11162 11163 ArrayExprs.push_back(Start.get()); 11164 ArrayExprs.push_back(End.get()); 11165 } 11166 11167 if (!getDerived().AlwaysRebuild() && 11168 Init.get() == E->getInit() && 11169 !ExprChanged) 11170 return E; 11171 11172 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11173 E->getEqualOrColonLoc(), 11174 E->usesGNUSyntax(), Init.get()); 11175 } 11176 11177 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11178 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11179 template<typename Derived> 11180 ExprResult 11181 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11182 DesignatedInitUpdateExpr *E) { 11183 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11184 "initializer"); 11185 return ExprError(); 11186 } 11187 11188 template<typename Derived> 11189 ExprResult 11190 TreeTransform<Derived>::TransformNoInitExpr( 11191 NoInitExpr *E) { 11192 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11193 return ExprError(); 11194 } 11195 11196 template<typename Derived> 11197 ExprResult 11198 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11199 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11200 return ExprError(); 11201 } 11202 11203 template<typename Derived> 11204 ExprResult 11205 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11206 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11207 return ExprError(); 11208 } 11209 11210 template<typename Derived> 11211 ExprResult 11212 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11213 ImplicitValueInitExpr *E) { 11214 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11215 11216 // FIXME: Will we ever have proper type location here? Will we actually 11217 // need to transform the type? 11218 QualType T = getDerived().TransformType(E->getType()); 11219 if (T.isNull()) 11220 return ExprError(); 11221 11222 if (!getDerived().AlwaysRebuild() && 11223 T == E->getType()) 11224 return E; 11225 11226 return getDerived().RebuildImplicitValueInitExpr(T); 11227 } 11228 11229 template<typename Derived> 11230 ExprResult 11231 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11232 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11233 if (!TInfo) 11234 return ExprError(); 11235 11236 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11237 if (SubExpr.isInvalid()) 11238 return ExprError(); 11239 11240 if (!getDerived().AlwaysRebuild() && 11241 TInfo == E->getWrittenTypeInfo() && 11242 SubExpr.get() == E->getSubExpr()) 11243 return E; 11244 11245 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11246 TInfo, E->getRParenLoc()); 11247 } 11248 11249 template<typename Derived> 11250 ExprResult 11251 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11252 bool ArgumentChanged = false; 11253 SmallVector<Expr*, 4> Inits; 11254 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11255 &ArgumentChanged)) 11256 return ExprError(); 11257 11258 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11259 Inits, 11260 E->getRParenLoc()); 11261 } 11262 11263 /// Transform an address-of-label expression. 11264 /// 11265 /// By default, the transformation of an address-of-label expression always 11266 /// rebuilds the expression, so that the label identifier can be resolved to 11267 /// the corresponding label statement by semantic analysis. 11268 template<typename Derived> 11269 ExprResult 11270 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11271 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11272 E->getLabel()); 11273 if (!LD) 11274 return ExprError(); 11275 11276 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11277 cast<LabelDecl>(LD)); 11278 } 11279 11280 template<typename Derived> 11281 ExprResult 11282 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11283 SemaRef.ActOnStartStmtExpr(); 11284 StmtResult SubStmt 11285 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11286 if (SubStmt.isInvalid()) { 11287 SemaRef.ActOnStmtExprError(); 11288 return ExprError(); 11289 } 11290 11291 unsigned OldDepth = E->getTemplateDepth(); 11292 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11293 11294 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11295 SubStmt.get() == E->getSubStmt()) { 11296 // Calling this an 'error' is unintuitive, but it does the right thing. 11297 SemaRef.ActOnStmtExprError(); 11298 return SemaRef.MaybeBindToTemporary(E); 11299 } 11300 11301 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11302 E->getRParenLoc(), NewDepth); 11303 } 11304 11305 template<typename Derived> 11306 ExprResult 11307 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11308 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11309 if (Cond.isInvalid()) 11310 return ExprError(); 11311 11312 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11313 if (LHS.isInvalid()) 11314 return ExprError(); 11315 11316 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11317 if (RHS.isInvalid()) 11318 return ExprError(); 11319 11320 if (!getDerived().AlwaysRebuild() && 11321 Cond.get() == E->getCond() && 11322 LHS.get() == E->getLHS() && 11323 RHS.get() == E->getRHS()) 11324 return E; 11325 11326 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11327 Cond.get(), LHS.get(), RHS.get(), 11328 E->getRParenLoc()); 11329 } 11330 11331 template<typename Derived> 11332 ExprResult 11333 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11334 return E; 11335 } 11336 11337 template<typename Derived> 11338 ExprResult 11339 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11340 switch (E->getOperator()) { 11341 case OO_New: 11342 case OO_Delete: 11343 case OO_Array_New: 11344 case OO_Array_Delete: 11345 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11346 11347 case OO_Call: { 11348 // This is a call to an object's operator(). 11349 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11350 11351 // Transform the object itself. 11352 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11353 if (Object.isInvalid()) 11354 return ExprError(); 11355 11356 // FIXME: Poor location information 11357 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11358 static_cast<Expr *>(Object.get())->getEndLoc()); 11359 11360 // Transform the call arguments. 11361 SmallVector<Expr*, 8> Args; 11362 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11363 Args)) 11364 return ExprError(); 11365 11366 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11367 E->getEndLoc()); 11368 } 11369 11370 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11371 case OO_##Name: 11372 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11373 #include "clang/Basic/OperatorKinds.def" 11374 case OO_Subscript: 11375 // Handled below. 11376 break; 11377 11378 case OO_Conditional: 11379 llvm_unreachable("conditional operator is not actually overloadable"); 11380 11381 case OO_None: 11382 case NUM_OVERLOADED_OPERATORS: 11383 llvm_unreachable("not an overloaded operator?"); 11384 } 11385 11386 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11387 if (Callee.isInvalid()) 11388 return ExprError(); 11389 11390 ExprResult First; 11391 if (E->getOperator() == OO_Amp) 11392 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11393 else 11394 First = getDerived().TransformExpr(E->getArg(0)); 11395 if (First.isInvalid()) 11396 return ExprError(); 11397 11398 ExprResult Second; 11399 if (E->getNumArgs() == 2) { 11400 Second = getDerived().TransformExpr(E->getArg(1)); 11401 if (Second.isInvalid()) 11402 return ExprError(); 11403 } 11404 11405 if (!getDerived().AlwaysRebuild() && 11406 Callee.get() == E->getCallee() && 11407 First.get() == E->getArg(0) && 11408 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11409 return SemaRef.MaybeBindToTemporary(E); 11410 11411 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11412 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11413 getSema().CurFPFeatures = 11414 NewOverrides.applyOverrides(getSema().getLangOpts()); 11415 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11416 11417 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11418 E->getOperatorLoc(), 11419 Callee.get(), 11420 First.get(), 11421 Second.get()); 11422 } 11423 11424 template<typename Derived> 11425 ExprResult 11426 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11427 return getDerived().TransformCallExpr(E); 11428 } 11429 11430 template <typename Derived> 11431 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11432 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11433 getSema().CurContext != E->getParentContext(); 11434 11435 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11436 return E; 11437 11438 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11439 E->getEndLoc(), 11440 getSema().CurContext); 11441 } 11442 11443 template<typename Derived> 11444 ExprResult 11445 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11446 // Transform the callee. 11447 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11448 if (Callee.isInvalid()) 11449 return ExprError(); 11450 11451 // Transform exec config. 11452 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11453 if (EC.isInvalid()) 11454 return ExprError(); 11455 11456 // Transform arguments. 11457 bool ArgChanged = false; 11458 SmallVector<Expr*, 8> Args; 11459 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11460 &ArgChanged)) 11461 return ExprError(); 11462 11463 if (!getDerived().AlwaysRebuild() && 11464 Callee.get() == E->getCallee() && 11465 !ArgChanged) 11466 return SemaRef.MaybeBindToTemporary(E); 11467 11468 // FIXME: Wrong source location information for the '('. 11469 SourceLocation FakeLParenLoc 11470 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11471 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11472 Args, 11473 E->getRParenLoc(), EC.get()); 11474 } 11475 11476 template<typename Derived> 11477 ExprResult 11478 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11479 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11480 if (!Type) 11481 return ExprError(); 11482 11483 ExprResult SubExpr 11484 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11485 if (SubExpr.isInvalid()) 11486 return ExprError(); 11487 11488 if (!getDerived().AlwaysRebuild() && 11489 Type == E->getTypeInfoAsWritten() && 11490 SubExpr.get() == E->getSubExpr()) 11491 return E; 11492 return getDerived().RebuildCXXNamedCastExpr( 11493 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11494 Type, E->getAngleBrackets().getEnd(), 11495 // FIXME. this should be '(' location 11496 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11497 } 11498 11499 template<typename Derived> 11500 ExprResult 11501 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11502 TypeSourceInfo *TSI = 11503 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11504 if (!TSI) 11505 return ExprError(); 11506 11507 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11508 if (Sub.isInvalid()) 11509 return ExprError(); 11510 11511 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11512 Sub.get(), BCE->getEndLoc()); 11513 } 11514 11515 template<typename Derived> 11516 ExprResult 11517 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11518 return getDerived().TransformCXXNamedCastExpr(E); 11519 } 11520 11521 template<typename Derived> 11522 ExprResult 11523 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11524 return getDerived().TransformCXXNamedCastExpr(E); 11525 } 11526 11527 template<typename Derived> 11528 ExprResult 11529 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11530 CXXReinterpretCastExpr *E) { 11531 return getDerived().TransformCXXNamedCastExpr(E); 11532 } 11533 11534 template<typename Derived> 11535 ExprResult 11536 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11537 return getDerived().TransformCXXNamedCastExpr(E); 11538 } 11539 11540 template<typename Derived> 11541 ExprResult 11542 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11543 return getDerived().TransformCXXNamedCastExpr(E); 11544 } 11545 11546 template<typename Derived> 11547 ExprResult 11548 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11549 CXXFunctionalCastExpr *E) { 11550 TypeSourceInfo *Type = 11551 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11552 if (!Type) 11553 return ExprError(); 11554 11555 ExprResult SubExpr 11556 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11557 if (SubExpr.isInvalid()) 11558 return ExprError(); 11559 11560 if (!getDerived().AlwaysRebuild() && 11561 Type == E->getTypeInfoAsWritten() && 11562 SubExpr.get() == E->getSubExpr()) 11563 return E; 11564 11565 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11566 E->getLParenLoc(), 11567 SubExpr.get(), 11568 E->getRParenLoc(), 11569 E->isListInitialization()); 11570 } 11571 11572 template<typename Derived> 11573 ExprResult 11574 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11575 if (E->isTypeOperand()) { 11576 TypeSourceInfo *TInfo 11577 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11578 if (!TInfo) 11579 return ExprError(); 11580 11581 if (!getDerived().AlwaysRebuild() && 11582 TInfo == E->getTypeOperandSourceInfo()) 11583 return E; 11584 11585 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11586 TInfo, E->getEndLoc()); 11587 } 11588 11589 // Typeid's operand is an unevaluated context, unless it's a polymorphic 11590 // type. We must not unilaterally enter unevaluated context here, as then 11591 // semantic processing can re-transform an already transformed operand. 11592 Expr *Op = E->getExprOperand(); 11593 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 11594 if (E->isGLValue()) 11595 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 11596 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 11597 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 11598 11599 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 11600 Sema::ReuseLambdaContextDecl); 11601 11602 ExprResult SubExpr = getDerived().TransformExpr(Op); 11603 if (SubExpr.isInvalid()) 11604 return ExprError(); 11605 11606 if (!getDerived().AlwaysRebuild() && 11607 SubExpr.get() == E->getExprOperand()) 11608 return E; 11609 11610 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11611 SubExpr.get(), E->getEndLoc()); 11612 } 11613 11614 template<typename Derived> 11615 ExprResult 11616 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11617 if (E->isTypeOperand()) { 11618 TypeSourceInfo *TInfo 11619 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11620 if (!TInfo) 11621 return ExprError(); 11622 11623 if (!getDerived().AlwaysRebuild() && 11624 TInfo == E->getTypeOperandSourceInfo()) 11625 return E; 11626 11627 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11628 TInfo, E->getEndLoc()); 11629 } 11630 11631 EnterExpressionEvaluationContext Unevaluated( 11632 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11633 11634 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11635 if (SubExpr.isInvalid()) 11636 return ExprError(); 11637 11638 if (!getDerived().AlwaysRebuild() && 11639 SubExpr.get() == E->getExprOperand()) 11640 return E; 11641 11642 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11643 SubExpr.get(), E->getEndLoc()); 11644 } 11645 11646 template<typename Derived> 11647 ExprResult 11648 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11649 return E; 11650 } 11651 11652 template<typename Derived> 11653 ExprResult 11654 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11655 CXXNullPtrLiteralExpr *E) { 11656 return E; 11657 } 11658 11659 template<typename Derived> 11660 ExprResult 11661 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11662 QualType T = getSema().getCurrentThisType(); 11663 11664 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11665 // Mark it referenced in the new context regardless. 11666 // FIXME: this is a bit instantiation-specific. 11667 getSema().MarkThisReferenced(E); 11668 return E; 11669 } 11670 11671 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11672 } 11673 11674 template<typename Derived> 11675 ExprResult 11676 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11677 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11678 if (SubExpr.isInvalid()) 11679 return ExprError(); 11680 11681 if (!getDerived().AlwaysRebuild() && 11682 SubExpr.get() == E->getSubExpr()) 11683 return E; 11684 11685 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11686 E->isThrownVariableInScope()); 11687 } 11688 11689 template<typename Derived> 11690 ExprResult 11691 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11692 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11693 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11694 if (!Param) 11695 return ExprError(); 11696 11697 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11698 E->getUsedContext() == SemaRef.CurContext) 11699 return E; 11700 11701 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11702 } 11703 11704 template<typename Derived> 11705 ExprResult 11706 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11707 FieldDecl *Field = cast_or_null<FieldDecl>( 11708 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11709 if (!Field) 11710 return ExprError(); 11711 11712 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11713 E->getUsedContext() == SemaRef.CurContext) 11714 return E; 11715 11716 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11717 } 11718 11719 template<typename Derived> 11720 ExprResult 11721 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11722 CXXScalarValueInitExpr *E) { 11723 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11724 if (!T) 11725 return ExprError(); 11726 11727 if (!getDerived().AlwaysRebuild() && 11728 T == E->getTypeSourceInfo()) 11729 return E; 11730 11731 return getDerived().RebuildCXXScalarValueInitExpr(T, 11732 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11733 E->getRParenLoc()); 11734 } 11735 11736 template<typename Derived> 11737 ExprResult 11738 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11739 // Transform the type that we're allocating 11740 TypeSourceInfo *AllocTypeInfo = 11741 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11742 if (!AllocTypeInfo) 11743 return ExprError(); 11744 11745 // Transform the size of the array we're allocating (if any). 11746 Optional<Expr *> ArraySize; 11747 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11748 ExprResult NewArraySize; 11749 if (*OldArraySize) { 11750 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11751 if (NewArraySize.isInvalid()) 11752 return ExprError(); 11753 } 11754 ArraySize = NewArraySize.get(); 11755 } 11756 11757 // Transform the placement arguments (if any). 11758 bool ArgumentChanged = false; 11759 SmallVector<Expr*, 8> PlacementArgs; 11760 if (getDerived().TransformExprs(E->getPlacementArgs(), 11761 E->getNumPlacementArgs(), true, 11762 PlacementArgs, &ArgumentChanged)) 11763 return ExprError(); 11764 11765 // Transform the initializer (if any). 11766 Expr *OldInit = E->getInitializer(); 11767 ExprResult NewInit; 11768 if (OldInit) 11769 NewInit = getDerived().TransformInitializer(OldInit, true); 11770 if (NewInit.isInvalid()) 11771 return ExprError(); 11772 11773 // Transform new operator and delete operator. 11774 FunctionDecl *OperatorNew = nullptr; 11775 if (E->getOperatorNew()) { 11776 OperatorNew = cast_or_null<FunctionDecl>( 11777 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11778 if (!OperatorNew) 11779 return ExprError(); 11780 } 11781 11782 FunctionDecl *OperatorDelete = nullptr; 11783 if (E->getOperatorDelete()) { 11784 OperatorDelete = cast_or_null<FunctionDecl>( 11785 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11786 if (!OperatorDelete) 11787 return ExprError(); 11788 } 11789 11790 if (!getDerived().AlwaysRebuild() && 11791 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11792 ArraySize == E->getArraySize() && 11793 NewInit.get() == OldInit && 11794 OperatorNew == E->getOperatorNew() && 11795 OperatorDelete == E->getOperatorDelete() && 11796 !ArgumentChanged) { 11797 // Mark any declarations we need as referenced. 11798 // FIXME: instantiation-specific. 11799 if (OperatorNew) 11800 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11801 if (OperatorDelete) 11802 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11803 11804 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11805 QualType ElementType 11806 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11807 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11808 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11809 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11810 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11811 } 11812 } 11813 } 11814 11815 return E; 11816 } 11817 11818 QualType AllocType = AllocTypeInfo->getType(); 11819 if (!ArraySize) { 11820 // If no array size was specified, but the new expression was 11821 // instantiated with an array type (e.g., "new T" where T is 11822 // instantiated with "int[4]"), extract the outer bound from the 11823 // array type as our array size. We do this with constant and 11824 // dependently-sized array types. 11825 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11826 if (!ArrayT) { 11827 // Do nothing 11828 } else if (const ConstantArrayType *ConsArrayT 11829 = dyn_cast<ConstantArrayType>(ArrayT)) { 11830 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11831 SemaRef.Context.getSizeType(), 11832 /*FIXME:*/ E->getBeginLoc()); 11833 AllocType = ConsArrayT->getElementType(); 11834 } else if (const DependentSizedArrayType *DepArrayT 11835 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11836 if (DepArrayT->getSizeExpr()) { 11837 ArraySize = DepArrayT->getSizeExpr(); 11838 AllocType = DepArrayT->getElementType(); 11839 } 11840 } 11841 } 11842 11843 return getDerived().RebuildCXXNewExpr( 11844 E->getBeginLoc(), E->isGlobalNew(), 11845 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11846 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11847 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11848 } 11849 11850 template<typename Derived> 11851 ExprResult 11852 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11853 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11854 if (Operand.isInvalid()) 11855 return ExprError(); 11856 11857 // Transform the delete operator, if known. 11858 FunctionDecl *OperatorDelete = nullptr; 11859 if (E->getOperatorDelete()) { 11860 OperatorDelete = cast_or_null<FunctionDecl>( 11861 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11862 if (!OperatorDelete) 11863 return ExprError(); 11864 } 11865 11866 if (!getDerived().AlwaysRebuild() && 11867 Operand.get() == E->getArgument() && 11868 OperatorDelete == E->getOperatorDelete()) { 11869 // Mark any declarations we need as referenced. 11870 // FIXME: instantiation-specific. 11871 if (OperatorDelete) 11872 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11873 11874 if (!E->getArgument()->isTypeDependent()) { 11875 QualType Destroyed = SemaRef.Context.getBaseElementType( 11876 E->getDestroyedType()); 11877 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11878 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11879 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11880 SemaRef.LookupDestructor(Record)); 11881 } 11882 } 11883 11884 return E; 11885 } 11886 11887 return getDerived().RebuildCXXDeleteExpr( 11888 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11889 } 11890 11891 template<typename Derived> 11892 ExprResult 11893 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11894 CXXPseudoDestructorExpr *E) { 11895 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11896 if (Base.isInvalid()) 11897 return ExprError(); 11898 11899 ParsedType ObjectTypePtr; 11900 bool MayBePseudoDestructor = false; 11901 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11902 E->getOperatorLoc(), 11903 E->isArrow()? tok::arrow : tok::period, 11904 ObjectTypePtr, 11905 MayBePseudoDestructor); 11906 if (Base.isInvalid()) 11907 return ExprError(); 11908 11909 QualType ObjectType = ObjectTypePtr.get(); 11910 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11911 if (QualifierLoc) { 11912 QualifierLoc 11913 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11914 if (!QualifierLoc) 11915 return ExprError(); 11916 } 11917 CXXScopeSpec SS; 11918 SS.Adopt(QualifierLoc); 11919 11920 PseudoDestructorTypeStorage Destroyed; 11921 if (E->getDestroyedTypeInfo()) { 11922 TypeSourceInfo *DestroyedTypeInfo 11923 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11924 ObjectType, nullptr, SS); 11925 if (!DestroyedTypeInfo) 11926 return ExprError(); 11927 Destroyed = DestroyedTypeInfo; 11928 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11929 // We aren't likely to be able to resolve the identifier down to a type 11930 // now anyway, so just retain the identifier. 11931 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11932 E->getDestroyedTypeLoc()); 11933 } else { 11934 // Look for a destructor known with the given name. 11935 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11936 *E->getDestroyedTypeIdentifier(), 11937 E->getDestroyedTypeLoc(), 11938 /*Scope=*/nullptr, 11939 SS, ObjectTypePtr, 11940 false); 11941 if (!T) 11942 return ExprError(); 11943 11944 Destroyed 11945 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11946 E->getDestroyedTypeLoc()); 11947 } 11948 11949 TypeSourceInfo *ScopeTypeInfo = nullptr; 11950 if (E->getScopeTypeInfo()) { 11951 CXXScopeSpec EmptySS; 11952 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11953 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11954 if (!ScopeTypeInfo) 11955 return ExprError(); 11956 } 11957 11958 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11959 E->getOperatorLoc(), 11960 E->isArrow(), 11961 SS, 11962 ScopeTypeInfo, 11963 E->getColonColonLoc(), 11964 E->getTildeLoc(), 11965 Destroyed); 11966 } 11967 11968 template <typename Derived> 11969 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11970 bool RequiresADL, 11971 LookupResult &R) { 11972 // Transform all the decls. 11973 bool AllEmptyPacks = true; 11974 for (auto *OldD : Old->decls()) { 11975 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11976 if (!InstD) { 11977 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11978 // This can happen because of dependent hiding. 11979 if (isa<UsingShadowDecl>(OldD)) 11980 continue; 11981 else { 11982 R.clear(); 11983 return true; 11984 } 11985 } 11986 11987 // Expand using pack declarations. 11988 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11989 ArrayRef<NamedDecl*> Decls = SingleDecl; 11990 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11991 Decls = UPD->expansions(); 11992 11993 // Expand using declarations. 11994 for (auto *D : Decls) { 11995 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11996 for (auto *SD : UD->shadows()) 11997 R.addDecl(SD); 11998 } else { 11999 R.addDecl(D); 12000 } 12001 } 12002 12003 AllEmptyPacks &= Decls.empty(); 12004 }; 12005 12006 // C++ [temp.res]/8.4.2: 12007 // The program is ill-formed, no diagnostic required, if [...] lookup for 12008 // a name in the template definition found a using-declaration, but the 12009 // lookup in the corresponding scope in the instantiation odoes not find 12010 // any declarations because the using-declaration was a pack expansion and 12011 // the corresponding pack is empty 12012 if (AllEmptyPacks && !RequiresADL) { 12013 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12014 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12015 return true; 12016 } 12017 12018 // Resolve a kind, but don't do any further analysis. If it's 12019 // ambiguous, the callee needs to deal with it. 12020 R.resolveKind(); 12021 return false; 12022 } 12023 12024 template<typename Derived> 12025 ExprResult 12026 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12027 UnresolvedLookupExpr *Old) { 12028 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12029 Sema::LookupOrdinaryName); 12030 12031 // Transform the declaration set. 12032 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12033 return ExprError(); 12034 12035 // Rebuild the nested-name qualifier, if present. 12036 CXXScopeSpec SS; 12037 if (Old->getQualifierLoc()) { 12038 NestedNameSpecifierLoc QualifierLoc 12039 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12040 if (!QualifierLoc) 12041 return ExprError(); 12042 12043 SS.Adopt(QualifierLoc); 12044 } 12045 12046 if (Old->getNamingClass()) { 12047 CXXRecordDecl *NamingClass 12048 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12049 Old->getNameLoc(), 12050 Old->getNamingClass())); 12051 if (!NamingClass) { 12052 R.clear(); 12053 return ExprError(); 12054 } 12055 12056 R.setNamingClass(NamingClass); 12057 } 12058 12059 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12060 12061 // If we have neither explicit template arguments, nor the template keyword, 12062 // it's a normal declaration name or member reference. 12063 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12064 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12065 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12066 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12067 // give a good diagnostic. 12068 if (D && D->isCXXInstanceMember()) { 12069 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12070 /*TemplateArgs=*/nullptr, 12071 /*Scope=*/nullptr); 12072 } 12073 12074 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12075 } 12076 12077 // If we have template arguments, rebuild them, then rebuild the 12078 // templateid expression. 12079 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12080 if (Old->hasExplicitTemplateArgs() && 12081 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12082 Old->getNumTemplateArgs(), 12083 TransArgs)) { 12084 R.clear(); 12085 return ExprError(); 12086 } 12087 12088 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12089 Old->requiresADL(), &TransArgs); 12090 } 12091 12092 template<typename Derived> 12093 ExprResult 12094 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12095 bool ArgChanged = false; 12096 SmallVector<TypeSourceInfo *, 4> Args; 12097 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12098 TypeSourceInfo *From = E->getArg(I); 12099 TypeLoc FromTL = From->getTypeLoc(); 12100 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12101 TypeLocBuilder TLB; 12102 TLB.reserve(FromTL.getFullDataSize()); 12103 QualType To = getDerived().TransformType(TLB, FromTL); 12104 if (To.isNull()) 12105 return ExprError(); 12106 12107 if (To == From->getType()) 12108 Args.push_back(From); 12109 else { 12110 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12111 ArgChanged = true; 12112 } 12113 continue; 12114 } 12115 12116 ArgChanged = true; 12117 12118 // We have a pack expansion. Instantiate it. 12119 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12120 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12121 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12122 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12123 12124 // Determine whether the set of unexpanded parameter packs can and should 12125 // be expanded. 12126 bool Expand = true; 12127 bool RetainExpansion = false; 12128 Optional<unsigned> OrigNumExpansions = 12129 ExpansionTL.getTypePtr()->getNumExpansions(); 12130 Optional<unsigned> NumExpansions = OrigNumExpansions; 12131 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12132 PatternTL.getSourceRange(), 12133 Unexpanded, 12134 Expand, RetainExpansion, 12135 NumExpansions)) 12136 return ExprError(); 12137 12138 if (!Expand) { 12139 // The transform has determined that we should perform a simple 12140 // transformation on the pack expansion, producing another pack 12141 // expansion. 12142 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12143 12144 TypeLocBuilder TLB; 12145 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12146 12147 QualType To = getDerived().TransformType(TLB, PatternTL); 12148 if (To.isNull()) 12149 return ExprError(); 12150 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 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12162 continue; 12163 } 12164 12165 // Expand the pack expansion by substituting for each argument in the 12166 // pack(s). 12167 for (unsigned I = 0; I != *NumExpansions; ++I) { 12168 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12169 TypeLocBuilder TLB; 12170 TLB.reserve(PatternTL.getFullDataSize()); 12171 QualType To = getDerived().TransformType(TLB, PatternTL); 12172 if (To.isNull()) 12173 return ExprError(); 12174 12175 if (To->containsUnexpandedParameterPack()) { 12176 To = getDerived().RebuildPackExpansionType(To, 12177 PatternTL.getSourceRange(), 12178 ExpansionTL.getEllipsisLoc(), 12179 NumExpansions); 12180 if (To.isNull()) 12181 return ExprError(); 12182 12183 PackExpansionTypeLoc ToExpansionTL 12184 = TLB.push<PackExpansionTypeLoc>(To); 12185 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12186 } 12187 12188 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12189 } 12190 12191 if (!RetainExpansion) 12192 continue; 12193 12194 // If we're supposed to retain a pack expansion, do so by temporarily 12195 // forgetting the partially-substituted parameter pack. 12196 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12197 12198 TypeLocBuilder TLB; 12199 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12200 12201 QualType To = getDerived().TransformType(TLB, PatternTL); 12202 if (To.isNull()) 12203 return ExprError(); 12204 12205 To = getDerived().RebuildPackExpansionType(To, 12206 PatternTL.getSourceRange(), 12207 ExpansionTL.getEllipsisLoc(), 12208 NumExpansions); 12209 if (To.isNull()) 12210 return ExprError(); 12211 12212 PackExpansionTypeLoc ToExpansionTL 12213 = TLB.push<PackExpansionTypeLoc>(To); 12214 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12215 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12216 } 12217 12218 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12219 return E; 12220 12221 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12222 E->getEndLoc()); 12223 } 12224 12225 template<typename Derived> 12226 ExprResult 12227 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12228 ConceptSpecializationExpr *E) { 12229 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12230 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12231 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12232 Old->NumTemplateArgs, TransArgs)) 12233 return ExprError(); 12234 12235 return getDerived().RebuildConceptSpecializationExpr( 12236 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12237 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12238 &TransArgs); 12239 } 12240 12241 template<typename Derived> 12242 ExprResult 12243 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12244 SmallVector<ParmVarDecl*, 4> TransParams; 12245 SmallVector<QualType, 4> TransParamTypes; 12246 Sema::ExtParameterInfoBuilder ExtParamInfos; 12247 12248 // C++2a [expr.prim.req]p2 12249 // Expressions appearing within a requirement-body are unevaluated operands. 12250 EnterExpressionEvaluationContext Ctx( 12251 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12252 12253 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12254 getSema().Context, getSema().CurContext, 12255 E->getBody()->getBeginLoc()); 12256 12257 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12258 12259 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12260 E->getLocalParameters(), 12261 /*ParamTypes=*/nullptr, 12262 /*ParamInfos=*/nullptr, 12263 TransParamTypes, &TransParams, 12264 ExtParamInfos)) 12265 return ExprError(); 12266 12267 for (ParmVarDecl *Param : TransParams) 12268 Param->setDeclContext(Body); 12269 12270 SmallVector<concepts::Requirement *, 4> TransReqs; 12271 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12272 TransReqs)) 12273 return ExprError(); 12274 12275 for (concepts::Requirement *Req : TransReqs) { 12276 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12277 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12278 ER->getReturnTypeRequirement() 12279 .getTypeConstraintTemplateParameterList()->getParam(0) 12280 ->setDeclContext(Body); 12281 } 12282 } 12283 } 12284 12285 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12286 TransParams, TransReqs, 12287 E->getRBraceLoc()); 12288 } 12289 12290 template<typename Derived> 12291 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12292 ArrayRef<concepts::Requirement *> Reqs, 12293 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12294 for (concepts::Requirement *Req : Reqs) { 12295 concepts::Requirement *TransReq = nullptr; 12296 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12297 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12298 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12299 TransReq = getDerived().TransformExprRequirement(ExprReq); 12300 else 12301 TransReq = getDerived().TransformNestedRequirement( 12302 cast<concepts::NestedRequirement>(Req)); 12303 if (!TransReq) 12304 return true; 12305 Transformed.push_back(TransReq); 12306 } 12307 return false; 12308 } 12309 12310 template<typename Derived> 12311 concepts::TypeRequirement * 12312 TreeTransform<Derived>::TransformTypeRequirement( 12313 concepts::TypeRequirement *Req) { 12314 if (Req->isSubstitutionFailure()) { 12315 if (getDerived().AlwaysRebuild()) 12316 return getDerived().RebuildTypeRequirement( 12317 Req->getSubstitutionDiagnostic()); 12318 return Req; 12319 } 12320 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12321 if (!TransType) 12322 return nullptr; 12323 return getDerived().RebuildTypeRequirement(TransType); 12324 } 12325 12326 template<typename Derived> 12327 concepts::ExprRequirement * 12328 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12329 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12330 if (Req->isExprSubstitutionFailure()) 12331 TransExpr = Req->getExprSubstitutionDiagnostic(); 12332 else { 12333 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12334 if (TransExprRes.isInvalid()) 12335 return nullptr; 12336 TransExpr = TransExprRes.get(); 12337 } 12338 12339 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12340 const auto &RetReq = Req->getReturnTypeRequirement(); 12341 if (RetReq.isEmpty()) 12342 TransRetReq.emplace(); 12343 else if (RetReq.isSubstitutionFailure()) 12344 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12345 else if (RetReq.isTypeConstraint()) { 12346 TemplateParameterList *OrigTPL = 12347 RetReq.getTypeConstraintTemplateParameterList(); 12348 TemplateParameterList *TPL = 12349 getDerived().TransformTemplateParameterList(OrigTPL); 12350 if (!TPL) 12351 return nullptr; 12352 TransRetReq.emplace(TPL); 12353 } 12354 assert(TransRetReq.hasValue() && 12355 "All code paths leading here must set TransRetReq"); 12356 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12357 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12358 Req->getNoexceptLoc(), 12359 std::move(*TransRetReq)); 12360 return getDerived().RebuildExprRequirement( 12361 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12362 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12363 } 12364 12365 template<typename Derived> 12366 concepts::NestedRequirement * 12367 TreeTransform<Derived>::TransformNestedRequirement( 12368 concepts::NestedRequirement *Req) { 12369 if (Req->isSubstitutionFailure()) { 12370 if (getDerived().AlwaysRebuild()) 12371 return getDerived().RebuildNestedRequirement( 12372 Req->getSubstitutionDiagnostic()); 12373 return Req; 12374 } 12375 ExprResult TransConstraint = 12376 getDerived().TransformExpr(Req->getConstraintExpr()); 12377 if (TransConstraint.isInvalid()) 12378 return nullptr; 12379 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12380 } 12381 12382 template<typename Derived> 12383 ExprResult 12384 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12385 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12386 if (!T) 12387 return ExprError(); 12388 12389 if (!getDerived().AlwaysRebuild() && 12390 T == E->getQueriedTypeSourceInfo()) 12391 return E; 12392 12393 ExprResult SubExpr; 12394 { 12395 EnterExpressionEvaluationContext Unevaluated( 12396 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12397 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12398 if (SubExpr.isInvalid()) 12399 return ExprError(); 12400 12401 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12402 return E; 12403 } 12404 12405 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12406 SubExpr.get(), E->getEndLoc()); 12407 } 12408 12409 template<typename Derived> 12410 ExprResult 12411 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12412 ExprResult SubExpr; 12413 { 12414 EnterExpressionEvaluationContext Unevaluated( 12415 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12416 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12417 if (SubExpr.isInvalid()) 12418 return ExprError(); 12419 12420 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12421 return E; 12422 } 12423 12424 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12425 SubExpr.get(), E->getEndLoc()); 12426 } 12427 12428 template <typename Derived> 12429 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12430 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12431 TypeSourceInfo **RecoveryTSI) { 12432 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12433 DRE, AddrTaken, RecoveryTSI); 12434 12435 // Propagate both errors and recovered types, which return ExprEmpty. 12436 if (!NewDRE.isUsable()) 12437 return NewDRE; 12438 12439 // We got an expr, wrap it up in parens. 12440 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12441 return PE; 12442 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12443 PE->getRParen()); 12444 } 12445 12446 template <typename Derived> 12447 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12448 DependentScopeDeclRefExpr *E) { 12449 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12450 nullptr); 12451 } 12452 12453 template<typename Derived> 12454 ExprResult 12455 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12456 DependentScopeDeclRefExpr *E, 12457 bool IsAddressOfOperand, 12458 TypeSourceInfo **RecoveryTSI) { 12459 assert(E->getQualifierLoc()); 12460 NestedNameSpecifierLoc QualifierLoc 12461 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12462 if (!QualifierLoc) 12463 return ExprError(); 12464 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12465 12466 // TODO: If this is a conversion-function-id, verify that the 12467 // destination type name (if present) resolves the same way after 12468 // instantiation as it did in the local scope. 12469 12470 DeclarationNameInfo NameInfo 12471 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12472 if (!NameInfo.getName()) 12473 return ExprError(); 12474 12475 if (!E->hasExplicitTemplateArgs()) { 12476 if (!getDerived().AlwaysRebuild() && 12477 QualifierLoc == E->getQualifierLoc() && 12478 // Note: it is sufficient to compare the Name component of NameInfo: 12479 // if name has not changed, DNLoc has not changed either. 12480 NameInfo.getName() == E->getDeclName()) 12481 return E; 12482 12483 return getDerived().RebuildDependentScopeDeclRefExpr( 12484 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12485 IsAddressOfOperand, RecoveryTSI); 12486 } 12487 12488 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12489 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12490 E->getNumTemplateArgs(), 12491 TransArgs)) 12492 return ExprError(); 12493 12494 return getDerived().RebuildDependentScopeDeclRefExpr( 12495 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12496 RecoveryTSI); 12497 } 12498 12499 template<typename Derived> 12500 ExprResult 12501 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12502 // CXXConstructExprs other than for list-initialization and 12503 // CXXTemporaryObjectExpr are always implicit, so when we have 12504 // a 1-argument construction we just transform that argument. 12505 if (getDerived().AllowSkippingCXXConstructExpr() && 12506 ((E->getNumArgs() == 1 || 12507 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12508 (!getDerived().DropCallArgument(E->getArg(0))) && 12509 !E->isListInitialization())) 12510 return getDerived().TransformInitializer(E->getArg(0), 12511 /*DirectInit*/ false); 12512 12513 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12514 12515 QualType T = getDerived().TransformType(E->getType()); 12516 if (T.isNull()) 12517 return ExprError(); 12518 12519 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12520 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12521 if (!Constructor) 12522 return ExprError(); 12523 12524 bool ArgumentChanged = false; 12525 SmallVector<Expr*, 8> Args; 12526 { 12527 EnterExpressionEvaluationContext Context( 12528 getSema(), EnterExpressionEvaluationContext::InitList, 12529 E->isListInitialization()); 12530 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12531 &ArgumentChanged)) 12532 return ExprError(); 12533 } 12534 12535 if (!getDerived().AlwaysRebuild() && 12536 T == E->getType() && 12537 Constructor == E->getConstructor() && 12538 !ArgumentChanged) { 12539 // Mark the constructor as referenced. 12540 // FIXME: Instantiation-specific 12541 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12542 return E; 12543 } 12544 12545 return getDerived().RebuildCXXConstructExpr( 12546 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12547 E->hadMultipleCandidates(), E->isListInitialization(), 12548 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12549 E->getConstructionKind(), E->getParenOrBraceRange()); 12550 } 12551 12552 template<typename Derived> 12553 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12554 CXXInheritedCtorInitExpr *E) { 12555 QualType T = getDerived().TransformType(E->getType()); 12556 if (T.isNull()) 12557 return ExprError(); 12558 12559 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12560 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12561 if (!Constructor) 12562 return ExprError(); 12563 12564 if (!getDerived().AlwaysRebuild() && 12565 T == E->getType() && 12566 Constructor == E->getConstructor()) { 12567 // Mark the constructor as referenced. 12568 // FIXME: Instantiation-specific 12569 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12570 return E; 12571 } 12572 12573 return getDerived().RebuildCXXInheritedCtorInitExpr( 12574 T, E->getLocation(), Constructor, 12575 E->constructsVBase(), E->inheritedFromVBase()); 12576 } 12577 12578 /// Transform a C++ temporary-binding expression. 12579 /// 12580 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12581 /// transform the subexpression and return that. 12582 template<typename Derived> 12583 ExprResult 12584 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12585 return getDerived().TransformExpr(E->getSubExpr()); 12586 } 12587 12588 /// Transform a C++ expression that contains cleanups that should 12589 /// be run after the expression is evaluated. 12590 /// 12591 /// Since ExprWithCleanups nodes are implicitly generated, we 12592 /// just transform the subexpression and return that. 12593 template<typename Derived> 12594 ExprResult 12595 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12596 return getDerived().TransformExpr(E->getSubExpr()); 12597 } 12598 12599 template<typename Derived> 12600 ExprResult 12601 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12602 CXXTemporaryObjectExpr *E) { 12603 TypeSourceInfo *T = 12604 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12605 if (!T) 12606 return ExprError(); 12607 12608 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12609 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12610 if (!Constructor) 12611 return ExprError(); 12612 12613 bool ArgumentChanged = false; 12614 SmallVector<Expr*, 8> Args; 12615 Args.reserve(E->getNumArgs()); 12616 { 12617 EnterExpressionEvaluationContext Context( 12618 getSema(), EnterExpressionEvaluationContext::InitList, 12619 E->isListInitialization()); 12620 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12621 &ArgumentChanged)) 12622 return ExprError(); 12623 } 12624 12625 if (!getDerived().AlwaysRebuild() && 12626 T == E->getTypeSourceInfo() && 12627 Constructor == E->getConstructor() && 12628 !ArgumentChanged) { 12629 // FIXME: Instantiation-specific 12630 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12631 return SemaRef.MaybeBindToTemporary(E); 12632 } 12633 12634 // FIXME: We should just pass E->isListInitialization(), but we're not 12635 // prepared to handle list-initialization without a child InitListExpr. 12636 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12637 return getDerived().RebuildCXXTemporaryObjectExpr( 12638 T, LParenLoc, Args, E->getEndLoc(), 12639 /*ListInitialization=*/LParenLoc.isInvalid()); 12640 } 12641 12642 template<typename Derived> 12643 ExprResult 12644 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12645 // Transform any init-capture expressions before entering the scope of the 12646 // lambda body, because they are not semantically within that scope. 12647 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12648 struct TransformedInitCapture { 12649 // The location of the ... if the result is retaining a pack expansion. 12650 SourceLocation EllipsisLoc; 12651 // Zero or more expansions of the init-capture. 12652 SmallVector<InitCaptureInfoTy, 4> Expansions; 12653 }; 12654 SmallVector<TransformedInitCapture, 4> InitCaptures; 12655 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12656 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12657 CEnd = E->capture_end(); 12658 C != CEnd; ++C) { 12659 if (!E->isInitCapture(C)) 12660 continue; 12661 12662 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12663 VarDecl *OldVD = C->getCapturedVar(); 12664 12665 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12666 Optional<unsigned> NumExpansions) { 12667 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12668 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12669 12670 if (NewExprInitResult.isInvalid()) { 12671 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12672 return; 12673 } 12674 Expr *NewExprInit = NewExprInitResult.get(); 12675 12676 QualType NewInitCaptureType = 12677 getSema().buildLambdaInitCaptureInitialization( 12678 C->getLocation(), OldVD->getType()->isReferenceType(), 12679 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12680 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12681 NewExprInit); 12682 Result.Expansions.push_back( 12683 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12684 }; 12685 12686 // If this is an init-capture pack, consider expanding the pack now. 12687 if (OldVD->isParameterPack()) { 12688 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12689 ->getTypeLoc() 12690 .castAs<PackExpansionTypeLoc>(); 12691 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12692 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12693 12694 // Determine whether the set of unexpanded parameter packs can and should 12695 // be expanded. 12696 bool Expand = true; 12697 bool RetainExpansion = false; 12698 Optional<unsigned> OrigNumExpansions = 12699 ExpansionTL.getTypePtr()->getNumExpansions(); 12700 Optional<unsigned> NumExpansions = OrigNumExpansions; 12701 if (getDerived().TryExpandParameterPacks( 12702 ExpansionTL.getEllipsisLoc(), 12703 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12704 RetainExpansion, NumExpansions)) 12705 return ExprError(); 12706 if (Expand) { 12707 for (unsigned I = 0; I != *NumExpansions; ++I) { 12708 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12709 SubstInitCapture(SourceLocation(), None); 12710 } 12711 } 12712 if (!Expand || RetainExpansion) { 12713 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12714 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12715 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12716 } 12717 } else { 12718 SubstInitCapture(SourceLocation(), None); 12719 } 12720 } 12721 12722 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12723 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12724 12725 // Transform the template parameters, and add them to the current 12726 // instantiation scope. The null case is handled correctly. 12727 auto TPL = getDerived().TransformTemplateParameterList( 12728 E->getTemplateParameterList()); 12729 LSI->GLTemplateParameterList = TPL; 12730 12731 // Transform the type of the original lambda's call operator. 12732 // The transformation MUST be done in the CurrentInstantiationScope since 12733 // it introduces a mapping of the original to the newly created 12734 // transformed parameters. 12735 TypeSourceInfo *NewCallOpTSI = nullptr; 12736 { 12737 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12738 FunctionProtoTypeLoc OldCallOpFPTL = 12739 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12740 12741 TypeLocBuilder NewCallOpTLBuilder; 12742 SmallVector<QualType, 4> ExceptionStorage; 12743 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12744 QualType NewCallOpType = TransformFunctionProtoType( 12745 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12746 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12747 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12748 ExceptionStorage, Changed); 12749 }); 12750 if (NewCallOpType.isNull()) 12751 return ExprError(); 12752 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12753 NewCallOpType); 12754 } 12755 12756 // Transform the trailing requires clause 12757 ExprResult NewTrailingRequiresClause; 12758 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12759 // FIXME: Concepts: Substitution into requires clause should only happen 12760 // when checking satisfaction. 12761 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12762 12763 // Create the local class that will describe the lambda. 12764 // FIXME: KnownDependent below is wrong when substituting inside a templated 12765 // context that isn't a DeclContext (such as a variable template). 12766 CXXRecordDecl *OldClass = E->getLambdaClass(); 12767 CXXRecordDecl *Class 12768 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12769 NewCallOpTSI, 12770 /*KnownDependent=*/false, 12771 E->getCaptureDefault()); 12772 getDerived().transformedLocalDecl(OldClass, {Class}); 12773 12774 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12775 if (getDerived().ReplacingOriginal()) 12776 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12777 OldClass->getLambdaManglingNumber(), 12778 OldClass->getDeviceLambdaManglingNumber(), 12779 OldClass->getLambdaContextDecl()); 12780 12781 // Build the call operator. 12782 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12783 Class, E->getIntroducerRange(), NewCallOpTSI, 12784 E->getCallOperator()->getEndLoc(), 12785 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12786 E->getCallOperator()->getConstexprKind(), 12787 NewTrailingRequiresClause.get()); 12788 12789 LSI->CallOperator = NewCallOperator; 12790 12791 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12792 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12793 12794 // Number the lambda for linkage purposes if necessary. 12795 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12796 12797 // Introduce the context of the call operator. 12798 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12799 /*NewThisContext*/false); 12800 12801 // Enter the scope of the lambda. 12802 getSema().buildLambdaScope(LSI, NewCallOperator, 12803 E->getIntroducerRange(), 12804 E->getCaptureDefault(), 12805 E->getCaptureDefaultLoc(), 12806 E->hasExplicitParameters(), 12807 E->hasExplicitResultType(), 12808 E->isMutable()); 12809 12810 bool Invalid = false; 12811 12812 // Transform captures. 12813 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12814 CEnd = E->capture_end(); 12815 C != CEnd; ++C) { 12816 // When we hit the first implicit capture, tell Sema that we've finished 12817 // the list of explicit captures. 12818 if (C->isImplicit()) 12819 break; 12820 12821 // Capturing 'this' is trivial. 12822 if (C->capturesThis()) { 12823 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12824 /*BuildAndDiagnose*/ true, nullptr, 12825 C->getCaptureKind() == LCK_StarThis); 12826 continue; 12827 } 12828 // Captured expression will be recaptured during captured variables 12829 // rebuilding. 12830 if (C->capturesVLAType()) 12831 continue; 12832 12833 // Rebuild init-captures, including the implied field declaration. 12834 if (E->isInitCapture(C)) { 12835 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12836 12837 VarDecl *OldVD = C->getCapturedVar(); 12838 llvm::SmallVector<Decl*, 4> NewVDs; 12839 12840 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12841 ExprResult Init = Info.first; 12842 QualType InitQualType = Info.second; 12843 if (Init.isInvalid() || InitQualType.isNull()) { 12844 Invalid = true; 12845 break; 12846 } 12847 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12848 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12849 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12850 if (!NewVD) { 12851 Invalid = true; 12852 break; 12853 } 12854 NewVDs.push_back(NewVD); 12855 getSema().addInitCapture(LSI, NewVD); 12856 } 12857 12858 if (Invalid) 12859 break; 12860 12861 getDerived().transformedLocalDecl(OldVD, NewVDs); 12862 continue; 12863 } 12864 12865 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12866 12867 // Determine the capture kind for Sema. 12868 Sema::TryCaptureKind Kind 12869 = C->isImplicit()? Sema::TryCapture_Implicit 12870 : C->getCaptureKind() == LCK_ByCopy 12871 ? Sema::TryCapture_ExplicitByVal 12872 : Sema::TryCapture_ExplicitByRef; 12873 SourceLocation EllipsisLoc; 12874 if (C->isPackExpansion()) { 12875 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12876 bool ShouldExpand = false; 12877 bool RetainExpansion = false; 12878 Optional<unsigned> NumExpansions; 12879 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12880 C->getLocation(), 12881 Unexpanded, 12882 ShouldExpand, RetainExpansion, 12883 NumExpansions)) { 12884 Invalid = true; 12885 continue; 12886 } 12887 12888 if (ShouldExpand) { 12889 // The transform has determined that we should perform an expansion; 12890 // transform and capture each of the arguments. 12891 // expansion of the pattern. Do so. 12892 VarDecl *Pack = C->getCapturedVar(); 12893 for (unsigned I = 0; I != *NumExpansions; ++I) { 12894 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12895 VarDecl *CapturedVar 12896 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12897 Pack)); 12898 if (!CapturedVar) { 12899 Invalid = true; 12900 continue; 12901 } 12902 12903 // Capture the transformed variable. 12904 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12905 } 12906 12907 // FIXME: Retain a pack expansion if RetainExpansion is true. 12908 12909 continue; 12910 } 12911 12912 EllipsisLoc = C->getEllipsisLoc(); 12913 } 12914 12915 // Transform the captured variable. 12916 VarDecl *CapturedVar 12917 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12918 C->getCapturedVar())); 12919 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12920 Invalid = true; 12921 continue; 12922 } 12923 12924 // Capture the transformed variable. 12925 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12926 EllipsisLoc); 12927 } 12928 getSema().finishLambdaExplicitCaptures(LSI); 12929 12930 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12931 // evaluation context even if we're not transforming the function body. 12932 getSema().PushExpressionEvaluationContext( 12933 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12934 12935 // Instantiate the body of the lambda expression. 12936 StmtResult Body = 12937 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12938 12939 // ActOnLambda* will pop the function scope for us. 12940 FuncScopeCleanup.disable(); 12941 12942 if (Body.isInvalid()) { 12943 SavedContext.pop(); 12944 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12945 /*IsInstantiation=*/true); 12946 return ExprError(); 12947 } 12948 12949 // Copy the LSI before ActOnFinishFunctionBody removes it. 12950 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12951 // the call operator. 12952 auto LSICopy = *LSI; 12953 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12954 /*IsInstantiation*/ true); 12955 SavedContext.pop(); 12956 12957 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12958 &LSICopy); 12959 } 12960 12961 template<typename Derived> 12962 StmtResult 12963 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12964 return TransformStmt(S); 12965 } 12966 12967 template<typename Derived> 12968 StmtResult 12969 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12970 // Transform captures. 12971 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12972 CEnd = E->capture_end(); 12973 C != CEnd; ++C) { 12974 // When we hit the first implicit capture, tell Sema that we've finished 12975 // the list of explicit captures. 12976 if (!C->isImplicit()) 12977 continue; 12978 12979 // Capturing 'this' is trivial. 12980 if (C->capturesThis()) { 12981 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12982 /*BuildAndDiagnose*/ true, nullptr, 12983 C->getCaptureKind() == LCK_StarThis); 12984 continue; 12985 } 12986 // Captured expression will be recaptured during captured variables 12987 // rebuilding. 12988 if (C->capturesVLAType()) 12989 continue; 12990 12991 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12992 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12993 12994 // Transform the captured variable. 12995 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12996 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12997 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12998 return StmtError(); 12999 13000 // Capture the transformed variable. 13001 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13002 } 13003 13004 return S; 13005 } 13006 13007 template<typename Derived> 13008 ExprResult 13009 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13010 CXXUnresolvedConstructExpr *E) { 13011 TypeSourceInfo *T = 13012 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13013 if (!T) 13014 return ExprError(); 13015 13016 bool ArgumentChanged = false; 13017 SmallVector<Expr*, 8> Args; 13018 Args.reserve(E->getNumArgs()); 13019 { 13020 EnterExpressionEvaluationContext Context( 13021 getSema(), EnterExpressionEvaluationContext::InitList, 13022 E->isListInitialization()); 13023 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13024 &ArgumentChanged)) 13025 return ExprError(); 13026 } 13027 13028 if (!getDerived().AlwaysRebuild() && 13029 T == E->getTypeSourceInfo() && 13030 !ArgumentChanged) 13031 return E; 13032 13033 // FIXME: we're faking the locations of the commas 13034 return getDerived().RebuildCXXUnresolvedConstructExpr( 13035 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13036 } 13037 13038 template<typename Derived> 13039 ExprResult 13040 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13041 CXXDependentScopeMemberExpr *E) { 13042 // Transform the base of the expression. 13043 ExprResult Base((Expr*) nullptr); 13044 Expr *OldBase; 13045 QualType BaseType; 13046 QualType ObjectType; 13047 if (!E->isImplicitAccess()) { 13048 OldBase = E->getBase(); 13049 Base = getDerived().TransformExpr(OldBase); 13050 if (Base.isInvalid()) 13051 return ExprError(); 13052 13053 // Start the member reference and compute the object's type. 13054 ParsedType ObjectTy; 13055 bool MayBePseudoDestructor = false; 13056 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13057 E->getOperatorLoc(), 13058 E->isArrow()? tok::arrow : tok::period, 13059 ObjectTy, 13060 MayBePseudoDestructor); 13061 if (Base.isInvalid()) 13062 return ExprError(); 13063 13064 ObjectType = ObjectTy.get(); 13065 BaseType = ((Expr*) Base.get())->getType(); 13066 } else { 13067 OldBase = nullptr; 13068 BaseType = getDerived().TransformType(E->getBaseType()); 13069 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13070 } 13071 13072 // Transform the first part of the nested-name-specifier that qualifies 13073 // the member name. 13074 NamedDecl *FirstQualifierInScope 13075 = getDerived().TransformFirstQualifierInScope( 13076 E->getFirstQualifierFoundInScope(), 13077 E->getQualifierLoc().getBeginLoc()); 13078 13079 NestedNameSpecifierLoc QualifierLoc; 13080 if (E->getQualifier()) { 13081 QualifierLoc 13082 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13083 ObjectType, 13084 FirstQualifierInScope); 13085 if (!QualifierLoc) 13086 return ExprError(); 13087 } 13088 13089 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13090 13091 // TODO: If this is a conversion-function-id, verify that the 13092 // destination type name (if present) resolves the same way after 13093 // instantiation as it did in the local scope. 13094 13095 DeclarationNameInfo NameInfo 13096 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13097 if (!NameInfo.getName()) 13098 return ExprError(); 13099 13100 if (!E->hasExplicitTemplateArgs()) { 13101 // This is a reference to a member without an explicitly-specified 13102 // template argument list. Optimize for this common case. 13103 if (!getDerived().AlwaysRebuild() && 13104 Base.get() == OldBase && 13105 BaseType == E->getBaseType() && 13106 QualifierLoc == E->getQualifierLoc() && 13107 NameInfo.getName() == E->getMember() && 13108 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13109 return E; 13110 13111 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13112 BaseType, 13113 E->isArrow(), 13114 E->getOperatorLoc(), 13115 QualifierLoc, 13116 TemplateKWLoc, 13117 FirstQualifierInScope, 13118 NameInfo, 13119 /*TemplateArgs*/nullptr); 13120 } 13121 13122 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13123 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13124 E->getNumTemplateArgs(), 13125 TransArgs)) 13126 return ExprError(); 13127 13128 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13129 BaseType, 13130 E->isArrow(), 13131 E->getOperatorLoc(), 13132 QualifierLoc, 13133 TemplateKWLoc, 13134 FirstQualifierInScope, 13135 NameInfo, 13136 &TransArgs); 13137 } 13138 13139 template<typename Derived> 13140 ExprResult 13141 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 13142 // Transform the base of the expression. 13143 ExprResult Base((Expr*) nullptr); 13144 QualType BaseType; 13145 if (!Old->isImplicitAccess()) { 13146 Base = getDerived().TransformExpr(Old->getBase()); 13147 if (Base.isInvalid()) 13148 return ExprError(); 13149 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 13150 Old->isArrow()); 13151 if (Base.isInvalid()) 13152 return ExprError(); 13153 BaseType = Base.get()->getType(); 13154 } else { 13155 BaseType = getDerived().TransformType(Old->getBaseType()); 13156 } 13157 13158 NestedNameSpecifierLoc QualifierLoc; 13159 if (Old->getQualifierLoc()) { 13160 QualifierLoc 13161 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13162 if (!QualifierLoc) 13163 return ExprError(); 13164 } 13165 13166 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13167 13168 LookupResult R(SemaRef, Old->getMemberNameInfo(), 13169 Sema::LookupOrdinaryName); 13170 13171 // Transform the declaration set. 13172 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 13173 return ExprError(); 13174 13175 // Determine the naming class. 13176 if (Old->getNamingClass()) { 13177 CXXRecordDecl *NamingClass 13178 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 13179 Old->getMemberLoc(), 13180 Old->getNamingClass())); 13181 if (!NamingClass) 13182 return ExprError(); 13183 13184 R.setNamingClass(NamingClass); 13185 } 13186 13187 TemplateArgumentListInfo TransArgs; 13188 if (Old->hasExplicitTemplateArgs()) { 13189 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13190 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13191 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 13192 Old->getNumTemplateArgs(), 13193 TransArgs)) 13194 return ExprError(); 13195 } 13196 13197 // FIXME: to do this check properly, we will need to preserve the 13198 // first-qualifier-in-scope here, just in case we had a dependent 13199 // base (and therefore couldn't do the check) and a 13200 // nested-name-qualifier (and therefore could do the lookup). 13201 NamedDecl *FirstQualifierInScope = nullptr; 13202 13203 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 13204 BaseType, 13205 Old->getOperatorLoc(), 13206 Old->isArrow(), 13207 QualifierLoc, 13208 TemplateKWLoc, 13209 FirstQualifierInScope, 13210 R, 13211 (Old->hasExplicitTemplateArgs() 13212 ? &TransArgs : nullptr)); 13213 } 13214 13215 template<typename Derived> 13216 ExprResult 13217 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13218 EnterExpressionEvaluationContext Unevaluated( 13219 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13220 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13221 if (SubExpr.isInvalid()) 13222 return ExprError(); 13223 13224 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13225 return E; 13226 13227 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13228 } 13229 13230 template<typename Derived> 13231 ExprResult 13232 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13233 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13234 if (Pattern.isInvalid()) 13235 return ExprError(); 13236 13237 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13238 return E; 13239 13240 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13241 E->getNumExpansions()); 13242 } 13243 13244 template<typename Derived> 13245 ExprResult 13246 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13247 // If E is not value-dependent, then nothing will change when we transform it. 13248 // Note: This is an instantiation-centric view. 13249 if (!E->isValueDependent()) 13250 return E; 13251 13252 EnterExpressionEvaluationContext Unevaluated( 13253 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13254 13255 ArrayRef<TemplateArgument> PackArgs; 13256 TemplateArgument ArgStorage; 13257 13258 // Find the argument list to transform. 13259 if (E->isPartiallySubstituted()) { 13260 PackArgs = E->getPartialArguments(); 13261 } else if (E->isValueDependent()) { 13262 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13263 bool ShouldExpand = false; 13264 bool RetainExpansion = false; 13265 Optional<unsigned> NumExpansions; 13266 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13267 Unexpanded, 13268 ShouldExpand, RetainExpansion, 13269 NumExpansions)) 13270 return ExprError(); 13271 13272 // If we need to expand the pack, build a template argument from it and 13273 // expand that. 13274 if (ShouldExpand) { 13275 auto *Pack = E->getPack(); 13276 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13277 ArgStorage = getSema().Context.getPackExpansionType( 13278 getSema().Context.getTypeDeclType(TTPD), None); 13279 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13280 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13281 } else { 13282 auto *VD = cast<ValueDecl>(Pack); 13283 ExprResult DRE = getSema().BuildDeclRefExpr( 13284 VD, VD->getType().getNonLValueExprType(getSema().Context), 13285 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 13286 E->getPackLoc()); 13287 if (DRE.isInvalid()) 13288 return ExprError(); 13289 ArgStorage = new (getSema().Context) PackExpansionExpr( 13290 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13291 } 13292 PackArgs = ArgStorage; 13293 } 13294 } 13295 13296 // If we're not expanding the pack, just transform the decl. 13297 if (!PackArgs.size()) { 13298 auto *Pack = cast_or_null<NamedDecl>( 13299 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13300 if (!Pack) 13301 return ExprError(); 13302 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13303 E->getPackLoc(), 13304 E->getRParenLoc(), None, None); 13305 } 13306 13307 // Try to compute the result without performing a partial substitution. 13308 Optional<unsigned> Result = 0; 13309 for (const TemplateArgument &Arg : PackArgs) { 13310 if (!Arg.isPackExpansion()) { 13311 Result = *Result + 1; 13312 continue; 13313 } 13314 13315 TemplateArgumentLoc ArgLoc; 13316 InventTemplateArgumentLoc(Arg, ArgLoc); 13317 13318 // Find the pattern of the pack expansion. 13319 SourceLocation Ellipsis; 13320 Optional<unsigned> OrigNumExpansions; 13321 TemplateArgumentLoc Pattern = 13322 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13323 OrigNumExpansions); 13324 13325 // Substitute under the pack expansion. Do not expand the pack (yet). 13326 TemplateArgumentLoc OutPattern; 13327 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13328 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13329 /*Uneval*/ true)) 13330 return true; 13331 13332 // See if we can determine the number of arguments from the result. 13333 Optional<unsigned> NumExpansions = 13334 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13335 if (!NumExpansions) { 13336 // No: we must be in an alias template expansion, and we're going to need 13337 // to actually expand the packs. 13338 Result = None; 13339 break; 13340 } 13341 13342 Result = *Result + *NumExpansions; 13343 } 13344 13345 // Common case: we could determine the number of expansions without 13346 // substituting. 13347 if (Result) 13348 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13349 E->getPackLoc(), 13350 E->getRParenLoc(), *Result, None); 13351 13352 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13353 E->getPackLoc()); 13354 { 13355 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13356 typedef TemplateArgumentLocInventIterator< 13357 Derived, const TemplateArgument*> PackLocIterator; 13358 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13359 PackLocIterator(*this, PackArgs.end()), 13360 TransformedPackArgs, /*Uneval*/true)) 13361 return ExprError(); 13362 } 13363 13364 // Check whether we managed to fully-expand the pack. 13365 // FIXME: Is it possible for us to do so and not hit the early exit path? 13366 SmallVector<TemplateArgument, 8> Args; 13367 bool PartialSubstitution = false; 13368 for (auto &Loc : TransformedPackArgs.arguments()) { 13369 Args.push_back(Loc.getArgument()); 13370 if (Loc.getArgument().isPackExpansion()) 13371 PartialSubstitution = true; 13372 } 13373 13374 if (PartialSubstitution) 13375 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13376 E->getPackLoc(), 13377 E->getRParenLoc(), None, Args); 13378 13379 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13380 E->getPackLoc(), E->getRParenLoc(), 13381 Args.size(), None); 13382 } 13383 13384 template<typename Derived> 13385 ExprResult 13386 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13387 SubstNonTypeTemplateParmPackExpr *E) { 13388 // Default behavior is to do nothing with this transformation. 13389 return E; 13390 } 13391 13392 template<typename Derived> 13393 ExprResult 13394 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13395 SubstNonTypeTemplateParmExpr *E) { 13396 // Default behavior is to do nothing with this transformation. 13397 return E; 13398 } 13399 13400 template<typename Derived> 13401 ExprResult 13402 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13403 // Default behavior is to do nothing with this transformation. 13404 return E; 13405 } 13406 13407 template<typename Derived> 13408 ExprResult 13409 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13410 MaterializeTemporaryExpr *E) { 13411 return getDerived().TransformExpr(E->getSubExpr()); 13412 } 13413 13414 template<typename Derived> 13415 ExprResult 13416 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13417 UnresolvedLookupExpr *Callee = nullptr; 13418 if (Expr *OldCallee = E->getCallee()) { 13419 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13420 if (CalleeResult.isInvalid()) 13421 return ExprError(); 13422 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13423 } 13424 13425 Expr *Pattern = E->getPattern(); 13426 13427 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13428 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13429 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13430 13431 // Determine whether the set of unexpanded parameter packs can and should 13432 // be expanded. 13433 bool Expand = true; 13434 bool RetainExpansion = false; 13435 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13436 NumExpansions = OrigNumExpansions; 13437 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13438 Pattern->getSourceRange(), 13439 Unexpanded, 13440 Expand, RetainExpansion, 13441 NumExpansions)) 13442 return true; 13443 13444 if (!Expand) { 13445 // Do not expand any packs here, just transform and rebuild a fold 13446 // expression. 13447 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13448 13449 ExprResult LHS = 13450 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13451 if (LHS.isInvalid()) 13452 return true; 13453 13454 ExprResult RHS = 13455 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13456 if (RHS.isInvalid()) 13457 return true; 13458 13459 if (!getDerived().AlwaysRebuild() && 13460 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13461 return E; 13462 13463 return getDerived().RebuildCXXFoldExpr( 13464 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13465 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13466 } 13467 13468 // Formally a fold expression expands to nested parenthesized expressions. 13469 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13470 // them. 13471 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13472 SemaRef.Diag(E->getEllipsisLoc(), 13473 clang::diag::err_fold_expression_limit_exceeded) 13474 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13475 << E->getSourceRange(); 13476 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13477 return ExprError(); 13478 } 13479 13480 // The transform has determined that we should perform an elementwise 13481 // expansion of the pattern. Do so. 13482 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13483 if (Result.isInvalid()) 13484 return true; 13485 bool LeftFold = E->isLeftFold(); 13486 13487 // If we're retaining an expansion for a right fold, it is the innermost 13488 // component and takes the init (if any). 13489 if (!LeftFold && RetainExpansion) { 13490 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13491 13492 ExprResult Out = getDerived().TransformExpr(Pattern); 13493 if (Out.isInvalid()) 13494 return true; 13495 13496 Result = getDerived().RebuildCXXFoldExpr( 13497 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13498 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13499 if (Result.isInvalid()) 13500 return true; 13501 } 13502 13503 for (unsigned I = 0; I != *NumExpansions; ++I) { 13504 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13505 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13506 ExprResult Out = getDerived().TransformExpr(Pattern); 13507 if (Out.isInvalid()) 13508 return true; 13509 13510 if (Out.get()->containsUnexpandedParameterPack()) { 13511 // We still have a pack; retain a pack expansion for this slice. 13512 Result = getDerived().RebuildCXXFoldExpr( 13513 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13514 E->getOperator(), E->getEllipsisLoc(), 13515 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13516 OrigNumExpansions); 13517 } else if (Result.isUsable()) { 13518 // We've got down to a single element; build a binary operator. 13519 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13520 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13521 if (Callee) 13522 Result = getDerived().RebuildCXXOperatorCallExpr( 13523 BinaryOperator::getOverloadedOperator(E->getOperator()), 13524 E->getEllipsisLoc(), Callee, LHS, RHS); 13525 else 13526 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13527 E->getOperator(), LHS, RHS); 13528 } else 13529 Result = Out; 13530 13531 if (Result.isInvalid()) 13532 return true; 13533 } 13534 13535 // If we're retaining an expansion for a left fold, it is the outermost 13536 // component and takes the complete expansion so far as its init (if any). 13537 if (LeftFold && RetainExpansion) { 13538 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13539 13540 ExprResult Out = getDerived().TransformExpr(Pattern); 13541 if (Out.isInvalid()) 13542 return true; 13543 13544 Result = getDerived().RebuildCXXFoldExpr( 13545 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13546 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13547 if (Result.isInvalid()) 13548 return true; 13549 } 13550 13551 // If we had no init and an empty pack, and we're not retaining an expansion, 13552 // then produce a fallback value or error. 13553 if (Result.isUnset()) 13554 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13555 E->getOperator()); 13556 13557 return Result; 13558 } 13559 13560 template<typename Derived> 13561 ExprResult 13562 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13563 CXXStdInitializerListExpr *E) { 13564 return getDerived().TransformExpr(E->getSubExpr()); 13565 } 13566 13567 template<typename Derived> 13568 ExprResult 13569 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13570 return SemaRef.MaybeBindToTemporary(E); 13571 } 13572 13573 template<typename Derived> 13574 ExprResult 13575 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13576 return E; 13577 } 13578 13579 template<typename Derived> 13580 ExprResult 13581 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13582 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13583 if (SubExpr.isInvalid()) 13584 return ExprError(); 13585 13586 if (!getDerived().AlwaysRebuild() && 13587 SubExpr.get() == E->getSubExpr()) 13588 return E; 13589 13590 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13591 } 13592 13593 template<typename Derived> 13594 ExprResult 13595 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13596 // Transform each of the elements. 13597 SmallVector<Expr *, 8> Elements; 13598 bool ArgChanged = false; 13599 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13600 /*IsCall=*/false, Elements, &ArgChanged)) 13601 return ExprError(); 13602 13603 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13604 return SemaRef.MaybeBindToTemporary(E); 13605 13606 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13607 Elements.data(), 13608 Elements.size()); 13609 } 13610 13611 template<typename Derived> 13612 ExprResult 13613 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13614 ObjCDictionaryLiteral *E) { 13615 // Transform each of the elements. 13616 SmallVector<ObjCDictionaryElement, 8> Elements; 13617 bool ArgChanged = false; 13618 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13619 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13620 13621 if (OrigElement.isPackExpansion()) { 13622 // This key/value element is a pack expansion. 13623 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13624 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13625 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13626 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13627 13628 // Determine whether the set of unexpanded parameter packs can 13629 // and should be expanded. 13630 bool Expand = true; 13631 bool RetainExpansion = false; 13632 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13633 Optional<unsigned> NumExpansions = OrigNumExpansions; 13634 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13635 OrigElement.Value->getEndLoc()); 13636 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13637 PatternRange, Unexpanded, Expand, 13638 RetainExpansion, NumExpansions)) 13639 return ExprError(); 13640 13641 if (!Expand) { 13642 // The transform has determined that we should perform a simple 13643 // transformation on the pack expansion, producing another pack 13644 // expansion. 13645 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13646 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13647 if (Key.isInvalid()) 13648 return ExprError(); 13649 13650 if (Key.get() != OrigElement.Key) 13651 ArgChanged = true; 13652 13653 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13654 if (Value.isInvalid()) 13655 return ExprError(); 13656 13657 if (Value.get() != OrigElement.Value) 13658 ArgChanged = true; 13659 13660 ObjCDictionaryElement Expansion = { 13661 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13662 }; 13663 Elements.push_back(Expansion); 13664 continue; 13665 } 13666 13667 // Record right away that the argument was changed. This needs 13668 // to happen even if the array expands to nothing. 13669 ArgChanged = true; 13670 13671 // The transform has determined that we should perform an elementwise 13672 // expansion of the pattern. Do so. 13673 for (unsigned I = 0; I != *NumExpansions; ++I) { 13674 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13675 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13676 if (Key.isInvalid()) 13677 return ExprError(); 13678 13679 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13680 if (Value.isInvalid()) 13681 return ExprError(); 13682 13683 ObjCDictionaryElement Element = { 13684 Key.get(), Value.get(), SourceLocation(), NumExpansions 13685 }; 13686 13687 // If any unexpanded parameter packs remain, we still have a 13688 // pack expansion. 13689 // FIXME: Can this really happen? 13690 if (Key.get()->containsUnexpandedParameterPack() || 13691 Value.get()->containsUnexpandedParameterPack()) 13692 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13693 13694 Elements.push_back(Element); 13695 } 13696 13697 // FIXME: Retain a pack expansion if RetainExpansion is true. 13698 13699 // We've finished with this pack expansion. 13700 continue; 13701 } 13702 13703 // Transform and check key. 13704 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13705 if (Key.isInvalid()) 13706 return ExprError(); 13707 13708 if (Key.get() != OrigElement.Key) 13709 ArgChanged = true; 13710 13711 // Transform and check value. 13712 ExprResult Value 13713 = getDerived().TransformExpr(OrigElement.Value); 13714 if (Value.isInvalid()) 13715 return ExprError(); 13716 13717 if (Value.get() != OrigElement.Value) 13718 ArgChanged = true; 13719 13720 ObjCDictionaryElement Element = { 13721 Key.get(), Value.get(), SourceLocation(), None 13722 }; 13723 Elements.push_back(Element); 13724 } 13725 13726 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13727 return SemaRef.MaybeBindToTemporary(E); 13728 13729 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13730 Elements); 13731 } 13732 13733 template<typename Derived> 13734 ExprResult 13735 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13736 TypeSourceInfo *EncodedTypeInfo 13737 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13738 if (!EncodedTypeInfo) 13739 return ExprError(); 13740 13741 if (!getDerived().AlwaysRebuild() && 13742 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13743 return E; 13744 13745 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13746 EncodedTypeInfo, 13747 E->getRParenLoc()); 13748 } 13749 13750 template<typename Derived> 13751 ExprResult TreeTransform<Derived>:: 13752 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13753 // This is a kind of implicit conversion, and it needs to get dropped 13754 // and recomputed for the same general reasons that ImplicitCastExprs 13755 // do, as well a more specific one: this expression is only valid when 13756 // it appears *immediately* as an argument expression. 13757 return getDerived().TransformExpr(E->getSubExpr()); 13758 } 13759 13760 template<typename Derived> 13761 ExprResult TreeTransform<Derived>:: 13762 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13763 TypeSourceInfo *TSInfo 13764 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13765 if (!TSInfo) 13766 return ExprError(); 13767 13768 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13769 if (Result.isInvalid()) 13770 return ExprError(); 13771 13772 if (!getDerived().AlwaysRebuild() && 13773 TSInfo == E->getTypeInfoAsWritten() && 13774 Result.get() == E->getSubExpr()) 13775 return E; 13776 13777 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13778 E->getBridgeKeywordLoc(), TSInfo, 13779 Result.get()); 13780 } 13781 13782 template <typename Derived> 13783 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13784 ObjCAvailabilityCheckExpr *E) { 13785 return E; 13786 } 13787 13788 template<typename Derived> 13789 ExprResult 13790 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13791 // Transform arguments. 13792 bool ArgChanged = false; 13793 SmallVector<Expr*, 8> Args; 13794 Args.reserve(E->getNumArgs()); 13795 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13796 &ArgChanged)) 13797 return ExprError(); 13798 13799 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13800 // Class message: transform the receiver type. 13801 TypeSourceInfo *ReceiverTypeInfo 13802 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13803 if (!ReceiverTypeInfo) 13804 return ExprError(); 13805 13806 // If nothing changed, just retain the existing message send. 13807 if (!getDerived().AlwaysRebuild() && 13808 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13809 return SemaRef.MaybeBindToTemporary(E); 13810 13811 // Build a new class message send. 13812 SmallVector<SourceLocation, 16> SelLocs; 13813 E->getSelectorLocs(SelLocs); 13814 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13815 E->getSelector(), 13816 SelLocs, 13817 E->getMethodDecl(), 13818 E->getLeftLoc(), 13819 Args, 13820 E->getRightLoc()); 13821 } 13822 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13823 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13824 if (!E->getMethodDecl()) 13825 return ExprError(); 13826 13827 // Build a new class message send to 'super'. 13828 SmallVector<SourceLocation, 16> SelLocs; 13829 E->getSelectorLocs(SelLocs); 13830 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13831 E->getSelector(), 13832 SelLocs, 13833 E->getReceiverType(), 13834 E->getMethodDecl(), 13835 E->getLeftLoc(), 13836 Args, 13837 E->getRightLoc()); 13838 } 13839 13840 // Instance message: transform the receiver 13841 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13842 "Only class and instance messages may be instantiated"); 13843 ExprResult Receiver 13844 = getDerived().TransformExpr(E->getInstanceReceiver()); 13845 if (Receiver.isInvalid()) 13846 return ExprError(); 13847 13848 // If nothing changed, just retain the existing message send. 13849 if (!getDerived().AlwaysRebuild() && 13850 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13851 return SemaRef.MaybeBindToTemporary(E); 13852 13853 // Build a new instance message send. 13854 SmallVector<SourceLocation, 16> SelLocs; 13855 E->getSelectorLocs(SelLocs); 13856 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13857 E->getSelector(), 13858 SelLocs, 13859 E->getMethodDecl(), 13860 E->getLeftLoc(), 13861 Args, 13862 E->getRightLoc()); 13863 } 13864 13865 template<typename Derived> 13866 ExprResult 13867 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13868 return E; 13869 } 13870 13871 template<typename Derived> 13872 ExprResult 13873 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13874 return E; 13875 } 13876 13877 template<typename Derived> 13878 ExprResult 13879 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 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 ivar; 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 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13893 E->getLocation(), 13894 E->isArrow(), E->isFreeIvar()); 13895 } 13896 13897 template<typename Derived> 13898 ExprResult 13899 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13900 // 'super' and types never change. Property never changes. Just 13901 // retain the existing expression. 13902 if (!E->isObjectReceiver()) 13903 return E; 13904 13905 // Transform the base expression. 13906 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13907 if (Base.isInvalid()) 13908 return ExprError(); 13909 13910 // We don't need to transform the property; it will never change. 13911 13912 // If nothing changed, just retain the existing expression. 13913 if (!getDerived().AlwaysRebuild() && 13914 Base.get() == E->getBase()) 13915 return E; 13916 13917 if (E->isExplicitProperty()) 13918 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13919 E->getExplicitProperty(), 13920 E->getLocation()); 13921 13922 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13923 SemaRef.Context.PseudoObjectTy, 13924 E->getImplicitPropertyGetter(), 13925 E->getImplicitPropertySetter(), 13926 E->getLocation()); 13927 } 13928 13929 template<typename Derived> 13930 ExprResult 13931 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13932 // Transform the base expression. 13933 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13934 if (Base.isInvalid()) 13935 return ExprError(); 13936 13937 // Transform the key expression. 13938 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13939 if (Key.isInvalid()) 13940 return ExprError(); 13941 13942 // If nothing changed, just retain the existing expression. 13943 if (!getDerived().AlwaysRebuild() && 13944 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13945 return E; 13946 13947 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13948 Base.get(), Key.get(), 13949 E->getAtIndexMethodDecl(), 13950 E->setAtIndexMethodDecl()); 13951 } 13952 13953 template<typename Derived> 13954 ExprResult 13955 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13956 // Transform the base expression. 13957 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13958 if (Base.isInvalid()) 13959 return ExprError(); 13960 13961 // If nothing changed, just retain the existing expression. 13962 if (!getDerived().AlwaysRebuild() && 13963 Base.get() == E->getBase()) 13964 return E; 13965 13966 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13967 E->getOpLoc(), 13968 E->isArrow()); 13969 } 13970 13971 template<typename Derived> 13972 ExprResult 13973 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13974 bool ArgumentChanged = false; 13975 SmallVector<Expr*, 8> SubExprs; 13976 SubExprs.reserve(E->getNumSubExprs()); 13977 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13978 SubExprs, &ArgumentChanged)) 13979 return ExprError(); 13980 13981 if (!getDerived().AlwaysRebuild() && 13982 !ArgumentChanged) 13983 return E; 13984 13985 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13986 SubExprs, 13987 E->getRParenLoc()); 13988 } 13989 13990 template<typename Derived> 13991 ExprResult 13992 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13993 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13994 if (SrcExpr.isInvalid()) 13995 return ExprError(); 13996 13997 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13998 if (!Type) 13999 return ExprError(); 14000 14001 if (!getDerived().AlwaysRebuild() && 14002 Type == E->getTypeSourceInfo() && 14003 SrcExpr.get() == E->getSrcExpr()) 14004 return E; 14005 14006 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14007 SrcExpr.get(), Type, 14008 E->getRParenLoc()); 14009 } 14010 14011 template<typename Derived> 14012 ExprResult 14013 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14014 BlockDecl *oldBlock = E->getBlockDecl(); 14015 14016 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14017 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14018 14019 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14020 blockScope->TheDecl->setBlockMissingReturnType( 14021 oldBlock->blockMissingReturnType()); 14022 14023 SmallVector<ParmVarDecl*, 4> params; 14024 SmallVector<QualType, 4> paramTypes; 14025 14026 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14027 14028 // Parameter substitution. 14029 Sema::ExtParameterInfoBuilder extParamInfos; 14030 if (getDerived().TransformFunctionTypeParams( 14031 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14032 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14033 extParamInfos)) { 14034 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14035 return ExprError(); 14036 } 14037 14038 QualType exprResultType = 14039 getDerived().TransformType(exprFunctionType->getReturnType()); 14040 14041 auto epi = exprFunctionType->getExtProtoInfo(); 14042 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14043 14044 QualType functionType = 14045 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14046 blockScope->FunctionType = functionType; 14047 14048 // Set the parameters on the block decl. 14049 if (!params.empty()) 14050 blockScope->TheDecl->setParams(params); 14051 14052 if (!oldBlock->blockMissingReturnType()) { 14053 blockScope->HasImplicitReturnType = false; 14054 blockScope->ReturnType = exprResultType; 14055 } 14056 14057 // Transform the body 14058 StmtResult body = getDerived().TransformStmt(E->getBody()); 14059 if (body.isInvalid()) { 14060 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14061 return ExprError(); 14062 } 14063 14064 #ifndef NDEBUG 14065 // In builds with assertions, make sure that we captured everything we 14066 // captured before. 14067 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14068 for (const auto &I : oldBlock->captures()) { 14069 VarDecl *oldCapture = I.getVariable(); 14070 14071 // Ignore parameter packs. 14072 if (oldCapture->isParameterPack()) 14073 continue; 14074 14075 VarDecl *newCapture = 14076 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14077 oldCapture)); 14078 assert(blockScope->CaptureMap.count(newCapture)); 14079 } 14080 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14081 } 14082 #endif 14083 14084 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14085 /*Scope=*/nullptr); 14086 } 14087 14088 template<typename Derived> 14089 ExprResult 14090 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14091 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14092 if (SrcExpr.isInvalid()) 14093 return ExprError(); 14094 14095 QualType Type = getDerived().TransformType(E->getType()); 14096 14097 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14098 E->getRParenLoc()); 14099 } 14100 14101 template<typename Derived> 14102 ExprResult 14103 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14104 bool ArgumentChanged = false; 14105 SmallVector<Expr*, 8> SubExprs; 14106 SubExprs.reserve(E->getNumSubExprs()); 14107 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14108 SubExprs, &ArgumentChanged)) 14109 return ExprError(); 14110 14111 if (!getDerived().AlwaysRebuild() && 14112 !ArgumentChanged) 14113 return E; 14114 14115 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14116 E->getOp(), E->getRParenLoc()); 14117 } 14118 14119 //===----------------------------------------------------------------------===// 14120 // Type reconstruction 14121 //===----------------------------------------------------------------------===// 14122 14123 template<typename Derived> 14124 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14125 SourceLocation Star) { 14126 return SemaRef.BuildPointerType(PointeeType, Star, 14127 getDerived().getBaseEntity()); 14128 } 14129 14130 template<typename Derived> 14131 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14132 SourceLocation Star) { 14133 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14134 getDerived().getBaseEntity()); 14135 } 14136 14137 template<typename Derived> 14138 QualType 14139 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14140 bool WrittenAsLValue, 14141 SourceLocation Sigil) { 14142 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14143 Sigil, getDerived().getBaseEntity()); 14144 } 14145 14146 template<typename Derived> 14147 QualType 14148 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14149 QualType ClassType, 14150 SourceLocation Sigil) { 14151 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14152 getDerived().getBaseEntity()); 14153 } 14154 14155 template<typename Derived> 14156 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14157 const ObjCTypeParamDecl *Decl, 14158 SourceLocation ProtocolLAngleLoc, 14159 ArrayRef<ObjCProtocolDecl *> Protocols, 14160 ArrayRef<SourceLocation> ProtocolLocs, 14161 SourceLocation ProtocolRAngleLoc) { 14162 return SemaRef.BuildObjCTypeParamType(Decl, 14163 ProtocolLAngleLoc, Protocols, 14164 ProtocolLocs, ProtocolRAngleLoc, 14165 /*FailOnError=*/true); 14166 } 14167 14168 template<typename Derived> 14169 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14170 QualType BaseType, 14171 SourceLocation Loc, 14172 SourceLocation TypeArgsLAngleLoc, 14173 ArrayRef<TypeSourceInfo *> TypeArgs, 14174 SourceLocation TypeArgsRAngleLoc, 14175 SourceLocation ProtocolLAngleLoc, 14176 ArrayRef<ObjCProtocolDecl *> Protocols, 14177 ArrayRef<SourceLocation> ProtocolLocs, 14178 SourceLocation ProtocolRAngleLoc) { 14179 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14180 TypeArgs, TypeArgsRAngleLoc, 14181 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14182 ProtocolRAngleLoc, 14183 /*FailOnError=*/true); 14184 } 14185 14186 template<typename Derived> 14187 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14188 QualType PointeeType, 14189 SourceLocation Star) { 14190 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14191 } 14192 14193 template<typename Derived> 14194 QualType 14195 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14196 ArrayType::ArraySizeModifier SizeMod, 14197 const llvm::APInt *Size, 14198 Expr *SizeExpr, 14199 unsigned IndexTypeQuals, 14200 SourceRange BracketsRange) { 14201 if (SizeExpr || !Size) 14202 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14203 IndexTypeQuals, BracketsRange, 14204 getDerived().getBaseEntity()); 14205 14206 QualType Types[] = { 14207 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14208 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14209 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14210 }; 14211 const unsigned NumTypes = llvm::array_lengthof(Types); 14212 QualType SizeType; 14213 for (unsigned I = 0; I != NumTypes; ++I) 14214 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14215 SizeType = Types[I]; 14216 break; 14217 } 14218 14219 // Note that we can return a VariableArrayType here in the case where 14220 // the element type was a dependent VariableArrayType. 14221 IntegerLiteral *ArraySize 14222 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14223 /*FIXME*/BracketsRange.getBegin()); 14224 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14225 IndexTypeQuals, BracketsRange, 14226 getDerived().getBaseEntity()); 14227 } 14228 14229 template<typename Derived> 14230 QualType 14231 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14232 ArrayType::ArraySizeModifier SizeMod, 14233 const llvm::APInt &Size, 14234 Expr *SizeExpr, 14235 unsigned IndexTypeQuals, 14236 SourceRange BracketsRange) { 14237 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14238 IndexTypeQuals, BracketsRange); 14239 } 14240 14241 template<typename Derived> 14242 QualType 14243 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14244 ArrayType::ArraySizeModifier SizeMod, 14245 unsigned IndexTypeQuals, 14246 SourceRange BracketsRange) { 14247 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14248 IndexTypeQuals, BracketsRange); 14249 } 14250 14251 template<typename Derived> 14252 QualType 14253 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14254 ArrayType::ArraySizeModifier SizeMod, 14255 Expr *SizeExpr, 14256 unsigned IndexTypeQuals, 14257 SourceRange BracketsRange) { 14258 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14259 SizeExpr, 14260 IndexTypeQuals, BracketsRange); 14261 } 14262 14263 template<typename Derived> 14264 QualType 14265 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14266 ArrayType::ArraySizeModifier SizeMod, 14267 Expr *SizeExpr, 14268 unsigned IndexTypeQuals, 14269 SourceRange BracketsRange) { 14270 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14271 SizeExpr, 14272 IndexTypeQuals, BracketsRange); 14273 } 14274 14275 template <typename Derived> 14276 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14277 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14278 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14279 AttributeLoc); 14280 } 14281 14282 template <typename Derived> 14283 QualType 14284 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14285 unsigned NumElements, 14286 VectorType::VectorKind VecKind) { 14287 // FIXME: semantic checking! 14288 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14289 } 14290 14291 template <typename Derived> 14292 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14293 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14294 VectorType::VectorKind VecKind) { 14295 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14296 } 14297 14298 template<typename Derived> 14299 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14300 unsigned NumElements, 14301 SourceLocation AttributeLoc) { 14302 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14303 NumElements, true); 14304 IntegerLiteral *VectorSize 14305 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14306 AttributeLoc); 14307 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14308 } 14309 14310 template<typename Derived> 14311 QualType 14312 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14313 Expr *SizeExpr, 14314 SourceLocation AttributeLoc) { 14315 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14316 } 14317 14318 template <typename Derived> 14319 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14320 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14321 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14322 NumColumns); 14323 } 14324 14325 template <typename Derived> 14326 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14327 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14328 SourceLocation AttributeLoc) { 14329 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14330 AttributeLoc); 14331 } 14332 14333 template<typename Derived> 14334 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14335 QualType T, 14336 MutableArrayRef<QualType> ParamTypes, 14337 const FunctionProtoType::ExtProtoInfo &EPI) { 14338 return SemaRef.BuildFunctionType(T, ParamTypes, 14339 getDerived().getBaseLocation(), 14340 getDerived().getBaseEntity(), 14341 EPI); 14342 } 14343 14344 template<typename Derived> 14345 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14346 return SemaRef.Context.getFunctionNoProtoType(T); 14347 } 14348 14349 template<typename Derived> 14350 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14351 Decl *D) { 14352 assert(D && "no decl found"); 14353 if (D->isInvalidDecl()) return QualType(); 14354 14355 // FIXME: Doesn't account for ObjCInterfaceDecl! 14356 TypeDecl *Ty; 14357 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14358 // A valid resolved using typename pack expansion decl can have multiple 14359 // UsingDecls, but they must each have exactly one type, and it must be 14360 // the same type in every case. But we must have at least one expansion! 14361 if (UPD->expansions().empty()) { 14362 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14363 << UPD->isCXXClassMember() << UPD; 14364 return QualType(); 14365 } 14366 14367 // We might still have some unresolved types. Try to pick a resolved type 14368 // if we can. The final instantiation will check that the remaining 14369 // unresolved types instantiate to the type we pick. 14370 QualType FallbackT; 14371 QualType T; 14372 for (auto *E : UPD->expansions()) { 14373 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14374 if (ThisT.isNull()) 14375 continue; 14376 else if (ThisT->getAs<UnresolvedUsingType>()) 14377 FallbackT = ThisT; 14378 else if (T.isNull()) 14379 T = ThisT; 14380 else 14381 assert(getSema().Context.hasSameType(ThisT, T) && 14382 "mismatched resolved types in using pack expansion"); 14383 } 14384 return T.isNull() ? FallbackT : T; 14385 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14386 assert(Using->hasTypename() && 14387 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14388 14389 // A valid resolved using typename decl points to exactly one type decl. 14390 assert(++Using->shadow_begin() == Using->shadow_end()); 14391 14392 NamedDecl *Target = Using->shadow_begin()->getTargetDecl(); 14393 if (SemaRef.DiagnoseUseOfDecl(Target, Loc)) 14394 return QualType(); 14395 Ty = cast<TypeDecl>(Target); 14396 } else { 14397 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14398 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14399 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14400 } 14401 14402 return SemaRef.Context.getTypeDeclType(Ty); 14403 } 14404 14405 template<typename Derived> 14406 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14407 SourceLocation Loc) { 14408 return SemaRef.BuildTypeofExprType(E, Loc); 14409 } 14410 14411 template<typename Derived> 14412 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14413 return SemaRef.Context.getTypeOfType(Underlying); 14414 } 14415 14416 template<typename Derived> 14417 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14418 SourceLocation Loc) { 14419 return SemaRef.BuildDecltypeType(E, Loc); 14420 } 14421 14422 template<typename Derived> 14423 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14424 UnaryTransformType::UTTKind UKind, 14425 SourceLocation Loc) { 14426 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14427 } 14428 14429 template<typename Derived> 14430 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14431 TemplateName Template, 14432 SourceLocation TemplateNameLoc, 14433 TemplateArgumentListInfo &TemplateArgs) { 14434 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14435 } 14436 14437 template<typename Derived> 14438 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14439 SourceLocation KWLoc) { 14440 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14441 } 14442 14443 template<typename Derived> 14444 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14445 SourceLocation KWLoc, 14446 bool isReadPipe) { 14447 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14448 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14449 } 14450 14451 template <typename Derived> 14452 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14453 unsigned NumBits, 14454 SourceLocation Loc) { 14455 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14456 NumBits, true); 14457 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14458 SemaRef.Context.IntTy, Loc); 14459 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14460 } 14461 14462 template <typename Derived> 14463 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14464 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14465 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14466 } 14467 14468 template<typename Derived> 14469 TemplateName 14470 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14471 bool TemplateKW, 14472 TemplateDecl *Template) { 14473 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14474 Template); 14475 } 14476 14477 template<typename Derived> 14478 TemplateName 14479 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14480 SourceLocation TemplateKWLoc, 14481 const IdentifierInfo &Name, 14482 SourceLocation NameLoc, 14483 QualType ObjectType, 14484 NamedDecl *FirstQualifierInScope, 14485 bool AllowInjectedClassName) { 14486 UnqualifiedId TemplateName; 14487 TemplateName.setIdentifier(&Name, NameLoc); 14488 Sema::TemplateTy Template; 14489 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14490 TemplateName, ParsedType::make(ObjectType), 14491 /*EnteringContext=*/false, Template, 14492 AllowInjectedClassName); 14493 return Template.get(); 14494 } 14495 14496 template<typename Derived> 14497 TemplateName 14498 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14499 SourceLocation TemplateKWLoc, 14500 OverloadedOperatorKind Operator, 14501 SourceLocation NameLoc, 14502 QualType ObjectType, 14503 bool AllowInjectedClassName) { 14504 UnqualifiedId Name; 14505 // FIXME: Bogus location information. 14506 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14507 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14508 Sema::TemplateTy Template; 14509 getSema().ActOnTemplateName( 14510 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14511 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14512 return Template.get(); 14513 } 14514 14515 template<typename Derived> 14516 ExprResult 14517 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14518 SourceLocation OpLoc, 14519 Expr *OrigCallee, 14520 Expr *First, 14521 Expr *Second) { 14522 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14523 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14524 14525 if (First->getObjectKind() == OK_ObjCProperty) { 14526 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14527 if (BinaryOperator::isAssignmentOp(Opc)) 14528 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14529 First, Second); 14530 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14531 if (Result.isInvalid()) 14532 return ExprError(); 14533 First = Result.get(); 14534 } 14535 14536 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14537 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14538 if (Result.isInvalid()) 14539 return ExprError(); 14540 Second = Result.get(); 14541 } 14542 14543 // Determine whether this should be a builtin operation. 14544 if (Op == OO_Subscript) { 14545 if (!First->getType()->isOverloadableType() && 14546 !Second->getType()->isOverloadableType()) 14547 return getSema().CreateBuiltinArraySubscriptExpr( 14548 First, Callee->getBeginLoc(), Second, OpLoc); 14549 } else if (Op == OO_Arrow) { 14550 // -> is never a builtin operation. 14551 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14552 } else if (Second == nullptr || isPostIncDec) { 14553 if (!First->getType()->isOverloadableType() || 14554 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14555 // The argument is not of overloadable type, or this is an expression 14556 // of the form &Class::member, so try to create a built-in unary 14557 // operation. 14558 UnaryOperatorKind Opc 14559 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14560 14561 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14562 } 14563 } else { 14564 if (!First->getType()->isOverloadableType() && 14565 !Second->getType()->isOverloadableType()) { 14566 // Neither of the arguments is an overloadable type, so try to 14567 // create a built-in binary operation. 14568 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14569 ExprResult Result 14570 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14571 if (Result.isInvalid()) 14572 return ExprError(); 14573 14574 return Result; 14575 } 14576 } 14577 14578 // Compute the transformed set of functions (and function templates) to be 14579 // used during overload resolution. 14580 UnresolvedSet<16> Functions; 14581 bool RequiresADL; 14582 14583 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14584 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14585 // If the overload could not be resolved in the template definition 14586 // (because we had a dependent argument), ADL is performed as part of 14587 // template instantiation. 14588 RequiresADL = ULE->requiresADL(); 14589 } else { 14590 // If we've resolved this to a particular non-member function, just call 14591 // that function. If we resolved it to a member function, 14592 // CreateOverloaded* will find that function for us. 14593 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14594 if (!isa<CXXMethodDecl>(ND)) 14595 Functions.addDecl(ND); 14596 RequiresADL = false; 14597 } 14598 14599 // Add any functions found via argument-dependent lookup. 14600 Expr *Args[2] = { First, Second }; 14601 unsigned NumArgs = 1 + (Second != nullptr); 14602 14603 // Create the overloaded operator invocation for unary operators. 14604 if (NumArgs == 1 || isPostIncDec) { 14605 UnaryOperatorKind Opc 14606 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14607 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14608 RequiresADL); 14609 } 14610 14611 if (Op == OO_Subscript) { 14612 SourceLocation LBrace; 14613 SourceLocation RBrace; 14614 14615 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14616 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14617 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14618 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14619 } else { 14620 LBrace = Callee->getBeginLoc(); 14621 RBrace = OpLoc; 14622 } 14623 14624 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14625 First, Second); 14626 } 14627 14628 // Create the overloaded operator invocation for binary operators. 14629 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14630 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14631 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14632 if (Result.isInvalid()) 14633 return ExprError(); 14634 14635 return Result; 14636 } 14637 14638 template<typename Derived> 14639 ExprResult 14640 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14641 SourceLocation OperatorLoc, 14642 bool isArrow, 14643 CXXScopeSpec &SS, 14644 TypeSourceInfo *ScopeType, 14645 SourceLocation CCLoc, 14646 SourceLocation TildeLoc, 14647 PseudoDestructorTypeStorage Destroyed) { 14648 QualType BaseType = Base->getType(); 14649 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14650 (!isArrow && !BaseType->getAs<RecordType>()) || 14651 (isArrow && BaseType->getAs<PointerType>() && 14652 !BaseType->castAs<PointerType>()->getPointeeType() 14653 ->template getAs<RecordType>())){ 14654 // This pseudo-destructor expression is still a pseudo-destructor. 14655 return SemaRef.BuildPseudoDestructorExpr( 14656 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14657 CCLoc, TildeLoc, Destroyed); 14658 } 14659 14660 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14661 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14662 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14663 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14664 NameInfo.setNamedTypeInfo(DestroyedType); 14665 14666 // The scope type is now known to be a valid nested name specifier 14667 // component. Tack it on to the end of the nested name specifier. 14668 if (ScopeType) { 14669 if (!ScopeType->getType()->getAs<TagType>()) { 14670 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14671 diag::err_expected_class_or_namespace) 14672 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14673 return ExprError(); 14674 } 14675 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14676 CCLoc); 14677 } 14678 14679 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14680 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14681 OperatorLoc, isArrow, 14682 SS, TemplateKWLoc, 14683 /*FIXME: FirstQualifier*/ nullptr, 14684 NameInfo, 14685 /*TemplateArgs*/ nullptr, 14686 /*S*/nullptr); 14687 } 14688 14689 template<typename Derived> 14690 StmtResult 14691 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14692 SourceLocation Loc = S->getBeginLoc(); 14693 CapturedDecl *CD = S->getCapturedDecl(); 14694 unsigned NumParams = CD->getNumParams(); 14695 unsigned ContextParamPos = CD->getContextParamPosition(); 14696 SmallVector<Sema::CapturedParamNameType, 4> Params; 14697 for (unsigned I = 0; I < NumParams; ++I) { 14698 if (I != ContextParamPos) { 14699 Params.push_back( 14700 std::make_pair( 14701 CD->getParam(I)->getName(), 14702 getDerived().TransformType(CD->getParam(I)->getType()))); 14703 } else { 14704 Params.push_back(std::make_pair(StringRef(), QualType())); 14705 } 14706 } 14707 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14708 S->getCapturedRegionKind(), Params); 14709 StmtResult Body; 14710 { 14711 Sema::CompoundScopeRAII CompoundScope(getSema()); 14712 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14713 } 14714 14715 if (Body.isInvalid()) { 14716 getSema().ActOnCapturedRegionError(); 14717 return StmtError(); 14718 } 14719 14720 return getSema().ActOnCapturedRegionEnd(Body.get()); 14721 } 14722 14723 } // end namespace clang 14724 14725 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14726