1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 17 #include "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprConcepts.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/OpenMPClause.h" 27 #include "clang/AST/Stmt.h" 28 #include "clang/AST/StmtCXX.h" 29 #include "clang/AST/StmtObjC.h" 30 #include "clang/AST/StmtOpenMP.h" 31 #include "clang/Basic/DiagnosticParse.h" 32 #include "clang/Basic/OpenMPKinds.h" 33 #include "clang/Sema/Designator.h" 34 #include "clang/Sema/Lookup.h" 35 #include "clang/Sema/Ownership.h" 36 #include "clang/Sema/ParsedTemplate.h" 37 #include "clang/Sema/ScopeInfo.h" 38 #include "clang/Sema/SemaDiagnostic.h" 39 #include "clang/Sema/SemaInternal.h" 40 #include "llvm/ADT/ArrayRef.h" 41 #include "llvm/Support/ErrorHandling.h" 42 #include <algorithm> 43 44 using namespace llvm::omp; 45 46 namespace clang { 47 using namespace sema; 48 49 /// A semantic tree transformation that allows one to transform one 50 /// abstract syntax tree into another. 51 /// 52 /// A new tree transformation is defined by creating a new subclass \c X of 53 /// \c TreeTransform<X> and then overriding certain operations to provide 54 /// behavior specific to that transformation. For example, template 55 /// instantiation is implemented as a tree transformation where the 56 /// transformation of TemplateTypeParmType nodes involves substituting the 57 /// template arguments for their corresponding template parameters; a similar 58 /// transformation is performed for non-type template parameters and 59 /// template template parameters. 60 /// 61 /// This tree-transformation template uses static polymorphism to allow 62 /// subclasses to customize any of its operations. Thus, a subclass can 63 /// override any of the transformation or rebuild operators by providing an 64 /// operation with the same signature as the default implementation. The 65 /// overriding function should not be virtual. 66 /// 67 /// Semantic tree transformations are split into two stages, either of which 68 /// can be replaced by a subclass. The "transform" step transforms an AST node 69 /// or the parts of an AST node using the various transformation functions, 70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 71 /// node of the appropriate kind from the pieces. The default transformation 72 /// routines recursively transform the operands to composite AST nodes (e.g., 73 /// the pointee type of a PointerType node) and, if any of those operand nodes 74 /// were changed by the transformation, invokes the rebuild operation to create 75 /// a new AST node. 76 /// 77 /// Subclasses can customize the transformation at various levels. The 78 /// most coarse-grained transformations involve replacing TransformType(), 79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 81 /// new implementations. 82 /// 83 /// For more fine-grained transformations, subclasses can replace any of the 84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 86 /// replacing TransformTemplateTypeParmType() allows template instantiation 87 /// to substitute template arguments for their corresponding template 88 /// parameters. Additionally, subclasses can override the \c RebuildXXX 89 /// functions to control how AST nodes are rebuilt when their operands change. 90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 92 /// be able to use more efficient rebuild steps. 93 /// 94 /// There are a handful of other functions that can be overridden, allowing one 95 /// to avoid traversing nodes that don't need any transformation 96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 97 /// operands have not changed (\c AlwaysRebuild()), and customize the 98 /// default locations and entity names used for type-checking 99 /// (\c getBaseLocation(), \c getBaseEntity()). 100 template<typename Derived> 101 class TreeTransform { 102 /// Private RAII object that helps us forget and then re-remember 103 /// the template argument corresponding to a partially-substituted parameter 104 /// pack. 105 class ForgetPartiallySubstitutedPackRAII { 106 Derived &Self; 107 TemplateArgument Old; 108 109 public: 110 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 111 Old = Self.ForgetPartiallySubstitutedPack(); 112 } 113 114 ~ForgetPartiallySubstitutedPackRAII() { 115 Self.RememberPartiallySubstitutedPack(Old); 116 } 117 }; 118 119 protected: 120 Sema &SemaRef; 121 122 /// The set of local declarations that have been transformed, for 123 /// cases where we are forced to build new declarations within the transformer 124 /// rather than in the subclass (e.g., lambda closure types). 125 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 126 127 public: 128 /// Initializes a new tree transformer. 129 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 130 131 /// Retrieves a reference to the derived class. 132 Derived &getDerived() { return static_cast<Derived&>(*this); } 133 134 /// Retrieves a reference to the derived class. 135 const Derived &getDerived() const { 136 return static_cast<const Derived&>(*this); 137 } 138 139 static inline ExprResult Owned(Expr *E) { return E; } 140 static inline StmtResult Owned(Stmt *S) { return S; } 141 142 /// Retrieves a reference to the semantic analysis object used for 143 /// this tree transform. 144 Sema &getSema() const { return SemaRef; } 145 146 /// Whether the transformation should always rebuild AST nodes, even 147 /// if none of the children have changed. 148 /// 149 /// Subclasses may override this function to specify when the transformation 150 /// should rebuild all AST nodes. 151 /// 152 /// We must always rebuild all AST nodes when performing variadic template 153 /// pack expansion, in order to avoid violating the AST invariant that each 154 /// statement node appears at most once in its containing declaration. 155 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 156 157 /// Whether the transformation is forming an expression or statement that 158 /// replaces the original. In this case, we'll reuse mangling numbers from 159 /// existing lambdas. 160 bool ReplacingOriginal() { return false; } 161 162 /// Wether CXXConstructExpr can be skipped when they are implicit. 163 /// They will be reconstructed when used if needed. 164 /// This is usefull when the user that cause rebuilding of the 165 /// CXXConstructExpr is outside of the expression at which the TreeTransform 166 /// started. 167 bool AllowSkippingCXXConstructExpr() { return true; } 168 169 /// Returns the location of the entity being transformed, if that 170 /// information was not available elsewhere in the AST. 171 /// 172 /// By default, returns no source-location information. Subclasses can 173 /// provide an alternative implementation that provides better location 174 /// information. 175 SourceLocation getBaseLocation() { return SourceLocation(); } 176 177 /// Returns the name of the entity being transformed, if that 178 /// information was not available elsewhere in the AST. 179 /// 180 /// By default, returns an empty name. Subclasses can provide an alternative 181 /// implementation with a more precise name. 182 DeclarationName getBaseEntity() { return DeclarationName(); } 183 184 /// Sets the "base" location and entity when that 185 /// information is known based on another transformation. 186 /// 187 /// By default, the source location and entity are ignored. Subclasses can 188 /// override this function to provide a customized implementation. 189 void setBase(SourceLocation Loc, DeclarationName Entity) { } 190 191 /// RAII object that temporarily sets the base location and entity 192 /// used for reporting diagnostics in types. 193 class TemporaryBase { 194 TreeTransform &Self; 195 SourceLocation OldLocation; 196 DeclarationName OldEntity; 197 198 public: 199 TemporaryBase(TreeTransform &Self, SourceLocation Location, 200 DeclarationName Entity) : Self(Self) { 201 OldLocation = Self.getDerived().getBaseLocation(); 202 OldEntity = Self.getDerived().getBaseEntity(); 203 204 if (Location.isValid()) 205 Self.getDerived().setBase(Location, Entity); 206 } 207 208 ~TemporaryBase() { 209 Self.getDerived().setBase(OldLocation, OldEntity); 210 } 211 }; 212 213 /// Determine whether the given type \p T has already been 214 /// transformed. 215 /// 216 /// Subclasses can provide an alternative implementation of this routine 217 /// to short-circuit evaluation when it is known that a given type will 218 /// not change. For example, template instantiation need not traverse 219 /// non-dependent types. 220 bool AlreadyTransformed(QualType T) { 221 return T.isNull(); 222 } 223 224 /// Transform a template parameter depth level. 225 /// 226 /// During a transformation that transforms template parameters, this maps 227 /// an old template parameter depth to a new depth. 228 unsigned TransformTemplateDepth(unsigned Depth) { 229 return Depth; 230 } 231 232 /// Determine whether the given call argument should be dropped, e.g., 233 /// because it is a default argument. 234 /// 235 /// Subclasses can provide an alternative implementation of this routine to 236 /// determine which kinds of call arguments get dropped. By default, 237 /// CXXDefaultArgument nodes are dropped (prior to transformation). 238 bool DropCallArgument(Expr *E) { 239 return E->isDefaultArgument(); 240 } 241 242 /// Determine whether we should expand a pack expansion with the 243 /// given set of parameter packs into separate arguments by repeatedly 244 /// transforming the pattern. 245 /// 246 /// By default, the transformer never tries to expand pack expansions. 247 /// Subclasses can override this routine to provide different behavior. 248 /// 249 /// \param EllipsisLoc The location of the ellipsis that identifies the 250 /// pack expansion. 251 /// 252 /// \param PatternRange The source range that covers the entire pattern of 253 /// the pack expansion. 254 /// 255 /// \param Unexpanded The set of unexpanded parameter packs within the 256 /// pattern. 257 /// 258 /// \param ShouldExpand Will be set to \c true if the transformer should 259 /// expand the corresponding pack expansions into separate arguments. When 260 /// set, \c NumExpansions must also be set. 261 /// 262 /// \param RetainExpansion Whether the caller should add an unexpanded 263 /// pack expansion after all of the expanded arguments. This is used 264 /// when extending explicitly-specified template argument packs per 265 /// C++0x [temp.arg.explicit]p9. 266 /// 267 /// \param NumExpansions The number of separate arguments that will be in 268 /// the expanded form of the corresponding pack expansion. This is both an 269 /// input and an output parameter, which can be set by the caller if the 270 /// number of expansions is known a priori (e.g., due to a prior substitution) 271 /// and will be set by the callee when the number of expansions is known. 272 /// The callee must set this value when \c ShouldExpand is \c true; it may 273 /// set this value in other cases. 274 /// 275 /// \returns true if an error occurred (e.g., because the parameter packs 276 /// are to be instantiated with arguments of different lengths), false 277 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 278 /// must be set. 279 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 280 SourceRange PatternRange, 281 ArrayRef<UnexpandedParameterPack> Unexpanded, 282 bool &ShouldExpand, 283 bool &RetainExpansion, 284 Optional<unsigned> &NumExpansions) { 285 ShouldExpand = false; 286 return false; 287 } 288 289 /// "Forget" about the partially-substituted pack template argument, 290 /// when performing an instantiation that must preserve the parameter pack 291 /// use. 292 /// 293 /// This routine is meant to be overridden by the template instantiator. 294 TemplateArgument ForgetPartiallySubstitutedPack() { 295 return TemplateArgument(); 296 } 297 298 /// "Remember" the partially-substituted pack template argument 299 /// after performing an instantiation that must preserve the parameter pack 300 /// use. 301 /// 302 /// This routine is meant to be overridden by the template instantiator. 303 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 304 305 /// Note to the derived class when a function parameter pack is 306 /// being expanded. 307 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 308 309 /// Transforms the given type into another type. 310 /// 311 /// By default, this routine transforms a type by creating a 312 /// TypeSourceInfo for it and delegating to the appropriate 313 /// function. This is expensive, but we don't mind, because 314 /// this method is deprecated anyway; all users should be 315 /// switched to storing TypeSourceInfos. 316 /// 317 /// \returns the transformed type. 318 QualType TransformType(QualType T); 319 320 /// Transforms the given type-with-location into a new 321 /// type-with-location. 322 /// 323 /// By default, this routine transforms a type by delegating to the 324 /// appropriate TransformXXXType to build a new type. Subclasses 325 /// may override this function (to take over all type 326 /// transformations) or some set of the TransformXXXType functions 327 /// to alter the transformation. 328 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 329 330 /// Transform the given type-with-location into a new 331 /// type, collecting location information in the given builder 332 /// as necessary. 333 /// 334 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 335 336 /// Transform a type that is permitted to produce a 337 /// DeducedTemplateSpecializationType. 338 /// 339 /// This is used in the (relatively rare) contexts where it is acceptable 340 /// for transformation to produce a class template type with deduced 341 /// template arguments. 342 /// @{ 343 QualType TransformTypeWithDeducedTST(QualType T); 344 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 345 /// @} 346 347 /// The reason why the value of a statement is not discarded, if any. 348 enum StmtDiscardKind { 349 SDK_Discarded, 350 SDK_NotDiscarded, 351 SDK_StmtExprResult, 352 }; 353 354 /// Transform the given statement. 355 /// 356 /// By default, this routine transforms a statement by delegating to the 357 /// appropriate TransformXXXStmt function to transform a specific kind of 358 /// statement or the TransformExpr() function to transform an expression. 359 /// Subclasses may override this function to transform statements using some 360 /// other mechanism. 361 /// 362 /// \returns the transformed statement. 363 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 364 365 /// Transform the given statement. 366 /// 367 /// By default, this routine transforms a statement by delegating to the 368 /// appropriate TransformOMPXXXClause function to transform a specific kind 369 /// of clause. Subclasses may override this function to transform statements 370 /// using some other mechanism. 371 /// 372 /// \returns the transformed OpenMP clause. 373 OMPClause *TransformOMPClause(OMPClause *S); 374 375 /// Transform the given attribute. 376 /// 377 /// By default, this routine transforms a statement by delegating to the 378 /// appropriate TransformXXXAttr function to transform a specific kind 379 /// of attribute. Subclasses may override this function to transform 380 /// attributed statements using some other mechanism. 381 /// 382 /// \returns the transformed attribute 383 const Attr *TransformAttr(const Attr *S); 384 385 /// Transform the specified attribute. 386 /// 387 /// Subclasses should override the transformation of attributes with a pragma 388 /// spelling to transform expressions stored within the attribute. 389 /// 390 /// \returns the transformed attribute. 391 #define ATTR(X) 392 #define PRAGMA_SPELLING_ATTR(X) \ 393 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 394 #include "clang/Basic/AttrList.inc" 395 396 /// Transform the given expression. 397 /// 398 /// By default, this routine transforms an expression by delegating to the 399 /// appropriate TransformXXXExpr function to build a new expression. 400 /// Subclasses may override this function to transform expressions using some 401 /// other mechanism. 402 /// 403 /// \returns the transformed expression. 404 ExprResult TransformExpr(Expr *E); 405 406 /// Transform the given initializer. 407 /// 408 /// By default, this routine transforms an initializer by stripping off the 409 /// semantic nodes added by initialization, then passing the result to 410 /// TransformExpr or TransformExprs. 411 /// 412 /// \returns the transformed initializer. 413 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 414 415 /// Transform the given list of expressions. 416 /// 417 /// This routine transforms a list of expressions by invoking 418 /// \c TransformExpr() for each subexpression. However, it also provides 419 /// support for variadic templates by expanding any pack expansions (if the 420 /// derived class permits such expansion) along the way. When pack expansions 421 /// are present, the number of outputs may not equal the number of inputs. 422 /// 423 /// \param Inputs The set of expressions to be transformed. 424 /// 425 /// \param NumInputs The number of expressions in \c Inputs. 426 /// 427 /// \param IsCall If \c true, then this transform is being performed on 428 /// function-call arguments, and any arguments that should be dropped, will 429 /// be. 430 /// 431 /// \param Outputs The transformed input expressions will be added to this 432 /// vector. 433 /// 434 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 435 /// due to transformation. 436 /// 437 /// \returns true if an error occurred, false otherwise. 438 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 439 SmallVectorImpl<Expr *> &Outputs, 440 bool *ArgChanged = nullptr); 441 442 /// Transform the given declaration, which is referenced from a type 443 /// or expression. 444 /// 445 /// By default, acts as the identity function on declarations, unless the 446 /// transformer has had to transform the declaration itself. Subclasses 447 /// may override this function to provide alternate behavior. 448 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 449 llvm::DenseMap<Decl *, Decl *>::iterator Known 450 = TransformedLocalDecls.find(D); 451 if (Known != TransformedLocalDecls.end()) 452 return Known->second; 453 454 return D; 455 } 456 457 /// Transform the specified condition. 458 /// 459 /// By default, this transforms the variable and expression and rebuilds 460 /// the condition. 461 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 462 Expr *Expr, 463 Sema::ConditionKind Kind); 464 465 /// Transform the attributes associated with the given declaration and 466 /// place them on the new declaration. 467 /// 468 /// By default, this operation does nothing. Subclasses may override this 469 /// behavior to transform attributes. 470 void transformAttrs(Decl *Old, Decl *New) { } 471 472 /// Note that a local declaration has been transformed by this 473 /// transformer. 474 /// 475 /// Local declarations are typically transformed via a call to 476 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 477 /// the transformer itself has to transform the declarations. This routine 478 /// can be overridden by a subclass that keeps track of such mappings. 479 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 480 assert(New.size() == 1 && 481 "must override transformedLocalDecl if performing pack expansion"); 482 TransformedLocalDecls[Old] = New.front(); 483 } 484 485 /// Transform the definition of the given declaration. 486 /// 487 /// By default, invokes TransformDecl() to transform the declaration. 488 /// Subclasses may override this function to provide alternate behavior. 489 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 490 return getDerived().TransformDecl(Loc, D); 491 } 492 493 /// Transform the given declaration, which was the first part of a 494 /// nested-name-specifier in a member access expression. 495 /// 496 /// This specific declaration transformation only applies to the first 497 /// identifier in a nested-name-specifier of a member access expression, e.g., 498 /// the \c T in \c x->T::member 499 /// 500 /// By default, invokes TransformDecl() to transform the declaration. 501 /// Subclasses may override this function to provide alternate behavior. 502 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 503 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 504 } 505 506 /// Transform the set of declarations in an OverloadExpr. 507 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 508 LookupResult &R); 509 510 /// Transform the given nested-name-specifier with source-location 511 /// information. 512 /// 513 /// By default, transforms all of the types and declarations within the 514 /// nested-name-specifier. Subclasses may override this function to provide 515 /// alternate behavior. 516 NestedNameSpecifierLoc 517 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 518 QualType ObjectType = QualType(), 519 NamedDecl *FirstQualifierInScope = nullptr); 520 521 /// Transform the given declaration name. 522 /// 523 /// By default, transforms the types of conversion function, constructor, 524 /// and destructor names and then (if needed) rebuilds the declaration name. 525 /// Identifiers and selectors are returned unmodified. Sublcasses may 526 /// override this function to provide alternate behavior. 527 DeclarationNameInfo 528 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 529 530 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 531 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 532 concepts::TypeRequirement * 533 TransformTypeRequirement(concepts::TypeRequirement *Req); 534 concepts::ExprRequirement * 535 TransformExprRequirement(concepts::ExprRequirement *Req); 536 concepts::NestedRequirement * 537 TransformNestedRequirement(concepts::NestedRequirement *Req); 538 539 /// Transform the given template name. 540 /// 541 /// \param SS The nested-name-specifier that qualifies the template 542 /// name. This nested-name-specifier must already have been transformed. 543 /// 544 /// \param Name The template name to transform. 545 /// 546 /// \param NameLoc The source location of the template name. 547 /// 548 /// \param ObjectType If we're translating a template name within a member 549 /// access expression, this is the type of the object whose member template 550 /// is being referenced. 551 /// 552 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 553 /// also refers to a name within the current (lexical) scope, this is the 554 /// declaration it refers to. 555 /// 556 /// By default, transforms the template name by transforming the declarations 557 /// and nested-name-specifiers that occur within the template name. 558 /// Subclasses may override this function to provide alternate behavior. 559 TemplateName 560 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 561 SourceLocation NameLoc, 562 QualType ObjectType = QualType(), 563 NamedDecl *FirstQualifierInScope = nullptr, 564 bool AllowInjectedClassName = false); 565 566 /// Transform the given template argument. 567 /// 568 /// By default, this operation transforms the type, expression, or 569 /// declaration stored within the template argument and constructs a 570 /// new template argument from the transformed result. Subclasses may 571 /// override this function to provide alternate behavior. 572 /// 573 /// Returns true if there was an error. 574 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 575 TemplateArgumentLoc &Output, 576 bool Uneval = false); 577 578 /// Transform the given set of template arguments. 579 /// 580 /// By default, this operation transforms all of the template arguments 581 /// in the input set using \c TransformTemplateArgument(), and appends 582 /// the transformed arguments to the output list. 583 /// 584 /// Note that this overload of \c TransformTemplateArguments() is merely 585 /// a convenience function. Subclasses that wish to override this behavior 586 /// should override the iterator-based member template version. 587 /// 588 /// \param Inputs The set of template arguments to be transformed. 589 /// 590 /// \param NumInputs The number of template arguments in \p Inputs. 591 /// 592 /// \param Outputs The set of transformed template arguments output by this 593 /// routine. 594 /// 595 /// Returns true if an error occurred. 596 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 597 unsigned NumInputs, 598 TemplateArgumentListInfo &Outputs, 599 bool Uneval = false) { 600 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 601 Uneval); 602 } 603 604 /// Transform the given set of template arguments. 605 /// 606 /// By default, this operation transforms all of the template arguments 607 /// in the input set using \c TransformTemplateArgument(), and appends 608 /// the transformed arguments to the output list. 609 /// 610 /// \param First An iterator to the first template argument. 611 /// 612 /// \param Last An iterator one step past the last template argument. 613 /// 614 /// \param Outputs The set of transformed template arguments output by this 615 /// routine. 616 /// 617 /// Returns true if an error occurred. 618 template<typename InputIterator> 619 bool TransformTemplateArguments(InputIterator First, 620 InputIterator Last, 621 TemplateArgumentListInfo &Outputs, 622 bool Uneval = false); 623 624 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 625 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 626 TemplateArgumentLoc &ArgLoc); 627 628 /// Fakes up a TypeSourceInfo for a type. 629 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 630 return SemaRef.Context.getTrivialTypeSourceInfo(T, 631 getDerived().getBaseLocation()); 632 } 633 634 #define ABSTRACT_TYPELOC(CLASS, PARENT) 635 #define TYPELOC(CLASS, PARENT) \ 636 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 637 #include "clang/AST/TypeLocNodes.def" 638 639 template<typename Fn> 640 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 641 FunctionProtoTypeLoc TL, 642 CXXRecordDecl *ThisContext, 643 Qualifiers ThisTypeQuals, 644 Fn TransformExceptionSpec); 645 646 bool TransformExceptionSpec(SourceLocation Loc, 647 FunctionProtoType::ExceptionSpecInfo &ESI, 648 SmallVectorImpl<QualType> &Exceptions, 649 bool &Changed); 650 651 StmtResult TransformSEHHandler(Stmt *Handler); 652 653 QualType 654 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 655 TemplateSpecializationTypeLoc TL, 656 TemplateName Template); 657 658 QualType 659 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 660 DependentTemplateSpecializationTypeLoc TL, 661 TemplateName Template, 662 CXXScopeSpec &SS); 663 664 QualType TransformDependentTemplateSpecializationType( 665 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 666 NestedNameSpecifierLoc QualifierLoc); 667 668 /// Transforms the parameters of a function type into the 669 /// given vectors. 670 /// 671 /// The result vectors should be kept in sync; null entries in the 672 /// variables vector are acceptable. 673 /// 674 /// Return true on error. 675 bool TransformFunctionTypeParams( 676 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 677 const QualType *ParamTypes, 678 const FunctionProtoType::ExtParameterInfo *ParamInfos, 679 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 680 Sema::ExtParameterInfoBuilder &PInfos); 681 682 /// Transforms a single function-type parameter. Return null 683 /// on error. 684 /// 685 /// \param indexAdjustment - A number to add to the parameter's 686 /// scope index; can be negative 687 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 688 int indexAdjustment, 689 Optional<unsigned> NumExpansions, 690 bool ExpectParameterPack); 691 692 /// Transform the body of a lambda-expression. 693 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 694 /// Alternative implementation of TransformLambdaBody that skips transforming 695 /// the body. 696 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 697 698 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 699 700 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 701 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 702 703 TemplateParameterList *TransformTemplateParameterList( 704 TemplateParameterList *TPL) { 705 return TPL; 706 } 707 708 ExprResult TransformAddressOfOperand(Expr *E); 709 710 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 711 bool IsAddressOfOperand, 712 TypeSourceInfo **RecoveryTSI); 713 714 ExprResult TransformParenDependentScopeDeclRefExpr( 715 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 716 TypeSourceInfo **RecoveryTSI); 717 718 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 719 720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 721 // amount of stack usage with clang. 722 #define STMT(Node, Parent) \ 723 LLVM_ATTRIBUTE_NOINLINE \ 724 StmtResult Transform##Node(Node *S); 725 #define VALUESTMT(Node, Parent) \ 726 LLVM_ATTRIBUTE_NOINLINE \ 727 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 728 #define EXPR(Node, Parent) \ 729 LLVM_ATTRIBUTE_NOINLINE \ 730 ExprResult Transform##Node(Node *E); 731 #define ABSTRACT_STMT(Stmt) 732 #include "clang/AST/StmtNodes.inc" 733 734 #define GEN_CLANG_CLAUSE_CLASS 735 #define CLAUSE_CLASS(Enum, Str, Class) \ 736 LLVM_ATTRIBUTE_NOINLINE \ 737 OMPClause *Transform##Class(Class *S); 738 #include "llvm/Frontend/OpenMP/OMP.inc" 739 740 /// Build a new qualified type given its unqualified type and type location. 741 /// 742 /// By default, this routine adds type qualifiers only to types that can 743 /// have qualifiers, and silently suppresses those qualifiers that are not 744 /// permitted. Subclasses may override this routine to provide different 745 /// behavior. 746 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 747 748 /// Build a new pointer type given its pointee type. 749 /// 750 /// By default, performs semantic analysis when building the pointer type. 751 /// Subclasses may override this routine to provide different behavior. 752 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 753 754 /// Build a new block pointer type given its pointee type. 755 /// 756 /// By default, performs semantic analysis when building the block pointer 757 /// type. Subclasses may override this routine to provide different behavior. 758 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 759 760 /// Build a new reference type given the type it references. 761 /// 762 /// By default, performs semantic analysis when building the 763 /// reference type. Subclasses may override this routine to provide 764 /// different behavior. 765 /// 766 /// \param LValue whether the type was written with an lvalue sigil 767 /// or an rvalue sigil. 768 QualType RebuildReferenceType(QualType ReferentType, 769 bool LValue, 770 SourceLocation Sigil); 771 772 /// Build a new member pointer type given the pointee type and the 773 /// class type it refers into. 774 /// 775 /// By default, performs semantic analysis when building the member pointer 776 /// type. Subclasses may override this routine to provide different behavior. 777 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 778 SourceLocation Sigil); 779 780 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 781 SourceLocation ProtocolLAngleLoc, 782 ArrayRef<ObjCProtocolDecl *> Protocols, 783 ArrayRef<SourceLocation> ProtocolLocs, 784 SourceLocation ProtocolRAngleLoc); 785 786 /// Build an Objective-C object type. 787 /// 788 /// By default, performs semantic analysis when building the object type. 789 /// Subclasses may override this routine to provide different behavior. 790 QualType RebuildObjCObjectType(QualType BaseType, 791 SourceLocation Loc, 792 SourceLocation TypeArgsLAngleLoc, 793 ArrayRef<TypeSourceInfo *> TypeArgs, 794 SourceLocation TypeArgsRAngleLoc, 795 SourceLocation ProtocolLAngleLoc, 796 ArrayRef<ObjCProtocolDecl *> Protocols, 797 ArrayRef<SourceLocation> ProtocolLocs, 798 SourceLocation ProtocolRAngleLoc); 799 800 /// Build a new Objective-C object pointer type given the pointee type. 801 /// 802 /// By default, directly builds the pointer type, with no additional semantic 803 /// analysis. 804 QualType RebuildObjCObjectPointerType(QualType PointeeType, 805 SourceLocation Star); 806 807 /// Build a new array type given the element type, size 808 /// modifier, size of the array (if known), size expression, and index type 809 /// qualifiers. 810 /// 811 /// By default, performs semantic analysis when building the array type. 812 /// Subclasses may override this routine to provide different behavior. 813 /// Also by default, all of the other Rebuild*Array 814 QualType RebuildArrayType(QualType ElementType, 815 ArrayType::ArraySizeModifier SizeMod, 816 const llvm::APInt *Size, 817 Expr *SizeExpr, 818 unsigned IndexTypeQuals, 819 SourceRange BracketsRange); 820 821 /// Build a new constant array type given the element type, size 822 /// modifier, (known) size of the array, and index type qualifiers. 823 /// 824 /// By default, performs semantic analysis when building the array type. 825 /// Subclasses may override this routine to provide different behavior. 826 QualType RebuildConstantArrayType(QualType ElementType, 827 ArrayType::ArraySizeModifier SizeMod, 828 const llvm::APInt &Size, 829 Expr *SizeExpr, 830 unsigned IndexTypeQuals, 831 SourceRange BracketsRange); 832 833 /// Build a new incomplete array type given the element type, size 834 /// modifier, and index type qualifiers. 835 /// 836 /// By default, performs semantic analysis when building the array type. 837 /// Subclasses may override this routine to provide different behavior. 838 QualType RebuildIncompleteArrayType(QualType ElementType, 839 ArrayType::ArraySizeModifier SizeMod, 840 unsigned IndexTypeQuals, 841 SourceRange BracketsRange); 842 843 /// Build a new variable-length array type given the element type, 844 /// size modifier, size expression, and index type qualifiers. 845 /// 846 /// By default, performs semantic analysis when building the array type. 847 /// Subclasses may override this routine to provide different behavior. 848 QualType RebuildVariableArrayType(QualType ElementType, 849 ArrayType::ArraySizeModifier SizeMod, 850 Expr *SizeExpr, 851 unsigned IndexTypeQuals, 852 SourceRange BracketsRange); 853 854 /// Build a new dependent-sized array type given the element type, 855 /// size modifier, size expression, and index type qualifiers. 856 /// 857 /// By default, performs semantic analysis when building the array type. 858 /// Subclasses may override this routine to provide different behavior. 859 QualType RebuildDependentSizedArrayType(QualType ElementType, 860 ArrayType::ArraySizeModifier SizeMod, 861 Expr *SizeExpr, 862 unsigned IndexTypeQuals, 863 SourceRange BracketsRange); 864 865 /// Build a new vector type given the element type and 866 /// number of elements. 867 /// 868 /// By default, performs semantic analysis when building the vector type. 869 /// Subclasses may override this routine to provide different behavior. 870 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 871 VectorType::VectorKind VecKind); 872 873 /// Build a new potentially dependently-sized extended vector type 874 /// given the element type and number of elements. 875 /// 876 /// By default, performs semantic analysis when building the vector type. 877 /// Subclasses may override this routine to provide different behavior. 878 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 879 SourceLocation AttributeLoc, 880 VectorType::VectorKind); 881 882 /// Build a new extended vector type given the element type and 883 /// number of elements. 884 /// 885 /// By default, performs semantic analysis when building the vector type. 886 /// Subclasses may override this routine to provide different behavior. 887 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 888 SourceLocation AttributeLoc); 889 890 /// Build a new potentially dependently-sized extended vector type 891 /// given the element type and number of elements. 892 /// 893 /// By default, performs semantic analysis when building the vector type. 894 /// Subclasses may override this routine to provide different behavior. 895 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 896 Expr *SizeExpr, 897 SourceLocation AttributeLoc); 898 899 /// Build a new matrix type given the element type and dimensions. 900 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 901 unsigned NumColumns); 902 903 /// Build a new matrix type given the type and dependently-defined 904 /// dimensions. 905 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 906 Expr *ColumnExpr, 907 SourceLocation AttributeLoc); 908 909 /// Build a new DependentAddressSpaceType or return the pointee 910 /// type variable with the correct address space (retrieved from 911 /// AddrSpaceExpr) applied to it. The former will be returned in cases 912 /// where the address space remains dependent. 913 /// 914 /// By default, performs semantic analysis when building the type with address 915 /// space applied. Subclasses may override this routine to provide different 916 /// behavior. 917 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 918 Expr *AddrSpaceExpr, 919 SourceLocation AttributeLoc); 920 921 /// Build a new function type. 922 /// 923 /// By default, performs semantic analysis when building the function type. 924 /// Subclasses may override this routine to provide different behavior. 925 QualType RebuildFunctionProtoType(QualType T, 926 MutableArrayRef<QualType> ParamTypes, 927 const FunctionProtoType::ExtProtoInfo &EPI); 928 929 /// Build a new unprototyped function type. 930 QualType RebuildFunctionNoProtoType(QualType ResultType); 931 932 /// Rebuild an unresolved typename type, given the decl that 933 /// the UnresolvedUsingTypenameDecl was transformed to. 934 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 935 936 /// Build a new typedef type. 937 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 938 return SemaRef.Context.getTypeDeclType(Typedef); 939 } 940 941 /// Build a new MacroDefined type. 942 QualType RebuildMacroQualifiedType(QualType T, 943 const IdentifierInfo *MacroII) { 944 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 945 } 946 947 /// Build a new class/struct/union type. 948 QualType RebuildRecordType(RecordDecl *Record) { 949 return SemaRef.Context.getTypeDeclType(Record); 950 } 951 952 /// Build a new Enum type. 953 QualType RebuildEnumType(EnumDecl *Enum) { 954 return SemaRef.Context.getTypeDeclType(Enum); 955 } 956 957 /// Build a new typeof(expr) type. 958 /// 959 /// By default, performs semantic analysis when building the typeof type. 960 /// Subclasses may override this routine to provide different behavior. 961 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 962 963 /// Build a new typeof(type) type. 964 /// 965 /// By default, builds a new TypeOfType with the given underlying type. 966 QualType RebuildTypeOfType(QualType Underlying); 967 968 /// Build a new unary transform type. 969 QualType RebuildUnaryTransformType(QualType BaseType, 970 UnaryTransformType::UTTKind UKind, 971 SourceLocation Loc); 972 973 /// Build a new C++11 decltype type. 974 /// 975 /// By default, performs semantic analysis when building the decltype type. 976 /// Subclasses may override this routine to provide different behavior. 977 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 978 979 /// Build a new C++11 auto type. 980 /// 981 /// By default, builds a new AutoType with the given deduced type. 982 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 983 ConceptDecl *TypeConstraintConcept, 984 ArrayRef<TemplateArgument> TypeConstraintArgs) { 985 // Note, IsDependent is always false here: we implicitly convert an 'auto' 986 // which has been deduced to a dependent type into an undeduced 'auto', so 987 // that we'll retry deduction after the transformation. 988 return SemaRef.Context.getAutoType(Deduced, Keyword, 989 /*IsDependent*/ false, /*IsPack=*/false, 990 TypeConstraintConcept, 991 TypeConstraintArgs); 992 } 993 994 /// By default, builds a new DeducedTemplateSpecializationType with the given 995 /// deduced type. 996 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 997 QualType Deduced) { 998 return SemaRef.Context.getDeducedTemplateSpecializationType( 999 Template, Deduced, /*IsDependent*/ false); 1000 } 1001 1002 /// Build a new template specialization type. 1003 /// 1004 /// By default, performs semantic analysis when building the template 1005 /// specialization type. Subclasses may override this routine to provide 1006 /// different behavior. 1007 QualType RebuildTemplateSpecializationType(TemplateName Template, 1008 SourceLocation TemplateLoc, 1009 TemplateArgumentListInfo &Args); 1010 1011 /// Build a new parenthesized type. 1012 /// 1013 /// By default, builds a new ParenType type from the inner type. 1014 /// Subclasses may override this routine to provide different behavior. 1015 QualType RebuildParenType(QualType InnerType) { 1016 return SemaRef.BuildParenType(InnerType); 1017 } 1018 1019 /// Build a new qualified name type. 1020 /// 1021 /// By default, builds a new ElaboratedType type from the keyword, 1022 /// the nested-name-specifier and the named type. 1023 /// Subclasses may override this routine to provide different behavior. 1024 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1025 ElaboratedTypeKeyword Keyword, 1026 NestedNameSpecifierLoc QualifierLoc, 1027 QualType Named) { 1028 return SemaRef.Context.getElaboratedType(Keyword, 1029 QualifierLoc.getNestedNameSpecifier(), 1030 Named); 1031 } 1032 1033 /// Build a new typename type that refers to a template-id. 1034 /// 1035 /// By default, builds a new DependentNameType type from the 1036 /// nested-name-specifier and the given type. Subclasses may override 1037 /// this routine to provide different behavior. 1038 QualType RebuildDependentTemplateSpecializationType( 1039 ElaboratedTypeKeyword Keyword, 1040 NestedNameSpecifierLoc QualifierLoc, 1041 SourceLocation TemplateKWLoc, 1042 const IdentifierInfo *Name, 1043 SourceLocation NameLoc, 1044 TemplateArgumentListInfo &Args, 1045 bool AllowInjectedClassName) { 1046 // Rebuild the template name. 1047 // TODO: avoid TemplateName abstraction 1048 CXXScopeSpec SS; 1049 SS.Adopt(QualifierLoc); 1050 TemplateName InstName = getDerived().RebuildTemplateName( 1051 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1052 AllowInjectedClassName); 1053 1054 if (InstName.isNull()) 1055 return QualType(); 1056 1057 // If it's still dependent, make a dependent specialization. 1058 if (InstName.getAsDependentTemplateName()) 1059 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1060 QualifierLoc.getNestedNameSpecifier(), 1061 Name, 1062 Args); 1063 1064 // Otherwise, make an elaborated type wrapping a non-dependent 1065 // specialization. 1066 QualType T = 1067 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1068 if (T.isNull()) return QualType(); 1069 1070 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1071 return T; 1072 1073 return SemaRef.Context.getElaboratedType(Keyword, 1074 QualifierLoc.getNestedNameSpecifier(), 1075 T); 1076 } 1077 1078 /// Build a new typename type that refers to an identifier. 1079 /// 1080 /// By default, performs semantic analysis when building the typename type 1081 /// (or elaborated type). Subclasses may override this routine to provide 1082 /// different behavior. 1083 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1084 SourceLocation KeywordLoc, 1085 NestedNameSpecifierLoc QualifierLoc, 1086 const IdentifierInfo *Id, 1087 SourceLocation IdLoc, 1088 bool DeducedTSTContext) { 1089 CXXScopeSpec SS; 1090 SS.Adopt(QualifierLoc); 1091 1092 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1093 // If the name is still dependent, just build a new dependent name type. 1094 if (!SemaRef.computeDeclContext(SS)) 1095 return SemaRef.Context.getDependentNameType(Keyword, 1096 QualifierLoc.getNestedNameSpecifier(), 1097 Id); 1098 } 1099 1100 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1101 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1102 *Id, IdLoc, DeducedTSTContext); 1103 } 1104 1105 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1106 1107 // We had a dependent elaborated-type-specifier that has been transformed 1108 // into a non-dependent elaborated-type-specifier. Find the tag we're 1109 // referring to. 1110 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1111 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1112 if (!DC) 1113 return QualType(); 1114 1115 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1116 return QualType(); 1117 1118 TagDecl *Tag = nullptr; 1119 SemaRef.LookupQualifiedName(Result, DC); 1120 switch (Result.getResultKind()) { 1121 case LookupResult::NotFound: 1122 case LookupResult::NotFoundInCurrentInstantiation: 1123 break; 1124 1125 case LookupResult::Found: 1126 Tag = Result.getAsSingle<TagDecl>(); 1127 break; 1128 1129 case LookupResult::FoundOverloaded: 1130 case LookupResult::FoundUnresolvedValue: 1131 llvm_unreachable("Tag lookup cannot find non-tags"); 1132 1133 case LookupResult::Ambiguous: 1134 // Let the LookupResult structure handle ambiguities. 1135 return QualType(); 1136 } 1137 1138 if (!Tag) { 1139 // Check where the name exists but isn't a tag type and use that to emit 1140 // better diagnostics. 1141 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1142 SemaRef.LookupQualifiedName(Result, DC); 1143 switch (Result.getResultKind()) { 1144 case LookupResult::Found: 1145 case LookupResult::FoundOverloaded: 1146 case LookupResult::FoundUnresolvedValue: { 1147 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1148 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1149 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1150 << NTK << Kind; 1151 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1152 break; 1153 } 1154 default: 1155 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1156 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1157 break; 1158 } 1159 return QualType(); 1160 } 1161 1162 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1163 IdLoc, Id)) { 1164 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1165 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1166 return QualType(); 1167 } 1168 1169 // Build the elaborated-type-specifier type. 1170 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1171 return SemaRef.Context.getElaboratedType(Keyword, 1172 QualifierLoc.getNestedNameSpecifier(), 1173 T); 1174 } 1175 1176 /// Build a new pack expansion type. 1177 /// 1178 /// By default, builds a new PackExpansionType type from the given pattern. 1179 /// Subclasses may override this routine to provide different behavior. 1180 QualType RebuildPackExpansionType(QualType Pattern, 1181 SourceRange PatternRange, 1182 SourceLocation EllipsisLoc, 1183 Optional<unsigned> NumExpansions) { 1184 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1185 NumExpansions); 1186 } 1187 1188 /// Build a new atomic type given its value type. 1189 /// 1190 /// By default, performs semantic analysis when building the atomic type. 1191 /// Subclasses may override this routine to provide different behavior. 1192 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1193 1194 /// Build a new pipe type given its value type. 1195 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1196 bool isReadPipe); 1197 1198 /// Build an extended int given its value type. 1199 QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits, 1200 SourceLocation Loc); 1201 1202 /// Build a dependent extended int given its value type. 1203 QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr, 1204 SourceLocation Loc); 1205 1206 /// Build a new template name given a nested name specifier, a flag 1207 /// indicating whether the "template" keyword was provided, and the template 1208 /// that the template name refers to. 1209 /// 1210 /// By default, builds the new template name directly. Subclasses may override 1211 /// this routine to provide different behavior. 1212 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1213 bool TemplateKW, 1214 TemplateDecl *Template); 1215 1216 /// Build a new template name given a nested name specifier and the 1217 /// name that is referred to as a template. 1218 /// 1219 /// By default, performs semantic analysis to determine whether the name can 1220 /// be resolved to a specific template, then builds the appropriate kind of 1221 /// template name. Subclasses may override this routine to provide different 1222 /// behavior. 1223 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1224 SourceLocation TemplateKWLoc, 1225 const IdentifierInfo &Name, 1226 SourceLocation NameLoc, QualType ObjectType, 1227 NamedDecl *FirstQualifierInScope, 1228 bool AllowInjectedClassName); 1229 1230 /// Build a new template name given a nested name specifier and the 1231 /// overloaded operator name that is referred to as a template. 1232 /// 1233 /// By default, performs semantic analysis to determine whether the name can 1234 /// be resolved to a specific template, then builds the appropriate kind of 1235 /// template name. Subclasses may override this routine to provide different 1236 /// behavior. 1237 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1238 SourceLocation TemplateKWLoc, 1239 OverloadedOperatorKind Operator, 1240 SourceLocation NameLoc, QualType ObjectType, 1241 bool AllowInjectedClassName); 1242 1243 /// Build a new template name given a template template parameter pack 1244 /// and the 1245 /// 1246 /// By default, performs semantic analysis to determine whether the name can 1247 /// be resolved to a specific template, then builds the appropriate kind of 1248 /// template name. Subclasses may override this routine to provide different 1249 /// behavior. 1250 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1251 const TemplateArgument &ArgPack) { 1252 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1253 } 1254 1255 /// Build a new compound statement. 1256 /// 1257 /// By default, performs semantic analysis to build the new statement. 1258 /// Subclasses may override this routine to provide different behavior. 1259 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1260 MultiStmtArg Statements, 1261 SourceLocation RBraceLoc, 1262 bool IsStmtExpr) { 1263 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1264 IsStmtExpr); 1265 } 1266 1267 /// Build a new case statement. 1268 /// 1269 /// By default, performs semantic analysis to build the new statement. 1270 /// Subclasses may override this routine to provide different behavior. 1271 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1272 Expr *LHS, 1273 SourceLocation EllipsisLoc, 1274 Expr *RHS, 1275 SourceLocation ColonLoc) { 1276 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1277 ColonLoc); 1278 } 1279 1280 /// Attach the body to a new case statement. 1281 /// 1282 /// By default, performs semantic analysis to build the new statement. 1283 /// Subclasses may override this routine to provide different behavior. 1284 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1285 getSema().ActOnCaseStmtBody(S, Body); 1286 return S; 1287 } 1288 1289 /// Build a new default statement. 1290 /// 1291 /// By default, performs semantic analysis to build the new statement. 1292 /// Subclasses may override this routine to provide different behavior. 1293 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1294 SourceLocation ColonLoc, 1295 Stmt *SubStmt) { 1296 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1297 /*CurScope=*/nullptr); 1298 } 1299 1300 /// Build a new label statement. 1301 /// 1302 /// By default, performs semantic analysis to build the new statement. 1303 /// Subclasses may override this routine to provide different behavior. 1304 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1305 SourceLocation ColonLoc, Stmt *SubStmt) { 1306 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1307 } 1308 1309 /// Build a new attributed statement. 1310 /// 1311 /// By default, performs semantic analysis to build the new statement. 1312 /// Subclasses may override this routine to provide different behavior. 1313 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1314 ArrayRef<const Attr *> Attrs, 1315 Stmt *SubStmt) { 1316 return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt); 1317 } 1318 1319 /// Build a new "if" statement. 1320 /// 1321 /// By default, performs semantic analysis to build the new statement. 1322 /// Subclasses may override this routine to provide different behavior. 1323 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1324 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1325 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1326 SourceLocation ElseLoc, Stmt *Else) { 1327 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond, 1328 RParenLoc, Then, ElseLoc, Else); 1329 } 1330 1331 /// Start building a new switch statement. 1332 /// 1333 /// By default, performs semantic analysis to build the new statement. 1334 /// Subclasses may override this routine to provide different behavior. 1335 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1336 SourceLocation LParenLoc, Stmt *Init, 1337 Sema::ConditionResult Cond, 1338 SourceLocation RParenLoc) { 1339 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1340 RParenLoc); 1341 } 1342 1343 /// Attach the body to the switch statement. 1344 /// 1345 /// By default, performs semantic analysis to build the new statement. 1346 /// Subclasses may override this routine to provide different behavior. 1347 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1348 Stmt *Switch, Stmt *Body) { 1349 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1350 } 1351 1352 /// Build a new while statement. 1353 /// 1354 /// By default, performs semantic analysis to build the new statement. 1355 /// Subclasses may override this routine to provide different behavior. 1356 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1357 Sema::ConditionResult Cond, 1358 SourceLocation RParenLoc, Stmt *Body) { 1359 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1360 } 1361 1362 /// Build a new do-while statement. 1363 /// 1364 /// By default, performs semantic analysis to build the new statement. 1365 /// Subclasses may override this routine to provide different behavior. 1366 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1367 SourceLocation WhileLoc, SourceLocation LParenLoc, 1368 Expr *Cond, SourceLocation RParenLoc) { 1369 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1370 Cond, RParenLoc); 1371 } 1372 1373 /// Build a new for statement. 1374 /// 1375 /// By default, performs semantic analysis to build the new statement. 1376 /// Subclasses may override this routine to provide different behavior. 1377 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1378 Stmt *Init, Sema::ConditionResult Cond, 1379 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1380 Stmt *Body) { 1381 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1382 Inc, RParenLoc, Body); 1383 } 1384 1385 /// Build a new goto statement. 1386 /// 1387 /// By default, performs semantic analysis to build the new statement. 1388 /// Subclasses may override this routine to provide different behavior. 1389 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1390 LabelDecl *Label) { 1391 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1392 } 1393 1394 /// Build a new indirect goto statement. 1395 /// 1396 /// By default, performs semantic analysis to build the new statement. 1397 /// Subclasses may override this routine to provide different behavior. 1398 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1399 SourceLocation StarLoc, 1400 Expr *Target) { 1401 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1402 } 1403 1404 /// Build a new return statement. 1405 /// 1406 /// By default, performs semantic analysis to build the new statement. 1407 /// Subclasses may override this routine to provide different behavior. 1408 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1409 return getSema().BuildReturnStmt(ReturnLoc, Result); 1410 } 1411 1412 /// Build a new declaration statement. 1413 /// 1414 /// By default, performs semantic analysis to build the new statement. 1415 /// Subclasses may override this routine to provide different behavior. 1416 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1417 SourceLocation StartLoc, SourceLocation EndLoc) { 1418 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1419 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1420 } 1421 1422 /// Build a new inline asm statement. 1423 /// 1424 /// By default, performs semantic analysis to build the new statement. 1425 /// Subclasses may override this routine to provide different behavior. 1426 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1427 bool IsVolatile, unsigned NumOutputs, 1428 unsigned NumInputs, IdentifierInfo **Names, 1429 MultiExprArg Constraints, MultiExprArg Exprs, 1430 Expr *AsmString, MultiExprArg Clobbers, 1431 unsigned NumLabels, 1432 SourceLocation RParenLoc) { 1433 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1434 NumInputs, Names, Constraints, Exprs, 1435 AsmString, Clobbers, NumLabels, RParenLoc); 1436 } 1437 1438 /// Build a new MS style inline asm statement. 1439 /// 1440 /// By default, performs semantic analysis to build the new statement. 1441 /// Subclasses may override this routine to provide different behavior. 1442 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1443 ArrayRef<Token> AsmToks, 1444 StringRef AsmString, 1445 unsigned NumOutputs, unsigned NumInputs, 1446 ArrayRef<StringRef> Constraints, 1447 ArrayRef<StringRef> Clobbers, 1448 ArrayRef<Expr*> Exprs, 1449 SourceLocation EndLoc) { 1450 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1451 NumOutputs, NumInputs, 1452 Constraints, Clobbers, Exprs, EndLoc); 1453 } 1454 1455 /// Build a new co_return statement. 1456 /// 1457 /// By default, performs semantic analysis to build the new statement. 1458 /// Subclasses may override this routine to provide different behavior. 1459 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1460 bool IsImplicit) { 1461 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1462 } 1463 1464 /// Build a new co_await expression. 1465 /// 1466 /// By default, performs semantic analysis to build the new expression. 1467 /// Subclasses may override this routine to provide different behavior. 1468 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1469 bool IsImplicit) { 1470 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1471 } 1472 1473 /// Build a new co_await expression. 1474 /// 1475 /// By default, performs semantic analysis to build the new expression. 1476 /// Subclasses may override this routine to provide different behavior. 1477 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1478 Expr *Result, 1479 UnresolvedLookupExpr *Lookup) { 1480 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1481 } 1482 1483 /// Build a new co_yield expression. 1484 /// 1485 /// By default, performs semantic analysis to build the new expression. 1486 /// Subclasses may override this routine to provide different behavior. 1487 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1488 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1489 } 1490 1491 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1492 return getSema().BuildCoroutineBodyStmt(Args); 1493 } 1494 1495 /// Build a new Objective-C \@try statement. 1496 /// 1497 /// By default, performs semantic analysis to build the new statement. 1498 /// Subclasses may override this routine to provide different behavior. 1499 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1500 Stmt *TryBody, 1501 MultiStmtArg CatchStmts, 1502 Stmt *Finally) { 1503 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1504 Finally); 1505 } 1506 1507 /// Rebuild an Objective-C exception declaration. 1508 /// 1509 /// By default, performs semantic analysis to build the new declaration. 1510 /// Subclasses may override this routine to provide different behavior. 1511 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1512 TypeSourceInfo *TInfo, QualType T) { 1513 return getSema().BuildObjCExceptionDecl(TInfo, T, 1514 ExceptionDecl->getInnerLocStart(), 1515 ExceptionDecl->getLocation(), 1516 ExceptionDecl->getIdentifier()); 1517 } 1518 1519 /// Build a new Objective-C \@catch statement. 1520 /// 1521 /// By default, performs semantic analysis to build the new statement. 1522 /// Subclasses may override this routine to provide different behavior. 1523 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1524 SourceLocation RParenLoc, 1525 VarDecl *Var, 1526 Stmt *Body) { 1527 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1528 Var, Body); 1529 } 1530 1531 /// Build a new Objective-C \@finally statement. 1532 /// 1533 /// By default, performs semantic analysis to build the new statement. 1534 /// Subclasses may override this routine to provide different behavior. 1535 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1536 Stmt *Body) { 1537 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1538 } 1539 1540 /// Build a new Objective-C \@throw statement. 1541 /// 1542 /// By default, performs semantic analysis to build the new statement. 1543 /// Subclasses may override this routine to provide different behavior. 1544 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1545 Expr *Operand) { 1546 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1547 } 1548 1549 /// Build a new OpenMP Canonical loop. 1550 /// 1551 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1552 /// OMPCanonicalLoop. 1553 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1554 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1555 } 1556 1557 /// Build a new OpenMP executable directive. 1558 /// 1559 /// By default, performs semantic analysis to build the new statement. 1560 /// Subclasses may override this routine to provide different behavior. 1561 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1562 DeclarationNameInfo DirName, 1563 OpenMPDirectiveKind CancelRegion, 1564 ArrayRef<OMPClause *> Clauses, 1565 Stmt *AStmt, SourceLocation StartLoc, 1566 SourceLocation EndLoc) { 1567 return getSema().ActOnOpenMPExecutableDirective( 1568 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1569 } 1570 1571 /// Build a new OpenMP 'if' clause. 1572 /// 1573 /// By default, performs semantic analysis to build the new OpenMP clause. 1574 /// Subclasses may override this routine to provide different behavior. 1575 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1576 Expr *Condition, SourceLocation StartLoc, 1577 SourceLocation LParenLoc, 1578 SourceLocation NameModifierLoc, 1579 SourceLocation ColonLoc, 1580 SourceLocation EndLoc) { 1581 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1582 LParenLoc, NameModifierLoc, ColonLoc, 1583 EndLoc); 1584 } 1585 1586 /// Build a new OpenMP 'final' clause. 1587 /// 1588 /// By default, performs semantic analysis to build the new OpenMP clause. 1589 /// Subclasses may override this routine to provide different behavior. 1590 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1591 SourceLocation LParenLoc, 1592 SourceLocation EndLoc) { 1593 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1594 EndLoc); 1595 } 1596 1597 /// Build a new OpenMP 'num_threads' clause. 1598 /// 1599 /// By default, performs semantic analysis to build the new OpenMP clause. 1600 /// Subclasses may override this routine to provide different behavior. 1601 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1602 SourceLocation StartLoc, 1603 SourceLocation LParenLoc, 1604 SourceLocation EndLoc) { 1605 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1606 LParenLoc, EndLoc); 1607 } 1608 1609 /// Build a new OpenMP 'safelen' clause. 1610 /// 1611 /// By default, performs semantic analysis to build the new OpenMP clause. 1612 /// Subclasses may override this routine to provide different behavior. 1613 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1614 SourceLocation LParenLoc, 1615 SourceLocation EndLoc) { 1616 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1617 } 1618 1619 /// Build a new OpenMP 'simdlen' clause. 1620 /// 1621 /// By default, performs semantic analysis to build the new OpenMP clause. 1622 /// Subclasses may override this routine to provide different behavior. 1623 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1624 SourceLocation LParenLoc, 1625 SourceLocation EndLoc) { 1626 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1627 } 1628 1629 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1630 SourceLocation StartLoc, 1631 SourceLocation LParenLoc, 1632 SourceLocation EndLoc) { 1633 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1634 } 1635 1636 /// Build a new OpenMP 'allocator' clause. 1637 /// 1638 /// By default, performs semantic analysis to build the new OpenMP clause. 1639 /// Subclasses may override this routine to provide different behavior. 1640 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1641 SourceLocation LParenLoc, 1642 SourceLocation EndLoc) { 1643 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1644 } 1645 1646 /// Build a new OpenMP 'collapse' clause. 1647 /// 1648 /// By default, performs semantic analysis to build the new OpenMP clause. 1649 /// Subclasses may override this routine to provide different behavior. 1650 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1651 SourceLocation LParenLoc, 1652 SourceLocation EndLoc) { 1653 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1654 EndLoc); 1655 } 1656 1657 /// Build a new OpenMP 'default' clause. 1658 /// 1659 /// By default, performs semantic analysis to build the new OpenMP clause. 1660 /// Subclasses may override this routine to provide different behavior. 1661 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1662 SourceLocation StartLoc, 1663 SourceLocation LParenLoc, 1664 SourceLocation EndLoc) { 1665 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1666 StartLoc, LParenLoc, EndLoc); 1667 } 1668 1669 /// Build a new OpenMP 'proc_bind' clause. 1670 /// 1671 /// By default, performs semantic analysis to build the new OpenMP clause. 1672 /// Subclasses may override this routine to provide different behavior. 1673 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1674 SourceLocation KindKwLoc, 1675 SourceLocation StartLoc, 1676 SourceLocation LParenLoc, 1677 SourceLocation EndLoc) { 1678 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1679 StartLoc, LParenLoc, EndLoc); 1680 } 1681 1682 /// Build a new OpenMP 'schedule' clause. 1683 /// 1684 /// By default, performs semantic analysis to build the new OpenMP clause. 1685 /// Subclasses may override this routine to provide different behavior. 1686 OMPClause *RebuildOMPScheduleClause( 1687 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1688 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1689 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1690 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1691 return getSema().ActOnOpenMPScheduleClause( 1692 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1693 CommaLoc, EndLoc); 1694 } 1695 1696 /// Build a new OpenMP 'ordered' clause. 1697 /// 1698 /// By default, performs semantic analysis to build the new OpenMP clause. 1699 /// Subclasses may override this routine to provide different behavior. 1700 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1701 SourceLocation EndLoc, 1702 SourceLocation LParenLoc, Expr *Num) { 1703 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1704 } 1705 1706 /// Build a new OpenMP 'private' clause. 1707 /// 1708 /// By default, performs semantic analysis to build the new OpenMP clause. 1709 /// Subclasses may override this routine to provide different behavior. 1710 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1711 SourceLocation StartLoc, 1712 SourceLocation LParenLoc, 1713 SourceLocation EndLoc) { 1714 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1715 EndLoc); 1716 } 1717 1718 /// Build a new OpenMP 'firstprivate' clause. 1719 /// 1720 /// By default, performs semantic analysis to build the new OpenMP clause. 1721 /// Subclasses may override this routine to provide different behavior. 1722 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1723 SourceLocation StartLoc, 1724 SourceLocation LParenLoc, 1725 SourceLocation EndLoc) { 1726 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1727 EndLoc); 1728 } 1729 1730 /// Build a new OpenMP 'lastprivate' clause. 1731 /// 1732 /// By default, performs semantic analysis to build the new OpenMP clause. 1733 /// Subclasses may override this routine to provide different behavior. 1734 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1735 OpenMPLastprivateModifier LPKind, 1736 SourceLocation LPKindLoc, 1737 SourceLocation ColonLoc, 1738 SourceLocation StartLoc, 1739 SourceLocation LParenLoc, 1740 SourceLocation EndLoc) { 1741 return getSema().ActOnOpenMPLastprivateClause( 1742 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1743 } 1744 1745 /// Build a new OpenMP 'shared' clause. 1746 /// 1747 /// By default, performs semantic analysis to build the new OpenMP clause. 1748 /// Subclasses may override this routine to provide different behavior. 1749 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1750 SourceLocation StartLoc, 1751 SourceLocation LParenLoc, 1752 SourceLocation EndLoc) { 1753 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1754 EndLoc); 1755 } 1756 1757 /// Build a new OpenMP 'reduction' clause. 1758 /// 1759 /// By default, performs semantic analysis to build the new statement. 1760 /// Subclasses may override this routine to provide different behavior. 1761 OMPClause *RebuildOMPReductionClause( 1762 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1763 SourceLocation StartLoc, SourceLocation LParenLoc, 1764 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1765 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1766 const DeclarationNameInfo &ReductionId, 1767 ArrayRef<Expr *> UnresolvedReductions) { 1768 return getSema().ActOnOpenMPReductionClause( 1769 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1770 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1771 } 1772 1773 /// Build a new OpenMP 'task_reduction' clause. 1774 /// 1775 /// By default, performs semantic analysis to build the new statement. 1776 /// Subclasses may override this routine to provide different behavior. 1777 OMPClause *RebuildOMPTaskReductionClause( 1778 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1779 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1780 CXXScopeSpec &ReductionIdScopeSpec, 1781 const DeclarationNameInfo &ReductionId, 1782 ArrayRef<Expr *> UnresolvedReductions) { 1783 return getSema().ActOnOpenMPTaskReductionClause( 1784 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1785 ReductionId, UnresolvedReductions); 1786 } 1787 1788 /// Build a new OpenMP 'in_reduction' clause. 1789 /// 1790 /// By default, performs semantic analysis to build the new statement. 1791 /// Subclasses may override this routine to provide different behavior. 1792 OMPClause * 1793 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1794 SourceLocation LParenLoc, SourceLocation ColonLoc, 1795 SourceLocation EndLoc, 1796 CXXScopeSpec &ReductionIdScopeSpec, 1797 const DeclarationNameInfo &ReductionId, 1798 ArrayRef<Expr *> UnresolvedReductions) { 1799 return getSema().ActOnOpenMPInReductionClause( 1800 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1801 ReductionId, UnresolvedReductions); 1802 } 1803 1804 /// Build a new OpenMP 'linear' clause. 1805 /// 1806 /// By default, performs semantic analysis to build the new OpenMP clause. 1807 /// Subclasses may override this routine to provide different behavior. 1808 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1809 SourceLocation StartLoc, 1810 SourceLocation LParenLoc, 1811 OpenMPLinearClauseKind Modifier, 1812 SourceLocation ModifierLoc, 1813 SourceLocation ColonLoc, 1814 SourceLocation EndLoc) { 1815 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1816 Modifier, ModifierLoc, ColonLoc, 1817 EndLoc); 1818 } 1819 1820 /// Build a new OpenMP 'aligned' clause. 1821 /// 1822 /// By default, performs semantic analysis to build the new OpenMP clause. 1823 /// Subclasses may override this routine to provide different behavior. 1824 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1825 SourceLocation StartLoc, 1826 SourceLocation LParenLoc, 1827 SourceLocation ColonLoc, 1828 SourceLocation EndLoc) { 1829 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1830 LParenLoc, ColonLoc, EndLoc); 1831 } 1832 1833 /// Build a new OpenMP 'copyin' clause. 1834 /// 1835 /// By default, performs semantic analysis to build the new OpenMP clause. 1836 /// Subclasses may override this routine to provide different behavior. 1837 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1838 SourceLocation StartLoc, 1839 SourceLocation LParenLoc, 1840 SourceLocation EndLoc) { 1841 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1842 EndLoc); 1843 } 1844 1845 /// Build a new OpenMP 'copyprivate' clause. 1846 /// 1847 /// By default, performs semantic analysis to build the new OpenMP clause. 1848 /// Subclasses may override this routine to provide different behavior. 1849 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1850 SourceLocation StartLoc, 1851 SourceLocation LParenLoc, 1852 SourceLocation EndLoc) { 1853 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1854 EndLoc); 1855 } 1856 1857 /// Build a new OpenMP 'flush' pseudo clause. 1858 /// 1859 /// By default, performs semantic analysis to build the new OpenMP clause. 1860 /// Subclasses may override this routine to provide different behavior. 1861 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1862 SourceLocation StartLoc, 1863 SourceLocation LParenLoc, 1864 SourceLocation EndLoc) { 1865 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1866 EndLoc); 1867 } 1868 1869 /// Build a new OpenMP 'depobj' pseudo clause. 1870 /// 1871 /// By default, performs semantic analysis to build the new OpenMP clause. 1872 /// Subclasses may override this routine to provide different behavior. 1873 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1874 SourceLocation LParenLoc, 1875 SourceLocation EndLoc) { 1876 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1877 EndLoc); 1878 } 1879 1880 /// Build a new OpenMP 'depend' pseudo clause. 1881 /// 1882 /// By default, performs semantic analysis to build the new OpenMP clause. 1883 /// Subclasses may override this routine to provide different behavior. 1884 OMPClause * 1885 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1886 SourceLocation DepLoc, SourceLocation ColonLoc, 1887 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1888 SourceLocation LParenLoc, SourceLocation EndLoc) { 1889 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1890 ColonLoc, VarList, StartLoc, 1891 LParenLoc, EndLoc); 1892 } 1893 1894 /// Build a new OpenMP 'device' clause. 1895 /// 1896 /// By default, performs semantic analysis to build the new statement. 1897 /// Subclasses may override this routine to provide different behavior. 1898 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1899 Expr *Device, SourceLocation StartLoc, 1900 SourceLocation LParenLoc, 1901 SourceLocation ModifierLoc, 1902 SourceLocation EndLoc) { 1903 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1904 LParenLoc, ModifierLoc, EndLoc); 1905 } 1906 1907 /// Build a new OpenMP 'map' clause. 1908 /// 1909 /// By default, performs semantic analysis to build the new OpenMP clause. 1910 /// Subclasses may override this routine to provide different behavior. 1911 OMPClause *RebuildOMPMapClause( 1912 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1913 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1914 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1915 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1916 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1917 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1918 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1919 MapperIdScopeSpec, MapperId, MapType, 1920 IsMapTypeImplicit, MapLoc, ColonLoc, 1921 VarList, Locs, UnresolvedMappers); 1922 } 1923 1924 /// Build a new OpenMP 'allocate' clause. 1925 /// 1926 /// By default, performs semantic analysis to build the new OpenMP clause. 1927 /// Subclasses may override this routine to provide different behavior. 1928 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1929 SourceLocation StartLoc, 1930 SourceLocation LParenLoc, 1931 SourceLocation ColonLoc, 1932 SourceLocation EndLoc) { 1933 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1934 LParenLoc, ColonLoc, EndLoc); 1935 } 1936 1937 /// Build a new OpenMP 'num_teams' clause. 1938 /// 1939 /// By default, performs semantic analysis to build the new statement. 1940 /// Subclasses may override this routine to provide different behavior. 1941 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1942 SourceLocation LParenLoc, 1943 SourceLocation EndLoc) { 1944 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1945 EndLoc); 1946 } 1947 1948 /// Build a new OpenMP 'thread_limit' clause. 1949 /// 1950 /// By default, performs semantic analysis to build the new statement. 1951 /// Subclasses may override this routine to provide different behavior. 1952 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1953 SourceLocation StartLoc, 1954 SourceLocation LParenLoc, 1955 SourceLocation EndLoc) { 1956 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1957 LParenLoc, EndLoc); 1958 } 1959 1960 /// Build a new OpenMP 'priority' clause. 1961 /// 1962 /// By default, performs semantic analysis to build the new statement. 1963 /// Subclasses may override this routine to provide different behavior. 1964 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1965 SourceLocation LParenLoc, 1966 SourceLocation EndLoc) { 1967 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1968 EndLoc); 1969 } 1970 1971 /// Build a new OpenMP 'grainsize' clause. 1972 /// 1973 /// By default, performs semantic analysis to build the new statement. 1974 /// Subclasses may override this routine to provide different behavior. 1975 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1976 SourceLocation LParenLoc, 1977 SourceLocation EndLoc) { 1978 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1979 EndLoc); 1980 } 1981 1982 /// Build a new OpenMP 'num_tasks' clause. 1983 /// 1984 /// By default, performs semantic analysis to build the new statement. 1985 /// Subclasses may override this routine to provide different behavior. 1986 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1987 SourceLocation LParenLoc, 1988 SourceLocation EndLoc) { 1989 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1990 EndLoc); 1991 } 1992 1993 /// Build a new OpenMP 'hint' clause. 1994 /// 1995 /// By default, performs semantic analysis to build the new statement. 1996 /// Subclasses may override this routine to provide different behavior. 1997 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1998 SourceLocation LParenLoc, 1999 SourceLocation EndLoc) { 2000 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2001 } 2002 2003 /// Build a new OpenMP 'detach' clause. 2004 /// 2005 /// By default, performs semantic analysis to build the new statement. 2006 /// Subclasses may override this routine to provide different behavior. 2007 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2008 SourceLocation LParenLoc, 2009 SourceLocation EndLoc) { 2010 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2011 } 2012 2013 /// Build a new OpenMP 'dist_schedule' clause. 2014 /// 2015 /// By default, performs semantic analysis to build the new OpenMP clause. 2016 /// Subclasses may override this routine to provide different behavior. 2017 OMPClause * 2018 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2019 Expr *ChunkSize, SourceLocation StartLoc, 2020 SourceLocation LParenLoc, SourceLocation KindLoc, 2021 SourceLocation CommaLoc, SourceLocation EndLoc) { 2022 return getSema().ActOnOpenMPDistScheduleClause( 2023 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2024 } 2025 2026 /// Build a new OpenMP 'to' clause. 2027 /// 2028 /// By default, performs semantic analysis to build the new statement. 2029 /// Subclasses may override this routine to provide different behavior. 2030 OMPClause * 2031 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2032 ArrayRef<SourceLocation> MotionModifiersLoc, 2033 CXXScopeSpec &MapperIdScopeSpec, 2034 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2035 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2036 ArrayRef<Expr *> UnresolvedMappers) { 2037 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2038 MapperIdScopeSpec, MapperId, ColonLoc, 2039 VarList, Locs, UnresolvedMappers); 2040 } 2041 2042 /// Build a new OpenMP 'from' clause. 2043 /// 2044 /// By default, performs semantic analysis to build the new statement. 2045 /// Subclasses may override this routine to provide different behavior. 2046 OMPClause * 2047 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2048 ArrayRef<SourceLocation> MotionModifiersLoc, 2049 CXXScopeSpec &MapperIdScopeSpec, 2050 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2051 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2052 ArrayRef<Expr *> UnresolvedMappers) { 2053 return getSema().ActOnOpenMPFromClause( 2054 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2055 ColonLoc, VarList, Locs, UnresolvedMappers); 2056 } 2057 2058 /// Build a new OpenMP 'use_device_ptr' clause. 2059 /// 2060 /// By default, performs semantic analysis to build the new OpenMP clause. 2061 /// Subclasses may override this routine to provide different behavior. 2062 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2063 const OMPVarListLocTy &Locs) { 2064 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2065 } 2066 2067 /// Build a new OpenMP 'use_device_addr' clause. 2068 /// 2069 /// By default, performs semantic analysis to build the new OpenMP clause. 2070 /// Subclasses may override this routine to provide different behavior. 2071 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2072 const OMPVarListLocTy &Locs) { 2073 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2074 } 2075 2076 /// Build a new OpenMP 'is_device_ptr' clause. 2077 /// 2078 /// By default, performs semantic analysis to build the new OpenMP clause. 2079 /// Subclasses may override this routine to provide different behavior. 2080 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2081 const OMPVarListLocTy &Locs) { 2082 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2083 } 2084 2085 /// Build a new OpenMP 'defaultmap' clause. 2086 /// 2087 /// By default, performs semantic analysis to build the new OpenMP clause. 2088 /// Subclasses may override this routine to provide different behavior. 2089 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2090 OpenMPDefaultmapClauseKind Kind, 2091 SourceLocation StartLoc, 2092 SourceLocation LParenLoc, 2093 SourceLocation MLoc, 2094 SourceLocation KindLoc, 2095 SourceLocation EndLoc) { 2096 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2097 MLoc, KindLoc, EndLoc); 2098 } 2099 2100 /// Build a new OpenMP 'nontemporal' clause. 2101 /// 2102 /// By default, performs semantic analysis to build the new OpenMP clause. 2103 /// Subclasses may override this routine to provide different behavior. 2104 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2105 SourceLocation StartLoc, 2106 SourceLocation LParenLoc, 2107 SourceLocation EndLoc) { 2108 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2109 EndLoc); 2110 } 2111 2112 /// Build a new OpenMP 'inclusive' clause. 2113 /// 2114 /// By default, performs semantic analysis to build the new OpenMP clause. 2115 /// Subclasses may override this routine to provide different behavior. 2116 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2117 SourceLocation StartLoc, 2118 SourceLocation LParenLoc, 2119 SourceLocation EndLoc) { 2120 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2121 EndLoc); 2122 } 2123 2124 /// Build a new OpenMP 'exclusive' clause. 2125 /// 2126 /// By default, performs semantic analysis to build the new OpenMP clause. 2127 /// Subclasses may override this routine to provide different behavior. 2128 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2129 SourceLocation StartLoc, 2130 SourceLocation LParenLoc, 2131 SourceLocation EndLoc) { 2132 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2133 EndLoc); 2134 } 2135 2136 /// Build a new OpenMP 'uses_allocators' clause. 2137 /// 2138 /// By default, performs semantic analysis to build the new OpenMP clause. 2139 /// Subclasses may override this routine to provide different behavior. 2140 OMPClause *RebuildOMPUsesAllocatorsClause( 2141 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2142 SourceLocation LParenLoc, SourceLocation EndLoc) { 2143 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2144 Data); 2145 } 2146 2147 /// Build a new OpenMP 'affinity' clause. 2148 /// 2149 /// By default, performs semantic analysis to build the new OpenMP clause. 2150 /// Subclasses may override this routine to provide different behavior. 2151 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2152 SourceLocation LParenLoc, 2153 SourceLocation ColonLoc, 2154 SourceLocation EndLoc, Expr *Modifier, 2155 ArrayRef<Expr *> Locators) { 2156 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2157 EndLoc, Modifier, Locators); 2158 } 2159 2160 /// Build a new OpenMP 'order' clause. 2161 /// 2162 /// By default, performs semantic analysis to build the new OpenMP clause. 2163 /// Subclasses may override this routine to provide different behavior. 2164 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2165 SourceLocation KindKwLoc, 2166 SourceLocation StartLoc, 2167 SourceLocation LParenLoc, 2168 SourceLocation EndLoc) { 2169 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2170 LParenLoc, EndLoc); 2171 } 2172 2173 /// Build a new OpenMP 'init' clause. 2174 /// 2175 /// By default, performs semantic analysis to build the new OpenMP clause. 2176 /// Subclasses may override this routine to provide different behavior. 2177 OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2178 bool IsTarget, bool IsTargetSync, 2179 SourceLocation StartLoc, 2180 SourceLocation LParenLoc, 2181 SourceLocation VarLoc, 2182 SourceLocation EndLoc) { 2183 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2184 IsTargetSync, StartLoc, LParenLoc, 2185 VarLoc, EndLoc); 2186 } 2187 2188 /// Build a new OpenMP 'use' clause. 2189 /// 2190 /// By default, performs semantic analysis to build the new OpenMP clause. 2191 /// Subclasses may override this routine to provide different behavior. 2192 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2193 SourceLocation LParenLoc, 2194 SourceLocation VarLoc, SourceLocation EndLoc) { 2195 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2196 VarLoc, EndLoc); 2197 } 2198 2199 /// Build a new OpenMP 'destroy' clause. 2200 /// 2201 /// By default, performs semantic analysis to build the new OpenMP clause. 2202 /// Subclasses may override this routine to provide different behavior. 2203 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2204 SourceLocation LParenLoc, 2205 SourceLocation VarLoc, 2206 SourceLocation EndLoc) { 2207 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2208 VarLoc, EndLoc); 2209 } 2210 2211 /// Build a new OpenMP 'novariants' clause. 2212 /// 2213 /// By default, performs semantic analysis to build the new OpenMP clause. 2214 /// Subclasses may override this routine to provide different behavior. 2215 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2216 SourceLocation StartLoc, 2217 SourceLocation LParenLoc, 2218 SourceLocation EndLoc) { 2219 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2220 EndLoc); 2221 } 2222 2223 /// Build a new OpenMP 'nocontext' clause. 2224 /// 2225 /// By default, performs semantic analysis to build the new OpenMP clause. 2226 /// Subclasses may override this routine to provide different behavior. 2227 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2228 SourceLocation LParenLoc, 2229 SourceLocation EndLoc) { 2230 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2231 EndLoc); 2232 } 2233 2234 /// Build a new OpenMP 'filter' clause. 2235 /// 2236 /// By default, performs semantic analysis to build the new OpenMP clause. 2237 /// Subclasses may override this routine to provide different behavior. 2238 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2239 SourceLocation LParenLoc, 2240 SourceLocation EndLoc) { 2241 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2242 EndLoc); 2243 } 2244 2245 /// Rebuild the operand to an Objective-C \@synchronized statement. 2246 /// 2247 /// By default, performs semantic analysis to build the new statement. 2248 /// Subclasses may override this routine to provide different behavior. 2249 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2250 Expr *object) { 2251 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2252 } 2253 2254 /// Build a new Objective-C \@synchronized statement. 2255 /// 2256 /// By default, performs semantic analysis to build the new statement. 2257 /// Subclasses may override this routine to provide different behavior. 2258 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2259 Expr *Object, Stmt *Body) { 2260 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2261 } 2262 2263 /// Build a new Objective-C \@autoreleasepool statement. 2264 /// 2265 /// By default, performs semantic analysis to build the new statement. 2266 /// Subclasses may override this routine to provide different behavior. 2267 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2268 Stmt *Body) { 2269 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2270 } 2271 2272 /// Build a new Objective-C fast enumeration statement. 2273 /// 2274 /// By default, performs semantic analysis to build the new statement. 2275 /// Subclasses may override this routine to provide different behavior. 2276 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2277 Stmt *Element, 2278 Expr *Collection, 2279 SourceLocation RParenLoc, 2280 Stmt *Body) { 2281 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2282 Element, 2283 Collection, 2284 RParenLoc); 2285 if (ForEachStmt.isInvalid()) 2286 return StmtError(); 2287 2288 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2289 } 2290 2291 /// Build a new C++ exception declaration. 2292 /// 2293 /// By default, performs semantic analysis to build the new decaration. 2294 /// Subclasses may override this routine to provide different behavior. 2295 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2296 TypeSourceInfo *Declarator, 2297 SourceLocation StartLoc, 2298 SourceLocation IdLoc, 2299 IdentifierInfo *Id) { 2300 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2301 StartLoc, IdLoc, Id); 2302 if (Var) 2303 getSema().CurContext->addDecl(Var); 2304 return Var; 2305 } 2306 2307 /// Build a new C++ catch statement. 2308 /// 2309 /// By default, performs semantic analysis to build the new statement. 2310 /// Subclasses may override this routine to provide different behavior. 2311 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2312 VarDecl *ExceptionDecl, 2313 Stmt *Handler) { 2314 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2315 Handler)); 2316 } 2317 2318 /// Build a new C++ try statement. 2319 /// 2320 /// By default, performs semantic analysis to build the new statement. 2321 /// Subclasses may override this routine to provide different behavior. 2322 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2323 ArrayRef<Stmt *> Handlers) { 2324 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2325 } 2326 2327 /// Build a new C++0x range-based for statement. 2328 /// 2329 /// By default, performs semantic analysis to build the new statement. 2330 /// Subclasses may override this routine to provide different behavior. 2331 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2332 SourceLocation CoawaitLoc, Stmt *Init, 2333 SourceLocation ColonLoc, Stmt *Range, 2334 Stmt *Begin, Stmt *End, Expr *Cond, 2335 Expr *Inc, Stmt *LoopVar, 2336 SourceLocation RParenLoc) { 2337 // If we've just learned that the range is actually an Objective-C 2338 // collection, treat this as an Objective-C fast enumeration loop. 2339 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2340 if (RangeStmt->isSingleDecl()) { 2341 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2342 if (RangeVar->isInvalidDecl()) 2343 return StmtError(); 2344 2345 Expr *RangeExpr = RangeVar->getInit(); 2346 if (!RangeExpr->isTypeDependent() && 2347 RangeExpr->getType()->isObjCObjectPointerType()) { 2348 // FIXME: Support init-statements in Objective-C++20 ranged for 2349 // statement. 2350 if (Init) { 2351 return SemaRef.Diag(Init->getBeginLoc(), 2352 diag::err_objc_for_range_init_stmt) 2353 << Init->getSourceRange(); 2354 } 2355 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2356 RangeExpr, RParenLoc); 2357 } 2358 } 2359 } 2360 } 2361 2362 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2363 Range, Begin, End, Cond, Inc, LoopVar, 2364 RParenLoc, Sema::BFRK_Rebuild); 2365 } 2366 2367 /// Build a new C++0x range-based for statement. 2368 /// 2369 /// By default, performs semantic analysis to build the new statement. 2370 /// Subclasses may override this routine to provide different behavior. 2371 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2372 bool IsIfExists, 2373 NestedNameSpecifierLoc QualifierLoc, 2374 DeclarationNameInfo NameInfo, 2375 Stmt *Nested) { 2376 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2377 QualifierLoc, NameInfo, Nested); 2378 } 2379 2380 /// Attach body to a C++0x range-based for statement. 2381 /// 2382 /// By default, performs semantic analysis to finish the new statement. 2383 /// Subclasses may override this routine to provide different behavior. 2384 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2385 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2386 } 2387 2388 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2389 Stmt *TryBlock, Stmt *Handler) { 2390 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2391 } 2392 2393 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2394 Stmt *Block) { 2395 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2396 } 2397 2398 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2399 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2400 } 2401 2402 /// Build a new predefined expression. 2403 /// 2404 /// By default, performs semantic analysis to build the new expression. 2405 /// Subclasses may override this routine to provide different behavior. 2406 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2407 PredefinedExpr::IdentKind IK) { 2408 return getSema().BuildPredefinedExpr(Loc, IK); 2409 } 2410 2411 /// Build a new expression that references a declaration. 2412 /// 2413 /// By default, performs semantic analysis to build the new expression. 2414 /// Subclasses may override this routine to provide different behavior. 2415 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2416 LookupResult &R, 2417 bool RequiresADL) { 2418 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2419 } 2420 2421 2422 /// Build a new expression that references a declaration. 2423 /// 2424 /// By default, performs semantic analysis to build the new expression. 2425 /// Subclasses may override this routine to provide different behavior. 2426 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2427 ValueDecl *VD, 2428 const DeclarationNameInfo &NameInfo, 2429 NamedDecl *Found, 2430 TemplateArgumentListInfo *TemplateArgs) { 2431 CXXScopeSpec SS; 2432 SS.Adopt(QualifierLoc); 2433 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2434 TemplateArgs); 2435 } 2436 2437 /// Build a new expression in parentheses. 2438 /// 2439 /// By default, performs semantic analysis to build the new expression. 2440 /// Subclasses may override this routine to provide different behavior. 2441 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2442 SourceLocation RParen) { 2443 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2444 } 2445 2446 /// Build a new pseudo-destructor expression. 2447 /// 2448 /// By default, performs semantic analysis to build the new expression. 2449 /// Subclasses may override this routine to provide different behavior. 2450 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2451 SourceLocation OperatorLoc, 2452 bool isArrow, 2453 CXXScopeSpec &SS, 2454 TypeSourceInfo *ScopeType, 2455 SourceLocation CCLoc, 2456 SourceLocation TildeLoc, 2457 PseudoDestructorTypeStorage Destroyed); 2458 2459 /// Build a new unary operator expression. 2460 /// 2461 /// By default, performs semantic analysis to build the new expression. 2462 /// Subclasses may override this routine to provide different behavior. 2463 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2464 UnaryOperatorKind Opc, 2465 Expr *SubExpr) { 2466 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2467 } 2468 2469 /// Build a new builtin offsetof expression. 2470 /// 2471 /// By default, performs semantic analysis to build the new expression. 2472 /// Subclasses may override this routine to provide different behavior. 2473 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2474 TypeSourceInfo *Type, 2475 ArrayRef<Sema::OffsetOfComponent> Components, 2476 SourceLocation RParenLoc) { 2477 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2478 RParenLoc); 2479 } 2480 2481 /// Build a new sizeof, alignof or vec_step expression with a 2482 /// type argument. 2483 /// 2484 /// By default, performs semantic analysis to build the new expression. 2485 /// Subclasses may override this routine to provide different behavior. 2486 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2487 SourceLocation OpLoc, 2488 UnaryExprOrTypeTrait ExprKind, 2489 SourceRange R) { 2490 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2491 } 2492 2493 /// Build a new sizeof, alignof or vec step expression with an 2494 /// expression argument. 2495 /// 2496 /// By default, performs semantic analysis to build the new expression. 2497 /// Subclasses may override this routine to provide different behavior. 2498 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2499 UnaryExprOrTypeTrait ExprKind, 2500 SourceRange R) { 2501 ExprResult Result 2502 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2503 if (Result.isInvalid()) 2504 return ExprError(); 2505 2506 return Result; 2507 } 2508 2509 /// Build a new array subscript expression. 2510 /// 2511 /// By default, performs semantic analysis to build the new expression. 2512 /// Subclasses may override this routine to provide different behavior. 2513 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2514 SourceLocation LBracketLoc, 2515 Expr *RHS, 2516 SourceLocation RBracketLoc) { 2517 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2518 LBracketLoc, RHS, 2519 RBracketLoc); 2520 } 2521 2522 /// Build a new matrix subscript expression. 2523 /// 2524 /// By default, performs semantic analysis to build the new expression. 2525 /// Subclasses may override this routine to provide different behavior. 2526 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2527 Expr *ColumnIdx, 2528 SourceLocation RBracketLoc) { 2529 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2530 RBracketLoc); 2531 } 2532 2533 /// Build a new array section expression. 2534 /// 2535 /// By default, performs semantic analysis to build the new expression. 2536 /// Subclasses may override this routine to provide different behavior. 2537 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2538 Expr *LowerBound, 2539 SourceLocation ColonLocFirst, 2540 SourceLocation ColonLocSecond, 2541 Expr *Length, Expr *Stride, 2542 SourceLocation RBracketLoc) { 2543 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2544 ColonLocFirst, ColonLocSecond, 2545 Length, Stride, RBracketLoc); 2546 } 2547 2548 /// Build a new array shaping expression. 2549 /// 2550 /// By default, performs semantic analysis to build the new expression. 2551 /// Subclasses may override this routine to provide different behavior. 2552 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2553 SourceLocation RParenLoc, 2554 ArrayRef<Expr *> Dims, 2555 ArrayRef<SourceRange> BracketsRanges) { 2556 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2557 BracketsRanges); 2558 } 2559 2560 /// Build a new iterator expression. 2561 /// 2562 /// By default, performs semantic analysis to build the new expression. 2563 /// Subclasses may override this routine to provide different behavior. 2564 ExprResult RebuildOMPIteratorExpr( 2565 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2566 ArrayRef<Sema::OMPIteratorData> Data) { 2567 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2568 LLoc, RLoc, Data); 2569 } 2570 2571 /// Build a new call expression. 2572 /// 2573 /// By default, performs semantic analysis to build the new expression. 2574 /// Subclasses may override this routine to provide different behavior. 2575 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2576 MultiExprArg Args, 2577 SourceLocation RParenLoc, 2578 Expr *ExecConfig = nullptr) { 2579 return getSema().ActOnCallExpr( 2580 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2581 } 2582 2583 /// Build a new member access expression. 2584 /// 2585 /// By default, performs semantic analysis to build the new expression. 2586 /// Subclasses may override this routine to provide different behavior. 2587 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2588 bool isArrow, 2589 NestedNameSpecifierLoc QualifierLoc, 2590 SourceLocation TemplateKWLoc, 2591 const DeclarationNameInfo &MemberNameInfo, 2592 ValueDecl *Member, 2593 NamedDecl *FoundDecl, 2594 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2595 NamedDecl *FirstQualifierInScope) { 2596 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2597 isArrow); 2598 if (!Member->getDeclName()) { 2599 // We have a reference to an unnamed field. This is always the 2600 // base of an anonymous struct/union member access, i.e. the 2601 // field is always of record type. 2602 assert(Member->getType()->isRecordType() && 2603 "unnamed member not of record type?"); 2604 2605 BaseResult = 2606 getSema().PerformObjectMemberConversion(BaseResult.get(), 2607 QualifierLoc.getNestedNameSpecifier(), 2608 FoundDecl, Member); 2609 if (BaseResult.isInvalid()) 2610 return ExprError(); 2611 Base = BaseResult.get(); 2612 2613 CXXScopeSpec EmptySS; 2614 return getSema().BuildFieldReferenceExpr( 2615 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2616 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2617 } 2618 2619 CXXScopeSpec SS; 2620 SS.Adopt(QualifierLoc); 2621 2622 Base = BaseResult.get(); 2623 QualType BaseType = Base->getType(); 2624 2625 if (isArrow && !BaseType->isPointerType()) 2626 return ExprError(); 2627 2628 // FIXME: this involves duplicating earlier analysis in a lot of 2629 // cases; we should avoid this when possible. 2630 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2631 R.addDecl(FoundDecl); 2632 R.resolveKind(); 2633 2634 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2635 SS, TemplateKWLoc, 2636 FirstQualifierInScope, 2637 R, ExplicitTemplateArgs, 2638 /*S*/nullptr); 2639 } 2640 2641 /// Build a new binary operator expression. 2642 /// 2643 /// By default, performs semantic analysis to build the new expression. 2644 /// Subclasses may override this routine to provide different behavior. 2645 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2646 BinaryOperatorKind Opc, 2647 Expr *LHS, Expr *RHS) { 2648 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2649 } 2650 2651 /// Build a new rewritten operator expression. 2652 /// 2653 /// By default, performs semantic analysis to build the new expression. 2654 /// Subclasses may override this routine to provide different behavior. 2655 ExprResult RebuildCXXRewrittenBinaryOperator( 2656 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2657 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2658 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2659 RHS, /*RequiresADL*/false); 2660 } 2661 2662 /// Build a new conditional operator expression. 2663 /// 2664 /// By default, performs semantic analysis to build the new expression. 2665 /// Subclasses may override this routine to provide different behavior. 2666 ExprResult RebuildConditionalOperator(Expr *Cond, 2667 SourceLocation QuestionLoc, 2668 Expr *LHS, 2669 SourceLocation ColonLoc, 2670 Expr *RHS) { 2671 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2672 LHS, RHS); 2673 } 2674 2675 /// Build a new C-style cast expression. 2676 /// 2677 /// By default, performs semantic analysis to build the new expression. 2678 /// Subclasses may override this routine to provide different behavior. 2679 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2680 TypeSourceInfo *TInfo, 2681 SourceLocation RParenLoc, 2682 Expr *SubExpr) { 2683 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2684 SubExpr); 2685 } 2686 2687 /// Build a new compound literal expression. 2688 /// 2689 /// By default, performs semantic analysis to build the new expression. 2690 /// Subclasses may override this routine to provide different behavior. 2691 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2692 TypeSourceInfo *TInfo, 2693 SourceLocation RParenLoc, 2694 Expr *Init) { 2695 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2696 Init); 2697 } 2698 2699 /// Build a new extended vector element access expression. 2700 /// 2701 /// By default, performs semantic analysis to build the new expression. 2702 /// Subclasses may override this routine to provide different behavior. 2703 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2704 SourceLocation OpLoc, 2705 SourceLocation AccessorLoc, 2706 IdentifierInfo &Accessor) { 2707 2708 CXXScopeSpec SS; 2709 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2710 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2711 OpLoc, /*IsArrow*/ false, 2712 SS, SourceLocation(), 2713 /*FirstQualifierInScope*/ nullptr, 2714 NameInfo, 2715 /* TemplateArgs */ nullptr, 2716 /*S*/ nullptr); 2717 } 2718 2719 /// Build a new initializer list expression. 2720 /// 2721 /// By default, performs semantic analysis to build the new expression. 2722 /// Subclasses may override this routine to provide different behavior. 2723 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2724 MultiExprArg Inits, 2725 SourceLocation RBraceLoc) { 2726 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2727 } 2728 2729 /// Build a new designated initializer expression. 2730 /// 2731 /// By default, performs semantic analysis to build the new expression. 2732 /// Subclasses may override this routine to provide different behavior. 2733 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2734 MultiExprArg ArrayExprs, 2735 SourceLocation EqualOrColonLoc, 2736 bool GNUSyntax, 2737 Expr *Init) { 2738 ExprResult Result 2739 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2740 Init); 2741 if (Result.isInvalid()) 2742 return ExprError(); 2743 2744 return Result; 2745 } 2746 2747 /// Build a new value-initialized expression. 2748 /// 2749 /// By default, builds the implicit value initialization without performing 2750 /// any semantic analysis. Subclasses may override this routine to provide 2751 /// different behavior. 2752 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2753 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2754 } 2755 2756 /// Build a new \c va_arg expression. 2757 /// 2758 /// By default, performs semantic analysis to build the new expression. 2759 /// Subclasses may override this routine to provide different behavior. 2760 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2761 Expr *SubExpr, TypeSourceInfo *TInfo, 2762 SourceLocation RParenLoc) { 2763 return getSema().BuildVAArgExpr(BuiltinLoc, 2764 SubExpr, TInfo, 2765 RParenLoc); 2766 } 2767 2768 /// Build a new expression list in parentheses. 2769 /// 2770 /// By default, performs semantic analysis to build the new expression. 2771 /// Subclasses may override this routine to provide different behavior. 2772 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2773 MultiExprArg SubExprs, 2774 SourceLocation RParenLoc) { 2775 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2776 } 2777 2778 /// Build a new address-of-label expression. 2779 /// 2780 /// By default, performs semantic analysis, using the name of the label 2781 /// rather than attempting to map the label statement itself. 2782 /// Subclasses may override this routine to provide different behavior. 2783 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2784 SourceLocation LabelLoc, LabelDecl *Label) { 2785 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2786 } 2787 2788 /// Build a new GNU statement expression. 2789 /// 2790 /// By default, performs semantic analysis to build the new expression. 2791 /// Subclasses may override this routine to provide different behavior. 2792 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2793 SourceLocation RParenLoc, unsigned TemplateDepth) { 2794 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2795 TemplateDepth); 2796 } 2797 2798 /// Build a new __builtin_choose_expr expression. 2799 /// 2800 /// By default, performs semantic analysis to build the new expression. 2801 /// Subclasses may override this routine to provide different behavior. 2802 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2803 Expr *Cond, Expr *LHS, Expr *RHS, 2804 SourceLocation RParenLoc) { 2805 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2806 Cond, LHS, RHS, 2807 RParenLoc); 2808 } 2809 2810 /// Build a new generic selection expression. 2811 /// 2812 /// By default, performs semantic analysis to build the new expression. 2813 /// Subclasses may override this routine to provide different behavior. 2814 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2815 SourceLocation DefaultLoc, 2816 SourceLocation RParenLoc, 2817 Expr *ControllingExpr, 2818 ArrayRef<TypeSourceInfo *> Types, 2819 ArrayRef<Expr *> Exprs) { 2820 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2821 ControllingExpr, Types, Exprs); 2822 } 2823 2824 /// Build a new overloaded operator call expression. 2825 /// 2826 /// By default, performs semantic analysis to build the new expression. 2827 /// The semantic analysis provides the behavior of template instantiation, 2828 /// copying with transformations that turn what looks like an overloaded 2829 /// operator call into a use of a builtin operator, performing 2830 /// argument-dependent lookup, etc. Subclasses may override this routine to 2831 /// provide different behavior. 2832 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2833 SourceLocation OpLoc, 2834 Expr *Callee, 2835 Expr *First, 2836 Expr *Second); 2837 2838 /// Build a new C++ "named" cast expression, such as static_cast or 2839 /// reinterpret_cast. 2840 /// 2841 /// By default, this routine dispatches to one of the more-specific routines 2842 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2843 /// Subclasses may override this routine to provide different behavior. 2844 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2845 Stmt::StmtClass Class, 2846 SourceLocation LAngleLoc, 2847 TypeSourceInfo *TInfo, 2848 SourceLocation RAngleLoc, 2849 SourceLocation LParenLoc, 2850 Expr *SubExpr, 2851 SourceLocation RParenLoc) { 2852 switch (Class) { 2853 case Stmt::CXXStaticCastExprClass: 2854 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2855 RAngleLoc, LParenLoc, 2856 SubExpr, RParenLoc); 2857 2858 case Stmt::CXXDynamicCastExprClass: 2859 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2860 RAngleLoc, LParenLoc, 2861 SubExpr, RParenLoc); 2862 2863 case Stmt::CXXReinterpretCastExprClass: 2864 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2865 RAngleLoc, LParenLoc, 2866 SubExpr, 2867 RParenLoc); 2868 2869 case Stmt::CXXConstCastExprClass: 2870 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2871 RAngleLoc, LParenLoc, 2872 SubExpr, RParenLoc); 2873 2874 case Stmt::CXXAddrspaceCastExprClass: 2875 return getDerived().RebuildCXXAddrspaceCastExpr( 2876 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2877 2878 default: 2879 llvm_unreachable("Invalid C++ named cast"); 2880 } 2881 } 2882 2883 /// Build a new C++ static_cast expression. 2884 /// 2885 /// By default, performs semantic analysis to build the new expression. 2886 /// Subclasses may override this routine to provide different behavior. 2887 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2888 SourceLocation LAngleLoc, 2889 TypeSourceInfo *TInfo, 2890 SourceLocation RAngleLoc, 2891 SourceLocation LParenLoc, 2892 Expr *SubExpr, 2893 SourceLocation RParenLoc) { 2894 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2895 TInfo, SubExpr, 2896 SourceRange(LAngleLoc, RAngleLoc), 2897 SourceRange(LParenLoc, RParenLoc)); 2898 } 2899 2900 /// Build a new C++ dynamic_cast expression. 2901 /// 2902 /// By default, performs semantic analysis to build the new expression. 2903 /// Subclasses may override this routine to provide different behavior. 2904 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2905 SourceLocation LAngleLoc, 2906 TypeSourceInfo *TInfo, 2907 SourceLocation RAngleLoc, 2908 SourceLocation LParenLoc, 2909 Expr *SubExpr, 2910 SourceLocation RParenLoc) { 2911 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2912 TInfo, SubExpr, 2913 SourceRange(LAngleLoc, RAngleLoc), 2914 SourceRange(LParenLoc, RParenLoc)); 2915 } 2916 2917 /// Build a new C++ reinterpret_cast expression. 2918 /// 2919 /// By default, performs semantic analysis to build the new expression. 2920 /// Subclasses may override this routine to provide different behavior. 2921 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2922 SourceLocation LAngleLoc, 2923 TypeSourceInfo *TInfo, 2924 SourceLocation RAngleLoc, 2925 SourceLocation LParenLoc, 2926 Expr *SubExpr, 2927 SourceLocation RParenLoc) { 2928 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2929 TInfo, SubExpr, 2930 SourceRange(LAngleLoc, RAngleLoc), 2931 SourceRange(LParenLoc, RParenLoc)); 2932 } 2933 2934 /// Build a new C++ const_cast expression. 2935 /// 2936 /// By default, performs semantic analysis to build the new expression. 2937 /// Subclasses may override this routine to provide different behavior. 2938 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2939 SourceLocation LAngleLoc, 2940 TypeSourceInfo *TInfo, 2941 SourceLocation RAngleLoc, 2942 SourceLocation LParenLoc, 2943 Expr *SubExpr, 2944 SourceLocation RParenLoc) { 2945 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2946 TInfo, SubExpr, 2947 SourceRange(LAngleLoc, RAngleLoc), 2948 SourceRange(LParenLoc, RParenLoc)); 2949 } 2950 2951 ExprResult 2952 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2953 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2954 SourceLocation LParenLoc, Expr *SubExpr, 2955 SourceLocation RParenLoc) { 2956 return getSema().BuildCXXNamedCast( 2957 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2958 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2959 } 2960 2961 /// Build a new C++ functional-style cast expression. 2962 /// 2963 /// By default, performs semantic analysis to build the new expression. 2964 /// Subclasses may override this routine to provide different behavior. 2965 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2966 SourceLocation LParenLoc, 2967 Expr *Sub, 2968 SourceLocation RParenLoc, 2969 bool ListInitialization) { 2970 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2971 MultiExprArg(&Sub, 1), RParenLoc, 2972 ListInitialization); 2973 } 2974 2975 /// Build a new C++ __builtin_bit_cast expression. 2976 /// 2977 /// By default, performs semantic analysis to build the new expression. 2978 /// Subclasses may override this routine to provide different behavior. 2979 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2980 TypeSourceInfo *TSI, Expr *Sub, 2981 SourceLocation RParenLoc) { 2982 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2983 } 2984 2985 /// Build a new C++ typeid(type) expression. 2986 /// 2987 /// By default, performs semantic analysis to build the new expression. 2988 /// Subclasses may override this routine to provide different behavior. 2989 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2990 SourceLocation TypeidLoc, 2991 TypeSourceInfo *Operand, 2992 SourceLocation RParenLoc) { 2993 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2994 RParenLoc); 2995 } 2996 2997 2998 /// Build a new C++ typeid(expr) expression. 2999 /// 3000 /// By default, performs semantic analysis to build the new expression. 3001 /// Subclasses may override this routine to provide different behavior. 3002 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3003 SourceLocation TypeidLoc, 3004 Expr *Operand, 3005 SourceLocation RParenLoc) { 3006 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3007 RParenLoc); 3008 } 3009 3010 /// Build a new C++ __uuidof(type) expression. 3011 /// 3012 /// By default, performs semantic analysis to build the new expression. 3013 /// Subclasses may override this routine to provide different behavior. 3014 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3015 TypeSourceInfo *Operand, 3016 SourceLocation RParenLoc) { 3017 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3018 } 3019 3020 /// Build a new C++ __uuidof(expr) expression. 3021 /// 3022 /// By default, performs semantic analysis to build the new expression. 3023 /// Subclasses may override this routine to provide different behavior. 3024 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3025 Expr *Operand, SourceLocation RParenLoc) { 3026 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3027 } 3028 3029 /// Build a new C++ "this" expression. 3030 /// 3031 /// By default, builds a new "this" expression without performing any 3032 /// semantic analysis. Subclasses may override this routine to provide 3033 /// different behavior. 3034 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3035 QualType ThisType, 3036 bool isImplicit) { 3037 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3038 } 3039 3040 /// Build a new C++ throw expression. 3041 /// 3042 /// By default, performs semantic analysis to build the new expression. 3043 /// Subclasses may override this routine to provide different behavior. 3044 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3045 bool IsThrownVariableInScope) { 3046 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3047 } 3048 3049 /// Build a new C++ default-argument expression. 3050 /// 3051 /// By default, builds a new default-argument expression, which does not 3052 /// require any semantic analysis. Subclasses may override this routine to 3053 /// provide different behavior. 3054 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3055 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3056 getSema().CurContext); 3057 } 3058 3059 /// Build a new C++11 default-initialization expression. 3060 /// 3061 /// By default, builds a new default field initialization expression, which 3062 /// does not require any semantic analysis. Subclasses may override this 3063 /// routine to provide different behavior. 3064 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3065 FieldDecl *Field) { 3066 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3067 getSema().CurContext); 3068 } 3069 3070 /// Build a new C++ zero-initialization expression. 3071 /// 3072 /// By default, performs semantic analysis to build the new expression. 3073 /// Subclasses may override this routine to provide different behavior. 3074 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3075 SourceLocation LParenLoc, 3076 SourceLocation RParenLoc) { 3077 return getSema().BuildCXXTypeConstructExpr( 3078 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3079 } 3080 3081 /// Build a new C++ "new" expression. 3082 /// 3083 /// By default, performs semantic analysis to build the new expression. 3084 /// Subclasses may override this routine to provide different behavior. 3085 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3086 bool UseGlobal, 3087 SourceLocation PlacementLParen, 3088 MultiExprArg PlacementArgs, 3089 SourceLocation PlacementRParen, 3090 SourceRange TypeIdParens, 3091 QualType AllocatedType, 3092 TypeSourceInfo *AllocatedTypeInfo, 3093 Optional<Expr *> ArraySize, 3094 SourceRange DirectInitRange, 3095 Expr *Initializer) { 3096 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3097 PlacementLParen, 3098 PlacementArgs, 3099 PlacementRParen, 3100 TypeIdParens, 3101 AllocatedType, 3102 AllocatedTypeInfo, 3103 ArraySize, 3104 DirectInitRange, 3105 Initializer); 3106 } 3107 3108 /// Build a new C++ "delete" expression. 3109 /// 3110 /// By default, performs semantic analysis to build the new expression. 3111 /// Subclasses may override this routine to provide different behavior. 3112 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3113 bool IsGlobalDelete, 3114 bool IsArrayForm, 3115 Expr *Operand) { 3116 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3117 Operand); 3118 } 3119 3120 /// Build a new type trait expression. 3121 /// 3122 /// By default, performs semantic analysis to build the new expression. 3123 /// Subclasses may override this routine to provide different behavior. 3124 ExprResult RebuildTypeTrait(TypeTrait Trait, 3125 SourceLocation StartLoc, 3126 ArrayRef<TypeSourceInfo *> Args, 3127 SourceLocation RParenLoc) { 3128 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3129 } 3130 3131 /// Build a new array type trait expression. 3132 /// 3133 /// By default, performs semantic analysis to build the new expression. 3134 /// Subclasses may override this routine to provide different behavior. 3135 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3136 SourceLocation StartLoc, 3137 TypeSourceInfo *TSInfo, 3138 Expr *DimExpr, 3139 SourceLocation RParenLoc) { 3140 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3141 } 3142 3143 /// Build a new expression trait expression. 3144 /// 3145 /// By default, performs semantic analysis to build the new expression. 3146 /// Subclasses may override this routine to provide different behavior. 3147 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3148 SourceLocation StartLoc, 3149 Expr *Queried, 3150 SourceLocation RParenLoc) { 3151 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3152 } 3153 3154 /// Build a new (previously unresolved) declaration reference 3155 /// expression. 3156 /// 3157 /// By default, performs semantic analysis to build the new expression. 3158 /// Subclasses may override this routine to provide different behavior. 3159 ExprResult RebuildDependentScopeDeclRefExpr( 3160 NestedNameSpecifierLoc QualifierLoc, 3161 SourceLocation TemplateKWLoc, 3162 const DeclarationNameInfo &NameInfo, 3163 const TemplateArgumentListInfo *TemplateArgs, 3164 bool IsAddressOfOperand, 3165 TypeSourceInfo **RecoveryTSI) { 3166 CXXScopeSpec SS; 3167 SS.Adopt(QualifierLoc); 3168 3169 if (TemplateArgs || TemplateKWLoc.isValid()) 3170 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3171 TemplateArgs); 3172 3173 return getSema().BuildQualifiedDeclarationNameExpr( 3174 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3175 } 3176 3177 /// Build a new template-id expression. 3178 /// 3179 /// By default, performs semantic analysis to build the new expression. 3180 /// Subclasses may override this routine to provide different behavior. 3181 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3182 SourceLocation TemplateKWLoc, 3183 LookupResult &R, 3184 bool RequiresADL, 3185 const TemplateArgumentListInfo *TemplateArgs) { 3186 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3187 TemplateArgs); 3188 } 3189 3190 /// Build a new object-construction expression. 3191 /// 3192 /// By default, performs semantic analysis to build the new expression. 3193 /// Subclasses may override this routine to provide different behavior. 3194 ExprResult RebuildCXXConstructExpr(QualType T, 3195 SourceLocation Loc, 3196 CXXConstructorDecl *Constructor, 3197 bool IsElidable, 3198 MultiExprArg Args, 3199 bool HadMultipleCandidates, 3200 bool ListInitialization, 3201 bool StdInitListInitialization, 3202 bool RequiresZeroInit, 3203 CXXConstructExpr::ConstructionKind ConstructKind, 3204 SourceRange ParenRange) { 3205 // Reconstruct the constructor we originally found, which might be 3206 // different if this is a call to an inherited constructor. 3207 CXXConstructorDecl *FoundCtor = Constructor; 3208 if (Constructor->isInheritingConstructor()) 3209 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3210 3211 SmallVector<Expr *, 8> ConvertedArgs; 3212 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3213 ConvertedArgs)) 3214 return ExprError(); 3215 3216 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3217 IsElidable, 3218 ConvertedArgs, 3219 HadMultipleCandidates, 3220 ListInitialization, 3221 StdInitListInitialization, 3222 RequiresZeroInit, ConstructKind, 3223 ParenRange); 3224 } 3225 3226 /// Build a new implicit construction via inherited constructor 3227 /// expression. 3228 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3229 CXXConstructorDecl *Constructor, 3230 bool ConstructsVBase, 3231 bool InheritedFromVBase) { 3232 return new (getSema().Context) CXXInheritedCtorInitExpr( 3233 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3234 } 3235 3236 /// Build a new object-construction expression. 3237 /// 3238 /// By default, performs semantic analysis to build the new expression. 3239 /// Subclasses may override this routine to provide different behavior. 3240 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3241 SourceLocation LParenOrBraceLoc, 3242 MultiExprArg Args, 3243 SourceLocation RParenOrBraceLoc, 3244 bool ListInitialization) { 3245 return getSema().BuildCXXTypeConstructExpr( 3246 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3247 } 3248 3249 /// Build a new object-construction expression. 3250 /// 3251 /// By default, performs semantic analysis to build the new expression. 3252 /// Subclasses may override this routine to provide different behavior. 3253 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3254 SourceLocation LParenLoc, 3255 MultiExprArg Args, 3256 SourceLocation RParenLoc, 3257 bool ListInitialization) { 3258 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3259 RParenLoc, ListInitialization); 3260 } 3261 3262 /// Build a new member reference expression. 3263 /// 3264 /// By default, performs semantic analysis to build the new expression. 3265 /// Subclasses may override this routine to provide different behavior. 3266 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3267 QualType BaseType, 3268 bool IsArrow, 3269 SourceLocation OperatorLoc, 3270 NestedNameSpecifierLoc QualifierLoc, 3271 SourceLocation TemplateKWLoc, 3272 NamedDecl *FirstQualifierInScope, 3273 const DeclarationNameInfo &MemberNameInfo, 3274 const TemplateArgumentListInfo *TemplateArgs) { 3275 CXXScopeSpec SS; 3276 SS.Adopt(QualifierLoc); 3277 3278 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3279 OperatorLoc, IsArrow, 3280 SS, TemplateKWLoc, 3281 FirstQualifierInScope, 3282 MemberNameInfo, 3283 TemplateArgs, /*S*/nullptr); 3284 } 3285 3286 /// Build a new member reference expression. 3287 /// 3288 /// By default, performs semantic analysis to build the new expression. 3289 /// Subclasses may override this routine to provide different behavior. 3290 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3291 SourceLocation OperatorLoc, 3292 bool IsArrow, 3293 NestedNameSpecifierLoc QualifierLoc, 3294 SourceLocation TemplateKWLoc, 3295 NamedDecl *FirstQualifierInScope, 3296 LookupResult &R, 3297 const TemplateArgumentListInfo *TemplateArgs) { 3298 CXXScopeSpec SS; 3299 SS.Adopt(QualifierLoc); 3300 3301 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3302 OperatorLoc, IsArrow, 3303 SS, TemplateKWLoc, 3304 FirstQualifierInScope, 3305 R, TemplateArgs, /*S*/nullptr); 3306 } 3307 3308 /// Build a new noexcept expression. 3309 /// 3310 /// By default, performs semantic analysis to build the new expression. 3311 /// Subclasses may override this routine to provide different behavior. 3312 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3313 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3314 } 3315 3316 /// Build a new expression to compute the length of a parameter pack. 3317 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3318 NamedDecl *Pack, 3319 SourceLocation PackLoc, 3320 SourceLocation RParenLoc, 3321 Optional<unsigned> Length, 3322 ArrayRef<TemplateArgument> PartialArgs) { 3323 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3324 RParenLoc, Length, PartialArgs); 3325 } 3326 3327 /// Build a new expression representing a call to a source location 3328 /// builtin. 3329 /// 3330 /// By default, performs semantic analysis to build the new expression. 3331 /// Subclasses may override this routine to provide different behavior. 3332 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3333 SourceLocation BuiltinLoc, 3334 SourceLocation RPLoc, 3335 DeclContext *ParentContext) { 3336 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3337 } 3338 3339 /// Build a new Objective-C boxed expression. 3340 /// 3341 /// By default, performs semantic analysis to build the new expression. 3342 /// Subclasses may override this routine to provide different behavior. 3343 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3344 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3345 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3346 TemplateArgumentListInfo *TALI) { 3347 CXXScopeSpec SS; 3348 SS.Adopt(NNS); 3349 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3350 ConceptNameInfo, 3351 FoundDecl, 3352 NamedConcept, TALI); 3353 if (Result.isInvalid()) 3354 return ExprError(); 3355 return Result; 3356 } 3357 3358 /// \brief Build a new requires expression. 3359 /// 3360 /// By default, performs semantic analysis to build the new expression. 3361 /// Subclasses may override this routine to provide different behavior. 3362 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3363 RequiresExprBodyDecl *Body, 3364 ArrayRef<ParmVarDecl *> LocalParameters, 3365 ArrayRef<concepts::Requirement *> Requirements, 3366 SourceLocation ClosingBraceLoc) { 3367 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3368 LocalParameters, Requirements, ClosingBraceLoc); 3369 } 3370 3371 concepts::TypeRequirement * 3372 RebuildTypeRequirement( 3373 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3374 return SemaRef.BuildTypeRequirement(SubstDiag); 3375 } 3376 3377 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3378 return SemaRef.BuildTypeRequirement(T); 3379 } 3380 3381 concepts::ExprRequirement * 3382 RebuildExprRequirement( 3383 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3384 SourceLocation NoexceptLoc, 3385 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3386 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3387 std::move(Ret)); 3388 } 3389 3390 concepts::ExprRequirement * 3391 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3392 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3393 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3394 std::move(Ret)); 3395 } 3396 3397 concepts::NestedRequirement * 3398 RebuildNestedRequirement( 3399 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3400 return SemaRef.BuildNestedRequirement(SubstDiag); 3401 } 3402 3403 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3404 return SemaRef.BuildNestedRequirement(Constraint); 3405 } 3406 3407 /// \brief Build a new Objective-C boxed expression. 3408 /// 3409 /// By default, performs semantic analysis to build the new expression. 3410 /// Subclasses may override this routine to provide different behavior. 3411 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3412 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3413 } 3414 3415 /// Build a new Objective-C array literal. 3416 /// 3417 /// By default, performs semantic analysis to build the new expression. 3418 /// Subclasses may override this routine to provide different behavior. 3419 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3420 Expr **Elements, unsigned NumElements) { 3421 return getSema().BuildObjCArrayLiteral(Range, 3422 MultiExprArg(Elements, NumElements)); 3423 } 3424 3425 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3426 Expr *Base, Expr *Key, 3427 ObjCMethodDecl *getterMethod, 3428 ObjCMethodDecl *setterMethod) { 3429 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3430 getterMethod, setterMethod); 3431 } 3432 3433 /// Build a new Objective-C dictionary literal. 3434 /// 3435 /// By default, performs semantic analysis to build the new expression. 3436 /// Subclasses may override this routine to provide different behavior. 3437 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3438 MutableArrayRef<ObjCDictionaryElement> Elements) { 3439 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3440 } 3441 3442 /// Build a new Objective-C \@encode expression. 3443 /// 3444 /// By default, performs semantic analysis to build the new expression. 3445 /// Subclasses may override this routine to provide different behavior. 3446 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3447 TypeSourceInfo *EncodeTypeInfo, 3448 SourceLocation RParenLoc) { 3449 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3450 } 3451 3452 /// Build a new Objective-C class message. 3453 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3454 Selector Sel, 3455 ArrayRef<SourceLocation> SelectorLocs, 3456 ObjCMethodDecl *Method, 3457 SourceLocation LBracLoc, 3458 MultiExprArg Args, 3459 SourceLocation RBracLoc) { 3460 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3461 ReceiverTypeInfo->getType(), 3462 /*SuperLoc=*/SourceLocation(), 3463 Sel, Method, LBracLoc, SelectorLocs, 3464 RBracLoc, Args); 3465 } 3466 3467 /// Build a new Objective-C instance message. 3468 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3469 Selector Sel, 3470 ArrayRef<SourceLocation> SelectorLocs, 3471 ObjCMethodDecl *Method, 3472 SourceLocation LBracLoc, 3473 MultiExprArg Args, 3474 SourceLocation RBracLoc) { 3475 return SemaRef.BuildInstanceMessage(Receiver, 3476 Receiver->getType(), 3477 /*SuperLoc=*/SourceLocation(), 3478 Sel, Method, LBracLoc, SelectorLocs, 3479 RBracLoc, Args); 3480 } 3481 3482 /// Build a new Objective-C instance/class message to 'super'. 3483 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3484 Selector Sel, 3485 ArrayRef<SourceLocation> SelectorLocs, 3486 QualType SuperType, 3487 ObjCMethodDecl *Method, 3488 SourceLocation LBracLoc, 3489 MultiExprArg Args, 3490 SourceLocation RBracLoc) { 3491 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3492 SuperType, 3493 SuperLoc, 3494 Sel, Method, LBracLoc, SelectorLocs, 3495 RBracLoc, Args) 3496 : SemaRef.BuildClassMessage(nullptr, 3497 SuperType, 3498 SuperLoc, 3499 Sel, Method, LBracLoc, SelectorLocs, 3500 RBracLoc, Args); 3501 3502 3503 } 3504 3505 /// Build a new Objective-C ivar reference expression. 3506 /// 3507 /// By default, performs semantic analysis to build the new expression. 3508 /// Subclasses may override this routine to provide different behavior. 3509 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3510 SourceLocation IvarLoc, 3511 bool IsArrow, bool IsFreeIvar) { 3512 CXXScopeSpec SS; 3513 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3514 ExprResult Result = getSema().BuildMemberReferenceExpr( 3515 BaseArg, BaseArg->getType(), 3516 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3517 /*FirstQualifierInScope=*/nullptr, NameInfo, 3518 /*TemplateArgs=*/nullptr, 3519 /*S=*/nullptr); 3520 if (IsFreeIvar && Result.isUsable()) 3521 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3522 return Result; 3523 } 3524 3525 /// Build a new Objective-C property reference expression. 3526 /// 3527 /// By default, performs semantic analysis to build the new expression. 3528 /// Subclasses may override this routine to provide different behavior. 3529 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3530 ObjCPropertyDecl *Property, 3531 SourceLocation PropertyLoc) { 3532 CXXScopeSpec SS; 3533 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3534 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3535 /*FIXME:*/PropertyLoc, 3536 /*IsArrow=*/false, 3537 SS, SourceLocation(), 3538 /*FirstQualifierInScope=*/nullptr, 3539 NameInfo, 3540 /*TemplateArgs=*/nullptr, 3541 /*S=*/nullptr); 3542 } 3543 3544 /// Build a new Objective-C property reference expression. 3545 /// 3546 /// By default, performs semantic analysis to build the new expression. 3547 /// Subclasses may override this routine to provide different behavior. 3548 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3549 ObjCMethodDecl *Getter, 3550 ObjCMethodDecl *Setter, 3551 SourceLocation PropertyLoc) { 3552 // Since these expressions can only be value-dependent, we do not 3553 // need to perform semantic analysis again. 3554 return Owned( 3555 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3556 VK_LValue, OK_ObjCProperty, 3557 PropertyLoc, Base)); 3558 } 3559 3560 /// Build a new Objective-C "isa" expression. 3561 /// 3562 /// By default, performs semantic analysis to build the new expression. 3563 /// Subclasses may override this routine to provide different behavior. 3564 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3565 SourceLocation OpLoc, bool IsArrow) { 3566 CXXScopeSpec SS; 3567 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3568 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3569 OpLoc, IsArrow, 3570 SS, SourceLocation(), 3571 /*FirstQualifierInScope=*/nullptr, 3572 NameInfo, 3573 /*TemplateArgs=*/nullptr, 3574 /*S=*/nullptr); 3575 } 3576 3577 /// Build a new shuffle vector expression. 3578 /// 3579 /// By default, performs semantic analysis to build the new expression. 3580 /// Subclasses may override this routine to provide different behavior. 3581 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3582 MultiExprArg SubExprs, 3583 SourceLocation RParenLoc) { 3584 // Find the declaration for __builtin_shufflevector 3585 const IdentifierInfo &Name 3586 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3587 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3588 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3589 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3590 3591 // Build a reference to the __builtin_shufflevector builtin 3592 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3593 Expr *Callee = new (SemaRef.Context) 3594 DeclRefExpr(SemaRef.Context, Builtin, false, 3595 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3596 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3597 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3598 CK_BuiltinFnToFnPtr).get(); 3599 3600 // Build the CallExpr 3601 ExprResult TheCall = CallExpr::Create( 3602 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3603 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3604 FPOptionsOverride()); 3605 3606 // Type-check the __builtin_shufflevector expression. 3607 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3608 } 3609 3610 /// Build a new convert vector expression. 3611 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3612 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3613 SourceLocation RParenLoc) { 3614 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3615 BuiltinLoc, RParenLoc); 3616 } 3617 3618 /// Build a new template argument pack expansion. 3619 /// 3620 /// By default, performs semantic analysis to build a new pack expansion 3621 /// for a template argument. Subclasses may override this routine to provide 3622 /// different behavior. 3623 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3624 SourceLocation EllipsisLoc, 3625 Optional<unsigned> NumExpansions) { 3626 switch (Pattern.getArgument().getKind()) { 3627 case TemplateArgument::Expression: { 3628 ExprResult Result 3629 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3630 EllipsisLoc, NumExpansions); 3631 if (Result.isInvalid()) 3632 return TemplateArgumentLoc(); 3633 3634 return TemplateArgumentLoc(Result.get(), Result.get()); 3635 } 3636 3637 case TemplateArgument::Template: 3638 return TemplateArgumentLoc( 3639 SemaRef.Context, 3640 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3641 NumExpansions), 3642 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3643 EllipsisLoc); 3644 3645 case TemplateArgument::Null: 3646 case TemplateArgument::Integral: 3647 case TemplateArgument::Declaration: 3648 case TemplateArgument::Pack: 3649 case TemplateArgument::TemplateExpansion: 3650 case TemplateArgument::NullPtr: 3651 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3652 3653 case TemplateArgument::Type: 3654 if (TypeSourceInfo *Expansion 3655 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3656 EllipsisLoc, 3657 NumExpansions)) 3658 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3659 Expansion); 3660 break; 3661 } 3662 3663 return TemplateArgumentLoc(); 3664 } 3665 3666 /// Build a new expression pack expansion. 3667 /// 3668 /// By default, performs semantic analysis to build a new pack expansion 3669 /// for an expression. Subclasses may override this routine to provide 3670 /// different behavior. 3671 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3672 Optional<unsigned> NumExpansions) { 3673 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3674 } 3675 3676 /// Build a new C++1z fold-expression. 3677 /// 3678 /// By default, performs semantic analysis in order to build a new fold 3679 /// expression. 3680 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3681 SourceLocation LParenLoc, Expr *LHS, 3682 BinaryOperatorKind Operator, 3683 SourceLocation EllipsisLoc, Expr *RHS, 3684 SourceLocation RParenLoc, 3685 Optional<unsigned> NumExpansions) { 3686 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3687 EllipsisLoc, RHS, RParenLoc, 3688 NumExpansions); 3689 } 3690 3691 /// Build an empty C++1z fold-expression with the given operator. 3692 /// 3693 /// By default, produces the fallback value for the fold-expression, or 3694 /// produce an error if there is no fallback value. 3695 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3696 BinaryOperatorKind Operator) { 3697 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3698 } 3699 3700 /// Build a new atomic operation expression. 3701 /// 3702 /// By default, performs semantic analysis to build the new expression. 3703 /// Subclasses may override this routine to provide different behavior. 3704 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3705 AtomicExpr::AtomicOp Op, 3706 SourceLocation RParenLoc) { 3707 // Use this for all of the locations, since we don't know the difference 3708 // between the call and the expr at this point. 3709 SourceRange Range{BuiltinLoc, RParenLoc}; 3710 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3711 Sema::AtomicArgumentOrder::AST); 3712 } 3713 3714 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3715 ArrayRef<Expr *> SubExprs, QualType Type) { 3716 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3717 } 3718 3719 private: 3720 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3721 QualType ObjectType, 3722 NamedDecl *FirstQualifierInScope, 3723 CXXScopeSpec &SS); 3724 3725 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3726 QualType ObjectType, 3727 NamedDecl *FirstQualifierInScope, 3728 CXXScopeSpec &SS); 3729 3730 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3731 NamedDecl *FirstQualifierInScope, 3732 CXXScopeSpec &SS); 3733 3734 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3735 DependentNameTypeLoc TL, 3736 bool DeducibleTSTContext); 3737 }; 3738 3739 template <typename Derived> 3740 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3741 if (!S) 3742 return S; 3743 3744 switch (S->getStmtClass()) { 3745 case Stmt::NoStmtClass: break; 3746 3747 // Transform individual statement nodes 3748 // Pass SDK into statements that can produce a value 3749 #define STMT(Node, Parent) \ 3750 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3751 #define VALUESTMT(Node, Parent) \ 3752 case Stmt::Node##Class: \ 3753 return getDerived().Transform##Node(cast<Node>(S), SDK); 3754 #define ABSTRACT_STMT(Node) 3755 #define EXPR(Node, Parent) 3756 #include "clang/AST/StmtNodes.inc" 3757 3758 // Transform expressions by calling TransformExpr. 3759 #define STMT(Node, Parent) 3760 #define ABSTRACT_STMT(Stmt) 3761 #define EXPR(Node, Parent) case Stmt::Node##Class: 3762 #include "clang/AST/StmtNodes.inc" 3763 { 3764 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3765 3766 if (SDK == SDK_StmtExprResult) 3767 E = getSema().ActOnStmtExprResult(E); 3768 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3769 } 3770 } 3771 3772 return S; 3773 } 3774 3775 template<typename Derived> 3776 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3777 if (!S) 3778 return S; 3779 3780 switch (S->getClauseKind()) { 3781 default: break; 3782 // Transform individual clause nodes 3783 #define GEN_CLANG_CLAUSE_CLASS 3784 #define CLAUSE_CLASS(Enum, Str, Class) \ 3785 case Enum: \ 3786 return getDerived().Transform##Class(cast<Class>(S)); 3787 #include "llvm/Frontend/OpenMP/OMP.inc" 3788 } 3789 3790 return S; 3791 } 3792 3793 3794 template<typename Derived> 3795 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3796 if (!E) 3797 return E; 3798 3799 switch (E->getStmtClass()) { 3800 case Stmt::NoStmtClass: break; 3801 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3802 #define ABSTRACT_STMT(Stmt) 3803 #define EXPR(Node, Parent) \ 3804 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3805 #include "clang/AST/StmtNodes.inc" 3806 } 3807 3808 return E; 3809 } 3810 3811 template<typename Derived> 3812 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3813 bool NotCopyInit) { 3814 // Initializers are instantiated like expressions, except that various outer 3815 // layers are stripped. 3816 if (!Init) 3817 return Init; 3818 3819 if (auto *FE = dyn_cast<FullExpr>(Init)) 3820 Init = FE->getSubExpr(); 3821 3822 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3823 Init = AIL->getCommonExpr(); 3824 3825 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3826 Init = MTE->getSubExpr(); 3827 3828 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3829 Init = Binder->getSubExpr(); 3830 3831 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3832 Init = ICE->getSubExprAsWritten(); 3833 3834 if (CXXStdInitializerListExpr *ILE = 3835 dyn_cast<CXXStdInitializerListExpr>(Init)) 3836 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3837 3838 // If this is copy-initialization, we only need to reconstruct 3839 // InitListExprs. Other forms of copy-initialization will be a no-op if 3840 // the initializer is already the right type. 3841 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3842 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3843 return getDerived().TransformExpr(Init); 3844 3845 // Revert value-initialization back to empty parens. 3846 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3847 SourceRange Parens = VIE->getSourceRange(); 3848 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3849 Parens.getEnd()); 3850 } 3851 3852 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3853 if (isa<ImplicitValueInitExpr>(Init)) 3854 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3855 SourceLocation()); 3856 3857 // Revert initialization by constructor back to a parenthesized or braced list 3858 // of expressions. Any other form of initializer can just be reused directly. 3859 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3860 return getDerived().TransformExpr(Init); 3861 3862 // If the initialization implicitly converted an initializer list to a 3863 // std::initializer_list object, unwrap the std::initializer_list too. 3864 if (Construct && Construct->isStdInitListInitialization()) 3865 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3866 3867 // Enter a list-init context if this was list initialization. 3868 EnterExpressionEvaluationContext Context( 3869 getSema(), EnterExpressionEvaluationContext::InitList, 3870 Construct->isListInitialization()); 3871 3872 SmallVector<Expr*, 8> NewArgs; 3873 bool ArgChanged = false; 3874 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3875 /*IsCall*/true, NewArgs, &ArgChanged)) 3876 return ExprError(); 3877 3878 // If this was list initialization, revert to syntactic list form. 3879 if (Construct->isListInitialization()) 3880 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3881 Construct->getEndLoc()); 3882 3883 // Build a ParenListExpr to represent anything else. 3884 SourceRange Parens = Construct->getParenOrBraceRange(); 3885 if (Parens.isInvalid()) { 3886 // This was a variable declaration's initialization for which no initializer 3887 // was specified. 3888 assert(NewArgs.empty() && 3889 "no parens or braces but have direct init with arguments?"); 3890 return ExprEmpty(); 3891 } 3892 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3893 Parens.getEnd()); 3894 } 3895 3896 template<typename Derived> 3897 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3898 unsigned NumInputs, 3899 bool IsCall, 3900 SmallVectorImpl<Expr *> &Outputs, 3901 bool *ArgChanged) { 3902 for (unsigned I = 0; I != NumInputs; ++I) { 3903 // If requested, drop call arguments that need to be dropped. 3904 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3905 if (ArgChanged) 3906 *ArgChanged = true; 3907 3908 break; 3909 } 3910 3911 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3912 Expr *Pattern = Expansion->getPattern(); 3913 3914 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3915 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3916 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3917 3918 // Determine whether the set of unexpanded parameter packs can and should 3919 // be expanded. 3920 bool Expand = true; 3921 bool RetainExpansion = false; 3922 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3923 Optional<unsigned> NumExpansions = OrigNumExpansions; 3924 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3925 Pattern->getSourceRange(), 3926 Unexpanded, 3927 Expand, RetainExpansion, 3928 NumExpansions)) 3929 return true; 3930 3931 if (!Expand) { 3932 // The transform has determined that we should perform a simple 3933 // transformation on the pack expansion, producing another pack 3934 // expansion. 3935 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3936 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3937 if (OutPattern.isInvalid()) 3938 return true; 3939 3940 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3941 Expansion->getEllipsisLoc(), 3942 NumExpansions); 3943 if (Out.isInvalid()) 3944 return true; 3945 3946 if (ArgChanged) 3947 *ArgChanged = true; 3948 Outputs.push_back(Out.get()); 3949 continue; 3950 } 3951 3952 // Record right away that the argument was changed. This needs 3953 // to happen even if the array expands to nothing. 3954 if (ArgChanged) *ArgChanged = true; 3955 3956 // The transform has determined that we should perform an elementwise 3957 // expansion of the pattern. Do so. 3958 for (unsigned I = 0; I != *NumExpansions; ++I) { 3959 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3960 ExprResult Out = getDerived().TransformExpr(Pattern); 3961 if (Out.isInvalid()) 3962 return true; 3963 3964 if (Out.get()->containsUnexpandedParameterPack()) { 3965 Out = getDerived().RebuildPackExpansion( 3966 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3967 if (Out.isInvalid()) 3968 return true; 3969 } 3970 3971 Outputs.push_back(Out.get()); 3972 } 3973 3974 // If we're supposed to retain a pack expansion, do so by temporarily 3975 // forgetting the partially-substituted parameter pack. 3976 if (RetainExpansion) { 3977 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3978 3979 ExprResult Out = getDerived().TransformExpr(Pattern); 3980 if (Out.isInvalid()) 3981 return true; 3982 3983 Out = getDerived().RebuildPackExpansion( 3984 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3985 if (Out.isInvalid()) 3986 return true; 3987 3988 Outputs.push_back(Out.get()); 3989 } 3990 3991 continue; 3992 } 3993 3994 ExprResult Result = 3995 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3996 : getDerived().TransformExpr(Inputs[I]); 3997 if (Result.isInvalid()) 3998 return true; 3999 4000 if (Result.get() != Inputs[I] && ArgChanged) 4001 *ArgChanged = true; 4002 4003 Outputs.push_back(Result.get()); 4004 } 4005 4006 return false; 4007 } 4008 4009 template <typename Derived> 4010 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4011 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4012 if (Var) { 4013 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4014 getDerived().TransformDefinition(Var->getLocation(), Var)); 4015 4016 if (!ConditionVar) 4017 return Sema::ConditionError(); 4018 4019 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4020 } 4021 4022 if (Expr) { 4023 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4024 4025 if (CondExpr.isInvalid()) 4026 return Sema::ConditionError(); 4027 4028 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 4029 } 4030 4031 return Sema::ConditionResult(); 4032 } 4033 4034 template <typename Derived> 4035 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4036 NestedNameSpecifierLoc NNS, QualType ObjectType, 4037 NamedDecl *FirstQualifierInScope) { 4038 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4039 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4040 Qualifier = Qualifier.getPrefix()) 4041 Qualifiers.push_back(Qualifier); 4042 4043 CXXScopeSpec SS; 4044 while (!Qualifiers.empty()) { 4045 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4046 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4047 4048 switch (QNNS->getKind()) { 4049 case NestedNameSpecifier::Identifier: { 4050 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4051 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4052 ObjectType); 4053 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4054 SS, FirstQualifierInScope, false)) 4055 return NestedNameSpecifierLoc(); 4056 break; 4057 } 4058 4059 case NestedNameSpecifier::Namespace: { 4060 NamespaceDecl *NS = 4061 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4062 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4063 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4064 break; 4065 } 4066 4067 case NestedNameSpecifier::NamespaceAlias: { 4068 NamespaceAliasDecl *Alias = 4069 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4070 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4071 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4072 Q.getLocalEndLoc()); 4073 break; 4074 } 4075 4076 case NestedNameSpecifier::Global: 4077 // There is no meaningful transformation that one could perform on the 4078 // global scope. 4079 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4080 break; 4081 4082 case NestedNameSpecifier::Super: { 4083 CXXRecordDecl *RD = 4084 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4085 SourceLocation(), QNNS->getAsRecordDecl())); 4086 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4087 break; 4088 } 4089 4090 case NestedNameSpecifier::TypeSpecWithTemplate: 4091 case NestedNameSpecifier::TypeSpec: { 4092 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4093 FirstQualifierInScope, SS); 4094 4095 if (!TL) 4096 return NestedNameSpecifierLoc(); 4097 4098 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4099 (SemaRef.getLangOpts().CPlusPlus11 && 4100 TL.getType()->isEnumeralType())) { 4101 assert(!TL.getType().hasLocalQualifiers() && 4102 "Can't get cv-qualifiers here"); 4103 if (TL.getType()->isEnumeralType()) 4104 SemaRef.Diag(TL.getBeginLoc(), 4105 diag::warn_cxx98_compat_enum_nested_name_spec); 4106 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4107 Q.getLocalEndLoc()); 4108 break; 4109 } 4110 // If the nested-name-specifier is an invalid type def, don't emit an 4111 // error because a previous error should have already been emitted. 4112 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4113 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4114 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4115 << TL.getType() << SS.getRange(); 4116 } 4117 return NestedNameSpecifierLoc(); 4118 } 4119 } 4120 4121 // The qualifier-in-scope and object type only apply to the leftmost entity. 4122 FirstQualifierInScope = nullptr; 4123 ObjectType = QualType(); 4124 } 4125 4126 // Don't rebuild the nested-name-specifier if we don't have to. 4127 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4128 !getDerived().AlwaysRebuild()) 4129 return NNS; 4130 4131 // If we can re-use the source-location data from the original 4132 // nested-name-specifier, do so. 4133 if (SS.location_size() == NNS.getDataLength() && 4134 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4135 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4136 4137 // Allocate new nested-name-specifier location information. 4138 return SS.getWithLocInContext(SemaRef.Context); 4139 } 4140 4141 template<typename Derived> 4142 DeclarationNameInfo 4143 TreeTransform<Derived> 4144 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4145 DeclarationName Name = NameInfo.getName(); 4146 if (!Name) 4147 return DeclarationNameInfo(); 4148 4149 switch (Name.getNameKind()) { 4150 case DeclarationName::Identifier: 4151 case DeclarationName::ObjCZeroArgSelector: 4152 case DeclarationName::ObjCOneArgSelector: 4153 case DeclarationName::ObjCMultiArgSelector: 4154 case DeclarationName::CXXOperatorName: 4155 case DeclarationName::CXXLiteralOperatorName: 4156 case DeclarationName::CXXUsingDirective: 4157 return NameInfo; 4158 4159 case DeclarationName::CXXDeductionGuideName: { 4160 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4161 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4162 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4163 if (!NewTemplate) 4164 return DeclarationNameInfo(); 4165 4166 DeclarationNameInfo NewNameInfo(NameInfo); 4167 NewNameInfo.setName( 4168 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4169 return NewNameInfo; 4170 } 4171 4172 case DeclarationName::CXXConstructorName: 4173 case DeclarationName::CXXDestructorName: 4174 case DeclarationName::CXXConversionFunctionName: { 4175 TypeSourceInfo *NewTInfo; 4176 CanQualType NewCanTy; 4177 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4178 NewTInfo = getDerived().TransformType(OldTInfo); 4179 if (!NewTInfo) 4180 return DeclarationNameInfo(); 4181 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4182 } 4183 else { 4184 NewTInfo = nullptr; 4185 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4186 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4187 if (NewT.isNull()) 4188 return DeclarationNameInfo(); 4189 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4190 } 4191 4192 DeclarationName NewName 4193 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4194 NewCanTy); 4195 DeclarationNameInfo NewNameInfo(NameInfo); 4196 NewNameInfo.setName(NewName); 4197 NewNameInfo.setNamedTypeInfo(NewTInfo); 4198 return NewNameInfo; 4199 } 4200 } 4201 4202 llvm_unreachable("Unknown name kind."); 4203 } 4204 4205 template<typename Derived> 4206 TemplateName 4207 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4208 TemplateName Name, 4209 SourceLocation NameLoc, 4210 QualType ObjectType, 4211 NamedDecl *FirstQualifierInScope, 4212 bool AllowInjectedClassName) { 4213 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4214 TemplateDecl *Template = QTN->getTemplateDecl(); 4215 assert(Template && "qualified template name must refer to a template"); 4216 4217 TemplateDecl *TransTemplate 4218 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4219 Template)); 4220 if (!TransTemplate) 4221 return TemplateName(); 4222 4223 if (!getDerived().AlwaysRebuild() && 4224 SS.getScopeRep() == QTN->getQualifier() && 4225 TransTemplate == Template) 4226 return Name; 4227 4228 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4229 TransTemplate); 4230 } 4231 4232 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4233 if (SS.getScopeRep()) { 4234 // These apply to the scope specifier, not the template. 4235 ObjectType = QualType(); 4236 FirstQualifierInScope = nullptr; 4237 } 4238 4239 if (!getDerived().AlwaysRebuild() && 4240 SS.getScopeRep() == DTN->getQualifier() && 4241 ObjectType.isNull()) 4242 return Name; 4243 4244 // FIXME: Preserve the location of the "template" keyword. 4245 SourceLocation TemplateKWLoc = NameLoc; 4246 4247 if (DTN->isIdentifier()) { 4248 return getDerived().RebuildTemplateName(SS, 4249 TemplateKWLoc, 4250 *DTN->getIdentifier(), 4251 NameLoc, 4252 ObjectType, 4253 FirstQualifierInScope, 4254 AllowInjectedClassName); 4255 } 4256 4257 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4258 DTN->getOperator(), NameLoc, 4259 ObjectType, AllowInjectedClassName); 4260 } 4261 4262 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4263 TemplateDecl *TransTemplate 4264 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4265 Template)); 4266 if (!TransTemplate) 4267 return TemplateName(); 4268 4269 if (!getDerived().AlwaysRebuild() && 4270 TransTemplate == Template) 4271 return Name; 4272 4273 return TemplateName(TransTemplate); 4274 } 4275 4276 if (SubstTemplateTemplateParmPackStorage *SubstPack 4277 = Name.getAsSubstTemplateTemplateParmPack()) { 4278 TemplateTemplateParmDecl *TransParam 4279 = cast_or_null<TemplateTemplateParmDecl>( 4280 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4281 if (!TransParam) 4282 return TemplateName(); 4283 4284 if (!getDerived().AlwaysRebuild() && 4285 TransParam == SubstPack->getParameterPack()) 4286 return Name; 4287 4288 return getDerived().RebuildTemplateName(TransParam, 4289 SubstPack->getArgumentPack()); 4290 } 4291 4292 // These should be getting filtered out before they reach the AST. 4293 llvm_unreachable("overloaded function decl survived to here"); 4294 } 4295 4296 template<typename Derived> 4297 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4298 const TemplateArgument &Arg, 4299 TemplateArgumentLoc &Output) { 4300 Output = getSema().getTrivialTemplateArgumentLoc( 4301 Arg, QualType(), getDerived().getBaseLocation()); 4302 } 4303 4304 template<typename Derived> 4305 bool TreeTransform<Derived>::TransformTemplateArgument( 4306 const TemplateArgumentLoc &Input, 4307 TemplateArgumentLoc &Output, bool Uneval) { 4308 const TemplateArgument &Arg = Input.getArgument(); 4309 switch (Arg.getKind()) { 4310 case TemplateArgument::Null: 4311 case TemplateArgument::Pack: 4312 llvm_unreachable("Unexpected TemplateArgument"); 4313 4314 case TemplateArgument::Integral: 4315 case TemplateArgument::NullPtr: 4316 case TemplateArgument::Declaration: { 4317 // Transform a resolved template argument straight to a resolved template 4318 // argument. We get here when substituting into an already-substituted 4319 // template type argument during concept satisfaction checking. 4320 QualType T = Arg.getNonTypeTemplateArgumentType(); 4321 QualType NewT = getDerived().TransformType(T); 4322 if (NewT.isNull()) 4323 return true; 4324 4325 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4326 ? Arg.getAsDecl() 4327 : nullptr; 4328 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4329 getDerived().getBaseLocation(), D)) 4330 : nullptr; 4331 if (D && !NewD) 4332 return true; 4333 4334 if (NewT == T && D == NewD) 4335 Output = Input; 4336 else if (Arg.getKind() == TemplateArgument::Integral) 4337 Output = TemplateArgumentLoc( 4338 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4339 TemplateArgumentLocInfo()); 4340 else if (Arg.getKind() == TemplateArgument::NullPtr) 4341 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4342 TemplateArgumentLocInfo()); 4343 else 4344 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4345 TemplateArgumentLocInfo()); 4346 4347 return false; 4348 } 4349 4350 case TemplateArgument::Type: { 4351 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4352 if (!DI) 4353 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4354 4355 DI = getDerived().TransformType(DI); 4356 if (!DI) return true; 4357 4358 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4359 return false; 4360 } 4361 4362 case TemplateArgument::Template: { 4363 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4364 if (QualifierLoc) { 4365 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4366 if (!QualifierLoc) 4367 return true; 4368 } 4369 4370 CXXScopeSpec SS; 4371 SS.Adopt(QualifierLoc); 4372 TemplateName Template 4373 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4374 Input.getTemplateNameLoc()); 4375 if (Template.isNull()) 4376 return true; 4377 4378 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4379 QualifierLoc, Input.getTemplateNameLoc()); 4380 return false; 4381 } 4382 4383 case TemplateArgument::TemplateExpansion: 4384 llvm_unreachable("Caller should expand pack expansions"); 4385 4386 case TemplateArgument::Expression: { 4387 // Template argument expressions are constant expressions. 4388 EnterExpressionEvaluationContext Unevaluated( 4389 getSema(), 4390 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4391 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4392 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4393 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4394 4395 Expr *InputExpr = Input.getSourceExpression(); 4396 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4397 4398 ExprResult E = getDerived().TransformExpr(InputExpr); 4399 E = SemaRef.ActOnConstantExpression(E); 4400 if (E.isInvalid()) return true; 4401 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4402 return false; 4403 } 4404 } 4405 4406 // Work around bogus GCC warning 4407 return true; 4408 } 4409 4410 /// Iterator adaptor that invents template argument location information 4411 /// for each of the template arguments in its underlying iterator. 4412 template<typename Derived, typename InputIterator> 4413 class TemplateArgumentLocInventIterator { 4414 TreeTransform<Derived> &Self; 4415 InputIterator Iter; 4416 4417 public: 4418 typedef TemplateArgumentLoc value_type; 4419 typedef TemplateArgumentLoc reference; 4420 typedef typename std::iterator_traits<InputIterator>::difference_type 4421 difference_type; 4422 typedef std::input_iterator_tag iterator_category; 4423 4424 class pointer { 4425 TemplateArgumentLoc Arg; 4426 4427 public: 4428 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4429 4430 const TemplateArgumentLoc *operator->() const { return &Arg; } 4431 }; 4432 4433 TemplateArgumentLocInventIterator() { } 4434 4435 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4436 InputIterator Iter) 4437 : Self(Self), Iter(Iter) { } 4438 4439 TemplateArgumentLocInventIterator &operator++() { 4440 ++Iter; 4441 return *this; 4442 } 4443 4444 TemplateArgumentLocInventIterator operator++(int) { 4445 TemplateArgumentLocInventIterator Old(*this); 4446 ++(*this); 4447 return Old; 4448 } 4449 4450 reference operator*() const { 4451 TemplateArgumentLoc Result; 4452 Self.InventTemplateArgumentLoc(*Iter, Result); 4453 return Result; 4454 } 4455 4456 pointer operator->() const { return pointer(**this); } 4457 4458 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4459 const TemplateArgumentLocInventIterator &Y) { 4460 return X.Iter == Y.Iter; 4461 } 4462 4463 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4464 const TemplateArgumentLocInventIterator &Y) { 4465 return X.Iter != Y.Iter; 4466 } 4467 }; 4468 4469 template<typename Derived> 4470 template<typename InputIterator> 4471 bool TreeTransform<Derived>::TransformTemplateArguments( 4472 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4473 bool Uneval) { 4474 for (; First != Last; ++First) { 4475 TemplateArgumentLoc Out; 4476 TemplateArgumentLoc In = *First; 4477 4478 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4479 // Unpack argument packs, which we translate them into separate 4480 // arguments. 4481 // FIXME: We could do much better if we could guarantee that the 4482 // TemplateArgumentLocInfo for the pack expansion would be usable for 4483 // all of the template arguments in the argument pack. 4484 typedef TemplateArgumentLocInventIterator<Derived, 4485 TemplateArgument::pack_iterator> 4486 PackLocIterator; 4487 if (TransformTemplateArguments(PackLocIterator(*this, 4488 In.getArgument().pack_begin()), 4489 PackLocIterator(*this, 4490 In.getArgument().pack_end()), 4491 Outputs, Uneval)) 4492 return true; 4493 4494 continue; 4495 } 4496 4497 if (In.getArgument().isPackExpansion()) { 4498 // We have a pack expansion, for which we will be substituting into 4499 // the pattern. 4500 SourceLocation Ellipsis; 4501 Optional<unsigned> OrigNumExpansions; 4502 TemplateArgumentLoc Pattern 4503 = getSema().getTemplateArgumentPackExpansionPattern( 4504 In, Ellipsis, OrigNumExpansions); 4505 4506 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4507 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4508 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4509 4510 // Determine whether the set of unexpanded parameter packs can and should 4511 // be expanded. 4512 bool Expand = true; 4513 bool RetainExpansion = false; 4514 Optional<unsigned> NumExpansions = OrigNumExpansions; 4515 if (getDerived().TryExpandParameterPacks(Ellipsis, 4516 Pattern.getSourceRange(), 4517 Unexpanded, 4518 Expand, 4519 RetainExpansion, 4520 NumExpansions)) 4521 return true; 4522 4523 if (!Expand) { 4524 // The transform has determined that we should perform a simple 4525 // transformation on the pack expansion, producing another pack 4526 // expansion. 4527 TemplateArgumentLoc OutPattern; 4528 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4529 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4530 return true; 4531 4532 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4533 NumExpansions); 4534 if (Out.getArgument().isNull()) 4535 return true; 4536 4537 Outputs.addArgument(Out); 4538 continue; 4539 } 4540 4541 // The transform has determined that we should perform an elementwise 4542 // expansion of the pattern. Do so. 4543 for (unsigned I = 0; I != *NumExpansions; ++I) { 4544 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4545 4546 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4547 return true; 4548 4549 if (Out.getArgument().containsUnexpandedParameterPack()) { 4550 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4551 OrigNumExpansions); 4552 if (Out.getArgument().isNull()) 4553 return true; 4554 } 4555 4556 Outputs.addArgument(Out); 4557 } 4558 4559 // If we're supposed to retain a pack expansion, do so by temporarily 4560 // forgetting the partially-substituted parameter pack. 4561 if (RetainExpansion) { 4562 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4563 4564 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4565 return true; 4566 4567 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4568 OrigNumExpansions); 4569 if (Out.getArgument().isNull()) 4570 return true; 4571 4572 Outputs.addArgument(Out); 4573 } 4574 4575 continue; 4576 } 4577 4578 // The simple case: 4579 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4580 return true; 4581 4582 Outputs.addArgument(Out); 4583 } 4584 4585 return false; 4586 4587 } 4588 4589 //===----------------------------------------------------------------------===// 4590 // Type transformation 4591 //===----------------------------------------------------------------------===// 4592 4593 template<typename Derived> 4594 QualType TreeTransform<Derived>::TransformType(QualType T) { 4595 if (getDerived().AlreadyTransformed(T)) 4596 return T; 4597 4598 // Temporary workaround. All of these transformations should 4599 // eventually turn into transformations on TypeLocs. 4600 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4601 getDerived().getBaseLocation()); 4602 4603 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4604 4605 if (!NewDI) 4606 return QualType(); 4607 4608 return NewDI->getType(); 4609 } 4610 4611 template<typename Derived> 4612 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4613 // Refine the base location to the type's location. 4614 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4615 getDerived().getBaseEntity()); 4616 if (getDerived().AlreadyTransformed(DI->getType())) 4617 return DI; 4618 4619 TypeLocBuilder TLB; 4620 4621 TypeLoc TL = DI->getTypeLoc(); 4622 TLB.reserve(TL.getFullDataSize()); 4623 4624 QualType Result = getDerived().TransformType(TLB, TL); 4625 if (Result.isNull()) 4626 return nullptr; 4627 4628 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4629 } 4630 4631 template<typename Derived> 4632 QualType 4633 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4634 switch (T.getTypeLocClass()) { 4635 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4636 #define TYPELOC(CLASS, PARENT) \ 4637 case TypeLoc::CLASS: \ 4638 return getDerived().Transform##CLASS##Type(TLB, \ 4639 T.castAs<CLASS##TypeLoc>()); 4640 #include "clang/AST/TypeLocNodes.def" 4641 } 4642 4643 llvm_unreachable("unhandled type loc!"); 4644 } 4645 4646 template<typename Derived> 4647 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4648 if (!isa<DependentNameType>(T)) 4649 return TransformType(T); 4650 4651 if (getDerived().AlreadyTransformed(T)) 4652 return T; 4653 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4654 getDerived().getBaseLocation()); 4655 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4656 return NewDI ? NewDI->getType() : QualType(); 4657 } 4658 4659 template<typename Derived> 4660 TypeSourceInfo * 4661 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4662 if (!isa<DependentNameType>(DI->getType())) 4663 return TransformType(DI); 4664 4665 // Refine the base location to the type's location. 4666 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4667 getDerived().getBaseEntity()); 4668 if (getDerived().AlreadyTransformed(DI->getType())) 4669 return DI; 4670 4671 TypeLocBuilder TLB; 4672 4673 TypeLoc TL = DI->getTypeLoc(); 4674 TLB.reserve(TL.getFullDataSize()); 4675 4676 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4677 if (QTL) 4678 TL = QTL.getUnqualifiedLoc(); 4679 4680 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4681 4682 QualType Result = getDerived().TransformDependentNameType( 4683 TLB, DNTL, /*DeducedTSTContext*/true); 4684 if (Result.isNull()) 4685 return nullptr; 4686 4687 if (QTL) { 4688 Result = getDerived().RebuildQualifiedType(Result, QTL); 4689 if (Result.isNull()) 4690 return nullptr; 4691 TLB.TypeWasModifiedSafely(Result); 4692 } 4693 4694 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4695 } 4696 4697 template<typename Derived> 4698 QualType 4699 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4700 QualifiedTypeLoc T) { 4701 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4702 if (Result.isNull()) 4703 return QualType(); 4704 4705 Result = getDerived().RebuildQualifiedType(Result, T); 4706 4707 if (Result.isNull()) 4708 return QualType(); 4709 4710 // RebuildQualifiedType might have updated the type, but not in a way 4711 // that invalidates the TypeLoc. (There's no location information for 4712 // qualifiers.) 4713 TLB.TypeWasModifiedSafely(Result); 4714 4715 return Result; 4716 } 4717 4718 template <typename Derived> 4719 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4720 QualifiedTypeLoc TL) { 4721 4722 SourceLocation Loc = TL.getBeginLoc(); 4723 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4724 4725 if (((T.getAddressSpace() != LangAS::Default && 4726 Quals.getAddressSpace() != LangAS::Default)) && 4727 T.getAddressSpace() != Quals.getAddressSpace()) { 4728 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4729 << TL.getType() << T; 4730 return QualType(); 4731 } 4732 4733 // C++ [dcl.fct]p7: 4734 // [When] adding cv-qualifications on top of the function type [...] the 4735 // cv-qualifiers are ignored. 4736 if (T->isFunctionType()) { 4737 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4738 Quals.getAddressSpace()); 4739 return T; 4740 } 4741 4742 // C++ [dcl.ref]p1: 4743 // when the cv-qualifiers are introduced through the use of a typedef-name 4744 // or decltype-specifier [...] the cv-qualifiers are ignored. 4745 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4746 // applied to a reference type. 4747 if (T->isReferenceType()) { 4748 // The only qualifier that applies to a reference type is restrict. 4749 if (!Quals.hasRestrict()) 4750 return T; 4751 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4752 } 4753 4754 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4755 // resulting type. 4756 if (Quals.hasObjCLifetime()) { 4757 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4758 Quals.removeObjCLifetime(); 4759 else if (T.getObjCLifetime()) { 4760 // Objective-C ARC: 4761 // A lifetime qualifier applied to a substituted template parameter 4762 // overrides the lifetime qualifier from the template argument. 4763 const AutoType *AutoTy; 4764 if (const SubstTemplateTypeParmType *SubstTypeParam 4765 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4766 QualType Replacement = SubstTypeParam->getReplacementType(); 4767 Qualifiers Qs = Replacement.getQualifiers(); 4768 Qs.removeObjCLifetime(); 4769 Replacement = SemaRef.Context.getQualifiedType( 4770 Replacement.getUnqualifiedType(), Qs); 4771 T = SemaRef.Context.getSubstTemplateTypeParmType( 4772 SubstTypeParam->getReplacedParameter(), Replacement); 4773 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4774 // 'auto' types behave the same way as template parameters. 4775 QualType Deduced = AutoTy->getDeducedType(); 4776 Qualifiers Qs = Deduced.getQualifiers(); 4777 Qs.removeObjCLifetime(); 4778 Deduced = 4779 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4780 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4781 AutoTy->isDependentType(), 4782 /*isPack=*/false, 4783 AutoTy->getTypeConstraintConcept(), 4784 AutoTy->getTypeConstraintArguments()); 4785 } else { 4786 // Otherwise, complain about the addition of a qualifier to an 4787 // already-qualified type. 4788 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4789 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4790 Quals.removeObjCLifetime(); 4791 } 4792 } 4793 } 4794 4795 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4796 } 4797 4798 template<typename Derived> 4799 TypeLoc 4800 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4801 QualType ObjectType, 4802 NamedDecl *UnqualLookup, 4803 CXXScopeSpec &SS) { 4804 if (getDerived().AlreadyTransformed(TL.getType())) 4805 return TL; 4806 4807 TypeSourceInfo *TSI = 4808 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4809 if (TSI) 4810 return TSI->getTypeLoc(); 4811 return TypeLoc(); 4812 } 4813 4814 template<typename Derived> 4815 TypeSourceInfo * 4816 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4817 QualType ObjectType, 4818 NamedDecl *UnqualLookup, 4819 CXXScopeSpec &SS) { 4820 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4821 return TSInfo; 4822 4823 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4824 UnqualLookup, SS); 4825 } 4826 4827 template <typename Derived> 4828 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4829 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4830 CXXScopeSpec &SS) { 4831 QualType T = TL.getType(); 4832 assert(!getDerived().AlreadyTransformed(T)); 4833 4834 TypeLocBuilder TLB; 4835 QualType Result; 4836 4837 if (isa<TemplateSpecializationType>(T)) { 4838 TemplateSpecializationTypeLoc SpecTL = 4839 TL.castAs<TemplateSpecializationTypeLoc>(); 4840 4841 TemplateName Template = getDerived().TransformTemplateName( 4842 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4843 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4844 if (Template.isNull()) 4845 return nullptr; 4846 4847 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4848 Template); 4849 } else if (isa<DependentTemplateSpecializationType>(T)) { 4850 DependentTemplateSpecializationTypeLoc SpecTL = 4851 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4852 4853 TemplateName Template 4854 = getDerived().RebuildTemplateName(SS, 4855 SpecTL.getTemplateKeywordLoc(), 4856 *SpecTL.getTypePtr()->getIdentifier(), 4857 SpecTL.getTemplateNameLoc(), 4858 ObjectType, UnqualLookup, 4859 /*AllowInjectedClassName*/true); 4860 if (Template.isNull()) 4861 return nullptr; 4862 4863 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4864 SpecTL, 4865 Template, 4866 SS); 4867 } else { 4868 // Nothing special needs to be done for these. 4869 Result = getDerived().TransformType(TLB, TL); 4870 } 4871 4872 if (Result.isNull()) 4873 return nullptr; 4874 4875 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4876 } 4877 4878 template <class TyLoc> static inline 4879 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4880 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4881 NewT.setNameLoc(T.getNameLoc()); 4882 return T.getType(); 4883 } 4884 4885 template<typename Derived> 4886 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4887 BuiltinTypeLoc T) { 4888 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4889 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4890 if (T.needsExtraLocalData()) 4891 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4892 return T.getType(); 4893 } 4894 4895 template<typename Derived> 4896 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4897 ComplexTypeLoc T) { 4898 // FIXME: recurse? 4899 return TransformTypeSpecType(TLB, T); 4900 } 4901 4902 template <typename Derived> 4903 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4904 AdjustedTypeLoc TL) { 4905 // Adjustments applied during transformation are handled elsewhere. 4906 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4907 } 4908 4909 template<typename Derived> 4910 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4911 DecayedTypeLoc TL) { 4912 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4913 if (OriginalType.isNull()) 4914 return QualType(); 4915 4916 QualType Result = TL.getType(); 4917 if (getDerived().AlwaysRebuild() || 4918 OriginalType != TL.getOriginalLoc().getType()) 4919 Result = SemaRef.Context.getDecayedType(OriginalType); 4920 TLB.push<DecayedTypeLoc>(Result); 4921 // Nothing to set for DecayedTypeLoc. 4922 return Result; 4923 } 4924 4925 template<typename Derived> 4926 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4927 PointerTypeLoc TL) { 4928 QualType PointeeType 4929 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4930 if (PointeeType.isNull()) 4931 return QualType(); 4932 4933 QualType Result = TL.getType(); 4934 if (PointeeType->getAs<ObjCObjectType>()) { 4935 // A dependent pointer type 'T *' has is being transformed such 4936 // that an Objective-C class type is being replaced for 'T'. The 4937 // resulting pointer type is an ObjCObjectPointerType, not a 4938 // PointerType. 4939 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4940 4941 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4942 NewT.setStarLoc(TL.getStarLoc()); 4943 return Result; 4944 } 4945 4946 if (getDerived().AlwaysRebuild() || 4947 PointeeType != TL.getPointeeLoc().getType()) { 4948 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4949 if (Result.isNull()) 4950 return QualType(); 4951 } 4952 4953 // Objective-C ARC can add lifetime qualifiers to the type that we're 4954 // pointing to. 4955 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4956 4957 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4958 NewT.setSigilLoc(TL.getSigilLoc()); 4959 return Result; 4960 } 4961 4962 template<typename Derived> 4963 QualType 4964 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4965 BlockPointerTypeLoc TL) { 4966 QualType PointeeType 4967 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4968 if (PointeeType.isNull()) 4969 return QualType(); 4970 4971 QualType Result = TL.getType(); 4972 if (getDerived().AlwaysRebuild() || 4973 PointeeType != TL.getPointeeLoc().getType()) { 4974 Result = getDerived().RebuildBlockPointerType(PointeeType, 4975 TL.getSigilLoc()); 4976 if (Result.isNull()) 4977 return QualType(); 4978 } 4979 4980 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4981 NewT.setSigilLoc(TL.getSigilLoc()); 4982 return Result; 4983 } 4984 4985 /// Transforms a reference type. Note that somewhat paradoxically we 4986 /// don't care whether the type itself is an l-value type or an r-value 4987 /// type; we only care if the type was *written* as an l-value type 4988 /// or an r-value type. 4989 template<typename Derived> 4990 QualType 4991 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4992 ReferenceTypeLoc TL) { 4993 const ReferenceType *T = TL.getTypePtr(); 4994 4995 // Note that this works with the pointee-as-written. 4996 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4997 if (PointeeType.isNull()) 4998 return QualType(); 4999 5000 QualType Result = TL.getType(); 5001 if (getDerived().AlwaysRebuild() || 5002 PointeeType != T->getPointeeTypeAsWritten()) { 5003 Result = getDerived().RebuildReferenceType(PointeeType, 5004 T->isSpelledAsLValue(), 5005 TL.getSigilLoc()); 5006 if (Result.isNull()) 5007 return QualType(); 5008 } 5009 5010 // Objective-C ARC can add lifetime qualifiers to the type that we're 5011 // referring to. 5012 TLB.TypeWasModifiedSafely( 5013 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5014 5015 // r-value references can be rebuilt as l-value references. 5016 ReferenceTypeLoc NewTL; 5017 if (isa<LValueReferenceType>(Result)) 5018 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5019 else 5020 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5021 NewTL.setSigilLoc(TL.getSigilLoc()); 5022 5023 return Result; 5024 } 5025 5026 template<typename Derived> 5027 QualType 5028 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5029 LValueReferenceTypeLoc TL) { 5030 return TransformReferenceType(TLB, TL); 5031 } 5032 5033 template<typename Derived> 5034 QualType 5035 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5036 RValueReferenceTypeLoc TL) { 5037 return TransformReferenceType(TLB, TL); 5038 } 5039 5040 template<typename Derived> 5041 QualType 5042 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5043 MemberPointerTypeLoc TL) { 5044 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5045 if (PointeeType.isNull()) 5046 return QualType(); 5047 5048 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5049 TypeSourceInfo *NewClsTInfo = nullptr; 5050 if (OldClsTInfo) { 5051 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5052 if (!NewClsTInfo) 5053 return QualType(); 5054 } 5055 5056 const MemberPointerType *T = TL.getTypePtr(); 5057 QualType OldClsType = QualType(T->getClass(), 0); 5058 QualType NewClsType; 5059 if (NewClsTInfo) 5060 NewClsType = NewClsTInfo->getType(); 5061 else { 5062 NewClsType = getDerived().TransformType(OldClsType); 5063 if (NewClsType.isNull()) 5064 return QualType(); 5065 } 5066 5067 QualType Result = TL.getType(); 5068 if (getDerived().AlwaysRebuild() || 5069 PointeeType != T->getPointeeType() || 5070 NewClsType != OldClsType) { 5071 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5072 TL.getStarLoc()); 5073 if (Result.isNull()) 5074 return QualType(); 5075 } 5076 5077 // If we had to adjust the pointee type when building a member pointer, make 5078 // sure to push TypeLoc info for it. 5079 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5080 if (MPT && PointeeType != MPT->getPointeeType()) { 5081 assert(isa<AdjustedType>(MPT->getPointeeType())); 5082 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5083 } 5084 5085 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5086 NewTL.setSigilLoc(TL.getSigilLoc()); 5087 NewTL.setClassTInfo(NewClsTInfo); 5088 5089 return Result; 5090 } 5091 5092 template<typename Derived> 5093 QualType 5094 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5095 ConstantArrayTypeLoc TL) { 5096 const ConstantArrayType *T = TL.getTypePtr(); 5097 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5098 if (ElementType.isNull()) 5099 return QualType(); 5100 5101 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5102 Expr *OldSize = TL.getSizeExpr(); 5103 if (!OldSize) 5104 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5105 Expr *NewSize = nullptr; 5106 if (OldSize) { 5107 EnterExpressionEvaluationContext Unevaluated( 5108 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5109 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5110 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5111 } 5112 5113 QualType Result = TL.getType(); 5114 if (getDerived().AlwaysRebuild() || 5115 ElementType != T->getElementType() || 5116 (T->getSizeExpr() && NewSize != OldSize)) { 5117 Result = getDerived().RebuildConstantArrayType(ElementType, 5118 T->getSizeModifier(), 5119 T->getSize(), NewSize, 5120 T->getIndexTypeCVRQualifiers(), 5121 TL.getBracketsRange()); 5122 if (Result.isNull()) 5123 return QualType(); 5124 } 5125 5126 // We might have either a ConstantArrayType or a VariableArrayType now: 5127 // a ConstantArrayType is allowed to have an element type which is a 5128 // VariableArrayType if the type is dependent. Fortunately, all array 5129 // types have the same location layout. 5130 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5131 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5132 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5133 NewTL.setSizeExpr(NewSize); 5134 5135 return Result; 5136 } 5137 5138 template<typename Derived> 5139 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5140 TypeLocBuilder &TLB, 5141 IncompleteArrayTypeLoc TL) { 5142 const IncompleteArrayType *T = TL.getTypePtr(); 5143 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5144 if (ElementType.isNull()) 5145 return QualType(); 5146 5147 QualType Result = TL.getType(); 5148 if (getDerived().AlwaysRebuild() || 5149 ElementType != T->getElementType()) { 5150 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5151 T->getSizeModifier(), 5152 T->getIndexTypeCVRQualifiers(), 5153 TL.getBracketsRange()); 5154 if (Result.isNull()) 5155 return QualType(); 5156 } 5157 5158 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5159 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5160 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5161 NewTL.setSizeExpr(nullptr); 5162 5163 return Result; 5164 } 5165 5166 template<typename Derived> 5167 QualType 5168 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5169 VariableArrayTypeLoc TL) { 5170 const VariableArrayType *T = TL.getTypePtr(); 5171 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5172 if (ElementType.isNull()) 5173 return QualType(); 5174 5175 ExprResult SizeResult; 5176 { 5177 EnterExpressionEvaluationContext Context( 5178 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5179 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5180 } 5181 if (SizeResult.isInvalid()) 5182 return QualType(); 5183 SizeResult = 5184 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5185 if (SizeResult.isInvalid()) 5186 return QualType(); 5187 5188 Expr *Size = SizeResult.get(); 5189 5190 QualType Result = TL.getType(); 5191 if (getDerived().AlwaysRebuild() || 5192 ElementType != T->getElementType() || 5193 Size != T->getSizeExpr()) { 5194 Result = getDerived().RebuildVariableArrayType(ElementType, 5195 T->getSizeModifier(), 5196 Size, 5197 T->getIndexTypeCVRQualifiers(), 5198 TL.getBracketsRange()); 5199 if (Result.isNull()) 5200 return QualType(); 5201 } 5202 5203 // We might have constant size array now, but fortunately it has the same 5204 // location layout. 5205 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5206 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5207 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5208 NewTL.setSizeExpr(Size); 5209 5210 return Result; 5211 } 5212 5213 template<typename Derived> 5214 QualType 5215 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5216 DependentSizedArrayTypeLoc TL) { 5217 const DependentSizedArrayType *T = TL.getTypePtr(); 5218 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5219 if (ElementType.isNull()) 5220 return QualType(); 5221 5222 // Array bounds are constant expressions. 5223 EnterExpressionEvaluationContext Unevaluated( 5224 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5225 5226 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5227 Expr *origSize = TL.getSizeExpr(); 5228 if (!origSize) origSize = T->getSizeExpr(); 5229 5230 ExprResult sizeResult 5231 = getDerived().TransformExpr(origSize); 5232 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5233 if (sizeResult.isInvalid()) 5234 return QualType(); 5235 5236 Expr *size = sizeResult.get(); 5237 5238 QualType Result = TL.getType(); 5239 if (getDerived().AlwaysRebuild() || 5240 ElementType != T->getElementType() || 5241 size != origSize) { 5242 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5243 T->getSizeModifier(), 5244 size, 5245 T->getIndexTypeCVRQualifiers(), 5246 TL.getBracketsRange()); 5247 if (Result.isNull()) 5248 return QualType(); 5249 } 5250 5251 // We might have any sort of array type now, but fortunately they 5252 // all have the same location layout. 5253 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5254 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5255 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5256 NewTL.setSizeExpr(size); 5257 5258 return Result; 5259 } 5260 5261 template <typename Derived> 5262 QualType TreeTransform<Derived>::TransformDependentVectorType( 5263 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5264 const DependentVectorType *T = TL.getTypePtr(); 5265 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5266 if (ElementType.isNull()) 5267 return QualType(); 5268 5269 EnterExpressionEvaluationContext Unevaluated( 5270 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5271 5272 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5273 Size = SemaRef.ActOnConstantExpression(Size); 5274 if (Size.isInvalid()) 5275 return QualType(); 5276 5277 QualType Result = TL.getType(); 5278 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5279 Size.get() != T->getSizeExpr()) { 5280 Result = getDerived().RebuildDependentVectorType( 5281 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5282 if (Result.isNull()) 5283 return QualType(); 5284 } 5285 5286 // Result might be dependent or not. 5287 if (isa<DependentVectorType>(Result)) { 5288 DependentVectorTypeLoc NewTL = 5289 TLB.push<DependentVectorTypeLoc>(Result); 5290 NewTL.setNameLoc(TL.getNameLoc()); 5291 } else { 5292 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5293 NewTL.setNameLoc(TL.getNameLoc()); 5294 } 5295 5296 return Result; 5297 } 5298 5299 template<typename Derived> 5300 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5301 TypeLocBuilder &TLB, 5302 DependentSizedExtVectorTypeLoc TL) { 5303 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5304 5305 // FIXME: ext vector locs should be nested 5306 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5307 if (ElementType.isNull()) 5308 return QualType(); 5309 5310 // Vector sizes are constant expressions. 5311 EnterExpressionEvaluationContext Unevaluated( 5312 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5313 5314 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5315 Size = SemaRef.ActOnConstantExpression(Size); 5316 if (Size.isInvalid()) 5317 return QualType(); 5318 5319 QualType Result = TL.getType(); 5320 if (getDerived().AlwaysRebuild() || 5321 ElementType != T->getElementType() || 5322 Size.get() != T->getSizeExpr()) { 5323 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5324 Size.get(), 5325 T->getAttributeLoc()); 5326 if (Result.isNull()) 5327 return QualType(); 5328 } 5329 5330 // Result might be dependent or not. 5331 if (isa<DependentSizedExtVectorType>(Result)) { 5332 DependentSizedExtVectorTypeLoc NewTL 5333 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5334 NewTL.setNameLoc(TL.getNameLoc()); 5335 } else { 5336 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5337 NewTL.setNameLoc(TL.getNameLoc()); 5338 } 5339 5340 return Result; 5341 } 5342 5343 template <typename Derived> 5344 QualType 5345 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5346 ConstantMatrixTypeLoc TL) { 5347 const ConstantMatrixType *T = TL.getTypePtr(); 5348 QualType ElementType = getDerived().TransformType(T->getElementType()); 5349 if (ElementType.isNull()) 5350 return QualType(); 5351 5352 QualType Result = TL.getType(); 5353 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5354 Result = getDerived().RebuildConstantMatrixType( 5355 ElementType, T->getNumRows(), T->getNumColumns()); 5356 if (Result.isNull()) 5357 return QualType(); 5358 } 5359 5360 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5361 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5362 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5363 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5364 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5365 5366 return Result; 5367 } 5368 5369 template <typename Derived> 5370 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5371 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5372 const DependentSizedMatrixType *T = TL.getTypePtr(); 5373 5374 QualType ElementType = getDerived().TransformType(T->getElementType()); 5375 if (ElementType.isNull()) { 5376 return QualType(); 5377 } 5378 5379 // Matrix dimensions are constant expressions. 5380 EnterExpressionEvaluationContext Unevaluated( 5381 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5382 5383 Expr *origRows = TL.getAttrRowOperand(); 5384 if (!origRows) 5385 origRows = T->getRowExpr(); 5386 Expr *origColumns = TL.getAttrColumnOperand(); 5387 if (!origColumns) 5388 origColumns = T->getColumnExpr(); 5389 5390 ExprResult rowResult = getDerived().TransformExpr(origRows); 5391 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5392 if (rowResult.isInvalid()) 5393 return QualType(); 5394 5395 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5396 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5397 if (columnResult.isInvalid()) 5398 return QualType(); 5399 5400 Expr *rows = rowResult.get(); 5401 Expr *columns = columnResult.get(); 5402 5403 QualType Result = TL.getType(); 5404 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5405 rows != origRows || columns != origColumns) { 5406 Result = getDerived().RebuildDependentSizedMatrixType( 5407 ElementType, rows, columns, T->getAttributeLoc()); 5408 5409 if (Result.isNull()) 5410 return QualType(); 5411 } 5412 5413 // We might have any sort of matrix type now, but fortunately they 5414 // all have the same location layout. 5415 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5416 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5417 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5418 NewTL.setAttrRowOperand(rows); 5419 NewTL.setAttrColumnOperand(columns); 5420 return Result; 5421 } 5422 5423 template <typename Derived> 5424 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5425 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5426 const DependentAddressSpaceType *T = TL.getTypePtr(); 5427 5428 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5429 5430 if (pointeeType.isNull()) 5431 return QualType(); 5432 5433 // Address spaces are constant expressions. 5434 EnterExpressionEvaluationContext Unevaluated( 5435 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5436 5437 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5438 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5439 if (AddrSpace.isInvalid()) 5440 return QualType(); 5441 5442 QualType Result = TL.getType(); 5443 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5444 AddrSpace.get() != T->getAddrSpaceExpr()) { 5445 Result = getDerived().RebuildDependentAddressSpaceType( 5446 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5447 if (Result.isNull()) 5448 return QualType(); 5449 } 5450 5451 // Result might be dependent or not. 5452 if (isa<DependentAddressSpaceType>(Result)) { 5453 DependentAddressSpaceTypeLoc NewTL = 5454 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5455 5456 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5457 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5458 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5459 5460 } else { 5461 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5462 Result, getDerived().getBaseLocation()); 5463 TransformType(TLB, DI->getTypeLoc()); 5464 } 5465 5466 return Result; 5467 } 5468 5469 template <typename Derived> 5470 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5471 VectorTypeLoc TL) { 5472 const VectorType *T = TL.getTypePtr(); 5473 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5474 if (ElementType.isNull()) 5475 return QualType(); 5476 5477 QualType Result = TL.getType(); 5478 if (getDerived().AlwaysRebuild() || 5479 ElementType != T->getElementType()) { 5480 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5481 T->getVectorKind()); 5482 if (Result.isNull()) 5483 return QualType(); 5484 } 5485 5486 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5487 NewTL.setNameLoc(TL.getNameLoc()); 5488 5489 return Result; 5490 } 5491 5492 template<typename Derived> 5493 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5494 ExtVectorTypeLoc TL) { 5495 const VectorType *T = TL.getTypePtr(); 5496 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5497 if (ElementType.isNull()) 5498 return QualType(); 5499 5500 QualType Result = TL.getType(); 5501 if (getDerived().AlwaysRebuild() || 5502 ElementType != T->getElementType()) { 5503 Result = getDerived().RebuildExtVectorType(ElementType, 5504 T->getNumElements(), 5505 /*FIXME*/ SourceLocation()); 5506 if (Result.isNull()) 5507 return QualType(); 5508 } 5509 5510 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5511 NewTL.setNameLoc(TL.getNameLoc()); 5512 5513 return Result; 5514 } 5515 5516 template <typename Derived> 5517 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5518 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5519 bool ExpectParameterPack) { 5520 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5521 TypeSourceInfo *NewDI = nullptr; 5522 5523 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5524 // If we're substituting into a pack expansion type and we know the 5525 // length we want to expand to, just substitute for the pattern. 5526 TypeLoc OldTL = OldDI->getTypeLoc(); 5527 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5528 5529 TypeLocBuilder TLB; 5530 TypeLoc NewTL = OldDI->getTypeLoc(); 5531 TLB.reserve(NewTL.getFullDataSize()); 5532 5533 QualType Result = getDerived().TransformType(TLB, 5534 OldExpansionTL.getPatternLoc()); 5535 if (Result.isNull()) 5536 return nullptr; 5537 5538 Result = RebuildPackExpansionType(Result, 5539 OldExpansionTL.getPatternLoc().getSourceRange(), 5540 OldExpansionTL.getEllipsisLoc(), 5541 NumExpansions); 5542 if (Result.isNull()) 5543 return nullptr; 5544 5545 PackExpansionTypeLoc NewExpansionTL 5546 = TLB.push<PackExpansionTypeLoc>(Result); 5547 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5548 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5549 } else 5550 NewDI = getDerived().TransformType(OldDI); 5551 if (!NewDI) 5552 return nullptr; 5553 5554 if (NewDI == OldDI && indexAdjustment == 0) 5555 return OldParm; 5556 5557 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5558 OldParm->getDeclContext(), 5559 OldParm->getInnerLocStart(), 5560 OldParm->getLocation(), 5561 OldParm->getIdentifier(), 5562 NewDI->getType(), 5563 NewDI, 5564 OldParm->getStorageClass(), 5565 /* DefArg */ nullptr); 5566 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5567 OldParm->getFunctionScopeIndex() + indexAdjustment); 5568 transformedLocalDecl(OldParm, {newParm}); 5569 return newParm; 5570 } 5571 5572 template <typename Derived> 5573 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5574 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5575 const QualType *ParamTypes, 5576 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5577 SmallVectorImpl<QualType> &OutParamTypes, 5578 SmallVectorImpl<ParmVarDecl *> *PVars, 5579 Sema::ExtParameterInfoBuilder &PInfos) { 5580 int indexAdjustment = 0; 5581 5582 unsigned NumParams = Params.size(); 5583 for (unsigned i = 0; i != NumParams; ++i) { 5584 if (ParmVarDecl *OldParm = Params[i]) { 5585 assert(OldParm->getFunctionScopeIndex() == i); 5586 5587 Optional<unsigned> NumExpansions; 5588 ParmVarDecl *NewParm = nullptr; 5589 if (OldParm->isParameterPack()) { 5590 // We have a function parameter pack that may need to be expanded. 5591 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5592 5593 // Find the parameter packs that could be expanded. 5594 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5595 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5596 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5597 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5598 5599 // Determine whether we should expand the parameter packs. 5600 bool ShouldExpand = false; 5601 bool RetainExpansion = false; 5602 Optional<unsigned> OrigNumExpansions; 5603 if (Unexpanded.size() > 0) { 5604 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5605 NumExpansions = OrigNumExpansions; 5606 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5607 Pattern.getSourceRange(), 5608 Unexpanded, 5609 ShouldExpand, 5610 RetainExpansion, 5611 NumExpansions)) { 5612 return true; 5613 } 5614 } else { 5615 #ifndef NDEBUG 5616 const AutoType *AT = 5617 Pattern.getType().getTypePtr()->getContainedAutoType(); 5618 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5619 "Could not find parameter packs or undeduced auto type!"); 5620 #endif 5621 } 5622 5623 if (ShouldExpand) { 5624 // Expand the function parameter pack into multiple, separate 5625 // parameters. 5626 getDerived().ExpandingFunctionParameterPack(OldParm); 5627 for (unsigned I = 0; I != *NumExpansions; ++I) { 5628 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5629 ParmVarDecl *NewParm 5630 = getDerived().TransformFunctionTypeParam(OldParm, 5631 indexAdjustment++, 5632 OrigNumExpansions, 5633 /*ExpectParameterPack=*/false); 5634 if (!NewParm) 5635 return true; 5636 5637 if (ParamInfos) 5638 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5639 OutParamTypes.push_back(NewParm->getType()); 5640 if (PVars) 5641 PVars->push_back(NewParm); 5642 } 5643 5644 // If we're supposed to retain a pack expansion, do so by temporarily 5645 // forgetting the partially-substituted parameter pack. 5646 if (RetainExpansion) { 5647 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5648 ParmVarDecl *NewParm 5649 = getDerived().TransformFunctionTypeParam(OldParm, 5650 indexAdjustment++, 5651 OrigNumExpansions, 5652 /*ExpectParameterPack=*/false); 5653 if (!NewParm) 5654 return true; 5655 5656 if (ParamInfos) 5657 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5658 OutParamTypes.push_back(NewParm->getType()); 5659 if (PVars) 5660 PVars->push_back(NewParm); 5661 } 5662 5663 // The next parameter should have the same adjustment as the 5664 // last thing we pushed, but we post-incremented indexAdjustment 5665 // on every push. Also, if we push nothing, the adjustment should 5666 // go down by one. 5667 indexAdjustment--; 5668 5669 // We're done with the pack expansion. 5670 continue; 5671 } 5672 5673 // We'll substitute the parameter now without expanding the pack 5674 // expansion. 5675 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5676 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5677 indexAdjustment, 5678 NumExpansions, 5679 /*ExpectParameterPack=*/true); 5680 assert(NewParm->isParameterPack() && 5681 "Parameter pack no longer a parameter pack after " 5682 "transformation."); 5683 } else { 5684 NewParm = getDerived().TransformFunctionTypeParam( 5685 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5686 } 5687 5688 if (!NewParm) 5689 return true; 5690 5691 if (ParamInfos) 5692 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5693 OutParamTypes.push_back(NewParm->getType()); 5694 if (PVars) 5695 PVars->push_back(NewParm); 5696 continue; 5697 } 5698 5699 // Deal with the possibility that we don't have a parameter 5700 // declaration for this parameter. 5701 QualType OldType = ParamTypes[i]; 5702 bool IsPackExpansion = false; 5703 Optional<unsigned> NumExpansions; 5704 QualType NewType; 5705 if (const PackExpansionType *Expansion 5706 = dyn_cast<PackExpansionType>(OldType)) { 5707 // We have a function parameter pack that may need to be expanded. 5708 QualType Pattern = Expansion->getPattern(); 5709 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5710 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5711 5712 // Determine whether we should expand the parameter packs. 5713 bool ShouldExpand = false; 5714 bool RetainExpansion = false; 5715 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5716 Unexpanded, 5717 ShouldExpand, 5718 RetainExpansion, 5719 NumExpansions)) { 5720 return true; 5721 } 5722 5723 if (ShouldExpand) { 5724 // Expand the function parameter pack into multiple, separate 5725 // parameters. 5726 for (unsigned I = 0; I != *NumExpansions; ++I) { 5727 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5728 QualType NewType = getDerived().TransformType(Pattern); 5729 if (NewType.isNull()) 5730 return true; 5731 5732 if (NewType->containsUnexpandedParameterPack()) { 5733 NewType = 5734 getSema().getASTContext().getPackExpansionType(NewType, None); 5735 5736 if (NewType.isNull()) 5737 return true; 5738 } 5739 5740 if (ParamInfos) 5741 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5742 OutParamTypes.push_back(NewType); 5743 if (PVars) 5744 PVars->push_back(nullptr); 5745 } 5746 5747 // We're done with the pack expansion. 5748 continue; 5749 } 5750 5751 // If we're supposed to retain a pack expansion, do so by temporarily 5752 // forgetting the partially-substituted parameter pack. 5753 if (RetainExpansion) { 5754 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5755 QualType NewType = getDerived().TransformType(Pattern); 5756 if (NewType.isNull()) 5757 return true; 5758 5759 if (ParamInfos) 5760 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5761 OutParamTypes.push_back(NewType); 5762 if (PVars) 5763 PVars->push_back(nullptr); 5764 } 5765 5766 // We'll substitute the parameter now without expanding the pack 5767 // expansion. 5768 OldType = Expansion->getPattern(); 5769 IsPackExpansion = true; 5770 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5771 NewType = getDerived().TransformType(OldType); 5772 } else { 5773 NewType = getDerived().TransformType(OldType); 5774 } 5775 5776 if (NewType.isNull()) 5777 return true; 5778 5779 if (IsPackExpansion) 5780 NewType = getSema().Context.getPackExpansionType(NewType, 5781 NumExpansions); 5782 5783 if (ParamInfos) 5784 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5785 OutParamTypes.push_back(NewType); 5786 if (PVars) 5787 PVars->push_back(nullptr); 5788 } 5789 5790 #ifndef NDEBUG 5791 if (PVars) { 5792 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5793 if (ParmVarDecl *parm = (*PVars)[i]) 5794 assert(parm->getFunctionScopeIndex() == i); 5795 } 5796 #endif 5797 5798 return false; 5799 } 5800 5801 template<typename Derived> 5802 QualType 5803 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5804 FunctionProtoTypeLoc TL) { 5805 SmallVector<QualType, 4> ExceptionStorage; 5806 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5807 return getDerived().TransformFunctionProtoType( 5808 TLB, TL, nullptr, Qualifiers(), 5809 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5810 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5811 ExceptionStorage, Changed); 5812 }); 5813 } 5814 5815 template<typename Derived> template<typename Fn> 5816 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5817 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5818 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5819 5820 // Transform the parameters and return type. 5821 // 5822 // We are required to instantiate the params and return type in source order. 5823 // When the function has a trailing return type, we instantiate the 5824 // parameters before the return type, since the return type can then refer 5825 // to the parameters themselves (via decltype, sizeof, etc.). 5826 // 5827 SmallVector<QualType, 4> ParamTypes; 5828 SmallVector<ParmVarDecl*, 4> ParamDecls; 5829 Sema::ExtParameterInfoBuilder ExtParamInfos; 5830 const FunctionProtoType *T = TL.getTypePtr(); 5831 5832 QualType ResultType; 5833 5834 if (T->hasTrailingReturn()) { 5835 if (getDerived().TransformFunctionTypeParams( 5836 TL.getBeginLoc(), TL.getParams(), 5837 TL.getTypePtr()->param_type_begin(), 5838 T->getExtParameterInfosOrNull(), 5839 ParamTypes, &ParamDecls, ExtParamInfos)) 5840 return QualType(); 5841 5842 { 5843 // C++11 [expr.prim.general]p3: 5844 // If a declaration declares a member function or member function 5845 // template of a class X, the expression this is a prvalue of type 5846 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5847 // and the end of the function-definition, member-declarator, or 5848 // declarator. 5849 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5850 5851 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5852 if (ResultType.isNull()) 5853 return QualType(); 5854 } 5855 } 5856 else { 5857 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5858 if (ResultType.isNull()) 5859 return QualType(); 5860 5861 if (getDerived().TransformFunctionTypeParams( 5862 TL.getBeginLoc(), TL.getParams(), 5863 TL.getTypePtr()->param_type_begin(), 5864 T->getExtParameterInfosOrNull(), 5865 ParamTypes, &ParamDecls, ExtParamInfos)) 5866 return QualType(); 5867 } 5868 5869 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5870 5871 bool EPIChanged = false; 5872 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5873 return QualType(); 5874 5875 // Handle extended parameter information. 5876 if (auto NewExtParamInfos = 5877 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5878 if (!EPI.ExtParameterInfos || 5879 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5880 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5881 EPIChanged = true; 5882 } 5883 EPI.ExtParameterInfos = NewExtParamInfos; 5884 } else if (EPI.ExtParameterInfos) { 5885 EPIChanged = true; 5886 EPI.ExtParameterInfos = nullptr; 5887 } 5888 5889 QualType Result = TL.getType(); 5890 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5891 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5892 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5893 if (Result.isNull()) 5894 return QualType(); 5895 } 5896 5897 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5898 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5899 NewTL.setLParenLoc(TL.getLParenLoc()); 5900 NewTL.setRParenLoc(TL.getRParenLoc()); 5901 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5902 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5903 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5904 NewTL.setParam(i, ParamDecls[i]); 5905 5906 return Result; 5907 } 5908 5909 template<typename Derived> 5910 bool TreeTransform<Derived>::TransformExceptionSpec( 5911 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5912 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5913 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5914 5915 // Instantiate a dynamic noexcept expression, if any. 5916 if (isComputedNoexcept(ESI.Type)) { 5917 EnterExpressionEvaluationContext Unevaluated( 5918 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5919 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5920 if (NoexceptExpr.isInvalid()) 5921 return true; 5922 5923 ExceptionSpecificationType EST = ESI.Type; 5924 NoexceptExpr = 5925 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5926 if (NoexceptExpr.isInvalid()) 5927 return true; 5928 5929 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5930 Changed = true; 5931 ESI.NoexceptExpr = NoexceptExpr.get(); 5932 ESI.Type = EST; 5933 } 5934 5935 if (ESI.Type != EST_Dynamic) 5936 return false; 5937 5938 // Instantiate a dynamic exception specification's type. 5939 for (QualType T : ESI.Exceptions) { 5940 if (const PackExpansionType *PackExpansion = 5941 T->getAs<PackExpansionType>()) { 5942 Changed = true; 5943 5944 // We have a pack expansion. Instantiate it. 5945 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5946 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5947 Unexpanded); 5948 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5949 5950 // Determine whether the set of unexpanded parameter packs can and 5951 // should 5952 // be expanded. 5953 bool Expand = false; 5954 bool RetainExpansion = false; 5955 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5956 // FIXME: Track the location of the ellipsis (and track source location 5957 // information for the types in the exception specification in general). 5958 if (getDerived().TryExpandParameterPacks( 5959 Loc, SourceRange(), Unexpanded, Expand, 5960 RetainExpansion, NumExpansions)) 5961 return true; 5962 5963 if (!Expand) { 5964 // We can't expand this pack expansion into separate arguments yet; 5965 // just substitute into the pattern and create a new pack expansion 5966 // type. 5967 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5968 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5969 if (U.isNull()) 5970 return true; 5971 5972 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5973 Exceptions.push_back(U); 5974 continue; 5975 } 5976 5977 // Substitute into the pack expansion pattern for each slice of the 5978 // pack. 5979 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5980 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5981 5982 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5983 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5984 return true; 5985 5986 Exceptions.push_back(U); 5987 } 5988 } else { 5989 QualType U = getDerived().TransformType(T); 5990 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5991 return true; 5992 if (T != U) 5993 Changed = true; 5994 5995 Exceptions.push_back(U); 5996 } 5997 } 5998 5999 ESI.Exceptions = Exceptions; 6000 if (ESI.Exceptions.empty()) 6001 ESI.Type = EST_DynamicNone; 6002 return false; 6003 } 6004 6005 template<typename Derived> 6006 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6007 TypeLocBuilder &TLB, 6008 FunctionNoProtoTypeLoc TL) { 6009 const FunctionNoProtoType *T = TL.getTypePtr(); 6010 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6011 if (ResultType.isNull()) 6012 return QualType(); 6013 6014 QualType Result = TL.getType(); 6015 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6016 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6017 6018 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6019 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6020 NewTL.setLParenLoc(TL.getLParenLoc()); 6021 NewTL.setRParenLoc(TL.getRParenLoc()); 6022 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6023 6024 return Result; 6025 } 6026 6027 template<typename Derived> QualType 6028 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 6029 UnresolvedUsingTypeLoc TL) { 6030 const UnresolvedUsingType *T = TL.getTypePtr(); 6031 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6032 if (!D) 6033 return QualType(); 6034 6035 QualType Result = TL.getType(); 6036 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6037 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6038 if (Result.isNull()) 6039 return QualType(); 6040 } 6041 6042 // We might get an arbitrary type spec type back. We should at 6043 // least always get a type spec type, though. 6044 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6045 NewTL.setNameLoc(TL.getNameLoc()); 6046 6047 return Result; 6048 } 6049 6050 template<typename Derived> 6051 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6052 TypedefTypeLoc TL) { 6053 const TypedefType *T = TL.getTypePtr(); 6054 TypedefNameDecl *Typedef 6055 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6056 T->getDecl())); 6057 if (!Typedef) 6058 return QualType(); 6059 6060 QualType Result = TL.getType(); 6061 if (getDerived().AlwaysRebuild() || 6062 Typedef != T->getDecl()) { 6063 Result = getDerived().RebuildTypedefType(Typedef); 6064 if (Result.isNull()) 6065 return QualType(); 6066 } 6067 6068 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6069 NewTL.setNameLoc(TL.getNameLoc()); 6070 6071 return Result; 6072 } 6073 6074 template<typename Derived> 6075 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6076 TypeOfExprTypeLoc TL) { 6077 // typeof expressions are not potentially evaluated contexts 6078 EnterExpressionEvaluationContext Unevaluated( 6079 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6080 Sema::ReuseLambdaContextDecl); 6081 6082 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6083 if (E.isInvalid()) 6084 return QualType(); 6085 6086 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6087 if (E.isInvalid()) 6088 return QualType(); 6089 6090 QualType Result = TL.getType(); 6091 if (getDerived().AlwaysRebuild() || 6092 E.get() != TL.getUnderlyingExpr()) { 6093 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6094 if (Result.isNull()) 6095 return QualType(); 6096 } 6097 else E.get(); 6098 6099 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6100 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6101 NewTL.setLParenLoc(TL.getLParenLoc()); 6102 NewTL.setRParenLoc(TL.getRParenLoc()); 6103 6104 return Result; 6105 } 6106 6107 template<typename Derived> 6108 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6109 TypeOfTypeLoc TL) { 6110 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6111 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6112 if (!New_Under_TI) 6113 return QualType(); 6114 6115 QualType Result = TL.getType(); 6116 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6117 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6118 if (Result.isNull()) 6119 return QualType(); 6120 } 6121 6122 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6123 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6124 NewTL.setLParenLoc(TL.getLParenLoc()); 6125 NewTL.setRParenLoc(TL.getRParenLoc()); 6126 NewTL.setUnderlyingTInfo(New_Under_TI); 6127 6128 return Result; 6129 } 6130 6131 template<typename Derived> 6132 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6133 DecltypeTypeLoc TL) { 6134 const DecltypeType *T = TL.getTypePtr(); 6135 6136 // decltype expressions are not potentially evaluated contexts 6137 EnterExpressionEvaluationContext Unevaluated( 6138 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6139 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6140 6141 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6142 if (E.isInvalid()) 6143 return QualType(); 6144 6145 E = getSema().ActOnDecltypeExpression(E.get()); 6146 if (E.isInvalid()) 6147 return QualType(); 6148 6149 QualType Result = TL.getType(); 6150 if (getDerived().AlwaysRebuild() || 6151 E.get() != T->getUnderlyingExpr()) { 6152 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6153 if (Result.isNull()) 6154 return QualType(); 6155 } 6156 else E.get(); 6157 6158 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6159 NewTL.setNameLoc(TL.getNameLoc()); 6160 6161 return Result; 6162 } 6163 6164 template<typename Derived> 6165 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6166 TypeLocBuilder &TLB, 6167 UnaryTransformTypeLoc TL) { 6168 QualType Result = TL.getType(); 6169 if (Result->isDependentType()) { 6170 const UnaryTransformType *T = TL.getTypePtr(); 6171 QualType NewBase = 6172 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6173 Result = getDerived().RebuildUnaryTransformType(NewBase, 6174 T->getUTTKind(), 6175 TL.getKWLoc()); 6176 if (Result.isNull()) 6177 return QualType(); 6178 } 6179 6180 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6181 NewTL.setKWLoc(TL.getKWLoc()); 6182 NewTL.setParensRange(TL.getParensRange()); 6183 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6184 return Result; 6185 } 6186 6187 template<typename Derived> 6188 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6189 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6190 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6191 6192 CXXScopeSpec SS; 6193 TemplateName TemplateName = getDerived().TransformTemplateName( 6194 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6195 if (TemplateName.isNull()) 6196 return QualType(); 6197 6198 QualType OldDeduced = T->getDeducedType(); 6199 QualType NewDeduced; 6200 if (!OldDeduced.isNull()) { 6201 NewDeduced = getDerived().TransformType(OldDeduced); 6202 if (NewDeduced.isNull()) 6203 return QualType(); 6204 } 6205 6206 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6207 TemplateName, NewDeduced); 6208 if (Result.isNull()) 6209 return QualType(); 6210 6211 DeducedTemplateSpecializationTypeLoc NewTL = 6212 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6213 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6214 6215 return Result; 6216 } 6217 6218 template<typename Derived> 6219 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6220 RecordTypeLoc TL) { 6221 const RecordType *T = TL.getTypePtr(); 6222 RecordDecl *Record 6223 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6224 T->getDecl())); 6225 if (!Record) 6226 return QualType(); 6227 6228 QualType Result = TL.getType(); 6229 if (getDerived().AlwaysRebuild() || 6230 Record != T->getDecl()) { 6231 Result = getDerived().RebuildRecordType(Record); 6232 if (Result.isNull()) 6233 return QualType(); 6234 } 6235 6236 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6237 NewTL.setNameLoc(TL.getNameLoc()); 6238 6239 return Result; 6240 } 6241 6242 template<typename Derived> 6243 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6244 EnumTypeLoc TL) { 6245 const EnumType *T = TL.getTypePtr(); 6246 EnumDecl *Enum 6247 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6248 T->getDecl())); 6249 if (!Enum) 6250 return QualType(); 6251 6252 QualType Result = TL.getType(); 6253 if (getDerived().AlwaysRebuild() || 6254 Enum != T->getDecl()) { 6255 Result = getDerived().RebuildEnumType(Enum); 6256 if (Result.isNull()) 6257 return QualType(); 6258 } 6259 6260 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6261 NewTL.setNameLoc(TL.getNameLoc()); 6262 6263 return Result; 6264 } 6265 6266 template<typename Derived> 6267 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6268 TypeLocBuilder &TLB, 6269 InjectedClassNameTypeLoc TL) { 6270 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6271 TL.getTypePtr()->getDecl()); 6272 if (!D) return QualType(); 6273 6274 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6275 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6276 return T; 6277 } 6278 6279 template<typename Derived> 6280 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6281 TypeLocBuilder &TLB, 6282 TemplateTypeParmTypeLoc TL) { 6283 return TransformTypeSpecType(TLB, TL); 6284 } 6285 6286 template<typename Derived> 6287 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6288 TypeLocBuilder &TLB, 6289 SubstTemplateTypeParmTypeLoc TL) { 6290 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6291 6292 // Substitute into the replacement type, which itself might involve something 6293 // that needs to be transformed. This only tends to occur with default 6294 // template arguments of template template parameters. 6295 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6296 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6297 if (Replacement.isNull()) 6298 return QualType(); 6299 6300 // Always canonicalize the replacement type. 6301 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6302 QualType Result 6303 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6304 Replacement); 6305 6306 // Propagate type-source information. 6307 SubstTemplateTypeParmTypeLoc NewTL 6308 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6309 NewTL.setNameLoc(TL.getNameLoc()); 6310 return Result; 6311 6312 } 6313 6314 template<typename Derived> 6315 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6316 TypeLocBuilder &TLB, 6317 SubstTemplateTypeParmPackTypeLoc TL) { 6318 return TransformTypeSpecType(TLB, TL); 6319 } 6320 6321 template<typename Derived> 6322 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6323 TypeLocBuilder &TLB, 6324 TemplateSpecializationTypeLoc TL) { 6325 const TemplateSpecializationType *T = TL.getTypePtr(); 6326 6327 // The nested-name-specifier never matters in a TemplateSpecializationType, 6328 // because we can't have a dependent nested-name-specifier anyway. 6329 CXXScopeSpec SS; 6330 TemplateName Template 6331 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6332 TL.getTemplateNameLoc()); 6333 if (Template.isNull()) 6334 return QualType(); 6335 6336 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6337 } 6338 6339 template<typename Derived> 6340 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6341 AtomicTypeLoc TL) { 6342 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6343 if (ValueType.isNull()) 6344 return QualType(); 6345 6346 QualType Result = TL.getType(); 6347 if (getDerived().AlwaysRebuild() || 6348 ValueType != TL.getValueLoc().getType()) { 6349 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6350 if (Result.isNull()) 6351 return QualType(); 6352 } 6353 6354 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6355 NewTL.setKWLoc(TL.getKWLoc()); 6356 NewTL.setLParenLoc(TL.getLParenLoc()); 6357 NewTL.setRParenLoc(TL.getRParenLoc()); 6358 6359 return Result; 6360 } 6361 6362 template <typename Derived> 6363 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6364 PipeTypeLoc TL) { 6365 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6366 if (ValueType.isNull()) 6367 return QualType(); 6368 6369 QualType Result = TL.getType(); 6370 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6371 const PipeType *PT = Result->castAs<PipeType>(); 6372 bool isReadPipe = PT->isReadOnly(); 6373 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6374 if (Result.isNull()) 6375 return QualType(); 6376 } 6377 6378 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6379 NewTL.setKWLoc(TL.getKWLoc()); 6380 6381 return Result; 6382 } 6383 6384 template <typename Derived> 6385 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6386 ExtIntTypeLoc TL) { 6387 const ExtIntType *EIT = TL.getTypePtr(); 6388 QualType Result = TL.getType(); 6389 6390 if (getDerived().AlwaysRebuild()) { 6391 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6392 EIT->getNumBits(), TL.getNameLoc()); 6393 if (Result.isNull()) 6394 return QualType(); 6395 } 6396 6397 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6398 NewTL.setNameLoc(TL.getNameLoc()); 6399 return Result; 6400 } 6401 6402 template <typename Derived> 6403 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6404 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6405 const DependentExtIntType *EIT = TL.getTypePtr(); 6406 6407 EnterExpressionEvaluationContext Unevaluated( 6408 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6409 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6410 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6411 6412 if (BitsExpr.isInvalid()) 6413 return QualType(); 6414 6415 QualType Result = TL.getType(); 6416 6417 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6418 Result = getDerived().RebuildDependentExtIntType( 6419 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6420 6421 if (Result.isNull()) 6422 return QualType(); 6423 } 6424 6425 if (isa<DependentExtIntType>(Result)) { 6426 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6427 NewTL.setNameLoc(TL.getNameLoc()); 6428 } else { 6429 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6430 NewTL.setNameLoc(TL.getNameLoc()); 6431 } 6432 return Result; 6433 } 6434 6435 /// Simple iterator that traverses the template arguments in a 6436 /// container that provides a \c getArgLoc() member function. 6437 /// 6438 /// This iterator is intended to be used with the iterator form of 6439 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6440 template<typename ArgLocContainer> 6441 class TemplateArgumentLocContainerIterator { 6442 ArgLocContainer *Container; 6443 unsigned Index; 6444 6445 public: 6446 typedef TemplateArgumentLoc value_type; 6447 typedef TemplateArgumentLoc reference; 6448 typedef int difference_type; 6449 typedef std::input_iterator_tag iterator_category; 6450 6451 class pointer { 6452 TemplateArgumentLoc Arg; 6453 6454 public: 6455 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6456 6457 const TemplateArgumentLoc *operator->() const { 6458 return &Arg; 6459 } 6460 }; 6461 6462 6463 TemplateArgumentLocContainerIterator() {} 6464 6465 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6466 unsigned Index) 6467 : Container(&Container), Index(Index) { } 6468 6469 TemplateArgumentLocContainerIterator &operator++() { 6470 ++Index; 6471 return *this; 6472 } 6473 6474 TemplateArgumentLocContainerIterator operator++(int) { 6475 TemplateArgumentLocContainerIterator Old(*this); 6476 ++(*this); 6477 return Old; 6478 } 6479 6480 TemplateArgumentLoc operator*() const { 6481 return Container->getArgLoc(Index); 6482 } 6483 6484 pointer operator->() const { 6485 return pointer(Container->getArgLoc(Index)); 6486 } 6487 6488 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6489 const TemplateArgumentLocContainerIterator &Y) { 6490 return X.Container == Y.Container && X.Index == Y.Index; 6491 } 6492 6493 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6494 const TemplateArgumentLocContainerIterator &Y) { 6495 return !(X == Y); 6496 } 6497 }; 6498 6499 template<typename Derived> 6500 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6501 AutoTypeLoc TL) { 6502 const AutoType *T = TL.getTypePtr(); 6503 QualType OldDeduced = T->getDeducedType(); 6504 QualType NewDeduced; 6505 if (!OldDeduced.isNull()) { 6506 NewDeduced = getDerived().TransformType(OldDeduced); 6507 if (NewDeduced.isNull()) 6508 return QualType(); 6509 } 6510 6511 ConceptDecl *NewCD = nullptr; 6512 TemplateArgumentListInfo NewTemplateArgs; 6513 NestedNameSpecifierLoc NewNestedNameSpec; 6514 if (T->isConstrained()) { 6515 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6516 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6517 6518 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6519 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6520 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6521 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6522 ArgIterator(TL, 6523 TL.getNumArgs()), 6524 NewTemplateArgs)) 6525 return QualType(); 6526 6527 if (TL.getNestedNameSpecifierLoc()) { 6528 NewNestedNameSpec 6529 = getDerived().TransformNestedNameSpecifierLoc( 6530 TL.getNestedNameSpecifierLoc()); 6531 if (!NewNestedNameSpec) 6532 return QualType(); 6533 } 6534 } 6535 6536 QualType Result = TL.getType(); 6537 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6538 T->isDependentType() || T->isConstrained()) { 6539 // FIXME: Maybe don't rebuild if all template arguments are the same. 6540 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6541 NewArgList.reserve(NewArgList.size()); 6542 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6543 NewArgList.push_back(ArgLoc.getArgument()); 6544 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6545 NewArgList); 6546 if (Result.isNull()) 6547 return QualType(); 6548 } 6549 6550 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6551 NewTL.setNameLoc(TL.getNameLoc()); 6552 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6553 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6554 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6555 NewTL.setFoundDecl(TL.getFoundDecl()); 6556 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6557 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6558 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6559 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6560 6561 return Result; 6562 } 6563 6564 template <typename Derived> 6565 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6566 TypeLocBuilder &TLB, 6567 TemplateSpecializationTypeLoc TL, 6568 TemplateName Template) { 6569 TemplateArgumentListInfo NewTemplateArgs; 6570 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6571 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6572 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6573 ArgIterator; 6574 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6575 ArgIterator(TL, TL.getNumArgs()), 6576 NewTemplateArgs)) 6577 return QualType(); 6578 6579 // FIXME: maybe don't rebuild if all the template arguments are the same. 6580 6581 QualType Result = 6582 getDerived().RebuildTemplateSpecializationType(Template, 6583 TL.getTemplateNameLoc(), 6584 NewTemplateArgs); 6585 6586 if (!Result.isNull()) { 6587 // Specializations of template template parameters are represented as 6588 // TemplateSpecializationTypes, and substitution of type alias templates 6589 // within a dependent context can transform them into 6590 // DependentTemplateSpecializationTypes. 6591 if (isa<DependentTemplateSpecializationType>(Result)) { 6592 DependentTemplateSpecializationTypeLoc NewTL 6593 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6594 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6595 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6596 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6597 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6598 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6599 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6600 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6601 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6602 return Result; 6603 } 6604 6605 TemplateSpecializationTypeLoc NewTL 6606 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6607 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6608 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6609 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6610 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6611 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6612 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6613 } 6614 6615 return Result; 6616 } 6617 6618 template <typename Derived> 6619 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6620 TypeLocBuilder &TLB, 6621 DependentTemplateSpecializationTypeLoc TL, 6622 TemplateName Template, 6623 CXXScopeSpec &SS) { 6624 TemplateArgumentListInfo NewTemplateArgs; 6625 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6626 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6627 typedef TemplateArgumentLocContainerIterator< 6628 DependentTemplateSpecializationTypeLoc> ArgIterator; 6629 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6630 ArgIterator(TL, TL.getNumArgs()), 6631 NewTemplateArgs)) 6632 return QualType(); 6633 6634 // FIXME: maybe don't rebuild if all the template arguments are the same. 6635 6636 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6637 QualType Result 6638 = getSema().Context.getDependentTemplateSpecializationType( 6639 TL.getTypePtr()->getKeyword(), 6640 DTN->getQualifier(), 6641 DTN->getIdentifier(), 6642 NewTemplateArgs); 6643 6644 DependentTemplateSpecializationTypeLoc NewTL 6645 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6646 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6647 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6648 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6649 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6650 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6651 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6652 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6653 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6654 return Result; 6655 } 6656 6657 QualType Result 6658 = getDerived().RebuildTemplateSpecializationType(Template, 6659 TL.getTemplateNameLoc(), 6660 NewTemplateArgs); 6661 6662 if (!Result.isNull()) { 6663 /// FIXME: Wrap this in an elaborated-type-specifier? 6664 TemplateSpecializationTypeLoc NewTL 6665 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6666 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6667 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6668 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6669 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6670 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6671 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6672 } 6673 6674 return Result; 6675 } 6676 6677 template<typename Derived> 6678 QualType 6679 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6680 ElaboratedTypeLoc TL) { 6681 const ElaboratedType *T = TL.getTypePtr(); 6682 6683 NestedNameSpecifierLoc QualifierLoc; 6684 // NOTE: the qualifier in an ElaboratedType is optional. 6685 if (TL.getQualifierLoc()) { 6686 QualifierLoc 6687 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6688 if (!QualifierLoc) 6689 return QualType(); 6690 } 6691 6692 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6693 if (NamedT.isNull()) 6694 return QualType(); 6695 6696 // C++0x [dcl.type.elab]p2: 6697 // If the identifier resolves to a typedef-name or the simple-template-id 6698 // resolves to an alias template specialization, the 6699 // elaborated-type-specifier is ill-formed. 6700 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6701 if (const TemplateSpecializationType *TST = 6702 NamedT->getAs<TemplateSpecializationType>()) { 6703 TemplateName Template = TST->getTemplateName(); 6704 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6705 Template.getAsTemplateDecl())) { 6706 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6707 diag::err_tag_reference_non_tag) 6708 << TAT << Sema::NTK_TypeAliasTemplate 6709 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6710 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6711 } 6712 } 6713 } 6714 6715 QualType Result = TL.getType(); 6716 if (getDerived().AlwaysRebuild() || 6717 QualifierLoc != TL.getQualifierLoc() || 6718 NamedT != T->getNamedType()) { 6719 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6720 T->getKeyword(), 6721 QualifierLoc, NamedT); 6722 if (Result.isNull()) 6723 return QualType(); 6724 } 6725 6726 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6727 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6728 NewTL.setQualifierLoc(QualifierLoc); 6729 return Result; 6730 } 6731 6732 template<typename Derived> 6733 QualType TreeTransform<Derived>::TransformAttributedType( 6734 TypeLocBuilder &TLB, 6735 AttributedTypeLoc TL) { 6736 const AttributedType *oldType = TL.getTypePtr(); 6737 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6738 if (modifiedType.isNull()) 6739 return QualType(); 6740 6741 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6742 const Attr *oldAttr = TL.getAttr(); 6743 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6744 if (oldAttr && !newAttr) 6745 return QualType(); 6746 6747 QualType result = TL.getType(); 6748 6749 // FIXME: dependent operand expressions? 6750 if (getDerived().AlwaysRebuild() || 6751 modifiedType != oldType->getModifiedType()) { 6752 // TODO: this is really lame; we should really be rebuilding the 6753 // equivalent type from first principles. 6754 QualType equivalentType 6755 = getDerived().TransformType(oldType->getEquivalentType()); 6756 if (equivalentType.isNull()) 6757 return QualType(); 6758 6759 // Check whether we can add nullability; it is only represented as 6760 // type sugar, and therefore cannot be diagnosed in any other way. 6761 if (auto nullability = oldType->getImmediateNullability()) { 6762 if (!modifiedType->canHaveNullability()) { 6763 SemaRef.Diag(TL.getAttr()->getLocation(), 6764 diag::err_nullability_nonpointer) 6765 << DiagNullabilityKind(*nullability, false) << modifiedType; 6766 return QualType(); 6767 } 6768 } 6769 6770 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6771 modifiedType, 6772 equivalentType); 6773 } 6774 6775 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6776 newTL.setAttr(newAttr); 6777 return result; 6778 } 6779 6780 template<typename Derived> 6781 QualType 6782 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6783 ParenTypeLoc TL) { 6784 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6785 if (Inner.isNull()) 6786 return QualType(); 6787 6788 QualType Result = TL.getType(); 6789 if (getDerived().AlwaysRebuild() || 6790 Inner != TL.getInnerLoc().getType()) { 6791 Result = getDerived().RebuildParenType(Inner); 6792 if (Result.isNull()) 6793 return QualType(); 6794 } 6795 6796 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6797 NewTL.setLParenLoc(TL.getLParenLoc()); 6798 NewTL.setRParenLoc(TL.getRParenLoc()); 6799 return Result; 6800 } 6801 6802 template <typename Derived> 6803 QualType 6804 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6805 MacroQualifiedTypeLoc TL) { 6806 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6807 if (Inner.isNull()) 6808 return QualType(); 6809 6810 QualType Result = TL.getType(); 6811 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6812 Result = 6813 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6814 if (Result.isNull()) 6815 return QualType(); 6816 } 6817 6818 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6819 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6820 return Result; 6821 } 6822 6823 template<typename Derived> 6824 QualType TreeTransform<Derived>::TransformDependentNameType( 6825 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6826 return TransformDependentNameType(TLB, TL, false); 6827 } 6828 6829 template<typename Derived> 6830 QualType TreeTransform<Derived>::TransformDependentNameType( 6831 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6832 const DependentNameType *T = TL.getTypePtr(); 6833 6834 NestedNameSpecifierLoc QualifierLoc 6835 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6836 if (!QualifierLoc) 6837 return QualType(); 6838 6839 QualType Result 6840 = getDerived().RebuildDependentNameType(T->getKeyword(), 6841 TL.getElaboratedKeywordLoc(), 6842 QualifierLoc, 6843 T->getIdentifier(), 6844 TL.getNameLoc(), 6845 DeducedTSTContext); 6846 if (Result.isNull()) 6847 return QualType(); 6848 6849 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6850 QualType NamedT = ElabT->getNamedType(); 6851 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6852 6853 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6854 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6855 NewTL.setQualifierLoc(QualifierLoc); 6856 } else { 6857 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6858 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6859 NewTL.setQualifierLoc(QualifierLoc); 6860 NewTL.setNameLoc(TL.getNameLoc()); 6861 } 6862 return Result; 6863 } 6864 6865 template<typename Derived> 6866 QualType TreeTransform<Derived>:: 6867 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6868 DependentTemplateSpecializationTypeLoc TL) { 6869 NestedNameSpecifierLoc QualifierLoc; 6870 if (TL.getQualifierLoc()) { 6871 QualifierLoc 6872 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6873 if (!QualifierLoc) 6874 return QualType(); 6875 } 6876 6877 return getDerived() 6878 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6879 } 6880 6881 template<typename Derived> 6882 QualType TreeTransform<Derived>:: 6883 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6884 DependentTemplateSpecializationTypeLoc TL, 6885 NestedNameSpecifierLoc QualifierLoc) { 6886 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6887 6888 TemplateArgumentListInfo NewTemplateArgs; 6889 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6890 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6891 6892 typedef TemplateArgumentLocContainerIterator< 6893 DependentTemplateSpecializationTypeLoc> ArgIterator; 6894 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6895 ArgIterator(TL, TL.getNumArgs()), 6896 NewTemplateArgs)) 6897 return QualType(); 6898 6899 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6900 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6901 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6902 /*AllowInjectedClassName*/ false); 6903 if (Result.isNull()) 6904 return QualType(); 6905 6906 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6907 QualType NamedT = ElabT->getNamedType(); 6908 6909 // Copy information relevant to the template specialization. 6910 TemplateSpecializationTypeLoc NamedTL 6911 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6912 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6913 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6914 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6915 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6916 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6917 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6918 6919 // Copy information relevant to the elaborated type. 6920 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6921 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6922 NewTL.setQualifierLoc(QualifierLoc); 6923 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6924 DependentTemplateSpecializationTypeLoc SpecTL 6925 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6926 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6927 SpecTL.setQualifierLoc(QualifierLoc); 6928 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6929 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6930 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6931 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6932 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6933 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6934 } else { 6935 TemplateSpecializationTypeLoc SpecTL 6936 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6937 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6938 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6939 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6940 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6941 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6942 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6943 } 6944 return Result; 6945 } 6946 6947 template<typename Derived> 6948 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6949 PackExpansionTypeLoc TL) { 6950 QualType Pattern 6951 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6952 if (Pattern.isNull()) 6953 return QualType(); 6954 6955 QualType Result = TL.getType(); 6956 if (getDerived().AlwaysRebuild() || 6957 Pattern != TL.getPatternLoc().getType()) { 6958 Result = getDerived().RebuildPackExpansionType(Pattern, 6959 TL.getPatternLoc().getSourceRange(), 6960 TL.getEllipsisLoc(), 6961 TL.getTypePtr()->getNumExpansions()); 6962 if (Result.isNull()) 6963 return QualType(); 6964 } 6965 6966 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6967 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6968 return Result; 6969 } 6970 6971 template<typename Derived> 6972 QualType 6973 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6974 ObjCInterfaceTypeLoc TL) { 6975 // ObjCInterfaceType is never dependent. 6976 TLB.pushFullCopy(TL); 6977 return TL.getType(); 6978 } 6979 6980 template<typename Derived> 6981 QualType 6982 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6983 ObjCTypeParamTypeLoc TL) { 6984 const ObjCTypeParamType *T = TL.getTypePtr(); 6985 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6986 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6987 if (!OTP) 6988 return QualType(); 6989 6990 QualType Result = TL.getType(); 6991 if (getDerived().AlwaysRebuild() || 6992 OTP != T->getDecl()) { 6993 Result = getDerived().RebuildObjCTypeParamType(OTP, 6994 TL.getProtocolLAngleLoc(), 6995 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6996 TL.getNumProtocols()), 6997 TL.getProtocolLocs(), 6998 TL.getProtocolRAngleLoc()); 6999 if (Result.isNull()) 7000 return QualType(); 7001 } 7002 7003 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7004 if (TL.getNumProtocols()) { 7005 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7006 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7007 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7008 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7009 } 7010 return Result; 7011 } 7012 7013 template<typename Derived> 7014 QualType 7015 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7016 ObjCObjectTypeLoc TL) { 7017 // Transform base type. 7018 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7019 if (BaseType.isNull()) 7020 return QualType(); 7021 7022 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7023 7024 // Transform type arguments. 7025 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7026 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7027 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7028 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7029 QualType TypeArg = TypeArgInfo->getType(); 7030 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7031 AnyChanged = true; 7032 7033 // We have a pack expansion. Instantiate it. 7034 const auto *PackExpansion = PackExpansionLoc.getType() 7035 ->castAs<PackExpansionType>(); 7036 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7037 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7038 Unexpanded); 7039 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7040 7041 // Determine whether the set of unexpanded parameter packs can 7042 // and should be expanded. 7043 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7044 bool Expand = false; 7045 bool RetainExpansion = false; 7046 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7047 if (getDerived().TryExpandParameterPacks( 7048 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7049 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7050 return QualType(); 7051 7052 if (!Expand) { 7053 // We can't expand this pack expansion into separate arguments yet; 7054 // just substitute into the pattern and create a new pack expansion 7055 // type. 7056 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7057 7058 TypeLocBuilder TypeArgBuilder; 7059 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7060 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7061 PatternLoc); 7062 if (NewPatternType.isNull()) 7063 return QualType(); 7064 7065 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7066 NewPatternType, NumExpansions); 7067 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7068 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7069 NewTypeArgInfos.push_back( 7070 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7071 continue; 7072 } 7073 7074 // Substitute into the pack expansion pattern for each slice of the 7075 // pack. 7076 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7077 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7078 7079 TypeLocBuilder TypeArgBuilder; 7080 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7081 7082 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7083 PatternLoc); 7084 if (NewTypeArg.isNull()) 7085 return QualType(); 7086 7087 NewTypeArgInfos.push_back( 7088 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7089 } 7090 7091 continue; 7092 } 7093 7094 TypeLocBuilder TypeArgBuilder; 7095 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7096 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7097 if (NewTypeArg.isNull()) 7098 return QualType(); 7099 7100 // If nothing changed, just keep the old TypeSourceInfo. 7101 if (NewTypeArg == TypeArg) { 7102 NewTypeArgInfos.push_back(TypeArgInfo); 7103 continue; 7104 } 7105 7106 NewTypeArgInfos.push_back( 7107 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7108 AnyChanged = true; 7109 } 7110 7111 QualType Result = TL.getType(); 7112 if (getDerived().AlwaysRebuild() || AnyChanged) { 7113 // Rebuild the type. 7114 Result = getDerived().RebuildObjCObjectType( 7115 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7116 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7117 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7118 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7119 7120 if (Result.isNull()) 7121 return QualType(); 7122 } 7123 7124 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7125 NewT.setHasBaseTypeAsWritten(true); 7126 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7127 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7128 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7129 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7130 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7131 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7132 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7133 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7134 return Result; 7135 } 7136 7137 template<typename Derived> 7138 QualType 7139 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7140 ObjCObjectPointerTypeLoc TL) { 7141 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7142 if (PointeeType.isNull()) 7143 return QualType(); 7144 7145 QualType Result = TL.getType(); 7146 if (getDerived().AlwaysRebuild() || 7147 PointeeType != TL.getPointeeLoc().getType()) { 7148 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7149 TL.getStarLoc()); 7150 if (Result.isNull()) 7151 return QualType(); 7152 } 7153 7154 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7155 NewT.setStarLoc(TL.getStarLoc()); 7156 return Result; 7157 } 7158 7159 //===----------------------------------------------------------------------===// 7160 // Statement transformation 7161 //===----------------------------------------------------------------------===// 7162 template<typename Derived> 7163 StmtResult 7164 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7165 return S; 7166 } 7167 7168 template<typename Derived> 7169 StmtResult 7170 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7171 return getDerived().TransformCompoundStmt(S, false); 7172 } 7173 7174 template<typename Derived> 7175 StmtResult 7176 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7177 bool IsStmtExpr) { 7178 Sema::CompoundScopeRAII CompoundScope(getSema()); 7179 7180 const Stmt *ExprResult = S->getStmtExprResult(); 7181 bool SubStmtInvalid = false; 7182 bool SubStmtChanged = false; 7183 SmallVector<Stmt*, 8> Statements; 7184 for (auto *B : S->body()) { 7185 StmtResult Result = getDerived().TransformStmt( 7186 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7187 7188 if (Result.isInvalid()) { 7189 // Immediately fail if this was a DeclStmt, since it's very 7190 // likely that this will cause problems for future statements. 7191 if (isa<DeclStmt>(B)) 7192 return StmtError(); 7193 7194 // Otherwise, just keep processing substatements and fail later. 7195 SubStmtInvalid = true; 7196 continue; 7197 } 7198 7199 SubStmtChanged = SubStmtChanged || Result.get() != B; 7200 Statements.push_back(Result.getAs<Stmt>()); 7201 } 7202 7203 if (SubStmtInvalid) 7204 return StmtError(); 7205 7206 if (!getDerived().AlwaysRebuild() && 7207 !SubStmtChanged) 7208 return S; 7209 7210 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7211 Statements, 7212 S->getRBracLoc(), 7213 IsStmtExpr); 7214 } 7215 7216 template<typename Derived> 7217 StmtResult 7218 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7219 ExprResult LHS, RHS; 7220 { 7221 EnterExpressionEvaluationContext Unevaluated( 7222 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7223 7224 // Transform the left-hand case value. 7225 LHS = getDerived().TransformExpr(S->getLHS()); 7226 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7227 if (LHS.isInvalid()) 7228 return StmtError(); 7229 7230 // Transform the right-hand case value (for the GNU case-range extension). 7231 RHS = getDerived().TransformExpr(S->getRHS()); 7232 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7233 if (RHS.isInvalid()) 7234 return StmtError(); 7235 } 7236 7237 // Build the case statement. 7238 // Case statements are always rebuilt so that they will attached to their 7239 // transformed switch statement. 7240 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7241 LHS.get(), 7242 S->getEllipsisLoc(), 7243 RHS.get(), 7244 S->getColonLoc()); 7245 if (Case.isInvalid()) 7246 return StmtError(); 7247 7248 // Transform the statement following the case 7249 StmtResult SubStmt = 7250 getDerived().TransformStmt(S->getSubStmt()); 7251 if (SubStmt.isInvalid()) 7252 return StmtError(); 7253 7254 // Attach the body to the case statement 7255 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7256 } 7257 7258 template <typename Derived> 7259 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7260 // Transform the statement following the default case 7261 StmtResult SubStmt = 7262 getDerived().TransformStmt(S->getSubStmt()); 7263 if (SubStmt.isInvalid()) 7264 return StmtError(); 7265 7266 // Default statements are always rebuilt 7267 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7268 SubStmt.get()); 7269 } 7270 7271 template<typename Derived> 7272 StmtResult 7273 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7274 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7275 if (SubStmt.isInvalid()) 7276 return StmtError(); 7277 7278 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7279 S->getDecl()); 7280 if (!LD) 7281 return StmtError(); 7282 7283 // If we're transforming "in-place" (we're not creating new local 7284 // declarations), assume we're replacing the old label statement 7285 // and clear out the reference to it. 7286 if (LD == S->getDecl()) 7287 S->getDecl()->setStmt(nullptr); 7288 7289 // FIXME: Pass the real colon location in. 7290 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7291 cast<LabelDecl>(LD), SourceLocation(), 7292 SubStmt.get()); 7293 } 7294 7295 template <typename Derived> 7296 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7297 if (!R) 7298 return R; 7299 7300 switch (R->getKind()) { 7301 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7302 #define ATTR(X) 7303 #define PRAGMA_SPELLING_ATTR(X) \ 7304 case attr::X: \ 7305 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7306 #include "clang/Basic/AttrList.inc" 7307 default: 7308 return R; 7309 } 7310 } 7311 7312 template <typename Derived> 7313 StmtResult 7314 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7315 StmtDiscardKind SDK) { 7316 bool AttrsChanged = false; 7317 SmallVector<const Attr *, 1> Attrs; 7318 7319 // Visit attributes and keep track if any are transformed. 7320 for (const auto *I : S->getAttrs()) { 7321 const Attr *R = getDerived().TransformAttr(I); 7322 AttrsChanged |= (I != R); 7323 if (R) 7324 Attrs.push_back(R); 7325 } 7326 7327 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7328 if (SubStmt.isInvalid()) 7329 return StmtError(); 7330 7331 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7332 return S; 7333 7334 // If transforming the attributes failed for all of the attributes in the 7335 // statement, don't make an AttributedStmt without attributes. 7336 if (Attrs.empty()) 7337 return SubStmt; 7338 7339 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7340 SubStmt.get()); 7341 } 7342 7343 template<typename Derived> 7344 StmtResult 7345 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7346 // Transform the initialization statement 7347 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7348 if (Init.isInvalid()) 7349 return StmtError(); 7350 7351 // Transform the condition 7352 Sema::ConditionResult Cond = getDerived().TransformCondition( 7353 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7354 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7355 : Sema::ConditionKind::Boolean); 7356 if (Cond.isInvalid()) 7357 return StmtError(); 7358 7359 // If this is a constexpr if, determine which arm we should instantiate. 7360 llvm::Optional<bool> ConstexprConditionValue; 7361 if (S->isConstexpr()) 7362 ConstexprConditionValue = Cond.getKnownValue(); 7363 7364 // Transform the "then" branch. 7365 StmtResult Then; 7366 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7367 Then = getDerived().TransformStmt(S->getThen()); 7368 if (Then.isInvalid()) 7369 return StmtError(); 7370 } else { 7371 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7372 } 7373 7374 // Transform the "else" branch. 7375 StmtResult Else; 7376 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7377 Else = getDerived().TransformStmt(S->getElse()); 7378 if (Else.isInvalid()) 7379 return StmtError(); 7380 } 7381 7382 if (!getDerived().AlwaysRebuild() && 7383 Init.get() == S->getInit() && 7384 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7385 Then.get() == S->getThen() && 7386 Else.get() == S->getElse()) 7387 return S; 7388 7389 return getDerived().RebuildIfStmt( 7390 S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, 7391 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7392 } 7393 7394 template<typename Derived> 7395 StmtResult 7396 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7397 // Transform the initialization statement 7398 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7399 if (Init.isInvalid()) 7400 return StmtError(); 7401 7402 // Transform the condition. 7403 Sema::ConditionResult Cond = getDerived().TransformCondition( 7404 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7405 Sema::ConditionKind::Switch); 7406 if (Cond.isInvalid()) 7407 return StmtError(); 7408 7409 // Rebuild the switch statement. 7410 StmtResult Switch = 7411 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7412 Init.get(), Cond, S->getRParenLoc()); 7413 if (Switch.isInvalid()) 7414 return StmtError(); 7415 7416 // Transform the body of the switch statement. 7417 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7418 if (Body.isInvalid()) 7419 return StmtError(); 7420 7421 // Complete the switch statement. 7422 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7423 Body.get()); 7424 } 7425 7426 template<typename Derived> 7427 StmtResult 7428 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7429 // Transform the condition 7430 Sema::ConditionResult Cond = getDerived().TransformCondition( 7431 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7432 Sema::ConditionKind::Boolean); 7433 if (Cond.isInvalid()) 7434 return StmtError(); 7435 7436 // Transform the body 7437 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7438 if (Body.isInvalid()) 7439 return StmtError(); 7440 7441 if (!getDerived().AlwaysRebuild() && 7442 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7443 Body.get() == S->getBody()) 7444 return Owned(S); 7445 7446 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7447 Cond, S->getRParenLoc(), Body.get()); 7448 } 7449 7450 template<typename Derived> 7451 StmtResult 7452 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7453 // Transform the body 7454 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7455 if (Body.isInvalid()) 7456 return StmtError(); 7457 7458 // Transform the condition 7459 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7460 if (Cond.isInvalid()) 7461 return StmtError(); 7462 7463 if (!getDerived().AlwaysRebuild() && 7464 Cond.get() == S->getCond() && 7465 Body.get() == S->getBody()) 7466 return S; 7467 7468 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7469 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7470 S->getRParenLoc()); 7471 } 7472 7473 template<typename Derived> 7474 StmtResult 7475 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7476 if (getSema().getLangOpts().OpenMP) 7477 getSema().startOpenMPLoop(); 7478 7479 // Transform the initialization statement 7480 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7481 if (Init.isInvalid()) 7482 return StmtError(); 7483 7484 // In OpenMP loop region loop control variable must be captured and be 7485 // private. Perform analysis of first part (if any). 7486 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7487 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7488 7489 // Transform the condition 7490 Sema::ConditionResult Cond = getDerived().TransformCondition( 7491 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7492 Sema::ConditionKind::Boolean); 7493 if (Cond.isInvalid()) 7494 return StmtError(); 7495 7496 // Transform the increment 7497 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7498 if (Inc.isInvalid()) 7499 return StmtError(); 7500 7501 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7502 if (S->getInc() && !FullInc.get()) 7503 return StmtError(); 7504 7505 // Transform the body 7506 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7507 if (Body.isInvalid()) 7508 return StmtError(); 7509 7510 if (!getDerived().AlwaysRebuild() && 7511 Init.get() == S->getInit() && 7512 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7513 Inc.get() == S->getInc() && 7514 Body.get() == S->getBody()) 7515 return S; 7516 7517 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7518 Init.get(), Cond, FullInc, 7519 S->getRParenLoc(), Body.get()); 7520 } 7521 7522 template<typename Derived> 7523 StmtResult 7524 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7525 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7526 S->getLabel()); 7527 if (!LD) 7528 return StmtError(); 7529 7530 // Goto statements must always be rebuilt, to resolve the label. 7531 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7532 cast<LabelDecl>(LD)); 7533 } 7534 7535 template<typename Derived> 7536 StmtResult 7537 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7538 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7539 if (Target.isInvalid()) 7540 return StmtError(); 7541 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7542 7543 if (!getDerived().AlwaysRebuild() && 7544 Target.get() == S->getTarget()) 7545 return S; 7546 7547 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7548 Target.get()); 7549 } 7550 7551 template<typename Derived> 7552 StmtResult 7553 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7554 return S; 7555 } 7556 7557 template<typename Derived> 7558 StmtResult 7559 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7560 return S; 7561 } 7562 7563 template<typename Derived> 7564 StmtResult 7565 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7566 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7567 /*NotCopyInit*/false); 7568 if (Result.isInvalid()) 7569 return StmtError(); 7570 7571 // FIXME: We always rebuild the return statement because there is no way 7572 // to tell whether the return type of the function has changed. 7573 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7574 } 7575 7576 template<typename Derived> 7577 StmtResult 7578 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7579 bool DeclChanged = false; 7580 SmallVector<Decl *, 4> Decls; 7581 for (auto *D : S->decls()) { 7582 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7583 if (!Transformed) 7584 return StmtError(); 7585 7586 if (Transformed != D) 7587 DeclChanged = true; 7588 7589 Decls.push_back(Transformed); 7590 } 7591 7592 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7593 return S; 7594 7595 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7596 } 7597 7598 template<typename Derived> 7599 StmtResult 7600 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7601 7602 SmallVector<Expr*, 8> Constraints; 7603 SmallVector<Expr*, 8> Exprs; 7604 SmallVector<IdentifierInfo *, 4> Names; 7605 7606 ExprResult AsmString; 7607 SmallVector<Expr*, 8> Clobbers; 7608 7609 bool ExprsChanged = false; 7610 7611 // Go through the outputs. 7612 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7613 Names.push_back(S->getOutputIdentifier(I)); 7614 7615 // No need to transform the constraint literal. 7616 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7617 7618 // Transform the output expr. 7619 Expr *OutputExpr = S->getOutputExpr(I); 7620 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7621 if (Result.isInvalid()) 7622 return StmtError(); 7623 7624 ExprsChanged |= Result.get() != OutputExpr; 7625 7626 Exprs.push_back(Result.get()); 7627 } 7628 7629 // Go through the inputs. 7630 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7631 Names.push_back(S->getInputIdentifier(I)); 7632 7633 // No need to transform the constraint literal. 7634 Constraints.push_back(S->getInputConstraintLiteral(I)); 7635 7636 // Transform the input expr. 7637 Expr *InputExpr = S->getInputExpr(I); 7638 ExprResult Result = getDerived().TransformExpr(InputExpr); 7639 if (Result.isInvalid()) 7640 return StmtError(); 7641 7642 ExprsChanged |= Result.get() != InputExpr; 7643 7644 Exprs.push_back(Result.get()); 7645 } 7646 7647 // Go through the Labels. 7648 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7649 Names.push_back(S->getLabelIdentifier(I)); 7650 7651 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7652 if (Result.isInvalid()) 7653 return StmtError(); 7654 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7655 Exprs.push_back(Result.get()); 7656 } 7657 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7658 return S; 7659 7660 // Go through the clobbers. 7661 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7662 Clobbers.push_back(S->getClobberStringLiteral(I)); 7663 7664 // No need to transform the asm string literal. 7665 AsmString = S->getAsmString(); 7666 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7667 S->isVolatile(), S->getNumOutputs(), 7668 S->getNumInputs(), Names.data(), 7669 Constraints, Exprs, AsmString.get(), 7670 Clobbers, S->getNumLabels(), 7671 S->getRParenLoc()); 7672 } 7673 7674 template<typename Derived> 7675 StmtResult 7676 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7677 ArrayRef<Token> AsmToks = 7678 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7679 7680 bool HadError = false, HadChange = false; 7681 7682 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7683 SmallVector<Expr*, 8> TransformedExprs; 7684 TransformedExprs.reserve(SrcExprs.size()); 7685 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7686 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7687 if (!Result.isUsable()) { 7688 HadError = true; 7689 } else { 7690 HadChange |= (Result.get() != SrcExprs[i]); 7691 TransformedExprs.push_back(Result.get()); 7692 } 7693 } 7694 7695 if (HadError) return StmtError(); 7696 if (!HadChange && !getDerived().AlwaysRebuild()) 7697 return Owned(S); 7698 7699 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7700 AsmToks, S->getAsmString(), 7701 S->getNumOutputs(), S->getNumInputs(), 7702 S->getAllConstraints(), S->getClobbers(), 7703 TransformedExprs, S->getEndLoc()); 7704 } 7705 7706 // C++ Coroutines TS 7707 7708 template<typename Derived> 7709 StmtResult 7710 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7711 auto *ScopeInfo = SemaRef.getCurFunction(); 7712 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7713 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7714 ScopeInfo->NeedsCoroutineSuspends && 7715 ScopeInfo->CoroutineSuspends.first == nullptr && 7716 ScopeInfo->CoroutineSuspends.second == nullptr && 7717 "expected clean scope info"); 7718 7719 // Set that we have (possibly-invalid) suspend points before we do anything 7720 // that may fail. 7721 ScopeInfo->setNeedsCoroutineSuspends(false); 7722 7723 // We re-build the coroutine promise object (and the coroutine parameters its 7724 // type and constructor depend on) based on the types used in our current 7725 // function. We must do so, and set it on the current FunctionScopeInfo, 7726 // before attempting to transform the other parts of the coroutine body 7727 // statement, such as the implicit suspend statements (because those 7728 // statements reference the FunctionScopeInfo::CoroutinePromise). 7729 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7730 return StmtError(); 7731 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7732 if (!Promise) 7733 return StmtError(); 7734 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7735 ScopeInfo->CoroutinePromise = Promise; 7736 7737 // Transform the implicit coroutine statements constructed using dependent 7738 // types during the previous parse: initial and final suspensions, the return 7739 // object, and others. We also transform the coroutine function's body. 7740 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7741 if (InitSuspend.isInvalid()) 7742 return StmtError(); 7743 StmtResult FinalSuspend = 7744 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7745 if (FinalSuspend.isInvalid() || 7746 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7747 return StmtError(); 7748 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7749 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7750 7751 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7752 if (BodyRes.isInvalid()) 7753 return StmtError(); 7754 7755 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7756 if (Builder.isInvalid()) 7757 return StmtError(); 7758 7759 Expr *ReturnObject = S->getReturnValueInit(); 7760 assert(ReturnObject && "the return object is expected to be valid"); 7761 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7762 /*NoCopyInit*/ false); 7763 if (Res.isInvalid()) 7764 return StmtError(); 7765 Builder.ReturnValue = Res.get(); 7766 7767 // If during the previous parse the coroutine still had a dependent promise 7768 // statement, we may need to build some implicit coroutine statements 7769 // (such as exception and fallthrough handlers) for the first time. 7770 if (S->hasDependentPromiseType()) { 7771 // We can only build these statements, however, if the current promise type 7772 // is not dependent. 7773 if (!Promise->getType()->isDependentType()) { 7774 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7775 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7776 "these nodes should not have been built yet"); 7777 if (!Builder.buildDependentStatements()) 7778 return StmtError(); 7779 } 7780 } else { 7781 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7782 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7783 if (Res.isInvalid()) 7784 return StmtError(); 7785 Builder.OnFallthrough = Res.get(); 7786 } 7787 7788 if (auto *OnException = S->getExceptionHandler()) { 7789 StmtResult Res = getDerived().TransformStmt(OnException); 7790 if (Res.isInvalid()) 7791 return StmtError(); 7792 Builder.OnException = Res.get(); 7793 } 7794 7795 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7796 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7797 if (Res.isInvalid()) 7798 return StmtError(); 7799 Builder.ReturnStmtOnAllocFailure = Res.get(); 7800 } 7801 7802 // Transform any additional statements we may have already built 7803 assert(S->getAllocate() && S->getDeallocate() && 7804 "allocation and deallocation calls must already be built"); 7805 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7806 if (AllocRes.isInvalid()) 7807 return StmtError(); 7808 Builder.Allocate = AllocRes.get(); 7809 7810 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7811 if (DeallocRes.isInvalid()) 7812 return StmtError(); 7813 Builder.Deallocate = DeallocRes.get(); 7814 7815 assert(S->getResultDecl() && "ResultDecl must already be built"); 7816 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7817 if (ResultDecl.isInvalid()) 7818 return StmtError(); 7819 Builder.ResultDecl = ResultDecl.get(); 7820 7821 if (auto *ReturnStmt = S->getReturnStmt()) { 7822 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7823 if (Res.isInvalid()) 7824 return StmtError(); 7825 Builder.ReturnStmt = Res.get(); 7826 } 7827 } 7828 7829 return getDerived().RebuildCoroutineBodyStmt(Builder); 7830 } 7831 7832 template<typename Derived> 7833 StmtResult 7834 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7835 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7836 /*NotCopyInit*/false); 7837 if (Result.isInvalid()) 7838 return StmtError(); 7839 7840 // Always rebuild; we don't know if this needs to be injected into a new 7841 // context or if the promise type has changed. 7842 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7843 S->isImplicit()); 7844 } 7845 7846 template<typename Derived> 7847 ExprResult 7848 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7849 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7850 /*NotCopyInit*/false); 7851 if (Result.isInvalid()) 7852 return ExprError(); 7853 7854 // Always rebuild; we don't know if this needs to be injected into a new 7855 // context or if the promise type has changed. 7856 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7857 E->isImplicit()); 7858 } 7859 7860 template <typename Derived> 7861 ExprResult 7862 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7863 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7864 /*NotCopyInit*/ false); 7865 if (OperandResult.isInvalid()) 7866 return ExprError(); 7867 7868 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7869 E->getOperatorCoawaitLookup()); 7870 7871 if (LookupResult.isInvalid()) 7872 return ExprError(); 7873 7874 // Always rebuild; we don't know if this needs to be injected into a new 7875 // context or if the promise type has changed. 7876 return getDerived().RebuildDependentCoawaitExpr( 7877 E->getKeywordLoc(), OperandResult.get(), 7878 cast<UnresolvedLookupExpr>(LookupResult.get())); 7879 } 7880 7881 template<typename Derived> 7882 ExprResult 7883 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7884 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7885 /*NotCopyInit*/false); 7886 if (Result.isInvalid()) 7887 return ExprError(); 7888 7889 // Always rebuild; we don't know if this needs to be injected into a new 7890 // context or if the promise type has changed. 7891 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7892 } 7893 7894 // Objective-C Statements. 7895 7896 template<typename Derived> 7897 StmtResult 7898 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7899 // Transform the body of the @try. 7900 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7901 if (TryBody.isInvalid()) 7902 return StmtError(); 7903 7904 // Transform the @catch statements (if present). 7905 bool AnyCatchChanged = false; 7906 SmallVector<Stmt*, 8> CatchStmts; 7907 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7908 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7909 if (Catch.isInvalid()) 7910 return StmtError(); 7911 if (Catch.get() != S->getCatchStmt(I)) 7912 AnyCatchChanged = true; 7913 CatchStmts.push_back(Catch.get()); 7914 } 7915 7916 // Transform the @finally statement (if present). 7917 StmtResult Finally; 7918 if (S->getFinallyStmt()) { 7919 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7920 if (Finally.isInvalid()) 7921 return StmtError(); 7922 } 7923 7924 // If nothing changed, just retain this statement. 7925 if (!getDerived().AlwaysRebuild() && 7926 TryBody.get() == S->getTryBody() && 7927 !AnyCatchChanged && 7928 Finally.get() == S->getFinallyStmt()) 7929 return S; 7930 7931 // Build a new statement. 7932 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7933 CatchStmts, Finally.get()); 7934 } 7935 7936 template<typename Derived> 7937 StmtResult 7938 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7939 // Transform the @catch parameter, if there is one. 7940 VarDecl *Var = nullptr; 7941 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7942 TypeSourceInfo *TSInfo = nullptr; 7943 if (FromVar->getTypeSourceInfo()) { 7944 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7945 if (!TSInfo) 7946 return StmtError(); 7947 } 7948 7949 QualType T; 7950 if (TSInfo) 7951 T = TSInfo->getType(); 7952 else { 7953 T = getDerived().TransformType(FromVar->getType()); 7954 if (T.isNull()) 7955 return StmtError(); 7956 } 7957 7958 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7959 if (!Var) 7960 return StmtError(); 7961 } 7962 7963 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7964 if (Body.isInvalid()) 7965 return StmtError(); 7966 7967 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7968 S->getRParenLoc(), 7969 Var, Body.get()); 7970 } 7971 7972 template<typename Derived> 7973 StmtResult 7974 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7975 // Transform the body. 7976 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7977 if (Body.isInvalid()) 7978 return StmtError(); 7979 7980 // If nothing changed, just retain this statement. 7981 if (!getDerived().AlwaysRebuild() && 7982 Body.get() == S->getFinallyBody()) 7983 return S; 7984 7985 // Build a new statement. 7986 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7987 Body.get()); 7988 } 7989 7990 template<typename Derived> 7991 StmtResult 7992 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7993 ExprResult Operand; 7994 if (S->getThrowExpr()) { 7995 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7996 if (Operand.isInvalid()) 7997 return StmtError(); 7998 } 7999 8000 if (!getDerived().AlwaysRebuild() && 8001 Operand.get() == S->getThrowExpr()) 8002 return S; 8003 8004 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8005 } 8006 8007 template<typename Derived> 8008 StmtResult 8009 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8010 ObjCAtSynchronizedStmt *S) { 8011 // Transform the object we are locking. 8012 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8013 if (Object.isInvalid()) 8014 return StmtError(); 8015 Object = 8016 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8017 Object.get()); 8018 if (Object.isInvalid()) 8019 return StmtError(); 8020 8021 // Transform the body. 8022 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8023 if (Body.isInvalid()) 8024 return StmtError(); 8025 8026 // If nothing change, just retain the current statement. 8027 if (!getDerived().AlwaysRebuild() && 8028 Object.get() == S->getSynchExpr() && 8029 Body.get() == S->getSynchBody()) 8030 return S; 8031 8032 // Build a new statement. 8033 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8034 Object.get(), Body.get()); 8035 } 8036 8037 template<typename Derived> 8038 StmtResult 8039 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8040 ObjCAutoreleasePoolStmt *S) { 8041 // Transform the body. 8042 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8043 if (Body.isInvalid()) 8044 return StmtError(); 8045 8046 // If nothing changed, just retain this statement. 8047 if (!getDerived().AlwaysRebuild() && 8048 Body.get() == S->getSubStmt()) 8049 return S; 8050 8051 // Build a new statement. 8052 return getDerived().RebuildObjCAutoreleasePoolStmt( 8053 S->getAtLoc(), Body.get()); 8054 } 8055 8056 template<typename Derived> 8057 StmtResult 8058 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8059 ObjCForCollectionStmt *S) { 8060 // Transform the element statement. 8061 StmtResult Element = 8062 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8063 if (Element.isInvalid()) 8064 return StmtError(); 8065 8066 // Transform the collection expression. 8067 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8068 if (Collection.isInvalid()) 8069 return StmtError(); 8070 8071 // Transform the body. 8072 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8073 if (Body.isInvalid()) 8074 return StmtError(); 8075 8076 // If nothing changed, just retain this statement. 8077 if (!getDerived().AlwaysRebuild() && 8078 Element.get() == S->getElement() && 8079 Collection.get() == S->getCollection() && 8080 Body.get() == S->getBody()) 8081 return S; 8082 8083 // Build a new statement. 8084 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8085 Element.get(), 8086 Collection.get(), 8087 S->getRParenLoc(), 8088 Body.get()); 8089 } 8090 8091 template <typename Derived> 8092 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8093 // Transform the exception declaration, if any. 8094 VarDecl *Var = nullptr; 8095 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8096 TypeSourceInfo *T = 8097 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8098 if (!T) 8099 return StmtError(); 8100 8101 Var = getDerived().RebuildExceptionDecl( 8102 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8103 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8104 if (!Var || Var->isInvalidDecl()) 8105 return StmtError(); 8106 } 8107 8108 // Transform the actual exception handler. 8109 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8110 if (Handler.isInvalid()) 8111 return StmtError(); 8112 8113 if (!getDerived().AlwaysRebuild() && !Var && 8114 Handler.get() == S->getHandlerBlock()) 8115 return S; 8116 8117 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8118 } 8119 8120 template <typename Derived> 8121 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8122 // Transform the try block itself. 8123 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8124 if (TryBlock.isInvalid()) 8125 return StmtError(); 8126 8127 // Transform the handlers. 8128 bool HandlerChanged = false; 8129 SmallVector<Stmt *, 8> Handlers; 8130 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8131 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8132 if (Handler.isInvalid()) 8133 return StmtError(); 8134 8135 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8136 Handlers.push_back(Handler.getAs<Stmt>()); 8137 } 8138 8139 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8140 !HandlerChanged) 8141 return S; 8142 8143 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8144 Handlers); 8145 } 8146 8147 template<typename Derived> 8148 StmtResult 8149 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8150 StmtResult Init = 8151 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8152 if (Init.isInvalid()) 8153 return StmtError(); 8154 8155 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8156 if (Range.isInvalid()) 8157 return StmtError(); 8158 8159 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8160 if (Begin.isInvalid()) 8161 return StmtError(); 8162 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8163 if (End.isInvalid()) 8164 return StmtError(); 8165 8166 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8167 if (Cond.isInvalid()) 8168 return StmtError(); 8169 if (Cond.get()) 8170 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8171 if (Cond.isInvalid()) 8172 return StmtError(); 8173 if (Cond.get()) 8174 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8175 8176 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8177 if (Inc.isInvalid()) 8178 return StmtError(); 8179 if (Inc.get()) 8180 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8181 8182 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8183 if (LoopVar.isInvalid()) 8184 return StmtError(); 8185 8186 StmtResult NewStmt = S; 8187 if (getDerived().AlwaysRebuild() || 8188 Init.get() != S->getInit() || 8189 Range.get() != S->getRangeStmt() || 8190 Begin.get() != S->getBeginStmt() || 8191 End.get() != S->getEndStmt() || 8192 Cond.get() != S->getCond() || 8193 Inc.get() != S->getInc() || 8194 LoopVar.get() != S->getLoopVarStmt()) { 8195 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8196 S->getCoawaitLoc(), Init.get(), 8197 S->getColonLoc(), Range.get(), 8198 Begin.get(), End.get(), 8199 Cond.get(), 8200 Inc.get(), LoopVar.get(), 8201 S->getRParenLoc()); 8202 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8203 // Might not have attached any initializer to the loop variable. 8204 getSema().ActOnInitializerError( 8205 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8206 return StmtError(); 8207 } 8208 } 8209 8210 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8211 if (Body.isInvalid()) 8212 return StmtError(); 8213 8214 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8215 // it now so we have a new statement to attach the body to. 8216 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8217 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8218 S->getCoawaitLoc(), Init.get(), 8219 S->getColonLoc(), Range.get(), 8220 Begin.get(), End.get(), 8221 Cond.get(), 8222 Inc.get(), LoopVar.get(), 8223 S->getRParenLoc()); 8224 if (NewStmt.isInvalid()) 8225 return StmtError(); 8226 } 8227 8228 if (NewStmt.get() == S) 8229 return S; 8230 8231 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8232 } 8233 8234 template<typename Derived> 8235 StmtResult 8236 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8237 MSDependentExistsStmt *S) { 8238 // Transform the nested-name-specifier, if any. 8239 NestedNameSpecifierLoc QualifierLoc; 8240 if (S->getQualifierLoc()) { 8241 QualifierLoc 8242 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8243 if (!QualifierLoc) 8244 return StmtError(); 8245 } 8246 8247 // Transform the declaration name. 8248 DeclarationNameInfo NameInfo = S->getNameInfo(); 8249 if (NameInfo.getName()) { 8250 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8251 if (!NameInfo.getName()) 8252 return StmtError(); 8253 } 8254 8255 // Check whether anything changed. 8256 if (!getDerived().AlwaysRebuild() && 8257 QualifierLoc == S->getQualifierLoc() && 8258 NameInfo.getName() == S->getNameInfo().getName()) 8259 return S; 8260 8261 // Determine whether this name exists, if we can. 8262 CXXScopeSpec SS; 8263 SS.Adopt(QualifierLoc); 8264 bool Dependent = false; 8265 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8266 case Sema::IER_Exists: 8267 if (S->isIfExists()) 8268 break; 8269 8270 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8271 8272 case Sema::IER_DoesNotExist: 8273 if (S->isIfNotExists()) 8274 break; 8275 8276 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8277 8278 case Sema::IER_Dependent: 8279 Dependent = true; 8280 break; 8281 8282 case Sema::IER_Error: 8283 return StmtError(); 8284 } 8285 8286 // We need to continue with the instantiation, so do so now. 8287 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8288 if (SubStmt.isInvalid()) 8289 return StmtError(); 8290 8291 // If we have resolved the name, just transform to the substatement. 8292 if (!Dependent) 8293 return SubStmt; 8294 8295 // The name is still dependent, so build a dependent expression again. 8296 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8297 S->isIfExists(), 8298 QualifierLoc, 8299 NameInfo, 8300 SubStmt.get()); 8301 } 8302 8303 template<typename Derived> 8304 ExprResult 8305 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8306 NestedNameSpecifierLoc QualifierLoc; 8307 if (E->getQualifierLoc()) { 8308 QualifierLoc 8309 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8310 if (!QualifierLoc) 8311 return ExprError(); 8312 } 8313 8314 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8315 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8316 if (!PD) 8317 return ExprError(); 8318 8319 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8320 if (Base.isInvalid()) 8321 return ExprError(); 8322 8323 return new (SemaRef.getASTContext()) 8324 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8325 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8326 QualifierLoc, E->getMemberLoc()); 8327 } 8328 8329 template <typename Derived> 8330 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8331 MSPropertySubscriptExpr *E) { 8332 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8333 if (BaseRes.isInvalid()) 8334 return ExprError(); 8335 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8336 if (IdxRes.isInvalid()) 8337 return ExprError(); 8338 8339 if (!getDerived().AlwaysRebuild() && 8340 BaseRes.get() == E->getBase() && 8341 IdxRes.get() == E->getIdx()) 8342 return E; 8343 8344 return getDerived().RebuildArraySubscriptExpr( 8345 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8346 } 8347 8348 template <typename Derived> 8349 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8350 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8351 if (TryBlock.isInvalid()) 8352 return StmtError(); 8353 8354 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8355 if (Handler.isInvalid()) 8356 return StmtError(); 8357 8358 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8359 Handler.get() == S->getHandler()) 8360 return S; 8361 8362 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8363 TryBlock.get(), Handler.get()); 8364 } 8365 8366 template <typename Derived> 8367 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8368 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8369 if (Block.isInvalid()) 8370 return StmtError(); 8371 8372 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8373 } 8374 8375 template <typename Derived> 8376 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8377 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8378 if (FilterExpr.isInvalid()) 8379 return StmtError(); 8380 8381 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8382 if (Block.isInvalid()) 8383 return StmtError(); 8384 8385 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8386 Block.get()); 8387 } 8388 8389 template <typename Derived> 8390 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8391 if (isa<SEHFinallyStmt>(Handler)) 8392 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8393 else 8394 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8395 } 8396 8397 template<typename Derived> 8398 StmtResult 8399 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8400 return S; 8401 } 8402 8403 //===----------------------------------------------------------------------===// 8404 // OpenMP directive transformation 8405 //===----------------------------------------------------------------------===// 8406 8407 template <typename Derived> 8408 StmtResult 8409 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8410 // OMPCanonicalLoops are eliminated during transformation, since they will be 8411 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8412 // after transformation. 8413 return getDerived().TransformStmt(L->getLoopStmt()); 8414 } 8415 8416 template <typename Derived> 8417 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8418 OMPExecutableDirective *D) { 8419 8420 // Transform the clauses 8421 llvm::SmallVector<OMPClause *, 16> TClauses; 8422 ArrayRef<OMPClause *> Clauses = D->clauses(); 8423 TClauses.reserve(Clauses.size()); 8424 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8425 I != E; ++I) { 8426 if (*I) { 8427 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8428 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8429 getDerived().getSema().EndOpenMPClause(); 8430 if (Clause) 8431 TClauses.push_back(Clause); 8432 } else { 8433 TClauses.push_back(nullptr); 8434 } 8435 } 8436 StmtResult AssociatedStmt; 8437 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8438 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8439 /*CurScope=*/nullptr); 8440 StmtResult Body; 8441 { 8442 Sema::CompoundScopeRAII CompoundScope(getSema()); 8443 Stmt *CS; 8444 if (D->getDirectiveKind() == OMPD_atomic || 8445 D->getDirectiveKind() == OMPD_critical || 8446 D->getDirectiveKind() == OMPD_section || 8447 D->getDirectiveKind() == OMPD_master) 8448 CS = D->getAssociatedStmt(); 8449 else 8450 CS = D->getRawStmt(); 8451 Body = getDerived().TransformStmt(CS); 8452 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8453 getSema().getLangOpts().OpenMPIRBuilder) 8454 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8455 } 8456 AssociatedStmt = 8457 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8458 if (AssociatedStmt.isInvalid()) { 8459 return StmtError(); 8460 } 8461 } 8462 if (TClauses.size() != Clauses.size()) { 8463 return StmtError(); 8464 } 8465 8466 // Transform directive name for 'omp critical' directive. 8467 DeclarationNameInfo DirName; 8468 if (D->getDirectiveKind() == OMPD_critical) { 8469 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8470 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8471 } 8472 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8473 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8474 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8475 } else if (D->getDirectiveKind() == OMPD_cancel) { 8476 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8477 } 8478 8479 return getDerived().RebuildOMPExecutableDirective( 8480 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8481 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8482 } 8483 8484 template <typename Derived> 8485 StmtResult 8486 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8487 DeclarationNameInfo DirName; 8488 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8489 D->getBeginLoc()); 8490 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8491 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8492 return Res; 8493 } 8494 8495 template <typename Derived> 8496 StmtResult 8497 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8498 DeclarationNameInfo DirName; 8499 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8500 D->getBeginLoc()); 8501 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8502 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8503 return Res; 8504 } 8505 8506 template <typename Derived> 8507 StmtResult 8508 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8509 DeclarationNameInfo DirName; 8510 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8511 nullptr, D->getBeginLoc()); 8512 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8513 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8514 return Res; 8515 } 8516 8517 template <typename Derived> 8518 StmtResult 8519 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8520 DeclarationNameInfo DirName; 8521 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8522 D->getBeginLoc()); 8523 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8524 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8525 return Res; 8526 } 8527 8528 template <typename Derived> 8529 StmtResult 8530 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8531 DeclarationNameInfo DirName; 8532 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8533 D->getBeginLoc()); 8534 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8535 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8536 return Res; 8537 } 8538 8539 template <typename Derived> 8540 StmtResult 8541 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8542 DeclarationNameInfo DirName; 8543 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8544 D->getBeginLoc()); 8545 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8546 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8547 return Res; 8548 } 8549 8550 template <typename Derived> 8551 StmtResult 8552 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8553 DeclarationNameInfo DirName; 8554 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8555 D->getBeginLoc()); 8556 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8557 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8558 return Res; 8559 } 8560 8561 template <typename Derived> 8562 StmtResult 8563 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8564 DeclarationNameInfo DirName; 8565 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8566 D->getBeginLoc()); 8567 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8568 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8569 return Res; 8570 } 8571 8572 template <typename Derived> 8573 StmtResult 8574 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8575 DeclarationNameInfo DirName; 8576 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8577 D->getBeginLoc()); 8578 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8579 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8580 return Res; 8581 } 8582 8583 template <typename Derived> 8584 StmtResult 8585 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8586 getDerived().getSema().StartOpenMPDSABlock( 8587 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8588 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8589 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8590 return Res; 8591 } 8592 8593 template <typename Derived> 8594 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8595 OMPParallelForDirective *D) { 8596 DeclarationNameInfo DirName; 8597 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8598 nullptr, D->getBeginLoc()); 8599 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8600 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8601 return Res; 8602 } 8603 8604 template <typename Derived> 8605 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8606 OMPParallelForSimdDirective *D) { 8607 DeclarationNameInfo DirName; 8608 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8609 nullptr, D->getBeginLoc()); 8610 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8611 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8612 return Res; 8613 } 8614 8615 template <typename Derived> 8616 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8617 OMPParallelMasterDirective *D) { 8618 DeclarationNameInfo DirName; 8619 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8620 nullptr, D->getBeginLoc()); 8621 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8622 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8623 return Res; 8624 } 8625 8626 template <typename Derived> 8627 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8628 OMPParallelSectionsDirective *D) { 8629 DeclarationNameInfo DirName; 8630 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8631 nullptr, D->getBeginLoc()); 8632 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8633 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8634 return Res; 8635 } 8636 8637 template <typename Derived> 8638 StmtResult 8639 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8640 DeclarationNameInfo DirName; 8641 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8642 D->getBeginLoc()); 8643 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8644 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8645 return Res; 8646 } 8647 8648 template <typename Derived> 8649 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8650 OMPTaskyieldDirective *D) { 8651 DeclarationNameInfo DirName; 8652 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8653 D->getBeginLoc()); 8654 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8655 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8656 return Res; 8657 } 8658 8659 template <typename Derived> 8660 StmtResult 8661 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8662 DeclarationNameInfo DirName; 8663 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8664 D->getBeginLoc()); 8665 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8666 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8667 return Res; 8668 } 8669 8670 template <typename Derived> 8671 StmtResult 8672 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8673 DeclarationNameInfo DirName; 8674 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8675 D->getBeginLoc()); 8676 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8677 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8678 return Res; 8679 } 8680 8681 template <typename Derived> 8682 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8683 OMPTaskgroupDirective *D) { 8684 DeclarationNameInfo DirName; 8685 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8686 D->getBeginLoc()); 8687 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8688 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8689 return Res; 8690 } 8691 8692 template <typename Derived> 8693 StmtResult 8694 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8695 DeclarationNameInfo DirName; 8696 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8697 D->getBeginLoc()); 8698 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8699 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8700 return Res; 8701 } 8702 8703 template <typename Derived> 8704 StmtResult 8705 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8706 DeclarationNameInfo DirName; 8707 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8708 D->getBeginLoc()); 8709 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8710 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8711 return Res; 8712 } 8713 8714 template <typename Derived> 8715 StmtResult 8716 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8717 DeclarationNameInfo DirName; 8718 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8719 D->getBeginLoc()); 8720 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8721 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8722 return Res; 8723 } 8724 8725 template <typename Derived> 8726 StmtResult 8727 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8728 DeclarationNameInfo DirName; 8729 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8730 D->getBeginLoc()); 8731 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8732 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8733 return Res; 8734 } 8735 8736 template <typename Derived> 8737 StmtResult 8738 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8739 DeclarationNameInfo DirName; 8740 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8741 D->getBeginLoc()); 8742 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8743 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8744 return Res; 8745 } 8746 8747 template <typename Derived> 8748 StmtResult 8749 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8750 DeclarationNameInfo DirName; 8751 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8752 D->getBeginLoc()); 8753 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8754 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8755 return Res; 8756 } 8757 8758 template <typename Derived> 8759 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8760 OMPTargetDataDirective *D) { 8761 DeclarationNameInfo DirName; 8762 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8763 D->getBeginLoc()); 8764 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8765 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8766 return Res; 8767 } 8768 8769 template <typename Derived> 8770 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8771 OMPTargetEnterDataDirective *D) { 8772 DeclarationNameInfo DirName; 8773 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8774 nullptr, D->getBeginLoc()); 8775 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8776 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8777 return Res; 8778 } 8779 8780 template <typename Derived> 8781 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8782 OMPTargetExitDataDirective *D) { 8783 DeclarationNameInfo DirName; 8784 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8785 nullptr, D->getBeginLoc()); 8786 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8787 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8788 return Res; 8789 } 8790 8791 template <typename Derived> 8792 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8793 OMPTargetParallelDirective *D) { 8794 DeclarationNameInfo DirName; 8795 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8796 nullptr, D->getBeginLoc()); 8797 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8798 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8799 return Res; 8800 } 8801 8802 template <typename Derived> 8803 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8804 OMPTargetParallelForDirective *D) { 8805 DeclarationNameInfo DirName; 8806 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8807 nullptr, D->getBeginLoc()); 8808 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8809 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8810 return Res; 8811 } 8812 8813 template <typename Derived> 8814 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8815 OMPTargetUpdateDirective *D) { 8816 DeclarationNameInfo DirName; 8817 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8818 nullptr, D->getBeginLoc()); 8819 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8820 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8821 return Res; 8822 } 8823 8824 template <typename Derived> 8825 StmtResult 8826 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8827 DeclarationNameInfo DirName; 8828 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8829 D->getBeginLoc()); 8830 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8831 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8832 return Res; 8833 } 8834 8835 template <typename Derived> 8836 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8837 OMPCancellationPointDirective *D) { 8838 DeclarationNameInfo DirName; 8839 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8840 nullptr, D->getBeginLoc()); 8841 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8842 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8843 return Res; 8844 } 8845 8846 template <typename Derived> 8847 StmtResult 8848 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8849 DeclarationNameInfo DirName; 8850 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8851 D->getBeginLoc()); 8852 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8853 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8854 return Res; 8855 } 8856 8857 template <typename Derived> 8858 StmtResult 8859 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8860 DeclarationNameInfo DirName; 8861 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8862 D->getBeginLoc()); 8863 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8864 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8865 return Res; 8866 } 8867 8868 template <typename Derived> 8869 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8870 OMPTaskLoopSimdDirective *D) { 8871 DeclarationNameInfo DirName; 8872 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8873 nullptr, D->getBeginLoc()); 8874 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8875 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8876 return Res; 8877 } 8878 8879 template <typename Derived> 8880 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8881 OMPMasterTaskLoopDirective *D) { 8882 DeclarationNameInfo DirName; 8883 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8884 nullptr, D->getBeginLoc()); 8885 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8886 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8887 return Res; 8888 } 8889 8890 template <typename Derived> 8891 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8892 OMPMasterTaskLoopSimdDirective *D) { 8893 DeclarationNameInfo DirName; 8894 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8895 nullptr, D->getBeginLoc()); 8896 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8897 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8898 return Res; 8899 } 8900 8901 template <typename Derived> 8902 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8903 OMPParallelMasterTaskLoopDirective *D) { 8904 DeclarationNameInfo DirName; 8905 getDerived().getSema().StartOpenMPDSABlock( 8906 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8907 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8908 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8909 return Res; 8910 } 8911 8912 template <typename Derived> 8913 StmtResult 8914 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8915 OMPParallelMasterTaskLoopSimdDirective *D) { 8916 DeclarationNameInfo DirName; 8917 getDerived().getSema().StartOpenMPDSABlock( 8918 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8919 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8920 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8921 return Res; 8922 } 8923 8924 template <typename Derived> 8925 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8926 OMPDistributeDirective *D) { 8927 DeclarationNameInfo DirName; 8928 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8929 D->getBeginLoc()); 8930 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8931 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8932 return Res; 8933 } 8934 8935 template <typename Derived> 8936 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8937 OMPDistributeParallelForDirective *D) { 8938 DeclarationNameInfo DirName; 8939 getDerived().getSema().StartOpenMPDSABlock( 8940 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8941 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8942 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8943 return Res; 8944 } 8945 8946 template <typename Derived> 8947 StmtResult 8948 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8949 OMPDistributeParallelForSimdDirective *D) { 8950 DeclarationNameInfo DirName; 8951 getDerived().getSema().StartOpenMPDSABlock( 8952 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8953 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8954 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8955 return Res; 8956 } 8957 8958 template <typename Derived> 8959 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8960 OMPDistributeSimdDirective *D) { 8961 DeclarationNameInfo DirName; 8962 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8963 nullptr, D->getBeginLoc()); 8964 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8965 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8966 return Res; 8967 } 8968 8969 template <typename Derived> 8970 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8971 OMPTargetParallelForSimdDirective *D) { 8972 DeclarationNameInfo DirName; 8973 getDerived().getSema().StartOpenMPDSABlock( 8974 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8975 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8976 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8977 return Res; 8978 } 8979 8980 template <typename Derived> 8981 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8982 OMPTargetSimdDirective *D) { 8983 DeclarationNameInfo DirName; 8984 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8985 D->getBeginLoc()); 8986 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8987 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8988 return Res; 8989 } 8990 8991 template <typename Derived> 8992 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8993 OMPTeamsDistributeDirective *D) { 8994 DeclarationNameInfo DirName; 8995 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8996 nullptr, D->getBeginLoc()); 8997 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8998 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8999 return Res; 9000 } 9001 9002 template <typename Derived> 9003 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9004 OMPTeamsDistributeSimdDirective *D) { 9005 DeclarationNameInfo DirName; 9006 getDerived().getSema().StartOpenMPDSABlock( 9007 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9008 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9009 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9010 return Res; 9011 } 9012 9013 template <typename Derived> 9014 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9015 OMPTeamsDistributeParallelForSimdDirective *D) { 9016 DeclarationNameInfo DirName; 9017 getDerived().getSema().StartOpenMPDSABlock( 9018 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9019 D->getBeginLoc()); 9020 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9021 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9022 return Res; 9023 } 9024 9025 template <typename Derived> 9026 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9027 OMPTeamsDistributeParallelForDirective *D) { 9028 DeclarationNameInfo DirName; 9029 getDerived().getSema().StartOpenMPDSABlock( 9030 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9031 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9032 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9033 return Res; 9034 } 9035 9036 template <typename Derived> 9037 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9038 OMPTargetTeamsDirective *D) { 9039 DeclarationNameInfo DirName; 9040 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9041 nullptr, D->getBeginLoc()); 9042 auto Res = getDerived().TransformOMPExecutableDirective(D); 9043 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9044 return Res; 9045 } 9046 9047 template <typename Derived> 9048 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9049 OMPTargetTeamsDistributeDirective *D) { 9050 DeclarationNameInfo DirName; 9051 getDerived().getSema().StartOpenMPDSABlock( 9052 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9053 auto Res = getDerived().TransformOMPExecutableDirective(D); 9054 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9055 return Res; 9056 } 9057 9058 template <typename Derived> 9059 StmtResult 9060 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9061 OMPTargetTeamsDistributeParallelForDirective *D) { 9062 DeclarationNameInfo DirName; 9063 getDerived().getSema().StartOpenMPDSABlock( 9064 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9065 D->getBeginLoc()); 9066 auto Res = getDerived().TransformOMPExecutableDirective(D); 9067 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9068 return Res; 9069 } 9070 9071 template <typename Derived> 9072 StmtResult TreeTransform<Derived>:: 9073 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9074 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9075 DeclarationNameInfo DirName; 9076 getDerived().getSema().StartOpenMPDSABlock( 9077 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9078 D->getBeginLoc()); 9079 auto Res = getDerived().TransformOMPExecutableDirective(D); 9080 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9081 return Res; 9082 } 9083 9084 template <typename Derived> 9085 StmtResult 9086 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9087 OMPTargetTeamsDistributeSimdDirective *D) { 9088 DeclarationNameInfo DirName; 9089 getDerived().getSema().StartOpenMPDSABlock( 9090 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9091 auto Res = getDerived().TransformOMPExecutableDirective(D); 9092 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9093 return Res; 9094 } 9095 9096 template <typename Derived> 9097 StmtResult 9098 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9099 DeclarationNameInfo DirName; 9100 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9101 D->getBeginLoc()); 9102 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9103 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9104 return Res; 9105 } 9106 9107 template <typename Derived> 9108 StmtResult 9109 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9110 DeclarationNameInfo DirName; 9111 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9112 D->getBeginLoc()); 9113 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9114 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9115 return Res; 9116 } 9117 9118 template <typename Derived> 9119 StmtResult 9120 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9121 DeclarationNameInfo DirName; 9122 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9123 D->getBeginLoc()); 9124 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9125 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9126 return Res; 9127 } 9128 9129 //===----------------------------------------------------------------------===// 9130 // OpenMP clause transformation 9131 //===----------------------------------------------------------------------===// 9132 template <typename Derived> 9133 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9134 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9135 if (Cond.isInvalid()) 9136 return nullptr; 9137 return getDerived().RebuildOMPIfClause( 9138 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9139 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9140 } 9141 9142 template <typename Derived> 9143 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9144 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9145 if (Cond.isInvalid()) 9146 return nullptr; 9147 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9148 C->getLParenLoc(), C->getEndLoc()); 9149 } 9150 9151 template <typename Derived> 9152 OMPClause * 9153 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9154 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9155 if (NumThreads.isInvalid()) 9156 return nullptr; 9157 return getDerived().RebuildOMPNumThreadsClause( 9158 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9159 } 9160 9161 template <typename Derived> 9162 OMPClause * 9163 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9164 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9165 if (E.isInvalid()) 9166 return nullptr; 9167 return getDerived().RebuildOMPSafelenClause( 9168 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9169 } 9170 9171 template <typename Derived> 9172 OMPClause * 9173 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9174 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9175 if (E.isInvalid()) 9176 return nullptr; 9177 return getDerived().RebuildOMPAllocatorClause( 9178 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9179 } 9180 9181 template <typename Derived> 9182 OMPClause * 9183 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9184 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9185 if (E.isInvalid()) 9186 return nullptr; 9187 return getDerived().RebuildOMPSimdlenClause( 9188 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9189 } 9190 9191 template <typename Derived> 9192 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9193 SmallVector<Expr *, 4> TransformedSizes; 9194 TransformedSizes.reserve(C->getNumSizes()); 9195 bool Changed = false; 9196 for (Expr *E : C->getSizesRefs()) { 9197 if (!E) { 9198 TransformedSizes.push_back(nullptr); 9199 continue; 9200 } 9201 9202 ExprResult T = getDerived().TransformExpr(E); 9203 if (T.isInvalid()) 9204 return nullptr; 9205 if (E != T.get()) 9206 Changed = true; 9207 TransformedSizes.push_back(T.get()); 9208 } 9209 9210 if (!Changed && !getDerived().AlwaysRebuild()) 9211 return C; 9212 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9213 C->getLParenLoc(), C->getEndLoc()); 9214 } 9215 9216 template <typename Derived> 9217 OMPClause * 9218 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9219 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9220 if (E.isInvalid()) 9221 return nullptr; 9222 return getDerived().RebuildOMPCollapseClause( 9223 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9224 } 9225 9226 template <typename Derived> 9227 OMPClause * 9228 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9229 return getDerived().RebuildOMPDefaultClause( 9230 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9231 C->getLParenLoc(), C->getEndLoc()); 9232 } 9233 9234 template <typename Derived> 9235 OMPClause * 9236 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9237 return getDerived().RebuildOMPProcBindClause( 9238 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9239 C->getLParenLoc(), C->getEndLoc()); 9240 } 9241 9242 template <typename Derived> 9243 OMPClause * 9244 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9245 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9246 if (E.isInvalid()) 9247 return nullptr; 9248 return getDerived().RebuildOMPScheduleClause( 9249 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9250 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9251 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9252 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9253 } 9254 9255 template <typename Derived> 9256 OMPClause * 9257 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9258 ExprResult E; 9259 if (auto *Num = C->getNumForLoops()) { 9260 E = getDerived().TransformExpr(Num); 9261 if (E.isInvalid()) 9262 return nullptr; 9263 } 9264 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9265 C->getLParenLoc(), E.get()); 9266 } 9267 9268 template <typename Derived> 9269 OMPClause * 9270 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9271 ExprResult E; 9272 if (Expr *Evt = C->getEventHandler()) { 9273 E = getDerived().TransformExpr(Evt); 9274 if (E.isInvalid()) 9275 return nullptr; 9276 } 9277 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9278 C->getLParenLoc(), C->getEndLoc()); 9279 } 9280 9281 template <typename Derived> 9282 OMPClause * 9283 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9284 // No need to rebuild this clause, no template-dependent parameters. 9285 return C; 9286 } 9287 9288 template <typename Derived> 9289 OMPClause * 9290 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *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>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9298 // No need to rebuild this clause, no template-dependent parameters. 9299 return C; 9300 } 9301 9302 template <typename Derived> 9303 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9304 // No need to rebuild this clause, no template-dependent parameters. 9305 return C; 9306 } 9307 9308 template <typename Derived> 9309 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9310 // No need to rebuild this clause, no template-dependent parameters. 9311 return C; 9312 } 9313 9314 template <typename Derived> 9315 OMPClause * 9316 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *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>::TransformOMPCaptureClause(OMPCaptureClause *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>::TransformOMPSeqCstClause(OMPSeqCstClause *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>::TransformOMPAcqRelClause(OMPAcqRelClause *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>::TransformOMPAcquireClause(OMPAcquireClause *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>::TransformOMPReleaseClause(OMPReleaseClause *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>::TransformOMPRelaxedClause(OMPRelaxedClause *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>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9366 // No need to rebuild this clause, no template-dependent parameters. 9367 return C; 9368 } 9369 9370 template <typename Derived> 9371 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9372 // No need to rebuild this clause, no template-dependent parameters. 9373 return C; 9374 } 9375 9376 template <typename Derived> 9377 OMPClause * 9378 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9379 // No need to rebuild this clause, no template-dependent parameters. 9380 return C; 9381 } 9382 9383 template <typename Derived> 9384 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9385 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9386 if (IVR.isInvalid()) 9387 return nullptr; 9388 9389 llvm::SmallVector<Expr *, 8> PrefExprs; 9390 PrefExprs.reserve(C->varlist_size() - 1); 9391 for (Expr *E : llvm::drop_begin(C->varlists())) { 9392 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9393 if (ER.isInvalid()) 9394 return nullptr; 9395 PrefExprs.push_back(ER.get()); 9396 } 9397 return getDerived().RebuildOMPInitClause( 9398 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9399 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9400 } 9401 9402 template <typename Derived> 9403 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9404 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9405 if (ER.isInvalid()) 9406 return nullptr; 9407 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9408 C->getLParenLoc(), C->getVarLoc(), 9409 C->getEndLoc()); 9410 } 9411 9412 template <typename Derived> 9413 OMPClause * 9414 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9415 ExprResult ER; 9416 if (Expr *IV = C->getInteropVar()) { 9417 ER = getDerived().TransformExpr(IV); 9418 if (ER.isInvalid()) 9419 return nullptr; 9420 } 9421 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9422 C->getLParenLoc(), C->getVarLoc(), 9423 C->getEndLoc()); 9424 } 9425 9426 template <typename Derived> 9427 OMPClause * 9428 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9429 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9430 if (Cond.isInvalid()) 9431 return nullptr; 9432 return getDerived().RebuildOMPNovariantsClause( 9433 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9434 } 9435 9436 template <typename Derived> 9437 OMPClause * 9438 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9439 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9440 if (Cond.isInvalid()) 9441 return nullptr; 9442 return getDerived().RebuildOMPNocontextClause( 9443 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9444 } 9445 9446 template <typename Derived> 9447 OMPClause * 9448 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9449 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9450 if (ThreadID.isInvalid()) 9451 return nullptr; 9452 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9453 C->getLParenLoc(), C->getEndLoc()); 9454 } 9455 9456 template <typename Derived> 9457 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9458 OMPUnifiedAddressClause *C) { 9459 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9460 } 9461 9462 template <typename Derived> 9463 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9464 OMPUnifiedSharedMemoryClause *C) { 9465 llvm_unreachable( 9466 "unified_shared_memory clause cannot appear in dependent context"); 9467 } 9468 9469 template <typename Derived> 9470 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9471 OMPReverseOffloadClause *C) { 9472 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9473 } 9474 9475 template <typename Derived> 9476 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9477 OMPDynamicAllocatorsClause *C) { 9478 llvm_unreachable( 9479 "dynamic_allocators clause cannot appear in dependent context"); 9480 } 9481 9482 template <typename Derived> 9483 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9484 OMPAtomicDefaultMemOrderClause *C) { 9485 llvm_unreachable( 9486 "atomic_default_mem_order clause cannot appear in dependent context"); 9487 } 9488 9489 template <typename Derived> 9490 OMPClause * 9491 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9492 llvm::SmallVector<Expr *, 16> Vars; 9493 Vars.reserve(C->varlist_size()); 9494 for (auto *VE : C->varlists()) { 9495 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9496 if (EVar.isInvalid()) 9497 return nullptr; 9498 Vars.push_back(EVar.get()); 9499 } 9500 return getDerived().RebuildOMPPrivateClause( 9501 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9502 } 9503 9504 template <typename Derived> 9505 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9506 OMPFirstprivateClause *C) { 9507 llvm::SmallVector<Expr *, 16> Vars; 9508 Vars.reserve(C->varlist_size()); 9509 for (auto *VE : C->varlists()) { 9510 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9511 if (EVar.isInvalid()) 9512 return nullptr; 9513 Vars.push_back(EVar.get()); 9514 } 9515 return getDerived().RebuildOMPFirstprivateClause( 9516 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9517 } 9518 9519 template <typename Derived> 9520 OMPClause * 9521 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9522 llvm::SmallVector<Expr *, 16> Vars; 9523 Vars.reserve(C->varlist_size()); 9524 for (auto *VE : C->varlists()) { 9525 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9526 if (EVar.isInvalid()) 9527 return nullptr; 9528 Vars.push_back(EVar.get()); 9529 } 9530 return getDerived().RebuildOMPLastprivateClause( 9531 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9532 C->getLParenLoc(), C->getEndLoc()); 9533 } 9534 9535 template <typename Derived> 9536 OMPClause * 9537 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9538 llvm::SmallVector<Expr *, 16> Vars; 9539 Vars.reserve(C->varlist_size()); 9540 for (auto *VE : C->varlists()) { 9541 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9542 if (EVar.isInvalid()) 9543 return nullptr; 9544 Vars.push_back(EVar.get()); 9545 } 9546 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9547 C->getLParenLoc(), C->getEndLoc()); 9548 } 9549 9550 template <typename Derived> 9551 OMPClause * 9552 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9553 llvm::SmallVector<Expr *, 16> Vars; 9554 Vars.reserve(C->varlist_size()); 9555 for (auto *VE : C->varlists()) { 9556 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9557 if (EVar.isInvalid()) 9558 return nullptr; 9559 Vars.push_back(EVar.get()); 9560 } 9561 CXXScopeSpec ReductionIdScopeSpec; 9562 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9563 9564 DeclarationNameInfo NameInfo = C->getNameInfo(); 9565 if (NameInfo.getName()) { 9566 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9567 if (!NameInfo.getName()) 9568 return nullptr; 9569 } 9570 // Build a list of all UDR decls with the same names ranged by the Scopes. 9571 // The Scope boundary is a duplication of the previous decl. 9572 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9573 for (auto *E : C->reduction_ops()) { 9574 // Transform all the decls. 9575 if (E) { 9576 auto *ULE = cast<UnresolvedLookupExpr>(E); 9577 UnresolvedSet<8> Decls; 9578 for (auto *D : ULE->decls()) { 9579 NamedDecl *InstD = 9580 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9581 Decls.addDecl(InstD, InstD->getAccess()); 9582 } 9583 UnresolvedReductions.push_back( 9584 UnresolvedLookupExpr::Create( 9585 SemaRef.Context, /*NamingClass=*/nullptr, 9586 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9587 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9588 Decls.begin(), Decls.end())); 9589 } else 9590 UnresolvedReductions.push_back(nullptr); 9591 } 9592 return getDerived().RebuildOMPReductionClause( 9593 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9594 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9595 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9596 } 9597 9598 template <typename Derived> 9599 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9600 OMPTaskReductionClause *C) { 9601 llvm::SmallVector<Expr *, 16> Vars; 9602 Vars.reserve(C->varlist_size()); 9603 for (auto *VE : C->varlists()) { 9604 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9605 if (EVar.isInvalid()) 9606 return nullptr; 9607 Vars.push_back(EVar.get()); 9608 } 9609 CXXScopeSpec ReductionIdScopeSpec; 9610 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9611 9612 DeclarationNameInfo NameInfo = C->getNameInfo(); 9613 if (NameInfo.getName()) { 9614 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9615 if (!NameInfo.getName()) 9616 return nullptr; 9617 } 9618 // Build a list of all UDR decls with the same names ranged by the Scopes. 9619 // The Scope boundary is a duplication of the previous decl. 9620 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9621 for (auto *E : C->reduction_ops()) { 9622 // Transform all the decls. 9623 if (E) { 9624 auto *ULE = cast<UnresolvedLookupExpr>(E); 9625 UnresolvedSet<8> Decls; 9626 for (auto *D : ULE->decls()) { 9627 NamedDecl *InstD = 9628 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9629 Decls.addDecl(InstD, InstD->getAccess()); 9630 } 9631 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9632 SemaRef.Context, /*NamingClass=*/nullptr, 9633 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9634 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9635 } else 9636 UnresolvedReductions.push_back(nullptr); 9637 } 9638 return getDerived().RebuildOMPTaskReductionClause( 9639 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9640 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9641 } 9642 9643 template <typename Derived> 9644 OMPClause * 9645 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9646 llvm::SmallVector<Expr *, 16> Vars; 9647 Vars.reserve(C->varlist_size()); 9648 for (auto *VE : C->varlists()) { 9649 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9650 if (EVar.isInvalid()) 9651 return nullptr; 9652 Vars.push_back(EVar.get()); 9653 } 9654 CXXScopeSpec ReductionIdScopeSpec; 9655 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9656 9657 DeclarationNameInfo NameInfo = C->getNameInfo(); 9658 if (NameInfo.getName()) { 9659 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9660 if (!NameInfo.getName()) 9661 return nullptr; 9662 } 9663 // Build a list of all UDR decls with the same names ranged by the Scopes. 9664 // The Scope boundary is a duplication of the previous decl. 9665 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9666 for (auto *E : C->reduction_ops()) { 9667 // Transform all the decls. 9668 if (E) { 9669 auto *ULE = cast<UnresolvedLookupExpr>(E); 9670 UnresolvedSet<8> Decls; 9671 for (auto *D : ULE->decls()) { 9672 NamedDecl *InstD = 9673 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9674 Decls.addDecl(InstD, InstD->getAccess()); 9675 } 9676 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9677 SemaRef.Context, /*NamingClass=*/nullptr, 9678 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9679 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9680 } else 9681 UnresolvedReductions.push_back(nullptr); 9682 } 9683 return getDerived().RebuildOMPInReductionClause( 9684 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9685 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9686 } 9687 9688 template <typename Derived> 9689 OMPClause * 9690 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9691 llvm::SmallVector<Expr *, 16> Vars; 9692 Vars.reserve(C->varlist_size()); 9693 for (auto *VE : C->varlists()) { 9694 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9695 if (EVar.isInvalid()) 9696 return nullptr; 9697 Vars.push_back(EVar.get()); 9698 } 9699 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9700 if (Step.isInvalid()) 9701 return nullptr; 9702 return getDerived().RebuildOMPLinearClause( 9703 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9704 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9705 } 9706 9707 template <typename Derived> 9708 OMPClause * 9709 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9710 llvm::SmallVector<Expr *, 16> Vars; 9711 Vars.reserve(C->varlist_size()); 9712 for (auto *VE : C->varlists()) { 9713 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9714 if (EVar.isInvalid()) 9715 return nullptr; 9716 Vars.push_back(EVar.get()); 9717 } 9718 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9719 if (Alignment.isInvalid()) 9720 return nullptr; 9721 return getDerived().RebuildOMPAlignedClause( 9722 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9723 C->getColonLoc(), C->getEndLoc()); 9724 } 9725 9726 template <typename Derived> 9727 OMPClause * 9728 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9729 llvm::SmallVector<Expr *, 16> Vars; 9730 Vars.reserve(C->varlist_size()); 9731 for (auto *VE : C->varlists()) { 9732 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9733 if (EVar.isInvalid()) 9734 return nullptr; 9735 Vars.push_back(EVar.get()); 9736 } 9737 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9738 C->getLParenLoc(), C->getEndLoc()); 9739 } 9740 9741 template <typename Derived> 9742 OMPClause * 9743 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9744 llvm::SmallVector<Expr *, 16> Vars; 9745 Vars.reserve(C->varlist_size()); 9746 for (auto *VE : C->varlists()) { 9747 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9748 if (EVar.isInvalid()) 9749 return nullptr; 9750 Vars.push_back(EVar.get()); 9751 } 9752 return getDerived().RebuildOMPCopyprivateClause( 9753 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9754 } 9755 9756 template <typename Derived> 9757 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9758 llvm::SmallVector<Expr *, 16> Vars; 9759 Vars.reserve(C->varlist_size()); 9760 for (auto *VE : C->varlists()) { 9761 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9762 if (EVar.isInvalid()) 9763 return nullptr; 9764 Vars.push_back(EVar.get()); 9765 } 9766 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9767 C->getLParenLoc(), C->getEndLoc()); 9768 } 9769 9770 template <typename Derived> 9771 OMPClause * 9772 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9773 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9774 if (E.isInvalid()) 9775 return nullptr; 9776 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9777 C->getLParenLoc(), C->getEndLoc()); 9778 } 9779 9780 template <typename Derived> 9781 OMPClause * 9782 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9783 llvm::SmallVector<Expr *, 16> Vars; 9784 Expr *DepModifier = C->getModifier(); 9785 if (DepModifier) { 9786 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9787 if (DepModRes.isInvalid()) 9788 return nullptr; 9789 DepModifier = DepModRes.get(); 9790 } 9791 Vars.reserve(C->varlist_size()); 9792 for (auto *VE : C->varlists()) { 9793 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9794 if (EVar.isInvalid()) 9795 return nullptr; 9796 Vars.push_back(EVar.get()); 9797 } 9798 return getDerived().RebuildOMPDependClause( 9799 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9800 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9801 C->getEndLoc()); 9802 } 9803 9804 template <typename Derived> 9805 OMPClause * 9806 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9807 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9808 if (E.isInvalid()) 9809 return nullptr; 9810 return getDerived().RebuildOMPDeviceClause( 9811 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9812 C->getModifierLoc(), C->getEndLoc()); 9813 } 9814 9815 template <typename Derived, class T> 9816 bool transformOMPMappableExprListClause( 9817 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9818 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9819 DeclarationNameInfo &MapperIdInfo, 9820 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9821 // Transform expressions in the list. 9822 Vars.reserve(C->varlist_size()); 9823 for (auto *VE : C->varlists()) { 9824 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9825 if (EVar.isInvalid()) 9826 return true; 9827 Vars.push_back(EVar.get()); 9828 } 9829 // Transform mapper scope specifier and identifier. 9830 NestedNameSpecifierLoc QualifierLoc; 9831 if (C->getMapperQualifierLoc()) { 9832 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9833 C->getMapperQualifierLoc()); 9834 if (!QualifierLoc) 9835 return true; 9836 } 9837 MapperIdScopeSpec.Adopt(QualifierLoc); 9838 MapperIdInfo = C->getMapperIdInfo(); 9839 if (MapperIdInfo.getName()) { 9840 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9841 if (!MapperIdInfo.getName()) 9842 return true; 9843 } 9844 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9845 // the previous user-defined mapper lookup in dependent environment. 9846 for (auto *E : C->mapperlists()) { 9847 // Transform all the decls. 9848 if (E) { 9849 auto *ULE = cast<UnresolvedLookupExpr>(E); 9850 UnresolvedSet<8> Decls; 9851 for (auto *D : ULE->decls()) { 9852 NamedDecl *InstD = 9853 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9854 Decls.addDecl(InstD, InstD->getAccess()); 9855 } 9856 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9857 TT.getSema().Context, /*NamingClass=*/nullptr, 9858 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9859 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9860 Decls.end())); 9861 } else { 9862 UnresolvedMappers.push_back(nullptr); 9863 } 9864 } 9865 return false; 9866 } 9867 9868 template <typename Derived> 9869 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9870 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9871 llvm::SmallVector<Expr *, 16> Vars; 9872 CXXScopeSpec MapperIdScopeSpec; 9873 DeclarationNameInfo MapperIdInfo; 9874 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9875 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9876 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9877 return nullptr; 9878 return getDerived().RebuildOMPMapClause( 9879 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9880 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9881 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9882 } 9883 9884 template <typename Derived> 9885 OMPClause * 9886 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9887 Expr *Allocator = C->getAllocator(); 9888 if (Allocator) { 9889 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9890 if (AllocatorRes.isInvalid()) 9891 return nullptr; 9892 Allocator = AllocatorRes.get(); 9893 } 9894 llvm::SmallVector<Expr *, 16> Vars; 9895 Vars.reserve(C->varlist_size()); 9896 for (auto *VE : C->varlists()) { 9897 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9898 if (EVar.isInvalid()) 9899 return nullptr; 9900 Vars.push_back(EVar.get()); 9901 } 9902 return getDerived().RebuildOMPAllocateClause( 9903 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9904 C->getEndLoc()); 9905 } 9906 9907 template <typename Derived> 9908 OMPClause * 9909 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9910 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9911 if (E.isInvalid()) 9912 return nullptr; 9913 return getDerived().RebuildOMPNumTeamsClause( 9914 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9915 } 9916 9917 template <typename Derived> 9918 OMPClause * 9919 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9920 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9921 if (E.isInvalid()) 9922 return nullptr; 9923 return getDerived().RebuildOMPThreadLimitClause( 9924 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9925 } 9926 9927 template <typename Derived> 9928 OMPClause * 9929 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9930 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9931 if (E.isInvalid()) 9932 return nullptr; 9933 return getDerived().RebuildOMPPriorityClause( 9934 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9935 } 9936 9937 template <typename Derived> 9938 OMPClause * 9939 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9940 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9941 if (E.isInvalid()) 9942 return nullptr; 9943 return getDerived().RebuildOMPGrainsizeClause( 9944 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9945 } 9946 9947 template <typename Derived> 9948 OMPClause * 9949 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9950 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9951 if (E.isInvalid()) 9952 return nullptr; 9953 return getDerived().RebuildOMPNumTasksClause( 9954 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9955 } 9956 9957 template <typename Derived> 9958 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9959 ExprResult E = getDerived().TransformExpr(C->getHint()); 9960 if (E.isInvalid()) 9961 return nullptr; 9962 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9963 C->getLParenLoc(), C->getEndLoc()); 9964 } 9965 9966 template <typename Derived> 9967 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9968 OMPDistScheduleClause *C) { 9969 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9970 if (E.isInvalid()) 9971 return nullptr; 9972 return getDerived().RebuildOMPDistScheduleClause( 9973 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9974 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9975 } 9976 9977 template <typename Derived> 9978 OMPClause * 9979 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9980 // Rebuild Defaultmap Clause since we need to invoke the checking of 9981 // defaultmap(none:variable-category) after template initialization. 9982 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9983 C->getDefaultmapKind(), 9984 C->getBeginLoc(), 9985 C->getLParenLoc(), 9986 C->getDefaultmapModifierLoc(), 9987 C->getDefaultmapKindLoc(), 9988 C->getEndLoc()); 9989 } 9990 9991 template <typename Derived> 9992 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9993 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9994 llvm::SmallVector<Expr *, 16> Vars; 9995 CXXScopeSpec MapperIdScopeSpec; 9996 DeclarationNameInfo MapperIdInfo; 9997 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9998 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9999 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10000 return nullptr; 10001 return getDerived().RebuildOMPToClause( 10002 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10003 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10004 } 10005 10006 template <typename Derived> 10007 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10008 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10009 llvm::SmallVector<Expr *, 16> Vars; 10010 CXXScopeSpec MapperIdScopeSpec; 10011 DeclarationNameInfo MapperIdInfo; 10012 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10013 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10014 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10015 return nullptr; 10016 return getDerived().RebuildOMPFromClause( 10017 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10018 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10019 } 10020 10021 template <typename Derived> 10022 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10023 OMPUseDevicePtrClause *C) { 10024 llvm::SmallVector<Expr *, 16> Vars; 10025 Vars.reserve(C->varlist_size()); 10026 for (auto *VE : C->varlists()) { 10027 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10028 if (EVar.isInvalid()) 10029 return nullptr; 10030 Vars.push_back(EVar.get()); 10031 } 10032 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10033 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10034 } 10035 10036 template <typename Derived> 10037 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10038 OMPUseDeviceAddrClause *C) { 10039 llvm::SmallVector<Expr *, 16> Vars; 10040 Vars.reserve(C->varlist_size()); 10041 for (auto *VE : C->varlists()) { 10042 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10043 if (EVar.isInvalid()) 10044 return nullptr; 10045 Vars.push_back(EVar.get()); 10046 } 10047 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10048 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10049 } 10050 10051 template <typename Derived> 10052 OMPClause * 10053 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10054 llvm::SmallVector<Expr *, 16> Vars; 10055 Vars.reserve(C->varlist_size()); 10056 for (auto *VE : C->varlists()) { 10057 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10058 if (EVar.isInvalid()) 10059 return nullptr; 10060 Vars.push_back(EVar.get()); 10061 } 10062 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10063 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10064 } 10065 10066 template <typename Derived> 10067 OMPClause * 10068 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10069 llvm::SmallVector<Expr *, 16> Vars; 10070 Vars.reserve(C->varlist_size()); 10071 for (auto *VE : C->varlists()) { 10072 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10073 if (EVar.isInvalid()) 10074 return nullptr; 10075 Vars.push_back(EVar.get()); 10076 } 10077 return getDerived().RebuildOMPNontemporalClause( 10078 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10079 } 10080 10081 template <typename Derived> 10082 OMPClause * 10083 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10084 llvm::SmallVector<Expr *, 16> Vars; 10085 Vars.reserve(C->varlist_size()); 10086 for (auto *VE : C->varlists()) { 10087 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10088 if (EVar.isInvalid()) 10089 return nullptr; 10090 Vars.push_back(EVar.get()); 10091 } 10092 return getDerived().RebuildOMPInclusiveClause( 10093 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10094 } 10095 10096 template <typename Derived> 10097 OMPClause * 10098 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10099 llvm::SmallVector<Expr *, 16> Vars; 10100 Vars.reserve(C->varlist_size()); 10101 for (auto *VE : C->varlists()) { 10102 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10103 if (EVar.isInvalid()) 10104 return nullptr; 10105 Vars.push_back(EVar.get()); 10106 } 10107 return getDerived().RebuildOMPExclusiveClause( 10108 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10109 } 10110 10111 template <typename Derived> 10112 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10113 OMPUsesAllocatorsClause *C) { 10114 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10115 Data.reserve(C->getNumberOfAllocators()); 10116 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10117 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10118 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10119 if (Allocator.isInvalid()) 10120 continue; 10121 ExprResult AllocatorTraits; 10122 if (Expr *AT = D.AllocatorTraits) { 10123 AllocatorTraits = getDerived().TransformExpr(AT); 10124 if (AllocatorTraits.isInvalid()) 10125 continue; 10126 } 10127 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10128 NewD.Allocator = Allocator.get(); 10129 NewD.AllocatorTraits = AllocatorTraits.get(); 10130 NewD.LParenLoc = D.LParenLoc; 10131 NewD.RParenLoc = D.RParenLoc; 10132 } 10133 return getDerived().RebuildOMPUsesAllocatorsClause( 10134 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10135 } 10136 10137 template <typename Derived> 10138 OMPClause * 10139 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10140 SmallVector<Expr *, 4> Locators; 10141 Locators.reserve(C->varlist_size()); 10142 ExprResult ModifierRes; 10143 if (Expr *Modifier = C->getModifier()) { 10144 ModifierRes = getDerived().TransformExpr(Modifier); 10145 if (ModifierRes.isInvalid()) 10146 return nullptr; 10147 } 10148 for (Expr *E : C->varlists()) { 10149 ExprResult Locator = getDerived().TransformExpr(E); 10150 if (Locator.isInvalid()) 10151 continue; 10152 Locators.push_back(Locator.get()); 10153 } 10154 return getDerived().RebuildOMPAffinityClause( 10155 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10156 ModifierRes.get(), Locators); 10157 } 10158 10159 template <typename Derived> 10160 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10161 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10162 C->getBeginLoc(), C->getLParenLoc(), 10163 C->getEndLoc()); 10164 } 10165 10166 //===----------------------------------------------------------------------===// 10167 // Expression transformation 10168 //===----------------------------------------------------------------------===// 10169 template<typename Derived> 10170 ExprResult 10171 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10172 return TransformExpr(E->getSubExpr()); 10173 } 10174 10175 template<typename Derived> 10176 ExprResult 10177 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10178 if (!E->isTypeDependent()) 10179 return E; 10180 10181 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10182 E->getIdentKind()); 10183 } 10184 10185 template<typename Derived> 10186 ExprResult 10187 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10188 NestedNameSpecifierLoc QualifierLoc; 10189 if (E->getQualifierLoc()) { 10190 QualifierLoc 10191 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10192 if (!QualifierLoc) 10193 return ExprError(); 10194 } 10195 10196 ValueDecl *ND 10197 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10198 E->getDecl())); 10199 if (!ND) 10200 return ExprError(); 10201 10202 NamedDecl *Found = ND; 10203 if (E->getFoundDecl() != E->getDecl()) { 10204 Found = cast_or_null<NamedDecl>( 10205 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10206 if (!Found) 10207 return ExprError(); 10208 } 10209 10210 DeclarationNameInfo NameInfo = E->getNameInfo(); 10211 if (NameInfo.getName()) { 10212 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10213 if (!NameInfo.getName()) 10214 return ExprError(); 10215 } 10216 10217 if (!getDerived().AlwaysRebuild() && 10218 QualifierLoc == E->getQualifierLoc() && 10219 ND == E->getDecl() && 10220 Found == E->getFoundDecl() && 10221 NameInfo.getName() == E->getDecl()->getDeclName() && 10222 !E->hasExplicitTemplateArgs()) { 10223 10224 // Mark it referenced in the new context regardless. 10225 // FIXME: this is a bit instantiation-specific. 10226 SemaRef.MarkDeclRefReferenced(E); 10227 10228 return E; 10229 } 10230 10231 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10232 if (E->hasExplicitTemplateArgs()) { 10233 TemplateArgs = &TransArgs; 10234 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10235 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10236 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10237 E->getNumTemplateArgs(), 10238 TransArgs)) 10239 return ExprError(); 10240 } 10241 10242 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10243 Found, TemplateArgs); 10244 } 10245 10246 template<typename Derived> 10247 ExprResult 10248 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10249 return E; 10250 } 10251 10252 template <typename Derived> 10253 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10254 FixedPointLiteral *E) { 10255 return E; 10256 } 10257 10258 template<typename Derived> 10259 ExprResult 10260 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10261 return E; 10262 } 10263 10264 template<typename Derived> 10265 ExprResult 10266 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10267 return E; 10268 } 10269 10270 template<typename Derived> 10271 ExprResult 10272 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10273 return E; 10274 } 10275 10276 template<typename Derived> 10277 ExprResult 10278 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10279 return E; 10280 } 10281 10282 template<typename Derived> 10283 ExprResult 10284 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10285 if (FunctionDecl *FD = E->getDirectCallee()) 10286 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10287 return SemaRef.MaybeBindToTemporary(E); 10288 } 10289 10290 template<typename Derived> 10291 ExprResult 10292 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10293 ExprResult ControllingExpr = 10294 getDerived().TransformExpr(E->getControllingExpr()); 10295 if (ControllingExpr.isInvalid()) 10296 return ExprError(); 10297 10298 SmallVector<Expr *, 4> AssocExprs; 10299 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10300 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10301 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10302 if (TSI) { 10303 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10304 if (!AssocType) 10305 return ExprError(); 10306 AssocTypes.push_back(AssocType); 10307 } else { 10308 AssocTypes.push_back(nullptr); 10309 } 10310 10311 ExprResult AssocExpr = 10312 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10313 if (AssocExpr.isInvalid()) 10314 return ExprError(); 10315 AssocExprs.push_back(AssocExpr.get()); 10316 } 10317 10318 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10319 E->getDefaultLoc(), 10320 E->getRParenLoc(), 10321 ControllingExpr.get(), 10322 AssocTypes, 10323 AssocExprs); 10324 } 10325 10326 template<typename Derived> 10327 ExprResult 10328 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10329 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10330 if (SubExpr.isInvalid()) 10331 return ExprError(); 10332 10333 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10334 return E; 10335 10336 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10337 E->getRParen()); 10338 } 10339 10340 /// The operand of a unary address-of operator has special rules: it's 10341 /// allowed to refer to a non-static member of a class even if there's no 'this' 10342 /// object available. 10343 template<typename Derived> 10344 ExprResult 10345 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10346 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10347 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10348 else 10349 return getDerived().TransformExpr(E); 10350 } 10351 10352 template<typename Derived> 10353 ExprResult 10354 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10355 ExprResult SubExpr; 10356 if (E->getOpcode() == UO_AddrOf) 10357 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10358 else 10359 SubExpr = TransformExpr(E->getSubExpr()); 10360 if (SubExpr.isInvalid()) 10361 return ExprError(); 10362 10363 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10364 return E; 10365 10366 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10367 E->getOpcode(), 10368 SubExpr.get()); 10369 } 10370 10371 template<typename Derived> 10372 ExprResult 10373 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10374 // Transform the type. 10375 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10376 if (!Type) 10377 return ExprError(); 10378 10379 // Transform all of the components into components similar to what the 10380 // parser uses. 10381 // FIXME: It would be slightly more efficient in the non-dependent case to 10382 // just map FieldDecls, rather than requiring the rebuilder to look for 10383 // the fields again. However, __builtin_offsetof is rare enough in 10384 // template code that we don't care. 10385 bool ExprChanged = false; 10386 typedef Sema::OffsetOfComponent Component; 10387 SmallVector<Component, 4> Components; 10388 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10389 const OffsetOfNode &ON = E->getComponent(I); 10390 Component Comp; 10391 Comp.isBrackets = true; 10392 Comp.LocStart = ON.getSourceRange().getBegin(); 10393 Comp.LocEnd = ON.getSourceRange().getEnd(); 10394 switch (ON.getKind()) { 10395 case OffsetOfNode::Array: { 10396 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10397 ExprResult Index = getDerived().TransformExpr(FromIndex); 10398 if (Index.isInvalid()) 10399 return ExprError(); 10400 10401 ExprChanged = ExprChanged || Index.get() != FromIndex; 10402 Comp.isBrackets = true; 10403 Comp.U.E = Index.get(); 10404 break; 10405 } 10406 10407 case OffsetOfNode::Field: 10408 case OffsetOfNode::Identifier: 10409 Comp.isBrackets = false; 10410 Comp.U.IdentInfo = ON.getFieldName(); 10411 if (!Comp.U.IdentInfo) 10412 continue; 10413 10414 break; 10415 10416 case OffsetOfNode::Base: 10417 // Will be recomputed during the rebuild. 10418 continue; 10419 } 10420 10421 Components.push_back(Comp); 10422 } 10423 10424 // If nothing changed, retain the existing expression. 10425 if (!getDerived().AlwaysRebuild() && 10426 Type == E->getTypeSourceInfo() && 10427 !ExprChanged) 10428 return E; 10429 10430 // Build a new offsetof expression. 10431 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10432 Components, E->getRParenLoc()); 10433 } 10434 10435 template<typename Derived> 10436 ExprResult 10437 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10438 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10439 "opaque value expression requires transformation"); 10440 return E; 10441 } 10442 10443 template<typename Derived> 10444 ExprResult 10445 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10446 return E; 10447 } 10448 10449 template <typename Derived> 10450 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10451 llvm::SmallVector<Expr *, 8> Children; 10452 bool Changed = false; 10453 for (Expr *C : E->subExpressions()) { 10454 ExprResult NewC = getDerived().TransformExpr(C); 10455 if (NewC.isInvalid()) 10456 return ExprError(); 10457 Children.push_back(NewC.get()); 10458 10459 Changed |= NewC.get() != C; 10460 } 10461 if (!getDerived().AlwaysRebuild() && !Changed) 10462 return E; 10463 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10464 Children, E->getType()); 10465 } 10466 10467 template<typename Derived> 10468 ExprResult 10469 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10470 // Rebuild the syntactic form. The original syntactic form has 10471 // opaque-value expressions in it, so strip those away and rebuild 10472 // the result. This is a really awful way of doing this, but the 10473 // better solution (rebuilding the semantic expressions and 10474 // rebinding OVEs as necessary) doesn't work; we'd need 10475 // TreeTransform to not strip away implicit conversions. 10476 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10477 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10478 if (result.isInvalid()) return ExprError(); 10479 10480 // If that gives us a pseudo-object result back, the pseudo-object 10481 // expression must have been an lvalue-to-rvalue conversion which we 10482 // should reapply. 10483 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10484 result = SemaRef.checkPseudoObjectRValue(result.get()); 10485 10486 return result; 10487 } 10488 10489 template<typename Derived> 10490 ExprResult 10491 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10492 UnaryExprOrTypeTraitExpr *E) { 10493 if (E->isArgumentType()) { 10494 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10495 10496 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10497 if (!NewT) 10498 return ExprError(); 10499 10500 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10501 return E; 10502 10503 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10504 E->getKind(), 10505 E->getSourceRange()); 10506 } 10507 10508 // C++0x [expr.sizeof]p1: 10509 // The operand is either an expression, which is an unevaluated operand 10510 // [...] 10511 EnterExpressionEvaluationContext Unevaluated( 10512 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10513 Sema::ReuseLambdaContextDecl); 10514 10515 // Try to recover if we have something like sizeof(T::X) where X is a type. 10516 // Notably, there must be *exactly* one set of parens if X is a type. 10517 TypeSourceInfo *RecoveryTSI = nullptr; 10518 ExprResult SubExpr; 10519 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10520 if (auto *DRE = 10521 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10522 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10523 PE, DRE, false, &RecoveryTSI); 10524 else 10525 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10526 10527 if (RecoveryTSI) { 10528 return getDerived().RebuildUnaryExprOrTypeTrait( 10529 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10530 } else if (SubExpr.isInvalid()) 10531 return ExprError(); 10532 10533 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10534 return E; 10535 10536 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10537 E->getOperatorLoc(), 10538 E->getKind(), 10539 E->getSourceRange()); 10540 } 10541 10542 template<typename Derived> 10543 ExprResult 10544 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10545 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10546 if (LHS.isInvalid()) 10547 return ExprError(); 10548 10549 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10550 if (RHS.isInvalid()) 10551 return ExprError(); 10552 10553 10554 if (!getDerived().AlwaysRebuild() && 10555 LHS.get() == E->getLHS() && 10556 RHS.get() == E->getRHS()) 10557 return E; 10558 10559 return getDerived().RebuildArraySubscriptExpr( 10560 LHS.get(), 10561 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10562 } 10563 10564 template <typename Derived> 10565 ExprResult 10566 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10567 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10568 if (Base.isInvalid()) 10569 return ExprError(); 10570 10571 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10572 if (RowIdx.isInvalid()) 10573 return ExprError(); 10574 10575 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10576 if (ColumnIdx.isInvalid()) 10577 return ExprError(); 10578 10579 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10580 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10581 return E; 10582 10583 return getDerived().RebuildMatrixSubscriptExpr( 10584 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10585 } 10586 10587 template <typename Derived> 10588 ExprResult 10589 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10590 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10591 if (Base.isInvalid()) 10592 return ExprError(); 10593 10594 ExprResult LowerBound; 10595 if (E->getLowerBound()) { 10596 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10597 if (LowerBound.isInvalid()) 10598 return ExprError(); 10599 } 10600 10601 ExprResult Length; 10602 if (E->getLength()) { 10603 Length = getDerived().TransformExpr(E->getLength()); 10604 if (Length.isInvalid()) 10605 return ExprError(); 10606 } 10607 10608 ExprResult Stride; 10609 if (Expr *Str = E->getStride()) { 10610 Stride = getDerived().TransformExpr(Str); 10611 if (Stride.isInvalid()) 10612 return ExprError(); 10613 } 10614 10615 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10616 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10617 return E; 10618 10619 return getDerived().RebuildOMPArraySectionExpr( 10620 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10621 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10622 E->getRBracketLoc()); 10623 } 10624 10625 template <typename Derived> 10626 ExprResult 10627 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10628 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10629 if (Base.isInvalid()) 10630 return ExprError(); 10631 10632 SmallVector<Expr *, 4> Dims; 10633 bool ErrorFound = false; 10634 for (Expr *Dim : E->getDimensions()) { 10635 ExprResult DimRes = getDerived().TransformExpr(Dim); 10636 if (DimRes.isInvalid()) { 10637 ErrorFound = true; 10638 continue; 10639 } 10640 Dims.push_back(DimRes.get()); 10641 } 10642 10643 if (ErrorFound) 10644 return ExprError(); 10645 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10646 E->getRParenLoc(), Dims, 10647 E->getBracketsRanges()); 10648 } 10649 10650 template <typename Derived> 10651 ExprResult 10652 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10653 unsigned NumIterators = E->numOfIterators(); 10654 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10655 10656 bool ErrorFound = false; 10657 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10658 for (unsigned I = 0; I < NumIterators; ++I) { 10659 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10660 Data[I].DeclIdent = D->getIdentifier(); 10661 Data[I].DeclIdentLoc = D->getLocation(); 10662 if (D->getLocation() == D->getBeginLoc()) { 10663 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10664 "Implicit type must be int."); 10665 } else { 10666 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10667 QualType DeclTy = getDerived().TransformType(D->getType()); 10668 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10669 } 10670 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10671 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10672 ExprResult End = getDerived().TransformExpr(Range.End); 10673 ExprResult Step = getDerived().TransformExpr(Range.Step); 10674 ErrorFound = ErrorFound || 10675 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10676 !Data[I].Type.get().isNull())) || 10677 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10678 if (ErrorFound) 10679 continue; 10680 Data[I].Range.Begin = Begin.get(); 10681 Data[I].Range.End = End.get(); 10682 Data[I].Range.Step = Step.get(); 10683 Data[I].AssignLoc = E->getAssignLoc(I); 10684 Data[I].ColonLoc = E->getColonLoc(I); 10685 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10686 NeedToRebuild = 10687 NeedToRebuild || 10688 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10689 D->getType().getTypePtrOrNull()) || 10690 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10691 Range.Step != Data[I].Range.Step; 10692 } 10693 if (ErrorFound) 10694 return ExprError(); 10695 if (!NeedToRebuild) 10696 return E; 10697 10698 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10699 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10700 if (!Res.isUsable()) 10701 return Res; 10702 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10703 for (unsigned I = 0; I < NumIterators; ++I) 10704 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10705 IE->getIteratorDecl(I)); 10706 return Res; 10707 } 10708 10709 template<typename Derived> 10710 ExprResult 10711 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10712 // Transform the callee. 10713 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10714 if (Callee.isInvalid()) 10715 return ExprError(); 10716 10717 // Transform arguments. 10718 bool ArgChanged = false; 10719 SmallVector<Expr*, 8> Args; 10720 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10721 &ArgChanged)) 10722 return ExprError(); 10723 10724 if (!getDerived().AlwaysRebuild() && 10725 Callee.get() == E->getCallee() && 10726 !ArgChanged) 10727 return SemaRef.MaybeBindToTemporary(E); 10728 10729 // FIXME: Wrong source location information for the '('. 10730 SourceLocation FakeLParenLoc 10731 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10732 10733 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10734 if (E->hasStoredFPFeatures()) { 10735 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10736 getSema().CurFPFeatures = 10737 NewOverrides.applyOverrides(getSema().getLangOpts()); 10738 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10739 } 10740 10741 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10742 Args, 10743 E->getRParenLoc()); 10744 } 10745 10746 template<typename Derived> 10747 ExprResult 10748 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10749 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10750 if (Base.isInvalid()) 10751 return ExprError(); 10752 10753 NestedNameSpecifierLoc QualifierLoc; 10754 if (E->hasQualifier()) { 10755 QualifierLoc 10756 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10757 10758 if (!QualifierLoc) 10759 return ExprError(); 10760 } 10761 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10762 10763 ValueDecl *Member 10764 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10765 E->getMemberDecl())); 10766 if (!Member) 10767 return ExprError(); 10768 10769 NamedDecl *FoundDecl = E->getFoundDecl(); 10770 if (FoundDecl == E->getMemberDecl()) { 10771 FoundDecl = Member; 10772 } else { 10773 FoundDecl = cast_or_null<NamedDecl>( 10774 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10775 if (!FoundDecl) 10776 return ExprError(); 10777 } 10778 10779 if (!getDerived().AlwaysRebuild() && 10780 Base.get() == E->getBase() && 10781 QualifierLoc == E->getQualifierLoc() && 10782 Member == E->getMemberDecl() && 10783 FoundDecl == E->getFoundDecl() && 10784 !E->hasExplicitTemplateArgs()) { 10785 10786 // Mark it referenced in the new context regardless. 10787 // FIXME: this is a bit instantiation-specific. 10788 SemaRef.MarkMemberReferenced(E); 10789 10790 return E; 10791 } 10792 10793 TemplateArgumentListInfo TransArgs; 10794 if (E->hasExplicitTemplateArgs()) { 10795 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10796 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10797 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10798 E->getNumTemplateArgs(), 10799 TransArgs)) 10800 return ExprError(); 10801 } 10802 10803 // FIXME: Bogus source location for the operator 10804 SourceLocation FakeOperatorLoc = 10805 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10806 10807 // FIXME: to do this check properly, we will need to preserve the 10808 // first-qualifier-in-scope here, just in case we had a dependent 10809 // base (and therefore couldn't do the check) and a 10810 // nested-name-qualifier (and therefore could do the lookup). 10811 NamedDecl *FirstQualifierInScope = nullptr; 10812 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10813 if (MemberNameInfo.getName()) { 10814 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10815 if (!MemberNameInfo.getName()) 10816 return ExprError(); 10817 } 10818 10819 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10820 E->isArrow(), 10821 QualifierLoc, 10822 TemplateKWLoc, 10823 MemberNameInfo, 10824 Member, 10825 FoundDecl, 10826 (E->hasExplicitTemplateArgs() 10827 ? &TransArgs : nullptr), 10828 FirstQualifierInScope); 10829 } 10830 10831 template<typename Derived> 10832 ExprResult 10833 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10834 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10835 if (LHS.isInvalid()) 10836 return ExprError(); 10837 10838 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10839 if (RHS.isInvalid()) 10840 return ExprError(); 10841 10842 if (!getDerived().AlwaysRebuild() && 10843 LHS.get() == E->getLHS() && 10844 RHS.get() == E->getRHS()) 10845 return E; 10846 10847 if (E->isCompoundAssignmentOp()) 10848 // FPFeatures has already been established from trailing storage 10849 return getDerived().RebuildBinaryOperator( 10850 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10851 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10852 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10853 getSema().CurFPFeatures = 10854 NewOverrides.applyOverrides(getSema().getLangOpts()); 10855 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10856 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10857 LHS.get(), RHS.get()); 10858 } 10859 10860 template <typename Derived> 10861 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10862 CXXRewrittenBinaryOperator *E) { 10863 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10864 10865 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10866 if (LHS.isInvalid()) 10867 return ExprError(); 10868 10869 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10870 if (RHS.isInvalid()) 10871 return ExprError(); 10872 10873 if (!getDerived().AlwaysRebuild() && 10874 LHS.get() == Decomp.LHS && 10875 RHS.get() == Decomp.RHS) 10876 return E; 10877 10878 // Extract the already-resolved callee declarations so that we can restrict 10879 // ourselves to using them as the unqualified lookup results when rebuilding. 10880 UnresolvedSet<2> UnqualLookups; 10881 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10882 const_cast<Expr *>(Decomp.InnerBinOp)}; 10883 for (Expr *PossibleBinOp : PossibleBinOps) { 10884 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10885 if (!Op) 10886 continue; 10887 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10888 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10889 continue; 10890 10891 // Transform the callee in case we built a call to a local extern 10892 // declaration. 10893 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10894 E->getOperatorLoc(), Callee->getFoundDecl())); 10895 if (!Found) 10896 return ExprError(); 10897 UnqualLookups.addDecl(Found); 10898 } 10899 10900 return getDerived().RebuildCXXRewrittenBinaryOperator( 10901 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10902 } 10903 10904 template<typename Derived> 10905 ExprResult 10906 TreeTransform<Derived>::TransformCompoundAssignOperator( 10907 CompoundAssignOperator *E) { 10908 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10909 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10910 getSema().CurFPFeatures = 10911 NewOverrides.applyOverrides(getSema().getLangOpts()); 10912 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10913 return getDerived().TransformBinaryOperator(E); 10914 } 10915 10916 template<typename Derived> 10917 ExprResult TreeTransform<Derived>:: 10918 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10919 // Just rebuild the common and RHS expressions and see whether we 10920 // get any changes. 10921 10922 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10923 if (commonExpr.isInvalid()) 10924 return ExprError(); 10925 10926 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10927 if (rhs.isInvalid()) 10928 return ExprError(); 10929 10930 if (!getDerived().AlwaysRebuild() && 10931 commonExpr.get() == e->getCommon() && 10932 rhs.get() == e->getFalseExpr()) 10933 return e; 10934 10935 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10936 e->getQuestionLoc(), 10937 nullptr, 10938 e->getColonLoc(), 10939 rhs.get()); 10940 } 10941 10942 template<typename Derived> 10943 ExprResult 10944 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10945 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10946 if (Cond.isInvalid()) 10947 return ExprError(); 10948 10949 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10950 if (LHS.isInvalid()) 10951 return ExprError(); 10952 10953 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10954 if (RHS.isInvalid()) 10955 return ExprError(); 10956 10957 if (!getDerived().AlwaysRebuild() && 10958 Cond.get() == E->getCond() && 10959 LHS.get() == E->getLHS() && 10960 RHS.get() == E->getRHS()) 10961 return E; 10962 10963 return getDerived().RebuildConditionalOperator(Cond.get(), 10964 E->getQuestionLoc(), 10965 LHS.get(), 10966 E->getColonLoc(), 10967 RHS.get()); 10968 } 10969 10970 template<typename Derived> 10971 ExprResult 10972 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10973 // Implicit casts are eliminated during transformation, since they 10974 // will be recomputed by semantic analysis after transformation. 10975 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10976 } 10977 10978 template<typename Derived> 10979 ExprResult 10980 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10981 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10982 if (!Type) 10983 return ExprError(); 10984 10985 ExprResult SubExpr 10986 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10987 if (SubExpr.isInvalid()) 10988 return ExprError(); 10989 10990 if (!getDerived().AlwaysRebuild() && 10991 Type == E->getTypeInfoAsWritten() && 10992 SubExpr.get() == E->getSubExpr()) 10993 return E; 10994 10995 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10996 Type, 10997 E->getRParenLoc(), 10998 SubExpr.get()); 10999 } 11000 11001 template<typename Derived> 11002 ExprResult 11003 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11004 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11005 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11006 if (!NewT) 11007 return ExprError(); 11008 11009 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11010 if (Init.isInvalid()) 11011 return ExprError(); 11012 11013 if (!getDerived().AlwaysRebuild() && 11014 OldT == NewT && 11015 Init.get() == E->getInitializer()) 11016 return SemaRef.MaybeBindToTemporary(E); 11017 11018 // Note: the expression type doesn't necessarily match the 11019 // type-as-written, but that's okay, because it should always be 11020 // derivable from the initializer. 11021 11022 return getDerived().RebuildCompoundLiteralExpr( 11023 E->getLParenLoc(), NewT, 11024 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11025 } 11026 11027 template<typename Derived> 11028 ExprResult 11029 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11030 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11031 if (Base.isInvalid()) 11032 return ExprError(); 11033 11034 if (!getDerived().AlwaysRebuild() && 11035 Base.get() == E->getBase()) 11036 return E; 11037 11038 // FIXME: Bad source location 11039 SourceLocation FakeOperatorLoc = 11040 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11041 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11042 E->getAccessorLoc(), 11043 E->getAccessor()); 11044 } 11045 11046 template<typename Derived> 11047 ExprResult 11048 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11049 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11050 E = Syntactic; 11051 11052 bool InitChanged = false; 11053 11054 EnterExpressionEvaluationContext Context( 11055 getSema(), EnterExpressionEvaluationContext::InitList); 11056 11057 SmallVector<Expr*, 4> Inits; 11058 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11059 Inits, &InitChanged)) 11060 return ExprError(); 11061 11062 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11063 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11064 // in some cases. We can't reuse it in general, because the syntactic and 11065 // semantic forms are linked, and we can't know that semantic form will 11066 // match even if the syntactic form does. 11067 } 11068 11069 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11070 E->getRBraceLoc()); 11071 } 11072 11073 template<typename Derived> 11074 ExprResult 11075 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11076 Designation Desig; 11077 11078 // transform the initializer value 11079 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11080 if (Init.isInvalid()) 11081 return ExprError(); 11082 11083 // transform the designators. 11084 SmallVector<Expr*, 4> ArrayExprs; 11085 bool ExprChanged = false; 11086 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11087 if (D.isFieldDesignator()) { 11088 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11089 D.getDotLoc(), 11090 D.getFieldLoc())); 11091 if (D.getField()) { 11092 FieldDecl *Field = cast_or_null<FieldDecl>( 11093 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11094 if (Field != D.getField()) 11095 // Rebuild the expression when the transformed FieldDecl is 11096 // different to the already assigned FieldDecl. 11097 ExprChanged = true; 11098 } else { 11099 // Ensure that the designator expression is rebuilt when there isn't 11100 // a resolved FieldDecl in the designator as we don't want to assign 11101 // a FieldDecl to a pattern designator that will be instantiated again. 11102 ExprChanged = true; 11103 } 11104 continue; 11105 } 11106 11107 if (D.isArrayDesignator()) { 11108 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11109 if (Index.isInvalid()) 11110 return ExprError(); 11111 11112 Desig.AddDesignator( 11113 Designator::getArray(Index.get(), D.getLBracketLoc())); 11114 11115 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11116 ArrayExprs.push_back(Index.get()); 11117 continue; 11118 } 11119 11120 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11121 ExprResult Start 11122 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11123 if (Start.isInvalid()) 11124 return ExprError(); 11125 11126 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11127 if (End.isInvalid()) 11128 return ExprError(); 11129 11130 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11131 End.get(), 11132 D.getLBracketLoc(), 11133 D.getEllipsisLoc())); 11134 11135 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11136 End.get() != E->getArrayRangeEnd(D); 11137 11138 ArrayExprs.push_back(Start.get()); 11139 ArrayExprs.push_back(End.get()); 11140 } 11141 11142 if (!getDerived().AlwaysRebuild() && 11143 Init.get() == E->getInit() && 11144 !ExprChanged) 11145 return E; 11146 11147 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11148 E->getEqualOrColonLoc(), 11149 E->usesGNUSyntax(), Init.get()); 11150 } 11151 11152 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11153 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11154 template<typename Derived> 11155 ExprResult 11156 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11157 DesignatedInitUpdateExpr *E) { 11158 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11159 "initializer"); 11160 return ExprError(); 11161 } 11162 11163 template<typename Derived> 11164 ExprResult 11165 TreeTransform<Derived>::TransformNoInitExpr( 11166 NoInitExpr *E) { 11167 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11168 return ExprError(); 11169 } 11170 11171 template<typename Derived> 11172 ExprResult 11173 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11174 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11175 return ExprError(); 11176 } 11177 11178 template<typename Derived> 11179 ExprResult 11180 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11181 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11182 return ExprError(); 11183 } 11184 11185 template<typename Derived> 11186 ExprResult 11187 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11188 ImplicitValueInitExpr *E) { 11189 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11190 11191 // FIXME: Will we ever have proper type location here? Will we actually 11192 // need to transform the type? 11193 QualType T = getDerived().TransformType(E->getType()); 11194 if (T.isNull()) 11195 return ExprError(); 11196 11197 if (!getDerived().AlwaysRebuild() && 11198 T == E->getType()) 11199 return E; 11200 11201 return getDerived().RebuildImplicitValueInitExpr(T); 11202 } 11203 11204 template<typename Derived> 11205 ExprResult 11206 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11207 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11208 if (!TInfo) 11209 return ExprError(); 11210 11211 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11212 if (SubExpr.isInvalid()) 11213 return ExprError(); 11214 11215 if (!getDerived().AlwaysRebuild() && 11216 TInfo == E->getWrittenTypeInfo() && 11217 SubExpr.get() == E->getSubExpr()) 11218 return E; 11219 11220 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11221 TInfo, E->getRParenLoc()); 11222 } 11223 11224 template<typename Derived> 11225 ExprResult 11226 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11227 bool ArgumentChanged = false; 11228 SmallVector<Expr*, 4> Inits; 11229 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11230 &ArgumentChanged)) 11231 return ExprError(); 11232 11233 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11234 Inits, 11235 E->getRParenLoc()); 11236 } 11237 11238 /// Transform an address-of-label expression. 11239 /// 11240 /// By default, the transformation of an address-of-label expression always 11241 /// rebuilds the expression, so that the label identifier can be resolved to 11242 /// the corresponding label statement by semantic analysis. 11243 template<typename Derived> 11244 ExprResult 11245 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11246 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11247 E->getLabel()); 11248 if (!LD) 11249 return ExprError(); 11250 11251 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11252 cast<LabelDecl>(LD)); 11253 } 11254 11255 template<typename Derived> 11256 ExprResult 11257 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11258 SemaRef.ActOnStartStmtExpr(); 11259 StmtResult SubStmt 11260 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11261 if (SubStmt.isInvalid()) { 11262 SemaRef.ActOnStmtExprError(); 11263 return ExprError(); 11264 } 11265 11266 unsigned OldDepth = E->getTemplateDepth(); 11267 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11268 11269 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11270 SubStmt.get() == E->getSubStmt()) { 11271 // Calling this an 'error' is unintuitive, but it does the right thing. 11272 SemaRef.ActOnStmtExprError(); 11273 return SemaRef.MaybeBindToTemporary(E); 11274 } 11275 11276 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11277 E->getRParenLoc(), NewDepth); 11278 } 11279 11280 template<typename Derived> 11281 ExprResult 11282 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11283 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11284 if (Cond.isInvalid()) 11285 return ExprError(); 11286 11287 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11288 if (LHS.isInvalid()) 11289 return ExprError(); 11290 11291 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11292 if (RHS.isInvalid()) 11293 return ExprError(); 11294 11295 if (!getDerived().AlwaysRebuild() && 11296 Cond.get() == E->getCond() && 11297 LHS.get() == E->getLHS() && 11298 RHS.get() == E->getRHS()) 11299 return E; 11300 11301 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11302 Cond.get(), LHS.get(), RHS.get(), 11303 E->getRParenLoc()); 11304 } 11305 11306 template<typename Derived> 11307 ExprResult 11308 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11309 return E; 11310 } 11311 11312 template<typename Derived> 11313 ExprResult 11314 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11315 switch (E->getOperator()) { 11316 case OO_New: 11317 case OO_Delete: 11318 case OO_Array_New: 11319 case OO_Array_Delete: 11320 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11321 11322 case OO_Call: { 11323 // This is a call to an object's operator(). 11324 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11325 11326 // Transform the object itself. 11327 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11328 if (Object.isInvalid()) 11329 return ExprError(); 11330 11331 // FIXME: Poor location information 11332 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11333 static_cast<Expr *>(Object.get())->getEndLoc()); 11334 11335 // Transform the call arguments. 11336 SmallVector<Expr*, 8> Args; 11337 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11338 Args)) 11339 return ExprError(); 11340 11341 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11342 E->getEndLoc()); 11343 } 11344 11345 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11346 case OO_##Name: 11347 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11348 #include "clang/Basic/OperatorKinds.def" 11349 case OO_Subscript: 11350 // Handled below. 11351 break; 11352 11353 case OO_Conditional: 11354 llvm_unreachable("conditional operator is not actually overloadable"); 11355 11356 case OO_None: 11357 case NUM_OVERLOADED_OPERATORS: 11358 llvm_unreachable("not an overloaded operator?"); 11359 } 11360 11361 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11362 if (Callee.isInvalid()) 11363 return ExprError(); 11364 11365 ExprResult First; 11366 if (E->getOperator() == OO_Amp) 11367 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11368 else 11369 First = getDerived().TransformExpr(E->getArg(0)); 11370 if (First.isInvalid()) 11371 return ExprError(); 11372 11373 ExprResult Second; 11374 if (E->getNumArgs() == 2) { 11375 Second = getDerived().TransformExpr(E->getArg(1)); 11376 if (Second.isInvalid()) 11377 return ExprError(); 11378 } 11379 11380 if (!getDerived().AlwaysRebuild() && 11381 Callee.get() == E->getCallee() && 11382 First.get() == E->getArg(0) && 11383 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11384 return SemaRef.MaybeBindToTemporary(E); 11385 11386 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11387 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11388 getSema().CurFPFeatures = 11389 NewOverrides.applyOverrides(getSema().getLangOpts()); 11390 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11391 11392 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11393 E->getOperatorLoc(), 11394 Callee.get(), 11395 First.get(), 11396 Second.get()); 11397 } 11398 11399 template<typename Derived> 11400 ExprResult 11401 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11402 return getDerived().TransformCallExpr(E); 11403 } 11404 11405 template <typename Derived> 11406 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11407 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11408 getSema().CurContext != E->getParentContext(); 11409 11410 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11411 return E; 11412 11413 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11414 E->getEndLoc(), 11415 getSema().CurContext); 11416 } 11417 11418 template<typename Derived> 11419 ExprResult 11420 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11421 // Transform the callee. 11422 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11423 if (Callee.isInvalid()) 11424 return ExprError(); 11425 11426 // Transform exec config. 11427 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11428 if (EC.isInvalid()) 11429 return ExprError(); 11430 11431 // Transform arguments. 11432 bool ArgChanged = false; 11433 SmallVector<Expr*, 8> Args; 11434 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11435 &ArgChanged)) 11436 return ExprError(); 11437 11438 if (!getDerived().AlwaysRebuild() && 11439 Callee.get() == E->getCallee() && 11440 !ArgChanged) 11441 return SemaRef.MaybeBindToTemporary(E); 11442 11443 // FIXME: Wrong source location information for the '('. 11444 SourceLocation FakeLParenLoc 11445 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11446 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11447 Args, 11448 E->getRParenLoc(), EC.get()); 11449 } 11450 11451 template<typename Derived> 11452 ExprResult 11453 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11454 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11455 if (!Type) 11456 return ExprError(); 11457 11458 ExprResult SubExpr 11459 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11460 if (SubExpr.isInvalid()) 11461 return ExprError(); 11462 11463 if (!getDerived().AlwaysRebuild() && 11464 Type == E->getTypeInfoAsWritten() && 11465 SubExpr.get() == E->getSubExpr()) 11466 return E; 11467 return getDerived().RebuildCXXNamedCastExpr( 11468 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11469 Type, E->getAngleBrackets().getEnd(), 11470 // FIXME. this should be '(' location 11471 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11472 } 11473 11474 template<typename Derived> 11475 ExprResult 11476 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11477 TypeSourceInfo *TSI = 11478 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11479 if (!TSI) 11480 return ExprError(); 11481 11482 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11483 if (Sub.isInvalid()) 11484 return ExprError(); 11485 11486 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11487 Sub.get(), BCE->getEndLoc()); 11488 } 11489 11490 template<typename Derived> 11491 ExprResult 11492 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11493 return getDerived().TransformCXXNamedCastExpr(E); 11494 } 11495 11496 template<typename Derived> 11497 ExprResult 11498 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11499 return getDerived().TransformCXXNamedCastExpr(E); 11500 } 11501 11502 template<typename Derived> 11503 ExprResult 11504 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11505 CXXReinterpretCastExpr *E) { 11506 return getDerived().TransformCXXNamedCastExpr(E); 11507 } 11508 11509 template<typename Derived> 11510 ExprResult 11511 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11512 return getDerived().TransformCXXNamedCastExpr(E); 11513 } 11514 11515 template<typename Derived> 11516 ExprResult 11517 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11518 return getDerived().TransformCXXNamedCastExpr(E); 11519 } 11520 11521 template<typename Derived> 11522 ExprResult 11523 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11524 CXXFunctionalCastExpr *E) { 11525 TypeSourceInfo *Type = 11526 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11527 if (!Type) 11528 return ExprError(); 11529 11530 ExprResult SubExpr 11531 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11532 if (SubExpr.isInvalid()) 11533 return ExprError(); 11534 11535 if (!getDerived().AlwaysRebuild() && 11536 Type == E->getTypeInfoAsWritten() && 11537 SubExpr.get() == E->getSubExpr()) 11538 return E; 11539 11540 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11541 E->getLParenLoc(), 11542 SubExpr.get(), 11543 E->getRParenLoc(), 11544 E->isListInitialization()); 11545 } 11546 11547 template<typename Derived> 11548 ExprResult 11549 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11550 if (E->isTypeOperand()) { 11551 TypeSourceInfo *TInfo 11552 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11553 if (!TInfo) 11554 return ExprError(); 11555 11556 if (!getDerived().AlwaysRebuild() && 11557 TInfo == E->getTypeOperandSourceInfo()) 11558 return E; 11559 11560 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11561 TInfo, E->getEndLoc()); 11562 } 11563 11564 // We don't know whether the subexpression is potentially evaluated until 11565 // after we perform semantic analysis. We speculatively assume it is 11566 // unevaluated; it will get fixed later if the subexpression is in fact 11567 // potentially evaluated. 11568 EnterExpressionEvaluationContext Unevaluated( 11569 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11570 Sema::ReuseLambdaContextDecl); 11571 11572 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11573 if (SubExpr.isInvalid()) 11574 return ExprError(); 11575 11576 if (!getDerived().AlwaysRebuild() && 11577 SubExpr.get() == E->getExprOperand()) 11578 return E; 11579 11580 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11581 SubExpr.get(), E->getEndLoc()); 11582 } 11583 11584 template<typename Derived> 11585 ExprResult 11586 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11587 if (E->isTypeOperand()) { 11588 TypeSourceInfo *TInfo 11589 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11590 if (!TInfo) 11591 return ExprError(); 11592 11593 if (!getDerived().AlwaysRebuild() && 11594 TInfo == E->getTypeOperandSourceInfo()) 11595 return E; 11596 11597 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11598 TInfo, E->getEndLoc()); 11599 } 11600 11601 EnterExpressionEvaluationContext Unevaluated( 11602 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11603 11604 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11605 if (SubExpr.isInvalid()) 11606 return ExprError(); 11607 11608 if (!getDerived().AlwaysRebuild() && 11609 SubExpr.get() == E->getExprOperand()) 11610 return E; 11611 11612 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11613 SubExpr.get(), E->getEndLoc()); 11614 } 11615 11616 template<typename Derived> 11617 ExprResult 11618 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11619 return E; 11620 } 11621 11622 template<typename Derived> 11623 ExprResult 11624 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11625 CXXNullPtrLiteralExpr *E) { 11626 return E; 11627 } 11628 11629 template<typename Derived> 11630 ExprResult 11631 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11632 QualType T = getSema().getCurrentThisType(); 11633 11634 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11635 // Mark it referenced in the new context regardless. 11636 // FIXME: this is a bit instantiation-specific. 11637 getSema().MarkThisReferenced(E); 11638 return E; 11639 } 11640 11641 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11642 } 11643 11644 template<typename Derived> 11645 ExprResult 11646 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11647 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11648 if (SubExpr.isInvalid()) 11649 return ExprError(); 11650 11651 if (!getDerived().AlwaysRebuild() && 11652 SubExpr.get() == E->getSubExpr()) 11653 return E; 11654 11655 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11656 E->isThrownVariableInScope()); 11657 } 11658 11659 template<typename Derived> 11660 ExprResult 11661 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11662 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11663 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11664 if (!Param) 11665 return ExprError(); 11666 11667 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11668 E->getUsedContext() == SemaRef.CurContext) 11669 return E; 11670 11671 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11672 } 11673 11674 template<typename Derived> 11675 ExprResult 11676 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11677 FieldDecl *Field = cast_or_null<FieldDecl>( 11678 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11679 if (!Field) 11680 return ExprError(); 11681 11682 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11683 E->getUsedContext() == SemaRef.CurContext) 11684 return E; 11685 11686 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11687 } 11688 11689 template<typename Derived> 11690 ExprResult 11691 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11692 CXXScalarValueInitExpr *E) { 11693 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11694 if (!T) 11695 return ExprError(); 11696 11697 if (!getDerived().AlwaysRebuild() && 11698 T == E->getTypeSourceInfo()) 11699 return E; 11700 11701 return getDerived().RebuildCXXScalarValueInitExpr(T, 11702 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11703 E->getRParenLoc()); 11704 } 11705 11706 template<typename Derived> 11707 ExprResult 11708 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11709 // Transform the type that we're allocating 11710 TypeSourceInfo *AllocTypeInfo = 11711 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11712 if (!AllocTypeInfo) 11713 return ExprError(); 11714 11715 // Transform the size of the array we're allocating (if any). 11716 Optional<Expr *> ArraySize; 11717 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11718 ExprResult NewArraySize; 11719 if (*OldArraySize) { 11720 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11721 if (NewArraySize.isInvalid()) 11722 return ExprError(); 11723 } 11724 ArraySize = NewArraySize.get(); 11725 } 11726 11727 // Transform the placement arguments (if any). 11728 bool ArgumentChanged = false; 11729 SmallVector<Expr*, 8> PlacementArgs; 11730 if (getDerived().TransformExprs(E->getPlacementArgs(), 11731 E->getNumPlacementArgs(), true, 11732 PlacementArgs, &ArgumentChanged)) 11733 return ExprError(); 11734 11735 // Transform the initializer (if any). 11736 Expr *OldInit = E->getInitializer(); 11737 ExprResult NewInit; 11738 if (OldInit) 11739 NewInit = getDerived().TransformInitializer(OldInit, true); 11740 if (NewInit.isInvalid()) 11741 return ExprError(); 11742 11743 // Transform new operator and delete operator. 11744 FunctionDecl *OperatorNew = nullptr; 11745 if (E->getOperatorNew()) { 11746 OperatorNew = cast_or_null<FunctionDecl>( 11747 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11748 if (!OperatorNew) 11749 return ExprError(); 11750 } 11751 11752 FunctionDecl *OperatorDelete = nullptr; 11753 if (E->getOperatorDelete()) { 11754 OperatorDelete = cast_or_null<FunctionDecl>( 11755 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11756 if (!OperatorDelete) 11757 return ExprError(); 11758 } 11759 11760 if (!getDerived().AlwaysRebuild() && 11761 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11762 ArraySize == E->getArraySize() && 11763 NewInit.get() == OldInit && 11764 OperatorNew == E->getOperatorNew() && 11765 OperatorDelete == E->getOperatorDelete() && 11766 !ArgumentChanged) { 11767 // Mark any declarations we need as referenced. 11768 // FIXME: instantiation-specific. 11769 if (OperatorNew) 11770 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11771 if (OperatorDelete) 11772 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11773 11774 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11775 QualType ElementType 11776 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11777 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11778 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11779 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11780 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11781 } 11782 } 11783 } 11784 11785 return E; 11786 } 11787 11788 QualType AllocType = AllocTypeInfo->getType(); 11789 if (!ArraySize) { 11790 // If no array size was specified, but the new expression was 11791 // instantiated with an array type (e.g., "new T" where T is 11792 // instantiated with "int[4]"), extract the outer bound from the 11793 // array type as our array size. We do this with constant and 11794 // dependently-sized array types. 11795 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11796 if (!ArrayT) { 11797 // Do nothing 11798 } else if (const ConstantArrayType *ConsArrayT 11799 = dyn_cast<ConstantArrayType>(ArrayT)) { 11800 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11801 SemaRef.Context.getSizeType(), 11802 /*FIXME:*/ E->getBeginLoc()); 11803 AllocType = ConsArrayT->getElementType(); 11804 } else if (const DependentSizedArrayType *DepArrayT 11805 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11806 if (DepArrayT->getSizeExpr()) { 11807 ArraySize = DepArrayT->getSizeExpr(); 11808 AllocType = DepArrayT->getElementType(); 11809 } 11810 } 11811 } 11812 11813 return getDerived().RebuildCXXNewExpr( 11814 E->getBeginLoc(), E->isGlobalNew(), 11815 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11816 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11817 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11818 } 11819 11820 template<typename Derived> 11821 ExprResult 11822 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11823 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11824 if (Operand.isInvalid()) 11825 return ExprError(); 11826 11827 // Transform the delete operator, if known. 11828 FunctionDecl *OperatorDelete = nullptr; 11829 if (E->getOperatorDelete()) { 11830 OperatorDelete = cast_or_null<FunctionDecl>( 11831 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11832 if (!OperatorDelete) 11833 return ExprError(); 11834 } 11835 11836 if (!getDerived().AlwaysRebuild() && 11837 Operand.get() == E->getArgument() && 11838 OperatorDelete == E->getOperatorDelete()) { 11839 // Mark any declarations we need as referenced. 11840 // FIXME: instantiation-specific. 11841 if (OperatorDelete) 11842 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11843 11844 if (!E->getArgument()->isTypeDependent()) { 11845 QualType Destroyed = SemaRef.Context.getBaseElementType( 11846 E->getDestroyedType()); 11847 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11848 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11849 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11850 SemaRef.LookupDestructor(Record)); 11851 } 11852 } 11853 11854 return E; 11855 } 11856 11857 return getDerived().RebuildCXXDeleteExpr( 11858 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11859 } 11860 11861 template<typename Derived> 11862 ExprResult 11863 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11864 CXXPseudoDestructorExpr *E) { 11865 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11866 if (Base.isInvalid()) 11867 return ExprError(); 11868 11869 ParsedType ObjectTypePtr; 11870 bool MayBePseudoDestructor = false; 11871 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11872 E->getOperatorLoc(), 11873 E->isArrow()? tok::arrow : tok::period, 11874 ObjectTypePtr, 11875 MayBePseudoDestructor); 11876 if (Base.isInvalid()) 11877 return ExprError(); 11878 11879 QualType ObjectType = ObjectTypePtr.get(); 11880 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11881 if (QualifierLoc) { 11882 QualifierLoc 11883 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11884 if (!QualifierLoc) 11885 return ExprError(); 11886 } 11887 CXXScopeSpec SS; 11888 SS.Adopt(QualifierLoc); 11889 11890 PseudoDestructorTypeStorage Destroyed; 11891 if (E->getDestroyedTypeInfo()) { 11892 TypeSourceInfo *DestroyedTypeInfo 11893 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11894 ObjectType, nullptr, SS); 11895 if (!DestroyedTypeInfo) 11896 return ExprError(); 11897 Destroyed = DestroyedTypeInfo; 11898 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11899 // We aren't likely to be able to resolve the identifier down to a type 11900 // now anyway, so just retain the identifier. 11901 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11902 E->getDestroyedTypeLoc()); 11903 } else { 11904 // Look for a destructor known with the given name. 11905 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11906 *E->getDestroyedTypeIdentifier(), 11907 E->getDestroyedTypeLoc(), 11908 /*Scope=*/nullptr, 11909 SS, ObjectTypePtr, 11910 false); 11911 if (!T) 11912 return ExprError(); 11913 11914 Destroyed 11915 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11916 E->getDestroyedTypeLoc()); 11917 } 11918 11919 TypeSourceInfo *ScopeTypeInfo = nullptr; 11920 if (E->getScopeTypeInfo()) { 11921 CXXScopeSpec EmptySS; 11922 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11923 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11924 if (!ScopeTypeInfo) 11925 return ExprError(); 11926 } 11927 11928 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11929 E->getOperatorLoc(), 11930 E->isArrow(), 11931 SS, 11932 ScopeTypeInfo, 11933 E->getColonColonLoc(), 11934 E->getTildeLoc(), 11935 Destroyed); 11936 } 11937 11938 template <typename Derived> 11939 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11940 bool RequiresADL, 11941 LookupResult &R) { 11942 // Transform all the decls. 11943 bool AllEmptyPacks = true; 11944 for (auto *OldD : Old->decls()) { 11945 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11946 if (!InstD) { 11947 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11948 // This can happen because of dependent hiding. 11949 if (isa<UsingShadowDecl>(OldD)) 11950 continue; 11951 else { 11952 R.clear(); 11953 return true; 11954 } 11955 } 11956 11957 // Expand using pack declarations. 11958 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11959 ArrayRef<NamedDecl*> Decls = SingleDecl; 11960 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11961 Decls = UPD->expansions(); 11962 11963 // Expand using declarations. 11964 for (auto *D : Decls) { 11965 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11966 for (auto *SD : UD->shadows()) 11967 R.addDecl(SD); 11968 } else { 11969 R.addDecl(D); 11970 } 11971 } 11972 11973 AllEmptyPacks &= Decls.empty(); 11974 }; 11975 11976 // C++ [temp.res]/8.4.2: 11977 // The program is ill-formed, no diagnostic required, if [...] lookup for 11978 // a name in the template definition found a using-declaration, but the 11979 // lookup in the corresponding scope in the instantiation odoes not find 11980 // any declarations because the using-declaration was a pack expansion and 11981 // the corresponding pack is empty 11982 if (AllEmptyPacks && !RequiresADL) { 11983 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11984 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11985 return true; 11986 } 11987 11988 // Resolve a kind, but don't do any further analysis. If it's 11989 // ambiguous, the callee needs to deal with it. 11990 R.resolveKind(); 11991 return false; 11992 } 11993 11994 template<typename Derived> 11995 ExprResult 11996 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11997 UnresolvedLookupExpr *Old) { 11998 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11999 Sema::LookupOrdinaryName); 12000 12001 // Transform the declaration set. 12002 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12003 return ExprError(); 12004 12005 // Rebuild the nested-name qualifier, if present. 12006 CXXScopeSpec SS; 12007 if (Old->getQualifierLoc()) { 12008 NestedNameSpecifierLoc QualifierLoc 12009 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12010 if (!QualifierLoc) 12011 return ExprError(); 12012 12013 SS.Adopt(QualifierLoc); 12014 } 12015 12016 if (Old->getNamingClass()) { 12017 CXXRecordDecl *NamingClass 12018 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12019 Old->getNameLoc(), 12020 Old->getNamingClass())); 12021 if (!NamingClass) { 12022 R.clear(); 12023 return ExprError(); 12024 } 12025 12026 R.setNamingClass(NamingClass); 12027 } 12028 12029 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12030 12031 // If we have neither explicit template arguments, nor the template keyword, 12032 // it's a normal declaration name or member reference. 12033 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12034 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12035 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12036 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12037 // give a good diagnostic. 12038 if (D && D->isCXXInstanceMember()) { 12039 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12040 /*TemplateArgs=*/nullptr, 12041 /*Scope=*/nullptr); 12042 } 12043 12044 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12045 } 12046 12047 // If we have template arguments, rebuild them, then rebuild the 12048 // templateid expression. 12049 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12050 if (Old->hasExplicitTemplateArgs() && 12051 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12052 Old->getNumTemplateArgs(), 12053 TransArgs)) { 12054 R.clear(); 12055 return ExprError(); 12056 } 12057 12058 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12059 Old->requiresADL(), &TransArgs); 12060 } 12061 12062 template<typename Derived> 12063 ExprResult 12064 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12065 bool ArgChanged = false; 12066 SmallVector<TypeSourceInfo *, 4> Args; 12067 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12068 TypeSourceInfo *From = E->getArg(I); 12069 TypeLoc FromTL = From->getTypeLoc(); 12070 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12071 TypeLocBuilder TLB; 12072 TLB.reserve(FromTL.getFullDataSize()); 12073 QualType To = getDerived().TransformType(TLB, FromTL); 12074 if (To.isNull()) 12075 return ExprError(); 12076 12077 if (To == From->getType()) 12078 Args.push_back(From); 12079 else { 12080 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12081 ArgChanged = true; 12082 } 12083 continue; 12084 } 12085 12086 ArgChanged = true; 12087 12088 // We have a pack expansion. Instantiate it. 12089 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12090 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12091 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12092 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12093 12094 // Determine whether the set of unexpanded parameter packs can and should 12095 // be expanded. 12096 bool Expand = true; 12097 bool RetainExpansion = false; 12098 Optional<unsigned> OrigNumExpansions = 12099 ExpansionTL.getTypePtr()->getNumExpansions(); 12100 Optional<unsigned> NumExpansions = OrigNumExpansions; 12101 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12102 PatternTL.getSourceRange(), 12103 Unexpanded, 12104 Expand, RetainExpansion, 12105 NumExpansions)) 12106 return ExprError(); 12107 12108 if (!Expand) { 12109 // The transform has determined that we should perform a simple 12110 // transformation on the pack expansion, producing another pack 12111 // expansion. 12112 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12113 12114 TypeLocBuilder TLB; 12115 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12116 12117 QualType To = getDerived().TransformType(TLB, PatternTL); 12118 if (To.isNull()) 12119 return ExprError(); 12120 12121 To = getDerived().RebuildPackExpansionType(To, 12122 PatternTL.getSourceRange(), 12123 ExpansionTL.getEllipsisLoc(), 12124 NumExpansions); 12125 if (To.isNull()) 12126 return ExprError(); 12127 12128 PackExpansionTypeLoc ToExpansionTL 12129 = TLB.push<PackExpansionTypeLoc>(To); 12130 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12131 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12132 continue; 12133 } 12134 12135 // Expand the pack expansion by substituting for each argument in the 12136 // pack(s). 12137 for (unsigned I = 0; I != *NumExpansions; ++I) { 12138 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12139 TypeLocBuilder TLB; 12140 TLB.reserve(PatternTL.getFullDataSize()); 12141 QualType To = getDerived().TransformType(TLB, PatternTL); 12142 if (To.isNull()) 12143 return ExprError(); 12144 12145 if (To->containsUnexpandedParameterPack()) { 12146 To = getDerived().RebuildPackExpansionType(To, 12147 PatternTL.getSourceRange(), 12148 ExpansionTL.getEllipsisLoc(), 12149 NumExpansions); 12150 if (To.isNull()) 12151 return ExprError(); 12152 12153 PackExpansionTypeLoc ToExpansionTL 12154 = TLB.push<PackExpansionTypeLoc>(To); 12155 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12156 } 12157 12158 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12159 } 12160 12161 if (!RetainExpansion) 12162 continue; 12163 12164 // If we're supposed to retain a pack expansion, do so by temporarily 12165 // forgetting the partially-substituted parameter pack. 12166 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12167 12168 TypeLocBuilder TLB; 12169 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12170 12171 QualType To = getDerived().TransformType(TLB, PatternTL); 12172 if (To.isNull()) 12173 return ExprError(); 12174 12175 To = getDerived().RebuildPackExpansionType(To, 12176 PatternTL.getSourceRange(), 12177 ExpansionTL.getEllipsisLoc(), 12178 NumExpansions); 12179 if (To.isNull()) 12180 return ExprError(); 12181 12182 PackExpansionTypeLoc ToExpansionTL 12183 = TLB.push<PackExpansionTypeLoc>(To); 12184 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12185 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12186 } 12187 12188 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12189 return E; 12190 12191 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12192 E->getEndLoc()); 12193 } 12194 12195 template<typename Derived> 12196 ExprResult 12197 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12198 ConceptSpecializationExpr *E) { 12199 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12200 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12201 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12202 Old->NumTemplateArgs, TransArgs)) 12203 return ExprError(); 12204 12205 return getDerived().RebuildConceptSpecializationExpr( 12206 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12207 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12208 &TransArgs); 12209 } 12210 12211 template<typename Derived> 12212 ExprResult 12213 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12214 SmallVector<ParmVarDecl*, 4> TransParams; 12215 SmallVector<QualType, 4> TransParamTypes; 12216 Sema::ExtParameterInfoBuilder ExtParamInfos; 12217 12218 // C++2a [expr.prim.req]p2 12219 // Expressions appearing within a requirement-body are unevaluated operands. 12220 EnterExpressionEvaluationContext Ctx( 12221 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12222 12223 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12224 getSema().Context, getSema().CurContext, 12225 E->getBody()->getBeginLoc()); 12226 12227 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12228 12229 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12230 E->getLocalParameters(), 12231 /*ParamTypes=*/nullptr, 12232 /*ParamInfos=*/nullptr, 12233 TransParamTypes, &TransParams, 12234 ExtParamInfos)) 12235 return ExprError(); 12236 12237 for (ParmVarDecl *Param : TransParams) 12238 Param->setDeclContext(Body); 12239 12240 SmallVector<concepts::Requirement *, 4> TransReqs; 12241 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12242 TransReqs)) 12243 return ExprError(); 12244 12245 for (concepts::Requirement *Req : TransReqs) { 12246 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12247 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12248 ER->getReturnTypeRequirement() 12249 .getTypeConstraintTemplateParameterList()->getParam(0) 12250 ->setDeclContext(Body); 12251 } 12252 } 12253 } 12254 12255 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12256 TransParams, TransReqs, 12257 E->getRBraceLoc()); 12258 } 12259 12260 template<typename Derived> 12261 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12262 ArrayRef<concepts::Requirement *> Reqs, 12263 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12264 for (concepts::Requirement *Req : Reqs) { 12265 concepts::Requirement *TransReq = nullptr; 12266 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12267 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12268 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12269 TransReq = getDerived().TransformExprRequirement(ExprReq); 12270 else 12271 TransReq = getDerived().TransformNestedRequirement( 12272 cast<concepts::NestedRequirement>(Req)); 12273 if (!TransReq) 12274 return true; 12275 Transformed.push_back(TransReq); 12276 } 12277 return false; 12278 } 12279 12280 template<typename Derived> 12281 concepts::TypeRequirement * 12282 TreeTransform<Derived>::TransformTypeRequirement( 12283 concepts::TypeRequirement *Req) { 12284 if (Req->isSubstitutionFailure()) { 12285 if (getDerived().AlwaysRebuild()) 12286 return getDerived().RebuildTypeRequirement( 12287 Req->getSubstitutionDiagnostic()); 12288 return Req; 12289 } 12290 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12291 if (!TransType) 12292 return nullptr; 12293 return getDerived().RebuildTypeRequirement(TransType); 12294 } 12295 12296 template<typename Derived> 12297 concepts::ExprRequirement * 12298 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12299 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12300 if (Req->isExprSubstitutionFailure()) 12301 TransExpr = Req->getExprSubstitutionDiagnostic(); 12302 else { 12303 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12304 if (TransExprRes.isInvalid()) 12305 return nullptr; 12306 TransExpr = TransExprRes.get(); 12307 } 12308 12309 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12310 const auto &RetReq = Req->getReturnTypeRequirement(); 12311 if (RetReq.isEmpty()) 12312 TransRetReq.emplace(); 12313 else if (RetReq.isSubstitutionFailure()) 12314 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12315 else if (RetReq.isTypeConstraint()) { 12316 TemplateParameterList *OrigTPL = 12317 RetReq.getTypeConstraintTemplateParameterList(); 12318 TemplateParameterList *TPL = 12319 getDerived().TransformTemplateParameterList(OrigTPL); 12320 if (!TPL) 12321 return nullptr; 12322 TransRetReq.emplace(TPL); 12323 } 12324 assert(TransRetReq.hasValue() && 12325 "All code paths leading here must set TransRetReq"); 12326 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12327 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12328 Req->getNoexceptLoc(), 12329 std::move(*TransRetReq)); 12330 return getDerived().RebuildExprRequirement( 12331 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12332 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12333 } 12334 12335 template<typename Derived> 12336 concepts::NestedRequirement * 12337 TreeTransform<Derived>::TransformNestedRequirement( 12338 concepts::NestedRequirement *Req) { 12339 if (Req->isSubstitutionFailure()) { 12340 if (getDerived().AlwaysRebuild()) 12341 return getDerived().RebuildNestedRequirement( 12342 Req->getSubstitutionDiagnostic()); 12343 return Req; 12344 } 12345 ExprResult TransConstraint = 12346 getDerived().TransformExpr(Req->getConstraintExpr()); 12347 if (TransConstraint.isInvalid()) 12348 return nullptr; 12349 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12350 } 12351 12352 template<typename Derived> 12353 ExprResult 12354 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12355 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12356 if (!T) 12357 return ExprError(); 12358 12359 if (!getDerived().AlwaysRebuild() && 12360 T == E->getQueriedTypeSourceInfo()) 12361 return E; 12362 12363 ExprResult SubExpr; 12364 { 12365 EnterExpressionEvaluationContext Unevaluated( 12366 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12367 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12368 if (SubExpr.isInvalid()) 12369 return ExprError(); 12370 12371 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12372 return E; 12373 } 12374 12375 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12376 SubExpr.get(), E->getEndLoc()); 12377 } 12378 12379 template<typename Derived> 12380 ExprResult 12381 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12382 ExprResult SubExpr; 12383 { 12384 EnterExpressionEvaluationContext Unevaluated( 12385 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12386 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12387 if (SubExpr.isInvalid()) 12388 return ExprError(); 12389 12390 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12391 return E; 12392 } 12393 12394 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12395 SubExpr.get(), E->getEndLoc()); 12396 } 12397 12398 template <typename Derived> 12399 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12400 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12401 TypeSourceInfo **RecoveryTSI) { 12402 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12403 DRE, AddrTaken, RecoveryTSI); 12404 12405 // Propagate both errors and recovered types, which return ExprEmpty. 12406 if (!NewDRE.isUsable()) 12407 return NewDRE; 12408 12409 // We got an expr, wrap it up in parens. 12410 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12411 return PE; 12412 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12413 PE->getRParen()); 12414 } 12415 12416 template <typename Derived> 12417 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12418 DependentScopeDeclRefExpr *E) { 12419 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12420 nullptr); 12421 } 12422 12423 template<typename Derived> 12424 ExprResult 12425 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12426 DependentScopeDeclRefExpr *E, 12427 bool IsAddressOfOperand, 12428 TypeSourceInfo **RecoveryTSI) { 12429 assert(E->getQualifierLoc()); 12430 NestedNameSpecifierLoc QualifierLoc 12431 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12432 if (!QualifierLoc) 12433 return ExprError(); 12434 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12435 12436 // TODO: If this is a conversion-function-id, verify that the 12437 // destination type name (if present) resolves the same way after 12438 // instantiation as it did in the local scope. 12439 12440 DeclarationNameInfo NameInfo 12441 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12442 if (!NameInfo.getName()) 12443 return ExprError(); 12444 12445 if (!E->hasExplicitTemplateArgs()) { 12446 if (!getDerived().AlwaysRebuild() && 12447 QualifierLoc == E->getQualifierLoc() && 12448 // Note: it is sufficient to compare the Name component of NameInfo: 12449 // if name has not changed, DNLoc has not changed either. 12450 NameInfo.getName() == E->getDeclName()) 12451 return E; 12452 12453 return getDerived().RebuildDependentScopeDeclRefExpr( 12454 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12455 IsAddressOfOperand, RecoveryTSI); 12456 } 12457 12458 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12459 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12460 E->getNumTemplateArgs(), 12461 TransArgs)) 12462 return ExprError(); 12463 12464 return getDerived().RebuildDependentScopeDeclRefExpr( 12465 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12466 RecoveryTSI); 12467 } 12468 12469 template<typename Derived> 12470 ExprResult 12471 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12472 // CXXConstructExprs other than for list-initialization and 12473 // CXXTemporaryObjectExpr are always implicit, so when we have 12474 // a 1-argument construction we just transform that argument. 12475 if (getDerived().AllowSkippingCXXConstructExpr() && 12476 ((E->getNumArgs() == 1 || 12477 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12478 (!getDerived().DropCallArgument(E->getArg(0))) && 12479 !E->isListInitialization())) 12480 return getDerived().TransformInitializer(E->getArg(0), 12481 /*DirectInit*/ false); 12482 12483 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12484 12485 QualType T = getDerived().TransformType(E->getType()); 12486 if (T.isNull()) 12487 return ExprError(); 12488 12489 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12490 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12491 if (!Constructor) 12492 return ExprError(); 12493 12494 bool ArgumentChanged = false; 12495 SmallVector<Expr*, 8> Args; 12496 { 12497 EnterExpressionEvaluationContext Context( 12498 getSema(), EnterExpressionEvaluationContext::InitList, 12499 E->isListInitialization()); 12500 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12501 &ArgumentChanged)) 12502 return ExprError(); 12503 } 12504 12505 if (!getDerived().AlwaysRebuild() && 12506 T == E->getType() && 12507 Constructor == E->getConstructor() && 12508 !ArgumentChanged) { 12509 // Mark the constructor as referenced. 12510 // FIXME: Instantiation-specific 12511 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12512 return E; 12513 } 12514 12515 return getDerived().RebuildCXXConstructExpr( 12516 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12517 E->hadMultipleCandidates(), E->isListInitialization(), 12518 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12519 E->getConstructionKind(), E->getParenOrBraceRange()); 12520 } 12521 12522 template<typename Derived> 12523 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12524 CXXInheritedCtorInitExpr *E) { 12525 QualType T = getDerived().TransformType(E->getType()); 12526 if (T.isNull()) 12527 return ExprError(); 12528 12529 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12530 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12531 if (!Constructor) 12532 return ExprError(); 12533 12534 if (!getDerived().AlwaysRebuild() && 12535 T == E->getType() && 12536 Constructor == E->getConstructor()) { 12537 // Mark the constructor as referenced. 12538 // FIXME: Instantiation-specific 12539 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12540 return E; 12541 } 12542 12543 return getDerived().RebuildCXXInheritedCtorInitExpr( 12544 T, E->getLocation(), Constructor, 12545 E->constructsVBase(), E->inheritedFromVBase()); 12546 } 12547 12548 /// Transform a C++ temporary-binding expression. 12549 /// 12550 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12551 /// transform the subexpression and return that. 12552 template<typename Derived> 12553 ExprResult 12554 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12555 return getDerived().TransformExpr(E->getSubExpr()); 12556 } 12557 12558 /// Transform a C++ expression that contains cleanups that should 12559 /// be run after the expression is evaluated. 12560 /// 12561 /// Since ExprWithCleanups nodes are implicitly generated, we 12562 /// just transform the subexpression and return that. 12563 template<typename Derived> 12564 ExprResult 12565 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12566 return getDerived().TransformExpr(E->getSubExpr()); 12567 } 12568 12569 template<typename Derived> 12570 ExprResult 12571 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12572 CXXTemporaryObjectExpr *E) { 12573 TypeSourceInfo *T = 12574 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12575 if (!T) 12576 return ExprError(); 12577 12578 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12579 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12580 if (!Constructor) 12581 return ExprError(); 12582 12583 bool ArgumentChanged = false; 12584 SmallVector<Expr*, 8> Args; 12585 Args.reserve(E->getNumArgs()); 12586 { 12587 EnterExpressionEvaluationContext Context( 12588 getSema(), EnterExpressionEvaluationContext::InitList, 12589 E->isListInitialization()); 12590 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12591 &ArgumentChanged)) 12592 return ExprError(); 12593 } 12594 12595 if (!getDerived().AlwaysRebuild() && 12596 T == E->getTypeSourceInfo() && 12597 Constructor == E->getConstructor() && 12598 !ArgumentChanged) { 12599 // FIXME: Instantiation-specific 12600 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12601 return SemaRef.MaybeBindToTemporary(E); 12602 } 12603 12604 // FIXME: We should just pass E->isListInitialization(), but we're not 12605 // prepared to handle list-initialization without a child InitListExpr. 12606 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12607 return getDerived().RebuildCXXTemporaryObjectExpr( 12608 T, LParenLoc, Args, E->getEndLoc(), 12609 /*ListInitialization=*/LParenLoc.isInvalid()); 12610 } 12611 12612 template<typename Derived> 12613 ExprResult 12614 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12615 // Transform any init-capture expressions before entering the scope of the 12616 // lambda body, because they are not semantically within that scope. 12617 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12618 struct TransformedInitCapture { 12619 // The location of the ... if the result is retaining a pack expansion. 12620 SourceLocation EllipsisLoc; 12621 // Zero or more expansions of the init-capture. 12622 SmallVector<InitCaptureInfoTy, 4> Expansions; 12623 }; 12624 SmallVector<TransformedInitCapture, 4> InitCaptures; 12625 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12626 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12627 CEnd = E->capture_end(); 12628 C != CEnd; ++C) { 12629 if (!E->isInitCapture(C)) 12630 continue; 12631 12632 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12633 VarDecl *OldVD = C->getCapturedVar(); 12634 12635 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12636 Optional<unsigned> NumExpansions) { 12637 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12638 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12639 12640 if (NewExprInitResult.isInvalid()) { 12641 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12642 return; 12643 } 12644 Expr *NewExprInit = NewExprInitResult.get(); 12645 12646 QualType NewInitCaptureType = 12647 getSema().buildLambdaInitCaptureInitialization( 12648 C->getLocation(), OldVD->getType()->isReferenceType(), 12649 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12650 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12651 NewExprInit); 12652 Result.Expansions.push_back( 12653 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12654 }; 12655 12656 // If this is an init-capture pack, consider expanding the pack now. 12657 if (OldVD->isParameterPack()) { 12658 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12659 ->getTypeLoc() 12660 .castAs<PackExpansionTypeLoc>(); 12661 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12662 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12663 12664 // Determine whether the set of unexpanded parameter packs can and should 12665 // be expanded. 12666 bool Expand = true; 12667 bool RetainExpansion = false; 12668 Optional<unsigned> OrigNumExpansions = 12669 ExpansionTL.getTypePtr()->getNumExpansions(); 12670 Optional<unsigned> NumExpansions = OrigNumExpansions; 12671 if (getDerived().TryExpandParameterPacks( 12672 ExpansionTL.getEllipsisLoc(), 12673 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12674 RetainExpansion, NumExpansions)) 12675 return ExprError(); 12676 if (Expand) { 12677 for (unsigned I = 0; I != *NumExpansions; ++I) { 12678 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12679 SubstInitCapture(SourceLocation(), None); 12680 } 12681 } 12682 if (!Expand || RetainExpansion) { 12683 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12684 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12685 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12686 } 12687 } else { 12688 SubstInitCapture(SourceLocation(), None); 12689 } 12690 } 12691 12692 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12693 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12694 12695 // Transform the template parameters, and add them to the current 12696 // instantiation scope. The null case is handled correctly. 12697 auto TPL = getDerived().TransformTemplateParameterList( 12698 E->getTemplateParameterList()); 12699 LSI->GLTemplateParameterList = TPL; 12700 12701 // Transform the type of the original lambda's call operator. 12702 // The transformation MUST be done in the CurrentInstantiationScope since 12703 // it introduces a mapping of the original to the newly created 12704 // transformed parameters. 12705 TypeSourceInfo *NewCallOpTSI = nullptr; 12706 { 12707 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12708 FunctionProtoTypeLoc OldCallOpFPTL = 12709 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12710 12711 TypeLocBuilder NewCallOpTLBuilder; 12712 SmallVector<QualType, 4> ExceptionStorage; 12713 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12714 QualType NewCallOpType = TransformFunctionProtoType( 12715 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12716 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12717 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12718 ExceptionStorage, Changed); 12719 }); 12720 if (NewCallOpType.isNull()) 12721 return ExprError(); 12722 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12723 NewCallOpType); 12724 } 12725 12726 // Transform the trailing requires clause 12727 ExprResult NewTrailingRequiresClause; 12728 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12729 // FIXME: Concepts: Substitution into requires clause should only happen 12730 // when checking satisfaction. 12731 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12732 12733 // Create the local class that will describe the lambda. 12734 // FIXME: KnownDependent below is wrong when substituting inside a templated 12735 // context that isn't a DeclContext (such as a variable template). 12736 CXXRecordDecl *OldClass = E->getLambdaClass(); 12737 CXXRecordDecl *Class 12738 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12739 NewCallOpTSI, 12740 /*KnownDependent=*/false, 12741 E->getCaptureDefault()); 12742 getDerived().transformedLocalDecl(OldClass, {Class}); 12743 12744 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12745 if (getDerived().ReplacingOriginal()) 12746 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12747 OldClass->getLambdaManglingNumber(), 12748 OldClass->getDeviceLambdaManglingNumber(), 12749 OldClass->getLambdaContextDecl()); 12750 12751 // Build the call operator. 12752 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12753 Class, E->getIntroducerRange(), NewCallOpTSI, 12754 E->getCallOperator()->getEndLoc(), 12755 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12756 E->getCallOperator()->getConstexprKind(), 12757 NewTrailingRequiresClause.get()); 12758 12759 LSI->CallOperator = NewCallOperator; 12760 12761 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12762 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12763 12764 // Number the lambda for linkage purposes if necessary. 12765 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12766 12767 // Introduce the context of the call operator. 12768 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12769 /*NewThisContext*/false); 12770 12771 // Enter the scope of the lambda. 12772 getSema().buildLambdaScope(LSI, NewCallOperator, 12773 E->getIntroducerRange(), 12774 E->getCaptureDefault(), 12775 E->getCaptureDefaultLoc(), 12776 E->hasExplicitParameters(), 12777 E->hasExplicitResultType(), 12778 E->isMutable()); 12779 12780 bool Invalid = false; 12781 12782 // Transform captures. 12783 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12784 CEnd = E->capture_end(); 12785 C != CEnd; ++C) { 12786 // When we hit the first implicit capture, tell Sema that we've finished 12787 // the list of explicit captures. 12788 if (C->isImplicit()) 12789 break; 12790 12791 // Capturing 'this' is trivial. 12792 if (C->capturesThis()) { 12793 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12794 /*BuildAndDiagnose*/ true, nullptr, 12795 C->getCaptureKind() == LCK_StarThis); 12796 continue; 12797 } 12798 // Captured expression will be recaptured during captured variables 12799 // rebuilding. 12800 if (C->capturesVLAType()) 12801 continue; 12802 12803 // Rebuild init-captures, including the implied field declaration. 12804 if (E->isInitCapture(C)) { 12805 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12806 12807 VarDecl *OldVD = C->getCapturedVar(); 12808 llvm::SmallVector<Decl*, 4> NewVDs; 12809 12810 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12811 ExprResult Init = Info.first; 12812 QualType InitQualType = Info.second; 12813 if (Init.isInvalid() || InitQualType.isNull()) { 12814 Invalid = true; 12815 break; 12816 } 12817 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12818 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12819 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12820 if (!NewVD) { 12821 Invalid = true; 12822 break; 12823 } 12824 NewVDs.push_back(NewVD); 12825 getSema().addInitCapture(LSI, NewVD); 12826 } 12827 12828 if (Invalid) 12829 break; 12830 12831 getDerived().transformedLocalDecl(OldVD, NewVDs); 12832 continue; 12833 } 12834 12835 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12836 12837 // Determine the capture kind for Sema. 12838 Sema::TryCaptureKind Kind 12839 = C->isImplicit()? Sema::TryCapture_Implicit 12840 : C->getCaptureKind() == LCK_ByCopy 12841 ? Sema::TryCapture_ExplicitByVal 12842 : Sema::TryCapture_ExplicitByRef; 12843 SourceLocation EllipsisLoc; 12844 if (C->isPackExpansion()) { 12845 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12846 bool ShouldExpand = false; 12847 bool RetainExpansion = false; 12848 Optional<unsigned> NumExpansions; 12849 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12850 C->getLocation(), 12851 Unexpanded, 12852 ShouldExpand, RetainExpansion, 12853 NumExpansions)) { 12854 Invalid = true; 12855 continue; 12856 } 12857 12858 if (ShouldExpand) { 12859 // The transform has determined that we should perform an expansion; 12860 // transform and capture each of the arguments. 12861 // expansion of the pattern. Do so. 12862 VarDecl *Pack = C->getCapturedVar(); 12863 for (unsigned I = 0; I != *NumExpansions; ++I) { 12864 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12865 VarDecl *CapturedVar 12866 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12867 Pack)); 12868 if (!CapturedVar) { 12869 Invalid = true; 12870 continue; 12871 } 12872 12873 // Capture the transformed variable. 12874 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12875 } 12876 12877 // FIXME: Retain a pack expansion if RetainExpansion is true. 12878 12879 continue; 12880 } 12881 12882 EllipsisLoc = C->getEllipsisLoc(); 12883 } 12884 12885 // Transform the captured variable. 12886 VarDecl *CapturedVar 12887 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12888 C->getCapturedVar())); 12889 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12890 Invalid = true; 12891 continue; 12892 } 12893 12894 // Capture the transformed variable. 12895 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12896 EllipsisLoc); 12897 } 12898 getSema().finishLambdaExplicitCaptures(LSI); 12899 12900 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12901 // evaluation context even if we're not transforming the function body. 12902 getSema().PushExpressionEvaluationContext( 12903 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12904 12905 // Instantiate the body of the lambda expression. 12906 StmtResult Body = 12907 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12908 12909 // ActOnLambda* will pop the function scope for us. 12910 FuncScopeCleanup.disable(); 12911 12912 if (Body.isInvalid()) { 12913 SavedContext.pop(); 12914 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12915 /*IsInstantiation=*/true); 12916 return ExprError(); 12917 } 12918 12919 // Copy the LSI before ActOnFinishFunctionBody removes it. 12920 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12921 // the call operator. 12922 auto LSICopy = *LSI; 12923 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12924 /*IsInstantiation*/ true); 12925 SavedContext.pop(); 12926 12927 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12928 &LSICopy); 12929 } 12930 12931 template<typename Derived> 12932 StmtResult 12933 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12934 return TransformStmt(S); 12935 } 12936 12937 template<typename Derived> 12938 StmtResult 12939 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12940 // Transform captures. 12941 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12942 CEnd = E->capture_end(); 12943 C != CEnd; ++C) { 12944 // When we hit the first implicit capture, tell Sema that we've finished 12945 // the list of explicit captures. 12946 if (!C->isImplicit()) 12947 continue; 12948 12949 // Capturing 'this' is trivial. 12950 if (C->capturesThis()) { 12951 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12952 /*BuildAndDiagnose*/ true, nullptr, 12953 C->getCaptureKind() == LCK_StarThis); 12954 continue; 12955 } 12956 // Captured expression will be recaptured during captured variables 12957 // rebuilding. 12958 if (C->capturesVLAType()) 12959 continue; 12960 12961 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12962 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12963 12964 // Transform the captured variable. 12965 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12966 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12967 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12968 return StmtError(); 12969 12970 // Capture the transformed variable. 12971 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12972 } 12973 12974 return S; 12975 } 12976 12977 template<typename Derived> 12978 ExprResult 12979 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12980 CXXUnresolvedConstructExpr *E) { 12981 TypeSourceInfo *T = 12982 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12983 if (!T) 12984 return ExprError(); 12985 12986 bool ArgumentChanged = false; 12987 SmallVector<Expr*, 8> Args; 12988 Args.reserve(E->getNumArgs()); 12989 { 12990 EnterExpressionEvaluationContext Context( 12991 getSema(), EnterExpressionEvaluationContext::InitList, 12992 E->isListInitialization()); 12993 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 12994 &ArgumentChanged)) 12995 return ExprError(); 12996 } 12997 12998 if (!getDerived().AlwaysRebuild() && 12999 T == E->getTypeSourceInfo() && 13000 !ArgumentChanged) 13001 return E; 13002 13003 // FIXME: we're faking the locations of the commas 13004 return getDerived().RebuildCXXUnresolvedConstructExpr( 13005 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13006 } 13007 13008 template<typename Derived> 13009 ExprResult 13010 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13011 CXXDependentScopeMemberExpr *E) { 13012 // Transform the base of the expression. 13013 ExprResult Base((Expr*) nullptr); 13014 Expr *OldBase; 13015 QualType BaseType; 13016 QualType ObjectType; 13017 if (!E->isImplicitAccess()) { 13018 OldBase = E->getBase(); 13019 Base = getDerived().TransformExpr(OldBase); 13020 if (Base.isInvalid()) 13021 return ExprError(); 13022 13023 // Start the member reference and compute the object's type. 13024 ParsedType ObjectTy; 13025 bool MayBePseudoDestructor = false; 13026 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13027 E->getOperatorLoc(), 13028 E->isArrow()? tok::arrow : tok::period, 13029 ObjectTy, 13030 MayBePseudoDestructor); 13031 if (Base.isInvalid()) 13032 return ExprError(); 13033 13034 ObjectType = ObjectTy.get(); 13035 BaseType = ((Expr*) Base.get())->getType(); 13036 } else { 13037 OldBase = nullptr; 13038 BaseType = getDerived().TransformType(E->getBaseType()); 13039 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13040 } 13041 13042 // Transform the first part of the nested-name-specifier that qualifies 13043 // the member name. 13044 NamedDecl *FirstQualifierInScope 13045 = getDerived().TransformFirstQualifierInScope( 13046 E->getFirstQualifierFoundInScope(), 13047 E->getQualifierLoc().getBeginLoc()); 13048 13049 NestedNameSpecifierLoc QualifierLoc; 13050 if (E->getQualifier()) { 13051 QualifierLoc 13052 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13053 ObjectType, 13054 FirstQualifierInScope); 13055 if (!QualifierLoc) 13056 return ExprError(); 13057 } 13058 13059 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13060 13061 // TODO: If this is a conversion-function-id, verify that the 13062 // destination type name (if present) resolves the same way after 13063 // instantiation as it did in the local scope. 13064 13065 DeclarationNameInfo NameInfo 13066 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13067 if (!NameInfo.getName()) 13068 return ExprError(); 13069 13070 if (!E->hasExplicitTemplateArgs()) { 13071 // This is a reference to a member without an explicitly-specified 13072 // template argument list. Optimize for this common case. 13073 if (!getDerived().AlwaysRebuild() && 13074 Base.get() == OldBase && 13075 BaseType == E->getBaseType() && 13076 QualifierLoc == E->getQualifierLoc() && 13077 NameInfo.getName() == E->getMember() && 13078 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13079 return E; 13080 13081 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13082 BaseType, 13083 E->isArrow(), 13084 E->getOperatorLoc(), 13085 QualifierLoc, 13086 TemplateKWLoc, 13087 FirstQualifierInScope, 13088 NameInfo, 13089 /*TemplateArgs*/nullptr); 13090 } 13091 13092 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13093 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13094 E->getNumTemplateArgs(), 13095 TransArgs)) 13096 return ExprError(); 13097 13098 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13099 BaseType, 13100 E->isArrow(), 13101 E->getOperatorLoc(), 13102 QualifierLoc, 13103 TemplateKWLoc, 13104 FirstQualifierInScope, 13105 NameInfo, 13106 &TransArgs); 13107 } 13108 13109 template<typename Derived> 13110 ExprResult 13111 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 13112 // Transform the base of the expression. 13113 ExprResult Base((Expr*) nullptr); 13114 QualType BaseType; 13115 if (!Old->isImplicitAccess()) { 13116 Base = getDerived().TransformExpr(Old->getBase()); 13117 if (Base.isInvalid()) 13118 return ExprError(); 13119 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 13120 Old->isArrow()); 13121 if (Base.isInvalid()) 13122 return ExprError(); 13123 BaseType = Base.get()->getType(); 13124 } else { 13125 BaseType = getDerived().TransformType(Old->getBaseType()); 13126 } 13127 13128 NestedNameSpecifierLoc QualifierLoc; 13129 if (Old->getQualifierLoc()) { 13130 QualifierLoc 13131 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13132 if (!QualifierLoc) 13133 return ExprError(); 13134 } 13135 13136 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13137 13138 LookupResult R(SemaRef, Old->getMemberNameInfo(), 13139 Sema::LookupOrdinaryName); 13140 13141 // Transform the declaration set. 13142 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 13143 return ExprError(); 13144 13145 // Determine the naming class. 13146 if (Old->getNamingClass()) { 13147 CXXRecordDecl *NamingClass 13148 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 13149 Old->getMemberLoc(), 13150 Old->getNamingClass())); 13151 if (!NamingClass) 13152 return ExprError(); 13153 13154 R.setNamingClass(NamingClass); 13155 } 13156 13157 TemplateArgumentListInfo TransArgs; 13158 if (Old->hasExplicitTemplateArgs()) { 13159 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13160 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13161 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 13162 Old->getNumTemplateArgs(), 13163 TransArgs)) 13164 return ExprError(); 13165 } 13166 13167 // FIXME: to do this check properly, we will need to preserve the 13168 // first-qualifier-in-scope here, just in case we had a dependent 13169 // base (and therefore couldn't do the check) and a 13170 // nested-name-qualifier (and therefore could do the lookup). 13171 NamedDecl *FirstQualifierInScope = nullptr; 13172 13173 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 13174 BaseType, 13175 Old->getOperatorLoc(), 13176 Old->isArrow(), 13177 QualifierLoc, 13178 TemplateKWLoc, 13179 FirstQualifierInScope, 13180 R, 13181 (Old->hasExplicitTemplateArgs() 13182 ? &TransArgs : nullptr)); 13183 } 13184 13185 template<typename Derived> 13186 ExprResult 13187 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13188 EnterExpressionEvaluationContext Unevaluated( 13189 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13190 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13191 if (SubExpr.isInvalid()) 13192 return ExprError(); 13193 13194 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13195 return E; 13196 13197 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13198 } 13199 13200 template<typename Derived> 13201 ExprResult 13202 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13203 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13204 if (Pattern.isInvalid()) 13205 return ExprError(); 13206 13207 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13208 return E; 13209 13210 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13211 E->getNumExpansions()); 13212 } 13213 13214 template<typename Derived> 13215 ExprResult 13216 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13217 // If E is not value-dependent, then nothing will change when we transform it. 13218 // Note: This is an instantiation-centric view. 13219 if (!E->isValueDependent()) 13220 return E; 13221 13222 EnterExpressionEvaluationContext Unevaluated( 13223 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13224 13225 ArrayRef<TemplateArgument> PackArgs; 13226 TemplateArgument ArgStorage; 13227 13228 // Find the argument list to transform. 13229 if (E->isPartiallySubstituted()) { 13230 PackArgs = E->getPartialArguments(); 13231 } else if (E->isValueDependent()) { 13232 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13233 bool ShouldExpand = false; 13234 bool RetainExpansion = false; 13235 Optional<unsigned> NumExpansions; 13236 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13237 Unexpanded, 13238 ShouldExpand, RetainExpansion, 13239 NumExpansions)) 13240 return ExprError(); 13241 13242 // If we need to expand the pack, build a template argument from it and 13243 // expand that. 13244 if (ShouldExpand) { 13245 auto *Pack = E->getPack(); 13246 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13247 ArgStorage = getSema().Context.getPackExpansionType( 13248 getSema().Context.getTypeDeclType(TTPD), None); 13249 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13250 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13251 } else { 13252 auto *VD = cast<ValueDecl>(Pack); 13253 ExprResult DRE = getSema().BuildDeclRefExpr( 13254 VD, VD->getType().getNonLValueExprType(getSema().Context), 13255 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 13256 E->getPackLoc()); 13257 if (DRE.isInvalid()) 13258 return ExprError(); 13259 ArgStorage = new (getSema().Context) PackExpansionExpr( 13260 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13261 } 13262 PackArgs = ArgStorage; 13263 } 13264 } 13265 13266 // If we're not expanding the pack, just transform the decl. 13267 if (!PackArgs.size()) { 13268 auto *Pack = cast_or_null<NamedDecl>( 13269 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13270 if (!Pack) 13271 return ExprError(); 13272 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13273 E->getPackLoc(), 13274 E->getRParenLoc(), None, None); 13275 } 13276 13277 // Try to compute the result without performing a partial substitution. 13278 Optional<unsigned> Result = 0; 13279 for (const TemplateArgument &Arg : PackArgs) { 13280 if (!Arg.isPackExpansion()) { 13281 Result = *Result + 1; 13282 continue; 13283 } 13284 13285 TemplateArgumentLoc ArgLoc; 13286 InventTemplateArgumentLoc(Arg, ArgLoc); 13287 13288 // Find the pattern of the pack expansion. 13289 SourceLocation Ellipsis; 13290 Optional<unsigned> OrigNumExpansions; 13291 TemplateArgumentLoc Pattern = 13292 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13293 OrigNumExpansions); 13294 13295 // Substitute under the pack expansion. Do not expand the pack (yet). 13296 TemplateArgumentLoc OutPattern; 13297 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13298 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13299 /*Uneval*/ true)) 13300 return true; 13301 13302 // See if we can determine the number of arguments from the result. 13303 Optional<unsigned> NumExpansions = 13304 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13305 if (!NumExpansions) { 13306 // No: we must be in an alias template expansion, and we're going to need 13307 // to actually expand the packs. 13308 Result = None; 13309 break; 13310 } 13311 13312 Result = *Result + *NumExpansions; 13313 } 13314 13315 // Common case: we could determine the number of expansions without 13316 // substituting. 13317 if (Result) 13318 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13319 E->getPackLoc(), 13320 E->getRParenLoc(), *Result, None); 13321 13322 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13323 E->getPackLoc()); 13324 { 13325 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13326 typedef TemplateArgumentLocInventIterator< 13327 Derived, const TemplateArgument*> PackLocIterator; 13328 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13329 PackLocIterator(*this, PackArgs.end()), 13330 TransformedPackArgs, /*Uneval*/true)) 13331 return ExprError(); 13332 } 13333 13334 // Check whether we managed to fully-expand the pack. 13335 // FIXME: Is it possible for us to do so and not hit the early exit path? 13336 SmallVector<TemplateArgument, 8> Args; 13337 bool PartialSubstitution = false; 13338 for (auto &Loc : TransformedPackArgs.arguments()) { 13339 Args.push_back(Loc.getArgument()); 13340 if (Loc.getArgument().isPackExpansion()) 13341 PartialSubstitution = true; 13342 } 13343 13344 if (PartialSubstitution) 13345 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13346 E->getPackLoc(), 13347 E->getRParenLoc(), None, Args); 13348 13349 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13350 E->getPackLoc(), E->getRParenLoc(), 13351 Args.size(), None); 13352 } 13353 13354 template<typename Derived> 13355 ExprResult 13356 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13357 SubstNonTypeTemplateParmPackExpr *E) { 13358 // Default behavior is to do nothing with this transformation. 13359 return E; 13360 } 13361 13362 template<typename Derived> 13363 ExprResult 13364 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13365 SubstNonTypeTemplateParmExpr *E) { 13366 // Default behavior is to do nothing with this transformation. 13367 return E; 13368 } 13369 13370 template<typename Derived> 13371 ExprResult 13372 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13373 // Default behavior is to do nothing with this transformation. 13374 return E; 13375 } 13376 13377 template<typename Derived> 13378 ExprResult 13379 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13380 MaterializeTemporaryExpr *E) { 13381 return getDerived().TransformExpr(E->getSubExpr()); 13382 } 13383 13384 template<typename Derived> 13385 ExprResult 13386 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13387 UnresolvedLookupExpr *Callee = nullptr; 13388 if (Expr *OldCallee = E->getCallee()) { 13389 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13390 if (CalleeResult.isInvalid()) 13391 return ExprError(); 13392 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13393 } 13394 13395 Expr *Pattern = E->getPattern(); 13396 13397 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13398 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13399 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13400 13401 // Determine whether the set of unexpanded parameter packs can and should 13402 // be expanded. 13403 bool Expand = true; 13404 bool RetainExpansion = false; 13405 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13406 NumExpansions = OrigNumExpansions; 13407 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13408 Pattern->getSourceRange(), 13409 Unexpanded, 13410 Expand, RetainExpansion, 13411 NumExpansions)) 13412 return true; 13413 13414 if (!Expand) { 13415 // Do not expand any packs here, just transform and rebuild a fold 13416 // expression. 13417 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13418 13419 ExprResult LHS = 13420 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13421 if (LHS.isInvalid()) 13422 return true; 13423 13424 ExprResult RHS = 13425 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13426 if (RHS.isInvalid()) 13427 return true; 13428 13429 if (!getDerived().AlwaysRebuild() && 13430 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13431 return E; 13432 13433 return getDerived().RebuildCXXFoldExpr( 13434 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13435 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13436 } 13437 13438 // Formally a fold expression expands to nested parenthesized expressions. 13439 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13440 // them. 13441 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13442 SemaRef.Diag(E->getEllipsisLoc(), 13443 clang::diag::err_fold_expression_limit_exceeded) 13444 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13445 << E->getSourceRange(); 13446 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13447 return ExprError(); 13448 } 13449 13450 // The transform has determined that we should perform an elementwise 13451 // expansion of the pattern. Do so. 13452 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13453 if (Result.isInvalid()) 13454 return true; 13455 bool LeftFold = E->isLeftFold(); 13456 13457 // If we're retaining an expansion for a right fold, it is the innermost 13458 // component and takes the init (if any). 13459 if (!LeftFold && RetainExpansion) { 13460 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13461 13462 ExprResult Out = getDerived().TransformExpr(Pattern); 13463 if (Out.isInvalid()) 13464 return true; 13465 13466 Result = getDerived().RebuildCXXFoldExpr( 13467 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13468 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13469 if (Result.isInvalid()) 13470 return true; 13471 } 13472 13473 for (unsigned I = 0; I != *NumExpansions; ++I) { 13474 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13475 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13476 ExprResult Out = getDerived().TransformExpr(Pattern); 13477 if (Out.isInvalid()) 13478 return true; 13479 13480 if (Out.get()->containsUnexpandedParameterPack()) { 13481 // We still have a pack; retain a pack expansion for this slice. 13482 Result = getDerived().RebuildCXXFoldExpr( 13483 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13484 E->getOperator(), E->getEllipsisLoc(), 13485 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13486 OrigNumExpansions); 13487 } else if (Result.isUsable()) { 13488 // We've got down to a single element; build a binary operator. 13489 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13490 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13491 if (Callee) 13492 Result = getDerived().RebuildCXXOperatorCallExpr( 13493 BinaryOperator::getOverloadedOperator(E->getOperator()), 13494 E->getEllipsisLoc(), Callee, LHS, RHS); 13495 else 13496 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13497 E->getOperator(), LHS, RHS); 13498 } else 13499 Result = Out; 13500 13501 if (Result.isInvalid()) 13502 return true; 13503 } 13504 13505 // If we're retaining an expansion for a left fold, it is the outermost 13506 // component and takes the complete expansion so far as its init (if any). 13507 if (LeftFold && RetainExpansion) { 13508 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13509 13510 ExprResult Out = getDerived().TransformExpr(Pattern); 13511 if (Out.isInvalid()) 13512 return true; 13513 13514 Result = getDerived().RebuildCXXFoldExpr( 13515 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13516 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13517 if (Result.isInvalid()) 13518 return true; 13519 } 13520 13521 // If we had no init and an empty pack, and we're not retaining an expansion, 13522 // then produce a fallback value or error. 13523 if (Result.isUnset()) 13524 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13525 E->getOperator()); 13526 13527 return Result; 13528 } 13529 13530 template<typename Derived> 13531 ExprResult 13532 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13533 CXXStdInitializerListExpr *E) { 13534 return getDerived().TransformExpr(E->getSubExpr()); 13535 } 13536 13537 template<typename Derived> 13538 ExprResult 13539 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13540 return SemaRef.MaybeBindToTemporary(E); 13541 } 13542 13543 template<typename Derived> 13544 ExprResult 13545 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13546 return E; 13547 } 13548 13549 template<typename Derived> 13550 ExprResult 13551 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13552 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13553 if (SubExpr.isInvalid()) 13554 return ExprError(); 13555 13556 if (!getDerived().AlwaysRebuild() && 13557 SubExpr.get() == E->getSubExpr()) 13558 return E; 13559 13560 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13561 } 13562 13563 template<typename Derived> 13564 ExprResult 13565 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13566 // Transform each of the elements. 13567 SmallVector<Expr *, 8> Elements; 13568 bool ArgChanged = false; 13569 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13570 /*IsCall=*/false, Elements, &ArgChanged)) 13571 return ExprError(); 13572 13573 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13574 return SemaRef.MaybeBindToTemporary(E); 13575 13576 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13577 Elements.data(), 13578 Elements.size()); 13579 } 13580 13581 template<typename Derived> 13582 ExprResult 13583 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13584 ObjCDictionaryLiteral *E) { 13585 // Transform each of the elements. 13586 SmallVector<ObjCDictionaryElement, 8> Elements; 13587 bool ArgChanged = false; 13588 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13589 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13590 13591 if (OrigElement.isPackExpansion()) { 13592 // This key/value element is a pack expansion. 13593 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13594 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13595 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13596 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13597 13598 // Determine whether the set of unexpanded parameter packs can 13599 // and should be expanded. 13600 bool Expand = true; 13601 bool RetainExpansion = false; 13602 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13603 Optional<unsigned> NumExpansions = OrigNumExpansions; 13604 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13605 OrigElement.Value->getEndLoc()); 13606 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13607 PatternRange, Unexpanded, Expand, 13608 RetainExpansion, NumExpansions)) 13609 return ExprError(); 13610 13611 if (!Expand) { 13612 // The transform has determined that we should perform a simple 13613 // transformation on the pack expansion, producing another pack 13614 // expansion. 13615 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13616 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13617 if (Key.isInvalid()) 13618 return ExprError(); 13619 13620 if (Key.get() != OrigElement.Key) 13621 ArgChanged = true; 13622 13623 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13624 if (Value.isInvalid()) 13625 return ExprError(); 13626 13627 if (Value.get() != OrigElement.Value) 13628 ArgChanged = true; 13629 13630 ObjCDictionaryElement Expansion = { 13631 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13632 }; 13633 Elements.push_back(Expansion); 13634 continue; 13635 } 13636 13637 // Record right away that the argument was changed. This needs 13638 // to happen even if the array expands to nothing. 13639 ArgChanged = true; 13640 13641 // The transform has determined that we should perform an elementwise 13642 // expansion of the pattern. Do so. 13643 for (unsigned I = 0; I != *NumExpansions; ++I) { 13644 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13645 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13646 if (Key.isInvalid()) 13647 return ExprError(); 13648 13649 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13650 if (Value.isInvalid()) 13651 return ExprError(); 13652 13653 ObjCDictionaryElement Element = { 13654 Key.get(), Value.get(), SourceLocation(), NumExpansions 13655 }; 13656 13657 // If any unexpanded parameter packs remain, we still have a 13658 // pack expansion. 13659 // FIXME: Can this really happen? 13660 if (Key.get()->containsUnexpandedParameterPack() || 13661 Value.get()->containsUnexpandedParameterPack()) 13662 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13663 13664 Elements.push_back(Element); 13665 } 13666 13667 // FIXME: Retain a pack expansion if RetainExpansion is true. 13668 13669 // We've finished with this pack expansion. 13670 continue; 13671 } 13672 13673 // Transform and check key. 13674 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13675 if (Key.isInvalid()) 13676 return ExprError(); 13677 13678 if (Key.get() != OrigElement.Key) 13679 ArgChanged = true; 13680 13681 // Transform and check value. 13682 ExprResult Value 13683 = getDerived().TransformExpr(OrigElement.Value); 13684 if (Value.isInvalid()) 13685 return ExprError(); 13686 13687 if (Value.get() != OrigElement.Value) 13688 ArgChanged = true; 13689 13690 ObjCDictionaryElement Element = { 13691 Key.get(), Value.get(), SourceLocation(), None 13692 }; 13693 Elements.push_back(Element); 13694 } 13695 13696 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13697 return SemaRef.MaybeBindToTemporary(E); 13698 13699 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13700 Elements); 13701 } 13702 13703 template<typename Derived> 13704 ExprResult 13705 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13706 TypeSourceInfo *EncodedTypeInfo 13707 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13708 if (!EncodedTypeInfo) 13709 return ExprError(); 13710 13711 if (!getDerived().AlwaysRebuild() && 13712 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13713 return E; 13714 13715 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13716 EncodedTypeInfo, 13717 E->getRParenLoc()); 13718 } 13719 13720 template<typename Derived> 13721 ExprResult TreeTransform<Derived>:: 13722 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13723 // This is a kind of implicit conversion, and it needs to get dropped 13724 // and recomputed for the same general reasons that ImplicitCastExprs 13725 // do, as well a more specific one: this expression is only valid when 13726 // it appears *immediately* as an argument expression. 13727 return getDerived().TransformExpr(E->getSubExpr()); 13728 } 13729 13730 template<typename Derived> 13731 ExprResult TreeTransform<Derived>:: 13732 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13733 TypeSourceInfo *TSInfo 13734 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13735 if (!TSInfo) 13736 return ExprError(); 13737 13738 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13739 if (Result.isInvalid()) 13740 return ExprError(); 13741 13742 if (!getDerived().AlwaysRebuild() && 13743 TSInfo == E->getTypeInfoAsWritten() && 13744 Result.get() == E->getSubExpr()) 13745 return E; 13746 13747 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13748 E->getBridgeKeywordLoc(), TSInfo, 13749 Result.get()); 13750 } 13751 13752 template <typename Derived> 13753 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13754 ObjCAvailabilityCheckExpr *E) { 13755 return E; 13756 } 13757 13758 template<typename Derived> 13759 ExprResult 13760 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13761 // Transform arguments. 13762 bool ArgChanged = false; 13763 SmallVector<Expr*, 8> Args; 13764 Args.reserve(E->getNumArgs()); 13765 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13766 &ArgChanged)) 13767 return ExprError(); 13768 13769 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13770 // Class message: transform the receiver type. 13771 TypeSourceInfo *ReceiverTypeInfo 13772 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13773 if (!ReceiverTypeInfo) 13774 return ExprError(); 13775 13776 // If nothing changed, just retain the existing message send. 13777 if (!getDerived().AlwaysRebuild() && 13778 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13779 return SemaRef.MaybeBindToTemporary(E); 13780 13781 // Build a new class message send. 13782 SmallVector<SourceLocation, 16> SelLocs; 13783 E->getSelectorLocs(SelLocs); 13784 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13785 E->getSelector(), 13786 SelLocs, 13787 E->getMethodDecl(), 13788 E->getLeftLoc(), 13789 Args, 13790 E->getRightLoc()); 13791 } 13792 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13793 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13794 if (!E->getMethodDecl()) 13795 return ExprError(); 13796 13797 // Build a new class message send to 'super'. 13798 SmallVector<SourceLocation, 16> SelLocs; 13799 E->getSelectorLocs(SelLocs); 13800 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13801 E->getSelector(), 13802 SelLocs, 13803 E->getReceiverType(), 13804 E->getMethodDecl(), 13805 E->getLeftLoc(), 13806 Args, 13807 E->getRightLoc()); 13808 } 13809 13810 // Instance message: transform the receiver 13811 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13812 "Only class and instance messages may be instantiated"); 13813 ExprResult Receiver 13814 = getDerived().TransformExpr(E->getInstanceReceiver()); 13815 if (Receiver.isInvalid()) 13816 return ExprError(); 13817 13818 // If nothing changed, just retain the existing message send. 13819 if (!getDerived().AlwaysRebuild() && 13820 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13821 return SemaRef.MaybeBindToTemporary(E); 13822 13823 // Build a new instance message send. 13824 SmallVector<SourceLocation, 16> SelLocs; 13825 E->getSelectorLocs(SelLocs); 13826 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13827 E->getSelector(), 13828 SelLocs, 13829 E->getMethodDecl(), 13830 E->getLeftLoc(), 13831 Args, 13832 E->getRightLoc()); 13833 } 13834 13835 template<typename Derived> 13836 ExprResult 13837 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13838 return E; 13839 } 13840 13841 template<typename Derived> 13842 ExprResult 13843 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13844 return E; 13845 } 13846 13847 template<typename Derived> 13848 ExprResult 13849 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13850 // Transform the base expression. 13851 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13852 if (Base.isInvalid()) 13853 return ExprError(); 13854 13855 // We don't need to transform the ivar; it will never change. 13856 13857 // If nothing changed, just retain the existing expression. 13858 if (!getDerived().AlwaysRebuild() && 13859 Base.get() == E->getBase()) 13860 return E; 13861 13862 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13863 E->getLocation(), 13864 E->isArrow(), E->isFreeIvar()); 13865 } 13866 13867 template<typename Derived> 13868 ExprResult 13869 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13870 // 'super' and types never change. Property never changes. Just 13871 // retain the existing expression. 13872 if (!E->isObjectReceiver()) 13873 return E; 13874 13875 // Transform the base expression. 13876 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13877 if (Base.isInvalid()) 13878 return ExprError(); 13879 13880 // We don't need to transform the property; it will never change. 13881 13882 // If nothing changed, just retain the existing expression. 13883 if (!getDerived().AlwaysRebuild() && 13884 Base.get() == E->getBase()) 13885 return E; 13886 13887 if (E->isExplicitProperty()) 13888 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13889 E->getExplicitProperty(), 13890 E->getLocation()); 13891 13892 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13893 SemaRef.Context.PseudoObjectTy, 13894 E->getImplicitPropertyGetter(), 13895 E->getImplicitPropertySetter(), 13896 E->getLocation()); 13897 } 13898 13899 template<typename Derived> 13900 ExprResult 13901 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13902 // Transform the base expression. 13903 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13904 if (Base.isInvalid()) 13905 return ExprError(); 13906 13907 // Transform the key expression. 13908 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13909 if (Key.isInvalid()) 13910 return ExprError(); 13911 13912 // If nothing changed, just retain the existing expression. 13913 if (!getDerived().AlwaysRebuild() && 13914 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13915 return E; 13916 13917 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13918 Base.get(), Key.get(), 13919 E->getAtIndexMethodDecl(), 13920 E->setAtIndexMethodDecl()); 13921 } 13922 13923 template<typename Derived> 13924 ExprResult 13925 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13926 // Transform the base expression. 13927 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13928 if (Base.isInvalid()) 13929 return ExprError(); 13930 13931 // If nothing changed, just retain the existing expression. 13932 if (!getDerived().AlwaysRebuild() && 13933 Base.get() == E->getBase()) 13934 return E; 13935 13936 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13937 E->getOpLoc(), 13938 E->isArrow()); 13939 } 13940 13941 template<typename Derived> 13942 ExprResult 13943 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13944 bool ArgumentChanged = false; 13945 SmallVector<Expr*, 8> SubExprs; 13946 SubExprs.reserve(E->getNumSubExprs()); 13947 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13948 SubExprs, &ArgumentChanged)) 13949 return ExprError(); 13950 13951 if (!getDerived().AlwaysRebuild() && 13952 !ArgumentChanged) 13953 return E; 13954 13955 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13956 SubExprs, 13957 E->getRParenLoc()); 13958 } 13959 13960 template<typename Derived> 13961 ExprResult 13962 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13963 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13964 if (SrcExpr.isInvalid()) 13965 return ExprError(); 13966 13967 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13968 if (!Type) 13969 return ExprError(); 13970 13971 if (!getDerived().AlwaysRebuild() && 13972 Type == E->getTypeSourceInfo() && 13973 SrcExpr.get() == E->getSrcExpr()) 13974 return E; 13975 13976 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13977 SrcExpr.get(), Type, 13978 E->getRParenLoc()); 13979 } 13980 13981 template<typename Derived> 13982 ExprResult 13983 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13984 BlockDecl *oldBlock = E->getBlockDecl(); 13985 13986 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13987 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13988 13989 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13990 blockScope->TheDecl->setBlockMissingReturnType( 13991 oldBlock->blockMissingReturnType()); 13992 13993 SmallVector<ParmVarDecl*, 4> params; 13994 SmallVector<QualType, 4> paramTypes; 13995 13996 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13997 13998 // Parameter substitution. 13999 Sema::ExtParameterInfoBuilder extParamInfos; 14000 if (getDerived().TransformFunctionTypeParams( 14001 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14002 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14003 extParamInfos)) { 14004 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14005 return ExprError(); 14006 } 14007 14008 QualType exprResultType = 14009 getDerived().TransformType(exprFunctionType->getReturnType()); 14010 14011 auto epi = exprFunctionType->getExtProtoInfo(); 14012 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14013 14014 QualType functionType = 14015 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14016 blockScope->FunctionType = functionType; 14017 14018 // Set the parameters on the block decl. 14019 if (!params.empty()) 14020 blockScope->TheDecl->setParams(params); 14021 14022 if (!oldBlock->blockMissingReturnType()) { 14023 blockScope->HasImplicitReturnType = false; 14024 blockScope->ReturnType = exprResultType; 14025 } 14026 14027 // Transform the body 14028 StmtResult body = getDerived().TransformStmt(E->getBody()); 14029 if (body.isInvalid()) { 14030 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14031 return ExprError(); 14032 } 14033 14034 #ifndef NDEBUG 14035 // In builds with assertions, make sure that we captured everything we 14036 // captured before. 14037 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14038 for (const auto &I : oldBlock->captures()) { 14039 VarDecl *oldCapture = I.getVariable(); 14040 14041 // Ignore parameter packs. 14042 if (oldCapture->isParameterPack()) 14043 continue; 14044 14045 VarDecl *newCapture = 14046 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14047 oldCapture)); 14048 assert(blockScope->CaptureMap.count(newCapture)); 14049 } 14050 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14051 } 14052 #endif 14053 14054 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14055 /*Scope=*/nullptr); 14056 } 14057 14058 template<typename Derived> 14059 ExprResult 14060 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14061 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14062 if (SrcExpr.isInvalid()) 14063 return ExprError(); 14064 14065 QualType Type = getDerived().TransformType(E->getType()); 14066 14067 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14068 E->getRParenLoc()); 14069 } 14070 14071 template<typename Derived> 14072 ExprResult 14073 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14074 bool ArgumentChanged = false; 14075 SmallVector<Expr*, 8> SubExprs; 14076 SubExprs.reserve(E->getNumSubExprs()); 14077 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14078 SubExprs, &ArgumentChanged)) 14079 return ExprError(); 14080 14081 if (!getDerived().AlwaysRebuild() && 14082 !ArgumentChanged) 14083 return E; 14084 14085 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14086 E->getOp(), E->getRParenLoc()); 14087 } 14088 14089 //===----------------------------------------------------------------------===// 14090 // Type reconstruction 14091 //===----------------------------------------------------------------------===// 14092 14093 template<typename Derived> 14094 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14095 SourceLocation Star) { 14096 return SemaRef.BuildPointerType(PointeeType, Star, 14097 getDerived().getBaseEntity()); 14098 } 14099 14100 template<typename Derived> 14101 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14102 SourceLocation Star) { 14103 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14104 getDerived().getBaseEntity()); 14105 } 14106 14107 template<typename Derived> 14108 QualType 14109 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14110 bool WrittenAsLValue, 14111 SourceLocation Sigil) { 14112 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14113 Sigil, getDerived().getBaseEntity()); 14114 } 14115 14116 template<typename Derived> 14117 QualType 14118 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14119 QualType ClassType, 14120 SourceLocation Sigil) { 14121 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14122 getDerived().getBaseEntity()); 14123 } 14124 14125 template<typename Derived> 14126 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14127 const ObjCTypeParamDecl *Decl, 14128 SourceLocation ProtocolLAngleLoc, 14129 ArrayRef<ObjCProtocolDecl *> Protocols, 14130 ArrayRef<SourceLocation> ProtocolLocs, 14131 SourceLocation ProtocolRAngleLoc) { 14132 return SemaRef.BuildObjCTypeParamType(Decl, 14133 ProtocolLAngleLoc, Protocols, 14134 ProtocolLocs, ProtocolRAngleLoc, 14135 /*FailOnError=*/true); 14136 } 14137 14138 template<typename Derived> 14139 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14140 QualType BaseType, 14141 SourceLocation Loc, 14142 SourceLocation TypeArgsLAngleLoc, 14143 ArrayRef<TypeSourceInfo *> TypeArgs, 14144 SourceLocation TypeArgsRAngleLoc, 14145 SourceLocation ProtocolLAngleLoc, 14146 ArrayRef<ObjCProtocolDecl *> Protocols, 14147 ArrayRef<SourceLocation> ProtocolLocs, 14148 SourceLocation ProtocolRAngleLoc) { 14149 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14150 TypeArgs, TypeArgsRAngleLoc, 14151 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14152 ProtocolRAngleLoc, 14153 /*FailOnError=*/true); 14154 } 14155 14156 template<typename Derived> 14157 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14158 QualType PointeeType, 14159 SourceLocation Star) { 14160 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14161 } 14162 14163 template<typename Derived> 14164 QualType 14165 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14166 ArrayType::ArraySizeModifier SizeMod, 14167 const llvm::APInt *Size, 14168 Expr *SizeExpr, 14169 unsigned IndexTypeQuals, 14170 SourceRange BracketsRange) { 14171 if (SizeExpr || !Size) 14172 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14173 IndexTypeQuals, BracketsRange, 14174 getDerived().getBaseEntity()); 14175 14176 QualType Types[] = { 14177 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14178 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14179 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14180 }; 14181 const unsigned NumTypes = llvm::array_lengthof(Types); 14182 QualType SizeType; 14183 for (unsigned I = 0; I != NumTypes; ++I) 14184 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14185 SizeType = Types[I]; 14186 break; 14187 } 14188 14189 // Note that we can return a VariableArrayType here in the case where 14190 // the element type was a dependent VariableArrayType. 14191 IntegerLiteral *ArraySize 14192 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14193 /*FIXME*/BracketsRange.getBegin()); 14194 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14195 IndexTypeQuals, BracketsRange, 14196 getDerived().getBaseEntity()); 14197 } 14198 14199 template<typename Derived> 14200 QualType 14201 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14202 ArrayType::ArraySizeModifier SizeMod, 14203 const llvm::APInt &Size, 14204 Expr *SizeExpr, 14205 unsigned IndexTypeQuals, 14206 SourceRange BracketsRange) { 14207 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14208 IndexTypeQuals, BracketsRange); 14209 } 14210 14211 template<typename Derived> 14212 QualType 14213 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14214 ArrayType::ArraySizeModifier SizeMod, 14215 unsigned IndexTypeQuals, 14216 SourceRange BracketsRange) { 14217 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14218 IndexTypeQuals, BracketsRange); 14219 } 14220 14221 template<typename Derived> 14222 QualType 14223 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14224 ArrayType::ArraySizeModifier SizeMod, 14225 Expr *SizeExpr, 14226 unsigned IndexTypeQuals, 14227 SourceRange BracketsRange) { 14228 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14229 SizeExpr, 14230 IndexTypeQuals, BracketsRange); 14231 } 14232 14233 template<typename Derived> 14234 QualType 14235 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14236 ArrayType::ArraySizeModifier SizeMod, 14237 Expr *SizeExpr, 14238 unsigned IndexTypeQuals, 14239 SourceRange BracketsRange) { 14240 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14241 SizeExpr, 14242 IndexTypeQuals, BracketsRange); 14243 } 14244 14245 template <typename Derived> 14246 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14247 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14248 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14249 AttributeLoc); 14250 } 14251 14252 template <typename Derived> 14253 QualType 14254 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14255 unsigned NumElements, 14256 VectorType::VectorKind VecKind) { 14257 // FIXME: semantic checking! 14258 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14259 } 14260 14261 template <typename Derived> 14262 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14263 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14264 VectorType::VectorKind VecKind) { 14265 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14266 } 14267 14268 template<typename Derived> 14269 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14270 unsigned NumElements, 14271 SourceLocation AttributeLoc) { 14272 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14273 NumElements, true); 14274 IntegerLiteral *VectorSize 14275 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14276 AttributeLoc); 14277 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14278 } 14279 14280 template<typename Derived> 14281 QualType 14282 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14283 Expr *SizeExpr, 14284 SourceLocation AttributeLoc) { 14285 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14286 } 14287 14288 template <typename Derived> 14289 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14290 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14291 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14292 NumColumns); 14293 } 14294 14295 template <typename Derived> 14296 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14297 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14298 SourceLocation AttributeLoc) { 14299 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14300 AttributeLoc); 14301 } 14302 14303 template<typename Derived> 14304 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14305 QualType T, 14306 MutableArrayRef<QualType> ParamTypes, 14307 const FunctionProtoType::ExtProtoInfo &EPI) { 14308 return SemaRef.BuildFunctionType(T, ParamTypes, 14309 getDerived().getBaseLocation(), 14310 getDerived().getBaseEntity(), 14311 EPI); 14312 } 14313 14314 template<typename Derived> 14315 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14316 return SemaRef.Context.getFunctionNoProtoType(T); 14317 } 14318 14319 template<typename Derived> 14320 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14321 Decl *D) { 14322 assert(D && "no decl found"); 14323 if (D->isInvalidDecl()) return QualType(); 14324 14325 // FIXME: Doesn't account for ObjCInterfaceDecl! 14326 TypeDecl *Ty; 14327 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14328 // A valid resolved using typename pack expansion decl can have multiple 14329 // UsingDecls, but they must each have exactly one type, and it must be 14330 // the same type in every case. But we must have at least one expansion! 14331 if (UPD->expansions().empty()) { 14332 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14333 << UPD->isCXXClassMember() << UPD; 14334 return QualType(); 14335 } 14336 14337 // We might still have some unresolved types. Try to pick a resolved type 14338 // if we can. The final instantiation will check that the remaining 14339 // unresolved types instantiate to the type we pick. 14340 QualType FallbackT; 14341 QualType T; 14342 for (auto *E : UPD->expansions()) { 14343 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14344 if (ThisT.isNull()) 14345 continue; 14346 else if (ThisT->getAs<UnresolvedUsingType>()) 14347 FallbackT = ThisT; 14348 else if (T.isNull()) 14349 T = ThisT; 14350 else 14351 assert(getSema().Context.hasSameType(ThisT, T) && 14352 "mismatched resolved types in using pack expansion"); 14353 } 14354 return T.isNull() ? FallbackT : T; 14355 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14356 assert(Using->hasTypename() && 14357 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14358 14359 // A valid resolved using typename decl points to exactly one type decl. 14360 assert(++Using->shadow_begin() == Using->shadow_end()); 14361 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 14362 } else { 14363 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14364 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14365 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14366 } 14367 14368 return SemaRef.Context.getTypeDeclType(Ty); 14369 } 14370 14371 template<typename Derived> 14372 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14373 SourceLocation Loc) { 14374 return SemaRef.BuildTypeofExprType(E, Loc); 14375 } 14376 14377 template<typename Derived> 14378 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14379 return SemaRef.Context.getTypeOfType(Underlying); 14380 } 14381 14382 template<typename Derived> 14383 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14384 SourceLocation Loc) { 14385 return SemaRef.BuildDecltypeType(E, Loc); 14386 } 14387 14388 template<typename Derived> 14389 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14390 UnaryTransformType::UTTKind UKind, 14391 SourceLocation Loc) { 14392 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14393 } 14394 14395 template<typename Derived> 14396 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14397 TemplateName Template, 14398 SourceLocation TemplateNameLoc, 14399 TemplateArgumentListInfo &TemplateArgs) { 14400 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14401 } 14402 14403 template<typename Derived> 14404 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14405 SourceLocation KWLoc) { 14406 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14407 } 14408 14409 template<typename Derived> 14410 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14411 SourceLocation KWLoc, 14412 bool isReadPipe) { 14413 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14414 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14415 } 14416 14417 template <typename Derived> 14418 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14419 unsigned NumBits, 14420 SourceLocation Loc) { 14421 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14422 NumBits, true); 14423 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14424 SemaRef.Context.IntTy, Loc); 14425 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14426 } 14427 14428 template <typename Derived> 14429 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14430 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14431 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14432 } 14433 14434 template<typename Derived> 14435 TemplateName 14436 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14437 bool TemplateKW, 14438 TemplateDecl *Template) { 14439 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14440 Template); 14441 } 14442 14443 template<typename Derived> 14444 TemplateName 14445 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14446 SourceLocation TemplateKWLoc, 14447 const IdentifierInfo &Name, 14448 SourceLocation NameLoc, 14449 QualType ObjectType, 14450 NamedDecl *FirstQualifierInScope, 14451 bool AllowInjectedClassName) { 14452 UnqualifiedId TemplateName; 14453 TemplateName.setIdentifier(&Name, NameLoc); 14454 Sema::TemplateTy Template; 14455 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14456 TemplateName, ParsedType::make(ObjectType), 14457 /*EnteringContext=*/false, Template, 14458 AllowInjectedClassName); 14459 return Template.get(); 14460 } 14461 14462 template<typename Derived> 14463 TemplateName 14464 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14465 SourceLocation TemplateKWLoc, 14466 OverloadedOperatorKind Operator, 14467 SourceLocation NameLoc, 14468 QualType ObjectType, 14469 bool AllowInjectedClassName) { 14470 UnqualifiedId Name; 14471 // FIXME: Bogus location information. 14472 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14473 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14474 Sema::TemplateTy Template; 14475 getSema().ActOnTemplateName( 14476 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14477 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14478 return Template.get(); 14479 } 14480 14481 template<typename Derived> 14482 ExprResult 14483 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14484 SourceLocation OpLoc, 14485 Expr *OrigCallee, 14486 Expr *First, 14487 Expr *Second) { 14488 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14489 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14490 14491 if (First->getObjectKind() == OK_ObjCProperty) { 14492 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14493 if (BinaryOperator::isAssignmentOp(Opc)) 14494 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14495 First, Second); 14496 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14497 if (Result.isInvalid()) 14498 return ExprError(); 14499 First = Result.get(); 14500 } 14501 14502 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14503 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14504 if (Result.isInvalid()) 14505 return ExprError(); 14506 Second = Result.get(); 14507 } 14508 14509 // Determine whether this should be a builtin operation. 14510 if (Op == OO_Subscript) { 14511 if (!First->getType()->isOverloadableType() && 14512 !Second->getType()->isOverloadableType()) 14513 return getSema().CreateBuiltinArraySubscriptExpr( 14514 First, Callee->getBeginLoc(), Second, OpLoc); 14515 } else if (Op == OO_Arrow) { 14516 // -> is never a builtin operation. 14517 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14518 } else if (Second == nullptr || isPostIncDec) { 14519 if (!First->getType()->isOverloadableType() || 14520 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14521 // The argument is not of overloadable type, or this is an expression 14522 // of the form &Class::member, so try to create a built-in unary 14523 // operation. 14524 UnaryOperatorKind Opc 14525 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14526 14527 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14528 } 14529 } else { 14530 if (!First->getType()->isOverloadableType() && 14531 !Second->getType()->isOverloadableType()) { 14532 // Neither of the arguments is an overloadable type, so try to 14533 // create a built-in binary operation. 14534 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14535 ExprResult Result 14536 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14537 if (Result.isInvalid()) 14538 return ExprError(); 14539 14540 return Result; 14541 } 14542 } 14543 14544 // Compute the transformed set of functions (and function templates) to be 14545 // used during overload resolution. 14546 UnresolvedSet<16> Functions; 14547 bool RequiresADL; 14548 14549 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14550 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14551 // If the overload could not be resolved in the template definition 14552 // (because we had a dependent argument), ADL is performed as part of 14553 // template instantiation. 14554 RequiresADL = ULE->requiresADL(); 14555 } else { 14556 // If we've resolved this to a particular non-member function, just call 14557 // that function. If we resolved it to a member function, 14558 // CreateOverloaded* will find that function for us. 14559 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14560 if (!isa<CXXMethodDecl>(ND)) 14561 Functions.addDecl(ND); 14562 RequiresADL = false; 14563 } 14564 14565 // Add any functions found via argument-dependent lookup. 14566 Expr *Args[2] = { First, Second }; 14567 unsigned NumArgs = 1 + (Second != nullptr); 14568 14569 // Create the overloaded operator invocation for unary operators. 14570 if (NumArgs == 1 || isPostIncDec) { 14571 UnaryOperatorKind Opc 14572 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14573 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14574 RequiresADL); 14575 } 14576 14577 if (Op == OO_Subscript) { 14578 SourceLocation LBrace; 14579 SourceLocation RBrace; 14580 14581 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14582 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14583 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14584 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14585 } else { 14586 LBrace = Callee->getBeginLoc(); 14587 RBrace = OpLoc; 14588 } 14589 14590 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14591 First, Second); 14592 } 14593 14594 // Create the overloaded operator invocation for binary operators. 14595 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14596 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14597 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14598 if (Result.isInvalid()) 14599 return ExprError(); 14600 14601 return Result; 14602 } 14603 14604 template<typename Derived> 14605 ExprResult 14606 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14607 SourceLocation OperatorLoc, 14608 bool isArrow, 14609 CXXScopeSpec &SS, 14610 TypeSourceInfo *ScopeType, 14611 SourceLocation CCLoc, 14612 SourceLocation TildeLoc, 14613 PseudoDestructorTypeStorage Destroyed) { 14614 QualType BaseType = Base->getType(); 14615 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14616 (!isArrow && !BaseType->getAs<RecordType>()) || 14617 (isArrow && BaseType->getAs<PointerType>() && 14618 !BaseType->castAs<PointerType>()->getPointeeType() 14619 ->template getAs<RecordType>())){ 14620 // This pseudo-destructor expression is still a pseudo-destructor. 14621 return SemaRef.BuildPseudoDestructorExpr( 14622 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14623 CCLoc, TildeLoc, Destroyed); 14624 } 14625 14626 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14627 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14628 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14629 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14630 NameInfo.setNamedTypeInfo(DestroyedType); 14631 14632 // The scope type is now known to be a valid nested name specifier 14633 // component. Tack it on to the end of the nested name specifier. 14634 if (ScopeType) { 14635 if (!ScopeType->getType()->getAs<TagType>()) { 14636 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14637 diag::err_expected_class_or_namespace) 14638 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14639 return ExprError(); 14640 } 14641 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14642 CCLoc); 14643 } 14644 14645 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14646 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14647 OperatorLoc, isArrow, 14648 SS, TemplateKWLoc, 14649 /*FIXME: FirstQualifier*/ nullptr, 14650 NameInfo, 14651 /*TemplateArgs*/ nullptr, 14652 /*S*/nullptr); 14653 } 14654 14655 template<typename Derived> 14656 StmtResult 14657 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14658 SourceLocation Loc = S->getBeginLoc(); 14659 CapturedDecl *CD = S->getCapturedDecl(); 14660 unsigned NumParams = CD->getNumParams(); 14661 unsigned ContextParamPos = CD->getContextParamPosition(); 14662 SmallVector<Sema::CapturedParamNameType, 4> Params; 14663 for (unsigned I = 0; I < NumParams; ++I) { 14664 if (I != ContextParamPos) { 14665 Params.push_back( 14666 std::make_pair( 14667 CD->getParam(I)->getName(), 14668 getDerived().TransformType(CD->getParam(I)->getType()))); 14669 } else { 14670 Params.push_back(std::make_pair(StringRef(), QualType())); 14671 } 14672 } 14673 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14674 S->getCapturedRegionKind(), Params); 14675 StmtResult Body; 14676 { 14677 Sema::CompoundScopeRAII CompoundScope(getSema()); 14678 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14679 } 14680 14681 if (Body.isInvalid()) { 14682 getSema().ActOnCapturedRegionError(); 14683 return StmtError(); 14684 } 14685 14686 return getSema().ActOnCapturedRegionEnd(Body.get()); 14687 } 14688 14689 } // end namespace clang 14690 14691 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14692