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 useful 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. Subclasses 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, IfStatementKind Kind, 1324 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1325 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1326 SourceLocation ElseLoc, Stmt *Else) { 1327 return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc, 1328 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 'full' clause. 1637 OMPClause *RebuildOMPFullClause(SourceLocation StartLoc, 1638 SourceLocation EndLoc) { 1639 return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc); 1640 } 1641 1642 /// Build a new OpenMP 'partial' clause. 1643 OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc, 1644 SourceLocation LParenLoc, 1645 SourceLocation EndLoc) { 1646 return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc, 1647 EndLoc); 1648 } 1649 1650 /// Build a new OpenMP 'allocator' clause. 1651 /// 1652 /// By default, performs semantic analysis to build the new OpenMP clause. 1653 /// Subclasses may override this routine to provide different behavior. 1654 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1655 SourceLocation LParenLoc, 1656 SourceLocation EndLoc) { 1657 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1658 } 1659 1660 /// Build a new OpenMP 'collapse' clause. 1661 /// 1662 /// By default, performs semantic analysis to build the new OpenMP clause. 1663 /// Subclasses may override this routine to provide different behavior. 1664 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1665 SourceLocation LParenLoc, 1666 SourceLocation EndLoc) { 1667 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1668 EndLoc); 1669 } 1670 1671 /// Build a new OpenMP 'default' clause. 1672 /// 1673 /// By default, performs semantic analysis to build the new OpenMP clause. 1674 /// Subclasses may override this routine to provide different behavior. 1675 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1676 SourceLocation StartLoc, 1677 SourceLocation LParenLoc, 1678 SourceLocation EndLoc) { 1679 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1680 StartLoc, LParenLoc, EndLoc); 1681 } 1682 1683 /// Build a new OpenMP 'proc_bind' clause. 1684 /// 1685 /// By default, performs semantic analysis to build the new OpenMP clause. 1686 /// Subclasses may override this routine to provide different behavior. 1687 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1688 SourceLocation KindKwLoc, 1689 SourceLocation StartLoc, 1690 SourceLocation LParenLoc, 1691 SourceLocation EndLoc) { 1692 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1693 StartLoc, LParenLoc, EndLoc); 1694 } 1695 1696 /// Build a new OpenMP 'schedule' 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 *RebuildOMPScheduleClause( 1701 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1702 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1703 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1704 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1705 return getSema().ActOnOpenMPScheduleClause( 1706 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1707 CommaLoc, EndLoc); 1708 } 1709 1710 /// Build a new OpenMP 'ordered' clause. 1711 /// 1712 /// By default, performs semantic analysis to build the new OpenMP clause. 1713 /// Subclasses may override this routine to provide different behavior. 1714 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1715 SourceLocation EndLoc, 1716 SourceLocation LParenLoc, Expr *Num) { 1717 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1718 } 1719 1720 /// Build a new OpenMP 'private' clause. 1721 /// 1722 /// By default, performs semantic analysis to build the new OpenMP clause. 1723 /// Subclasses may override this routine to provide different behavior. 1724 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1725 SourceLocation StartLoc, 1726 SourceLocation LParenLoc, 1727 SourceLocation EndLoc) { 1728 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1729 EndLoc); 1730 } 1731 1732 /// Build a new OpenMP 'firstprivate' clause. 1733 /// 1734 /// By default, performs semantic analysis to build the new OpenMP clause. 1735 /// Subclasses may override this routine to provide different behavior. 1736 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1737 SourceLocation StartLoc, 1738 SourceLocation LParenLoc, 1739 SourceLocation EndLoc) { 1740 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1741 EndLoc); 1742 } 1743 1744 /// Build a new OpenMP 'lastprivate' clause. 1745 /// 1746 /// By default, performs semantic analysis to build the new OpenMP clause. 1747 /// Subclasses may override this routine to provide different behavior. 1748 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1749 OpenMPLastprivateModifier LPKind, 1750 SourceLocation LPKindLoc, 1751 SourceLocation ColonLoc, 1752 SourceLocation StartLoc, 1753 SourceLocation LParenLoc, 1754 SourceLocation EndLoc) { 1755 return getSema().ActOnOpenMPLastprivateClause( 1756 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1757 } 1758 1759 /// Build a new OpenMP 'shared' clause. 1760 /// 1761 /// By default, performs semantic analysis to build the new OpenMP clause. 1762 /// Subclasses may override this routine to provide different behavior. 1763 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1764 SourceLocation StartLoc, 1765 SourceLocation LParenLoc, 1766 SourceLocation EndLoc) { 1767 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1768 EndLoc); 1769 } 1770 1771 /// Build a new OpenMP 'reduction' clause. 1772 /// 1773 /// By default, performs semantic analysis to build the new statement. 1774 /// Subclasses may override this routine to provide different behavior. 1775 OMPClause *RebuildOMPReductionClause( 1776 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1777 SourceLocation StartLoc, SourceLocation LParenLoc, 1778 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1779 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1780 const DeclarationNameInfo &ReductionId, 1781 ArrayRef<Expr *> UnresolvedReductions) { 1782 return getSema().ActOnOpenMPReductionClause( 1783 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1784 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1785 } 1786 1787 /// Build a new OpenMP 'task_reduction' clause. 1788 /// 1789 /// By default, performs semantic analysis to build the new statement. 1790 /// Subclasses may override this routine to provide different behavior. 1791 OMPClause *RebuildOMPTaskReductionClause( 1792 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1793 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1794 CXXScopeSpec &ReductionIdScopeSpec, 1795 const DeclarationNameInfo &ReductionId, 1796 ArrayRef<Expr *> UnresolvedReductions) { 1797 return getSema().ActOnOpenMPTaskReductionClause( 1798 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1799 ReductionId, UnresolvedReductions); 1800 } 1801 1802 /// Build a new OpenMP 'in_reduction' clause. 1803 /// 1804 /// By default, performs semantic analysis to build the new statement. 1805 /// Subclasses may override this routine to provide different behavior. 1806 OMPClause * 1807 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1808 SourceLocation LParenLoc, SourceLocation ColonLoc, 1809 SourceLocation EndLoc, 1810 CXXScopeSpec &ReductionIdScopeSpec, 1811 const DeclarationNameInfo &ReductionId, 1812 ArrayRef<Expr *> UnresolvedReductions) { 1813 return getSema().ActOnOpenMPInReductionClause( 1814 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1815 ReductionId, UnresolvedReductions); 1816 } 1817 1818 /// Build a new OpenMP 'linear' clause. 1819 /// 1820 /// By default, performs semantic analysis to build the new OpenMP clause. 1821 /// Subclasses may override this routine to provide different behavior. 1822 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1823 SourceLocation StartLoc, 1824 SourceLocation LParenLoc, 1825 OpenMPLinearClauseKind Modifier, 1826 SourceLocation ModifierLoc, 1827 SourceLocation ColonLoc, 1828 SourceLocation EndLoc) { 1829 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1830 Modifier, ModifierLoc, ColonLoc, 1831 EndLoc); 1832 } 1833 1834 /// Build a new OpenMP 'aligned' clause. 1835 /// 1836 /// By default, performs semantic analysis to build the new OpenMP clause. 1837 /// Subclasses may override this routine to provide different behavior. 1838 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1839 SourceLocation StartLoc, 1840 SourceLocation LParenLoc, 1841 SourceLocation ColonLoc, 1842 SourceLocation EndLoc) { 1843 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1844 LParenLoc, ColonLoc, EndLoc); 1845 } 1846 1847 /// Build a new OpenMP 'copyin' clause. 1848 /// 1849 /// By default, performs semantic analysis to build the new OpenMP clause. 1850 /// Subclasses may override this routine to provide different behavior. 1851 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1852 SourceLocation StartLoc, 1853 SourceLocation LParenLoc, 1854 SourceLocation EndLoc) { 1855 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1856 EndLoc); 1857 } 1858 1859 /// Build a new OpenMP 'copyprivate' clause. 1860 /// 1861 /// By default, performs semantic analysis to build the new OpenMP clause. 1862 /// Subclasses may override this routine to provide different behavior. 1863 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1864 SourceLocation StartLoc, 1865 SourceLocation LParenLoc, 1866 SourceLocation EndLoc) { 1867 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1868 EndLoc); 1869 } 1870 1871 /// Build a new OpenMP 'flush' pseudo clause. 1872 /// 1873 /// By default, performs semantic analysis to build the new OpenMP clause. 1874 /// Subclasses may override this routine to provide different behavior. 1875 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1876 SourceLocation StartLoc, 1877 SourceLocation LParenLoc, 1878 SourceLocation EndLoc) { 1879 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1880 EndLoc); 1881 } 1882 1883 /// Build a new OpenMP 'depobj' pseudo clause. 1884 /// 1885 /// By default, performs semantic analysis to build the new OpenMP clause. 1886 /// Subclasses may override this routine to provide different behavior. 1887 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1888 SourceLocation LParenLoc, 1889 SourceLocation EndLoc) { 1890 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1891 EndLoc); 1892 } 1893 1894 /// Build a new OpenMP 'depend' pseudo clause. 1895 /// 1896 /// By default, performs semantic analysis to build the new OpenMP clause. 1897 /// Subclasses may override this routine to provide different behavior. 1898 OMPClause * 1899 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1900 SourceLocation DepLoc, SourceLocation ColonLoc, 1901 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1902 SourceLocation LParenLoc, SourceLocation EndLoc) { 1903 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1904 ColonLoc, VarList, StartLoc, 1905 LParenLoc, EndLoc); 1906 } 1907 1908 /// Build a new OpenMP 'device' clause. 1909 /// 1910 /// By default, performs semantic analysis to build the new statement. 1911 /// Subclasses may override this routine to provide different behavior. 1912 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1913 Expr *Device, SourceLocation StartLoc, 1914 SourceLocation LParenLoc, 1915 SourceLocation ModifierLoc, 1916 SourceLocation EndLoc) { 1917 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1918 LParenLoc, ModifierLoc, EndLoc); 1919 } 1920 1921 /// Build a new OpenMP 'map' clause. 1922 /// 1923 /// By default, performs semantic analysis to build the new OpenMP clause. 1924 /// Subclasses may override this routine to provide different behavior. 1925 OMPClause *RebuildOMPMapClause( 1926 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1927 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1928 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1929 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1930 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1931 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1932 return getSema().ActOnOpenMPMapClause( 1933 MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId, 1934 MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs, 1935 /*NoDiagnose=*/false, UnresolvedMappers); 1936 } 1937 1938 /// Build a new OpenMP 'allocate' clause. 1939 /// 1940 /// By default, performs semantic analysis to build the new OpenMP clause. 1941 /// Subclasses may override this routine to provide different behavior. 1942 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1943 SourceLocation StartLoc, 1944 SourceLocation LParenLoc, 1945 SourceLocation ColonLoc, 1946 SourceLocation EndLoc) { 1947 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1948 LParenLoc, ColonLoc, EndLoc); 1949 } 1950 1951 /// Build a new OpenMP 'num_teams' clause. 1952 /// 1953 /// By default, performs semantic analysis to build the new statement. 1954 /// Subclasses may override this routine to provide different behavior. 1955 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1956 SourceLocation LParenLoc, 1957 SourceLocation EndLoc) { 1958 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1959 EndLoc); 1960 } 1961 1962 /// Build a new OpenMP 'thread_limit' clause. 1963 /// 1964 /// By default, performs semantic analysis to build the new statement. 1965 /// Subclasses may override this routine to provide different behavior. 1966 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1967 SourceLocation StartLoc, 1968 SourceLocation LParenLoc, 1969 SourceLocation EndLoc) { 1970 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1971 LParenLoc, EndLoc); 1972 } 1973 1974 /// Build a new OpenMP 'priority' clause. 1975 /// 1976 /// By default, performs semantic analysis to build the new statement. 1977 /// Subclasses may override this routine to provide different behavior. 1978 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1979 SourceLocation LParenLoc, 1980 SourceLocation EndLoc) { 1981 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1982 EndLoc); 1983 } 1984 1985 /// Build a new OpenMP 'grainsize' clause. 1986 /// 1987 /// By default, performs semantic analysis to build the new statement. 1988 /// Subclasses may override this routine to provide different behavior. 1989 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1990 SourceLocation LParenLoc, 1991 SourceLocation EndLoc) { 1992 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1993 EndLoc); 1994 } 1995 1996 /// Build a new OpenMP 'num_tasks' clause. 1997 /// 1998 /// By default, performs semantic analysis to build the new statement. 1999 /// Subclasses may override this routine to provide different behavior. 2000 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 2001 SourceLocation LParenLoc, 2002 SourceLocation EndLoc) { 2003 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 2004 EndLoc); 2005 } 2006 2007 /// Build a new OpenMP 'hint' clause. 2008 /// 2009 /// By default, performs semantic analysis to build the new statement. 2010 /// Subclasses may override this routine to provide different behavior. 2011 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 2012 SourceLocation LParenLoc, 2013 SourceLocation EndLoc) { 2014 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2015 } 2016 2017 /// Build a new OpenMP 'detach' clause. 2018 /// 2019 /// By default, performs semantic analysis to build the new statement. 2020 /// Subclasses may override this routine to provide different behavior. 2021 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2022 SourceLocation LParenLoc, 2023 SourceLocation EndLoc) { 2024 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2025 } 2026 2027 /// Build a new OpenMP 'dist_schedule' clause. 2028 /// 2029 /// By default, performs semantic analysis to build the new OpenMP clause. 2030 /// Subclasses may override this routine to provide different behavior. 2031 OMPClause * 2032 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2033 Expr *ChunkSize, SourceLocation StartLoc, 2034 SourceLocation LParenLoc, SourceLocation KindLoc, 2035 SourceLocation CommaLoc, SourceLocation EndLoc) { 2036 return getSema().ActOnOpenMPDistScheduleClause( 2037 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2038 } 2039 2040 /// Build a new OpenMP 'to' clause. 2041 /// 2042 /// By default, performs semantic analysis to build the new statement. 2043 /// Subclasses may override this routine to provide different behavior. 2044 OMPClause * 2045 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2046 ArrayRef<SourceLocation> MotionModifiersLoc, 2047 CXXScopeSpec &MapperIdScopeSpec, 2048 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2049 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2050 ArrayRef<Expr *> UnresolvedMappers) { 2051 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2052 MapperIdScopeSpec, MapperId, ColonLoc, 2053 VarList, Locs, UnresolvedMappers); 2054 } 2055 2056 /// Build a new OpenMP 'from' clause. 2057 /// 2058 /// By default, performs semantic analysis to build the new statement. 2059 /// Subclasses may override this routine to provide different behavior. 2060 OMPClause * 2061 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2062 ArrayRef<SourceLocation> MotionModifiersLoc, 2063 CXXScopeSpec &MapperIdScopeSpec, 2064 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2065 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2066 ArrayRef<Expr *> UnresolvedMappers) { 2067 return getSema().ActOnOpenMPFromClause( 2068 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2069 ColonLoc, VarList, Locs, UnresolvedMappers); 2070 } 2071 2072 /// Build a new OpenMP 'use_device_ptr' clause. 2073 /// 2074 /// By default, performs semantic analysis to build the new OpenMP clause. 2075 /// Subclasses may override this routine to provide different behavior. 2076 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2077 const OMPVarListLocTy &Locs) { 2078 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2079 } 2080 2081 /// Build a new OpenMP 'use_device_addr' clause. 2082 /// 2083 /// By default, performs semantic analysis to build the new OpenMP clause. 2084 /// Subclasses may override this routine to provide different behavior. 2085 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2086 const OMPVarListLocTy &Locs) { 2087 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2088 } 2089 2090 /// Build a new OpenMP 'is_device_ptr' clause. 2091 /// 2092 /// By default, performs semantic analysis to build the new OpenMP clause. 2093 /// Subclasses may override this routine to provide different behavior. 2094 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2095 const OMPVarListLocTy &Locs) { 2096 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2097 } 2098 2099 /// Build a new OpenMP 'defaultmap' clause. 2100 /// 2101 /// By default, performs semantic analysis to build the new OpenMP clause. 2102 /// Subclasses may override this routine to provide different behavior. 2103 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2104 OpenMPDefaultmapClauseKind Kind, 2105 SourceLocation StartLoc, 2106 SourceLocation LParenLoc, 2107 SourceLocation MLoc, 2108 SourceLocation KindLoc, 2109 SourceLocation EndLoc) { 2110 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2111 MLoc, KindLoc, EndLoc); 2112 } 2113 2114 /// Build a new OpenMP 'nontemporal' clause. 2115 /// 2116 /// By default, performs semantic analysis to build the new OpenMP clause. 2117 /// Subclasses may override this routine to provide different behavior. 2118 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2119 SourceLocation StartLoc, 2120 SourceLocation LParenLoc, 2121 SourceLocation EndLoc) { 2122 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2123 EndLoc); 2124 } 2125 2126 /// Build a new OpenMP 'inclusive' clause. 2127 /// 2128 /// By default, performs semantic analysis to build the new OpenMP clause. 2129 /// Subclasses may override this routine to provide different behavior. 2130 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2131 SourceLocation StartLoc, 2132 SourceLocation LParenLoc, 2133 SourceLocation EndLoc) { 2134 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2135 EndLoc); 2136 } 2137 2138 /// Build a new OpenMP 'exclusive' clause. 2139 /// 2140 /// By default, performs semantic analysis to build the new OpenMP clause. 2141 /// Subclasses may override this routine to provide different behavior. 2142 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2143 SourceLocation StartLoc, 2144 SourceLocation LParenLoc, 2145 SourceLocation EndLoc) { 2146 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2147 EndLoc); 2148 } 2149 2150 /// Build a new OpenMP 'uses_allocators' clause. 2151 /// 2152 /// By default, performs semantic analysis to build the new OpenMP clause. 2153 /// Subclasses may override this routine to provide different behavior. 2154 OMPClause *RebuildOMPUsesAllocatorsClause( 2155 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2156 SourceLocation LParenLoc, SourceLocation EndLoc) { 2157 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2158 Data); 2159 } 2160 2161 /// Build a new OpenMP 'affinity' clause. 2162 /// 2163 /// By default, performs semantic analysis to build the new OpenMP clause. 2164 /// Subclasses may override this routine to provide different behavior. 2165 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2166 SourceLocation LParenLoc, 2167 SourceLocation ColonLoc, 2168 SourceLocation EndLoc, Expr *Modifier, 2169 ArrayRef<Expr *> Locators) { 2170 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2171 EndLoc, Modifier, Locators); 2172 } 2173 2174 /// Build a new OpenMP 'order' clause. 2175 /// 2176 /// By default, performs semantic analysis to build the new OpenMP clause. 2177 /// Subclasses may override this routine to provide different behavior. 2178 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2179 SourceLocation KindKwLoc, 2180 SourceLocation StartLoc, 2181 SourceLocation LParenLoc, 2182 SourceLocation EndLoc) { 2183 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2184 LParenLoc, EndLoc); 2185 } 2186 2187 /// Build a new OpenMP 'init' clause. 2188 /// 2189 /// By default, performs semantic analysis to build the new OpenMP clause. 2190 /// Subclasses may override this routine to provide different behavior. 2191 OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2192 bool IsTarget, bool IsTargetSync, 2193 SourceLocation StartLoc, 2194 SourceLocation LParenLoc, 2195 SourceLocation VarLoc, 2196 SourceLocation EndLoc) { 2197 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2198 IsTargetSync, StartLoc, LParenLoc, 2199 VarLoc, EndLoc); 2200 } 2201 2202 /// Build a new OpenMP 'use' clause. 2203 /// 2204 /// By default, performs semantic analysis to build the new OpenMP clause. 2205 /// Subclasses may override this routine to provide different behavior. 2206 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2207 SourceLocation LParenLoc, 2208 SourceLocation VarLoc, SourceLocation EndLoc) { 2209 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2210 VarLoc, EndLoc); 2211 } 2212 2213 /// Build a new OpenMP 'destroy' clause. 2214 /// 2215 /// By default, performs semantic analysis to build the new OpenMP clause. 2216 /// Subclasses may override this routine to provide different behavior. 2217 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2218 SourceLocation LParenLoc, 2219 SourceLocation VarLoc, 2220 SourceLocation EndLoc) { 2221 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2222 VarLoc, EndLoc); 2223 } 2224 2225 /// Build a new OpenMP 'novariants' clause. 2226 /// 2227 /// By default, performs semantic analysis to build the new OpenMP clause. 2228 /// Subclasses may override this routine to provide different behavior. 2229 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2230 SourceLocation StartLoc, 2231 SourceLocation LParenLoc, 2232 SourceLocation EndLoc) { 2233 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2234 EndLoc); 2235 } 2236 2237 /// Build a new OpenMP 'nocontext' clause. 2238 /// 2239 /// By default, performs semantic analysis to build the new OpenMP clause. 2240 /// Subclasses may override this routine to provide different behavior. 2241 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2242 SourceLocation LParenLoc, 2243 SourceLocation EndLoc) { 2244 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2245 EndLoc); 2246 } 2247 2248 /// Build a new OpenMP 'filter' clause. 2249 /// 2250 /// By default, performs semantic analysis to build the new OpenMP clause. 2251 /// Subclasses may override this routine to provide different behavior. 2252 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2253 SourceLocation LParenLoc, 2254 SourceLocation EndLoc) { 2255 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2256 EndLoc); 2257 } 2258 2259 /// Build a new OpenMP 'bind' clause. 2260 /// 2261 /// By default, performs semantic analysis to build the new OpenMP clause. 2262 /// Subclasses may override this routine to provide different behavior. 2263 OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind, 2264 SourceLocation KindLoc, 2265 SourceLocation StartLoc, 2266 SourceLocation LParenLoc, 2267 SourceLocation EndLoc) { 2268 return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc, 2269 EndLoc); 2270 } 2271 2272 /// Build a new OpenMP 'align' clause. 2273 /// 2274 /// By default, performs semantic analysis to build the new OpenMP clause. 2275 /// Subclasses may override this routine to provide different behavior. 2276 OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc, 2277 SourceLocation LParenLoc, 2278 SourceLocation EndLoc) { 2279 return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc); 2280 } 2281 2282 /// Rebuild the operand to an Objective-C \@synchronized statement. 2283 /// 2284 /// By default, performs semantic analysis to build the new statement. 2285 /// Subclasses may override this routine to provide different behavior. 2286 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2287 Expr *object) { 2288 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2289 } 2290 2291 /// Build a new Objective-C \@synchronized statement. 2292 /// 2293 /// By default, performs semantic analysis to build the new statement. 2294 /// Subclasses may override this routine to provide different behavior. 2295 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2296 Expr *Object, Stmt *Body) { 2297 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2298 } 2299 2300 /// Build a new Objective-C \@autoreleasepool statement. 2301 /// 2302 /// By default, performs semantic analysis to build the new statement. 2303 /// Subclasses may override this routine to provide different behavior. 2304 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2305 Stmt *Body) { 2306 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2307 } 2308 2309 /// Build a new Objective-C fast enumeration statement. 2310 /// 2311 /// By default, performs semantic analysis to build the new statement. 2312 /// Subclasses may override this routine to provide different behavior. 2313 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2314 Stmt *Element, 2315 Expr *Collection, 2316 SourceLocation RParenLoc, 2317 Stmt *Body) { 2318 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2319 Element, 2320 Collection, 2321 RParenLoc); 2322 if (ForEachStmt.isInvalid()) 2323 return StmtError(); 2324 2325 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2326 } 2327 2328 /// Build a new C++ exception declaration. 2329 /// 2330 /// By default, performs semantic analysis to build the new decaration. 2331 /// Subclasses may override this routine to provide different behavior. 2332 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2333 TypeSourceInfo *Declarator, 2334 SourceLocation StartLoc, 2335 SourceLocation IdLoc, 2336 IdentifierInfo *Id) { 2337 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2338 StartLoc, IdLoc, Id); 2339 if (Var) 2340 getSema().CurContext->addDecl(Var); 2341 return Var; 2342 } 2343 2344 /// Build a new C++ catch statement. 2345 /// 2346 /// By default, performs semantic analysis to build the new statement. 2347 /// Subclasses may override this routine to provide different behavior. 2348 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2349 VarDecl *ExceptionDecl, 2350 Stmt *Handler) { 2351 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2352 Handler)); 2353 } 2354 2355 /// Build a new C++ try statement. 2356 /// 2357 /// By default, performs semantic analysis to build the new statement. 2358 /// Subclasses may override this routine to provide different behavior. 2359 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2360 ArrayRef<Stmt *> Handlers) { 2361 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2362 } 2363 2364 /// Build a new C++0x range-based for statement. 2365 /// 2366 /// By default, performs semantic analysis to build the new statement. 2367 /// Subclasses may override this routine to provide different behavior. 2368 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2369 SourceLocation CoawaitLoc, Stmt *Init, 2370 SourceLocation ColonLoc, Stmt *Range, 2371 Stmt *Begin, Stmt *End, Expr *Cond, 2372 Expr *Inc, Stmt *LoopVar, 2373 SourceLocation RParenLoc) { 2374 // If we've just learned that the range is actually an Objective-C 2375 // collection, treat this as an Objective-C fast enumeration loop. 2376 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2377 if (RangeStmt->isSingleDecl()) { 2378 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2379 if (RangeVar->isInvalidDecl()) 2380 return StmtError(); 2381 2382 Expr *RangeExpr = RangeVar->getInit(); 2383 if (!RangeExpr->isTypeDependent() && 2384 RangeExpr->getType()->isObjCObjectPointerType()) { 2385 // FIXME: Support init-statements in Objective-C++20 ranged for 2386 // statement. 2387 if (Init) { 2388 return SemaRef.Diag(Init->getBeginLoc(), 2389 diag::err_objc_for_range_init_stmt) 2390 << Init->getSourceRange(); 2391 } 2392 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2393 RangeExpr, RParenLoc); 2394 } 2395 } 2396 } 2397 } 2398 2399 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2400 Range, Begin, End, Cond, Inc, LoopVar, 2401 RParenLoc, Sema::BFRK_Rebuild); 2402 } 2403 2404 /// Build a new C++0x range-based for statement. 2405 /// 2406 /// By default, performs semantic analysis to build the new statement. 2407 /// Subclasses may override this routine to provide different behavior. 2408 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2409 bool IsIfExists, 2410 NestedNameSpecifierLoc QualifierLoc, 2411 DeclarationNameInfo NameInfo, 2412 Stmt *Nested) { 2413 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2414 QualifierLoc, NameInfo, Nested); 2415 } 2416 2417 /// Attach body to a C++0x range-based for statement. 2418 /// 2419 /// By default, performs semantic analysis to finish the new statement. 2420 /// Subclasses may override this routine to provide different behavior. 2421 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2422 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2423 } 2424 2425 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2426 Stmt *TryBlock, Stmt *Handler) { 2427 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2428 } 2429 2430 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2431 Stmt *Block) { 2432 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2433 } 2434 2435 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2436 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2437 } 2438 2439 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2440 SourceLocation LParen, 2441 SourceLocation RParen, 2442 TypeSourceInfo *TSI) { 2443 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2444 } 2445 2446 /// Build a new predefined 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 RebuildPredefinedExpr(SourceLocation Loc, 2451 PredefinedExpr::IdentKind IK) { 2452 return getSema().BuildPredefinedExpr(Loc, IK); 2453 } 2454 2455 /// Build a new expression that references a declaration. 2456 /// 2457 /// By default, performs semantic analysis to build the new expression. 2458 /// Subclasses may override this routine to provide different behavior. 2459 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2460 LookupResult &R, 2461 bool RequiresADL) { 2462 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2463 } 2464 2465 2466 /// Build a new expression that references a declaration. 2467 /// 2468 /// By default, performs semantic analysis to build the new expression. 2469 /// Subclasses may override this routine to provide different behavior. 2470 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2471 ValueDecl *VD, 2472 const DeclarationNameInfo &NameInfo, 2473 NamedDecl *Found, 2474 TemplateArgumentListInfo *TemplateArgs) { 2475 CXXScopeSpec SS; 2476 SS.Adopt(QualifierLoc); 2477 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2478 TemplateArgs); 2479 } 2480 2481 /// Build a new expression in parentheses. 2482 /// 2483 /// By default, performs semantic analysis to build the new expression. 2484 /// Subclasses may override this routine to provide different behavior. 2485 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2486 SourceLocation RParen) { 2487 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2488 } 2489 2490 /// Build a new pseudo-destructor expression. 2491 /// 2492 /// By default, performs semantic analysis to build the new expression. 2493 /// Subclasses may override this routine to provide different behavior. 2494 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2495 SourceLocation OperatorLoc, 2496 bool isArrow, 2497 CXXScopeSpec &SS, 2498 TypeSourceInfo *ScopeType, 2499 SourceLocation CCLoc, 2500 SourceLocation TildeLoc, 2501 PseudoDestructorTypeStorage Destroyed); 2502 2503 /// Build a new unary operator expression. 2504 /// 2505 /// By default, performs semantic analysis to build the new expression. 2506 /// Subclasses may override this routine to provide different behavior. 2507 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2508 UnaryOperatorKind Opc, 2509 Expr *SubExpr) { 2510 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2511 } 2512 2513 /// Build a new builtin offsetof expression. 2514 /// 2515 /// By default, performs semantic analysis to build the new expression. 2516 /// Subclasses may override this routine to provide different behavior. 2517 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2518 TypeSourceInfo *Type, 2519 ArrayRef<Sema::OffsetOfComponent> Components, 2520 SourceLocation RParenLoc) { 2521 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2522 RParenLoc); 2523 } 2524 2525 /// Build a new sizeof, alignof or vec_step expression with a 2526 /// type argument. 2527 /// 2528 /// By default, performs semantic analysis to build the new expression. 2529 /// Subclasses may override this routine to provide different behavior. 2530 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2531 SourceLocation OpLoc, 2532 UnaryExprOrTypeTrait ExprKind, 2533 SourceRange R) { 2534 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2535 } 2536 2537 /// Build a new sizeof, alignof or vec step expression with an 2538 /// expression argument. 2539 /// 2540 /// By default, performs semantic analysis to build the new expression. 2541 /// Subclasses may override this routine to provide different behavior. 2542 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2543 UnaryExprOrTypeTrait ExprKind, 2544 SourceRange R) { 2545 ExprResult Result 2546 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2547 if (Result.isInvalid()) 2548 return ExprError(); 2549 2550 return Result; 2551 } 2552 2553 /// Build a new array subscript expression. 2554 /// 2555 /// By default, performs semantic analysis to build the new expression. 2556 /// Subclasses may override this routine to provide different behavior. 2557 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2558 SourceLocation LBracketLoc, 2559 Expr *RHS, 2560 SourceLocation RBracketLoc) { 2561 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2562 LBracketLoc, RHS, 2563 RBracketLoc); 2564 } 2565 2566 /// Build a new matrix subscript expression. 2567 /// 2568 /// By default, performs semantic analysis to build the new expression. 2569 /// Subclasses may override this routine to provide different behavior. 2570 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2571 Expr *ColumnIdx, 2572 SourceLocation RBracketLoc) { 2573 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2574 RBracketLoc); 2575 } 2576 2577 /// Build a new array section expression. 2578 /// 2579 /// By default, performs semantic analysis to build the new expression. 2580 /// Subclasses may override this routine to provide different behavior. 2581 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2582 Expr *LowerBound, 2583 SourceLocation ColonLocFirst, 2584 SourceLocation ColonLocSecond, 2585 Expr *Length, Expr *Stride, 2586 SourceLocation RBracketLoc) { 2587 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2588 ColonLocFirst, ColonLocSecond, 2589 Length, Stride, RBracketLoc); 2590 } 2591 2592 /// Build a new array shaping expression. 2593 /// 2594 /// By default, performs semantic analysis to build the new expression. 2595 /// Subclasses may override this routine to provide different behavior. 2596 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2597 SourceLocation RParenLoc, 2598 ArrayRef<Expr *> Dims, 2599 ArrayRef<SourceRange> BracketsRanges) { 2600 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2601 BracketsRanges); 2602 } 2603 2604 /// Build a new iterator expression. 2605 /// 2606 /// By default, performs semantic analysis to build the new expression. 2607 /// Subclasses may override this routine to provide different behavior. 2608 ExprResult RebuildOMPIteratorExpr( 2609 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2610 ArrayRef<Sema::OMPIteratorData> Data) { 2611 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2612 LLoc, RLoc, Data); 2613 } 2614 2615 /// Build a new call expression. 2616 /// 2617 /// By default, performs semantic analysis to build the new expression. 2618 /// Subclasses may override this routine to provide different behavior. 2619 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2620 MultiExprArg Args, 2621 SourceLocation RParenLoc, 2622 Expr *ExecConfig = nullptr) { 2623 return getSema().ActOnCallExpr( 2624 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2625 } 2626 2627 /// Build a new member access expression. 2628 /// 2629 /// By default, performs semantic analysis to build the new expression. 2630 /// Subclasses may override this routine to provide different behavior. 2631 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2632 bool isArrow, 2633 NestedNameSpecifierLoc QualifierLoc, 2634 SourceLocation TemplateKWLoc, 2635 const DeclarationNameInfo &MemberNameInfo, 2636 ValueDecl *Member, 2637 NamedDecl *FoundDecl, 2638 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2639 NamedDecl *FirstQualifierInScope) { 2640 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2641 isArrow); 2642 if (!Member->getDeclName()) { 2643 // We have a reference to an unnamed field. This is always the 2644 // base of an anonymous struct/union member access, i.e. the 2645 // field is always of record type. 2646 assert(Member->getType()->isRecordType() && 2647 "unnamed member not of record type?"); 2648 2649 BaseResult = 2650 getSema().PerformObjectMemberConversion(BaseResult.get(), 2651 QualifierLoc.getNestedNameSpecifier(), 2652 FoundDecl, Member); 2653 if (BaseResult.isInvalid()) 2654 return ExprError(); 2655 Base = BaseResult.get(); 2656 2657 CXXScopeSpec EmptySS; 2658 return getSema().BuildFieldReferenceExpr( 2659 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2660 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2661 } 2662 2663 CXXScopeSpec SS; 2664 SS.Adopt(QualifierLoc); 2665 2666 Base = BaseResult.get(); 2667 QualType BaseType = Base->getType(); 2668 2669 if (isArrow && !BaseType->isPointerType()) 2670 return ExprError(); 2671 2672 // FIXME: this involves duplicating earlier analysis in a lot of 2673 // cases; we should avoid this when possible. 2674 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2675 R.addDecl(FoundDecl); 2676 R.resolveKind(); 2677 2678 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2679 SS, TemplateKWLoc, 2680 FirstQualifierInScope, 2681 R, ExplicitTemplateArgs, 2682 /*S*/nullptr); 2683 } 2684 2685 /// Build a new binary operator expression. 2686 /// 2687 /// By default, performs semantic analysis to build the new expression. 2688 /// Subclasses may override this routine to provide different behavior. 2689 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2690 BinaryOperatorKind Opc, 2691 Expr *LHS, Expr *RHS) { 2692 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2693 } 2694 2695 /// Build a new rewritten operator expression. 2696 /// 2697 /// By default, performs semantic analysis to build the new expression. 2698 /// Subclasses may override this routine to provide different behavior. 2699 ExprResult RebuildCXXRewrittenBinaryOperator( 2700 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2701 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2702 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2703 RHS, /*RequiresADL*/false); 2704 } 2705 2706 /// Build a new conditional operator expression. 2707 /// 2708 /// By default, performs semantic analysis to build the new expression. 2709 /// Subclasses may override this routine to provide different behavior. 2710 ExprResult RebuildConditionalOperator(Expr *Cond, 2711 SourceLocation QuestionLoc, 2712 Expr *LHS, 2713 SourceLocation ColonLoc, 2714 Expr *RHS) { 2715 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2716 LHS, RHS); 2717 } 2718 2719 /// Build a new C-style cast 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 RebuildCStyleCastExpr(SourceLocation LParenLoc, 2724 TypeSourceInfo *TInfo, 2725 SourceLocation RParenLoc, 2726 Expr *SubExpr) { 2727 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2728 SubExpr); 2729 } 2730 2731 /// Build a new compound literal expression. 2732 /// 2733 /// By default, performs semantic analysis to build the new expression. 2734 /// Subclasses may override this routine to provide different behavior. 2735 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2736 TypeSourceInfo *TInfo, 2737 SourceLocation RParenLoc, 2738 Expr *Init) { 2739 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2740 Init); 2741 } 2742 2743 /// Build a new extended vector element access expression. 2744 /// 2745 /// By default, performs semantic analysis to build the new expression. 2746 /// Subclasses may override this routine to provide different behavior. 2747 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2748 SourceLocation OpLoc, 2749 SourceLocation AccessorLoc, 2750 IdentifierInfo &Accessor) { 2751 2752 CXXScopeSpec SS; 2753 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2754 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2755 OpLoc, /*IsArrow*/ false, 2756 SS, SourceLocation(), 2757 /*FirstQualifierInScope*/ nullptr, 2758 NameInfo, 2759 /* TemplateArgs */ nullptr, 2760 /*S*/ nullptr); 2761 } 2762 2763 /// Build a new initializer list expression. 2764 /// 2765 /// By default, performs semantic analysis to build the new expression. 2766 /// Subclasses may override this routine to provide different behavior. 2767 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2768 MultiExprArg Inits, 2769 SourceLocation RBraceLoc) { 2770 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2771 } 2772 2773 /// Build a new designated initializer expression. 2774 /// 2775 /// By default, performs semantic analysis to build the new expression. 2776 /// Subclasses may override this routine to provide different behavior. 2777 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2778 MultiExprArg ArrayExprs, 2779 SourceLocation EqualOrColonLoc, 2780 bool GNUSyntax, 2781 Expr *Init) { 2782 ExprResult Result 2783 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2784 Init); 2785 if (Result.isInvalid()) 2786 return ExprError(); 2787 2788 return Result; 2789 } 2790 2791 /// Build a new value-initialized expression. 2792 /// 2793 /// By default, builds the implicit value initialization without performing 2794 /// any semantic analysis. Subclasses may override this routine to provide 2795 /// different behavior. 2796 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2797 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2798 } 2799 2800 /// Build a new \c va_arg expression. 2801 /// 2802 /// By default, performs semantic analysis to build the new expression. 2803 /// Subclasses may override this routine to provide different behavior. 2804 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2805 Expr *SubExpr, TypeSourceInfo *TInfo, 2806 SourceLocation RParenLoc) { 2807 return getSema().BuildVAArgExpr(BuiltinLoc, 2808 SubExpr, TInfo, 2809 RParenLoc); 2810 } 2811 2812 /// Build a new expression list in parentheses. 2813 /// 2814 /// By default, performs semantic analysis to build the new expression. 2815 /// Subclasses may override this routine to provide different behavior. 2816 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2817 MultiExprArg SubExprs, 2818 SourceLocation RParenLoc) { 2819 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2820 } 2821 2822 /// Build a new address-of-label expression. 2823 /// 2824 /// By default, performs semantic analysis, using the name of the label 2825 /// rather than attempting to map the label statement itself. 2826 /// Subclasses may override this routine to provide different behavior. 2827 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2828 SourceLocation LabelLoc, LabelDecl *Label) { 2829 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2830 } 2831 2832 /// Build a new GNU statement expression. 2833 /// 2834 /// By default, performs semantic analysis to build the new expression. 2835 /// Subclasses may override this routine to provide different behavior. 2836 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2837 SourceLocation RParenLoc, unsigned TemplateDepth) { 2838 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2839 TemplateDepth); 2840 } 2841 2842 /// Build a new __builtin_choose_expr expression. 2843 /// 2844 /// By default, performs semantic analysis to build the new expression. 2845 /// Subclasses may override this routine to provide different behavior. 2846 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2847 Expr *Cond, Expr *LHS, Expr *RHS, 2848 SourceLocation RParenLoc) { 2849 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2850 Cond, LHS, RHS, 2851 RParenLoc); 2852 } 2853 2854 /// Build a new generic selection expression. 2855 /// 2856 /// By default, performs semantic analysis to build the new expression. 2857 /// Subclasses may override this routine to provide different behavior. 2858 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2859 SourceLocation DefaultLoc, 2860 SourceLocation RParenLoc, 2861 Expr *ControllingExpr, 2862 ArrayRef<TypeSourceInfo *> Types, 2863 ArrayRef<Expr *> Exprs) { 2864 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2865 ControllingExpr, Types, Exprs); 2866 } 2867 2868 /// Build a new overloaded operator call expression. 2869 /// 2870 /// By default, performs semantic analysis to build the new expression. 2871 /// The semantic analysis provides the behavior of template instantiation, 2872 /// copying with transformations that turn what looks like an overloaded 2873 /// operator call into a use of a builtin operator, performing 2874 /// argument-dependent lookup, etc. Subclasses may override this routine to 2875 /// provide different behavior. 2876 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2877 SourceLocation OpLoc, 2878 Expr *Callee, 2879 Expr *First, 2880 Expr *Second); 2881 2882 /// Build a new C++ "named" cast expression, such as static_cast or 2883 /// reinterpret_cast. 2884 /// 2885 /// By default, this routine dispatches to one of the more-specific routines 2886 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2887 /// Subclasses may override this routine to provide different behavior. 2888 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2889 Stmt::StmtClass Class, 2890 SourceLocation LAngleLoc, 2891 TypeSourceInfo *TInfo, 2892 SourceLocation RAngleLoc, 2893 SourceLocation LParenLoc, 2894 Expr *SubExpr, 2895 SourceLocation RParenLoc) { 2896 switch (Class) { 2897 case Stmt::CXXStaticCastExprClass: 2898 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2899 RAngleLoc, LParenLoc, 2900 SubExpr, RParenLoc); 2901 2902 case Stmt::CXXDynamicCastExprClass: 2903 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2904 RAngleLoc, LParenLoc, 2905 SubExpr, RParenLoc); 2906 2907 case Stmt::CXXReinterpretCastExprClass: 2908 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2909 RAngleLoc, LParenLoc, 2910 SubExpr, 2911 RParenLoc); 2912 2913 case Stmt::CXXConstCastExprClass: 2914 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2915 RAngleLoc, LParenLoc, 2916 SubExpr, RParenLoc); 2917 2918 case Stmt::CXXAddrspaceCastExprClass: 2919 return getDerived().RebuildCXXAddrspaceCastExpr( 2920 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2921 2922 default: 2923 llvm_unreachable("Invalid C++ named cast"); 2924 } 2925 } 2926 2927 /// Build a new C++ static_cast expression. 2928 /// 2929 /// By default, performs semantic analysis to build the new expression. 2930 /// Subclasses may override this routine to provide different behavior. 2931 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2932 SourceLocation LAngleLoc, 2933 TypeSourceInfo *TInfo, 2934 SourceLocation RAngleLoc, 2935 SourceLocation LParenLoc, 2936 Expr *SubExpr, 2937 SourceLocation RParenLoc) { 2938 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2939 TInfo, SubExpr, 2940 SourceRange(LAngleLoc, RAngleLoc), 2941 SourceRange(LParenLoc, RParenLoc)); 2942 } 2943 2944 /// Build a new C++ dynamic_cast expression. 2945 /// 2946 /// By default, performs semantic analysis to build the new expression. 2947 /// Subclasses may override this routine to provide different behavior. 2948 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2949 SourceLocation LAngleLoc, 2950 TypeSourceInfo *TInfo, 2951 SourceLocation RAngleLoc, 2952 SourceLocation LParenLoc, 2953 Expr *SubExpr, 2954 SourceLocation RParenLoc) { 2955 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2956 TInfo, SubExpr, 2957 SourceRange(LAngleLoc, RAngleLoc), 2958 SourceRange(LParenLoc, RParenLoc)); 2959 } 2960 2961 /// Build a new C++ reinterpret_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 RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2966 SourceLocation LAngleLoc, 2967 TypeSourceInfo *TInfo, 2968 SourceLocation RAngleLoc, 2969 SourceLocation LParenLoc, 2970 Expr *SubExpr, 2971 SourceLocation RParenLoc) { 2972 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2973 TInfo, SubExpr, 2974 SourceRange(LAngleLoc, RAngleLoc), 2975 SourceRange(LParenLoc, RParenLoc)); 2976 } 2977 2978 /// Build a new C++ const_cast expression. 2979 /// 2980 /// By default, performs semantic analysis to build the new expression. 2981 /// Subclasses may override this routine to provide different behavior. 2982 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2983 SourceLocation LAngleLoc, 2984 TypeSourceInfo *TInfo, 2985 SourceLocation RAngleLoc, 2986 SourceLocation LParenLoc, 2987 Expr *SubExpr, 2988 SourceLocation RParenLoc) { 2989 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2990 TInfo, SubExpr, 2991 SourceRange(LAngleLoc, RAngleLoc), 2992 SourceRange(LParenLoc, RParenLoc)); 2993 } 2994 2995 ExprResult 2996 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2997 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2998 SourceLocation LParenLoc, Expr *SubExpr, 2999 SourceLocation RParenLoc) { 3000 return getSema().BuildCXXNamedCast( 3001 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 3002 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 3003 } 3004 3005 /// Build a new C++ functional-style cast expression. 3006 /// 3007 /// By default, performs semantic analysis to build the new expression. 3008 /// Subclasses may override this routine to provide different behavior. 3009 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 3010 SourceLocation LParenLoc, 3011 Expr *Sub, 3012 SourceLocation RParenLoc, 3013 bool ListInitialization) { 3014 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3015 MultiExprArg(&Sub, 1), RParenLoc, 3016 ListInitialization); 3017 } 3018 3019 /// Build a new C++ __builtin_bit_cast expression. 3020 /// 3021 /// By default, performs semantic analysis to build the new expression. 3022 /// Subclasses may override this routine to provide different behavior. 3023 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3024 TypeSourceInfo *TSI, Expr *Sub, 3025 SourceLocation RParenLoc) { 3026 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3027 } 3028 3029 /// Build a new C++ typeid(type) expression. 3030 /// 3031 /// By default, performs semantic analysis to build the new expression. 3032 /// Subclasses may override this routine to provide different behavior. 3033 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3034 SourceLocation TypeidLoc, 3035 TypeSourceInfo *Operand, 3036 SourceLocation RParenLoc) { 3037 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3038 RParenLoc); 3039 } 3040 3041 3042 /// Build a new C++ typeid(expr) expression. 3043 /// 3044 /// By default, performs semantic analysis to build the new expression. 3045 /// Subclasses may override this routine to provide different behavior. 3046 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3047 SourceLocation TypeidLoc, 3048 Expr *Operand, 3049 SourceLocation RParenLoc) { 3050 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3051 RParenLoc); 3052 } 3053 3054 /// Build a new C++ __uuidof(type) expression. 3055 /// 3056 /// By default, performs semantic analysis to build the new expression. 3057 /// Subclasses may override this routine to provide different behavior. 3058 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3059 TypeSourceInfo *Operand, 3060 SourceLocation RParenLoc) { 3061 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3062 } 3063 3064 /// Build a new C++ __uuidof(expr) expression. 3065 /// 3066 /// By default, performs semantic analysis to build the new expression. 3067 /// Subclasses may override this routine to provide different behavior. 3068 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3069 Expr *Operand, SourceLocation RParenLoc) { 3070 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3071 } 3072 3073 /// Build a new C++ "this" expression. 3074 /// 3075 /// By default, builds a new "this" expression without performing any 3076 /// semantic analysis. Subclasses may override this routine to provide 3077 /// different behavior. 3078 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3079 QualType ThisType, 3080 bool isImplicit) { 3081 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3082 } 3083 3084 /// Build a new C++ throw expression. 3085 /// 3086 /// By default, performs semantic analysis to build the new expression. 3087 /// Subclasses may override this routine to provide different behavior. 3088 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3089 bool IsThrownVariableInScope) { 3090 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3091 } 3092 3093 /// Build a new C++ default-argument expression. 3094 /// 3095 /// By default, builds a new default-argument expression, which does not 3096 /// require any semantic analysis. Subclasses may override this routine to 3097 /// provide different behavior. 3098 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3099 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3100 getSema().CurContext); 3101 } 3102 3103 /// Build a new C++11 default-initialization expression. 3104 /// 3105 /// By default, builds a new default field initialization expression, which 3106 /// does not require any semantic analysis. Subclasses may override this 3107 /// routine to provide different behavior. 3108 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3109 FieldDecl *Field) { 3110 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3111 getSema().CurContext); 3112 } 3113 3114 /// Build a new C++ zero-initialization expression. 3115 /// 3116 /// By default, performs semantic analysis to build the new expression. 3117 /// Subclasses may override this routine to provide different behavior. 3118 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3119 SourceLocation LParenLoc, 3120 SourceLocation RParenLoc) { 3121 return getSema().BuildCXXTypeConstructExpr( 3122 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3123 } 3124 3125 /// Build a new C++ "new" expression. 3126 /// 3127 /// By default, performs semantic analysis to build the new expression. 3128 /// Subclasses may override this routine to provide different behavior. 3129 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3130 bool UseGlobal, 3131 SourceLocation PlacementLParen, 3132 MultiExprArg PlacementArgs, 3133 SourceLocation PlacementRParen, 3134 SourceRange TypeIdParens, 3135 QualType AllocatedType, 3136 TypeSourceInfo *AllocatedTypeInfo, 3137 Optional<Expr *> ArraySize, 3138 SourceRange DirectInitRange, 3139 Expr *Initializer) { 3140 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3141 PlacementLParen, 3142 PlacementArgs, 3143 PlacementRParen, 3144 TypeIdParens, 3145 AllocatedType, 3146 AllocatedTypeInfo, 3147 ArraySize, 3148 DirectInitRange, 3149 Initializer); 3150 } 3151 3152 /// Build a new C++ "delete" expression. 3153 /// 3154 /// By default, performs semantic analysis to build the new expression. 3155 /// Subclasses may override this routine to provide different behavior. 3156 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3157 bool IsGlobalDelete, 3158 bool IsArrayForm, 3159 Expr *Operand) { 3160 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3161 Operand); 3162 } 3163 3164 /// Build a new type trait expression. 3165 /// 3166 /// By default, performs semantic analysis to build the new expression. 3167 /// Subclasses may override this routine to provide different behavior. 3168 ExprResult RebuildTypeTrait(TypeTrait Trait, 3169 SourceLocation StartLoc, 3170 ArrayRef<TypeSourceInfo *> Args, 3171 SourceLocation RParenLoc) { 3172 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3173 } 3174 3175 /// Build a new array type trait expression. 3176 /// 3177 /// By default, performs semantic analysis to build the new expression. 3178 /// Subclasses may override this routine to provide different behavior. 3179 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3180 SourceLocation StartLoc, 3181 TypeSourceInfo *TSInfo, 3182 Expr *DimExpr, 3183 SourceLocation RParenLoc) { 3184 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3185 } 3186 3187 /// Build a new expression trait expression. 3188 /// 3189 /// By default, performs semantic analysis to build the new expression. 3190 /// Subclasses may override this routine to provide different behavior. 3191 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3192 SourceLocation StartLoc, 3193 Expr *Queried, 3194 SourceLocation RParenLoc) { 3195 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3196 } 3197 3198 /// Build a new (previously unresolved) declaration reference 3199 /// expression. 3200 /// 3201 /// By default, performs semantic analysis to build the new expression. 3202 /// Subclasses may override this routine to provide different behavior. 3203 ExprResult RebuildDependentScopeDeclRefExpr( 3204 NestedNameSpecifierLoc QualifierLoc, 3205 SourceLocation TemplateKWLoc, 3206 const DeclarationNameInfo &NameInfo, 3207 const TemplateArgumentListInfo *TemplateArgs, 3208 bool IsAddressOfOperand, 3209 TypeSourceInfo **RecoveryTSI) { 3210 CXXScopeSpec SS; 3211 SS.Adopt(QualifierLoc); 3212 3213 if (TemplateArgs || TemplateKWLoc.isValid()) 3214 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3215 TemplateArgs); 3216 3217 return getSema().BuildQualifiedDeclarationNameExpr( 3218 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3219 } 3220 3221 /// Build a new template-id expression. 3222 /// 3223 /// By default, performs semantic analysis to build the new expression. 3224 /// Subclasses may override this routine to provide different behavior. 3225 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3226 SourceLocation TemplateKWLoc, 3227 LookupResult &R, 3228 bool RequiresADL, 3229 const TemplateArgumentListInfo *TemplateArgs) { 3230 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3231 TemplateArgs); 3232 } 3233 3234 /// Build a new object-construction expression. 3235 /// 3236 /// By default, performs semantic analysis to build the new expression. 3237 /// Subclasses may override this routine to provide different behavior. 3238 ExprResult RebuildCXXConstructExpr(QualType T, 3239 SourceLocation Loc, 3240 CXXConstructorDecl *Constructor, 3241 bool IsElidable, 3242 MultiExprArg Args, 3243 bool HadMultipleCandidates, 3244 bool ListInitialization, 3245 bool StdInitListInitialization, 3246 bool RequiresZeroInit, 3247 CXXConstructExpr::ConstructionKind ConstructKind, 3248 SourceRange ParenRange) { 3249 // Reconstruct the constructor we originally found, which might be 3250 // different if this is a call to an inherited constructor. 3251 CXXConstructorDecl *FoundCtor = Constructor; 3252 if (Constructor->isInheritingConstructor()) 3253 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3254 3255 SmallVector<Expr *, 8> ConvertedArgs; 3256 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3257 ConvertedArgs)) 3258 return ExprError(); 3259 3260 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3261 IsElidable, 3262 ConvertedArgs, 3263 HadMultipleCandidates, 3264 ListInitialization, 3265 StdInitListInitialization, 3266 RequiresZeroInit, ConstructKind, 3267 ParenRange); 3268 } 3269 3270 /// Build a new implicit construction via inherited constructor 3271 /// expression. 3272 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3273 CXXConstructorDecl *Constructor, 3274 bool ConstructsVBase, 3275 bool InheritedFromVBase) { 3276 return new (getSema().Context) CXXInheritedCtorInitExpr( 3277 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3278 } 3279 3280 /// Build a new object-construction expression. 3281 /// 3282 /// By default, performs semantic analysis to build the new expression. 3283 /// Subclasses may override this routine to provide different behavior. 3284 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3285 SourceLocation LParenOrBraceLoc, 3286 MultiExprArg Args, 3287 SourceLocation RParenOrBraceLoc, 3288 bool ListInitialization) { 3289 return getSema().BuildCXXTypeConstructExpr( 3290 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3291 } 3292 3293 /// Build a new object-construction expression. 3294 /// 3295 /// By default, performs semantic analysis to build the new expression. 3296 /// Subclasses may override this routine to provide different behavior. 3297 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3298 SourceLocation LParenLoc, 3299 MultiExprArg Args, 3300 SourceLocation RParenLoc, 3301 bool ListInitialization) { 3302 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3303 RParenLoc, ListInitialization); 3304 } 3305 3306 /// Build a new member reference expression. 3307 /// 3308 /// By default, performs semantic analysis to build the new expression. 3309 /// Subclasses may override this routine to provide different behavior. 3310 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3311 QualType BaseType, 3312 bool IsArrow, 3313 SourceLocation OperatorLoc, 3314 NestedNameSpecifierLoc QualifierLoc, 3315 SourceLocation TemplateKWLoc, 3316 NamedDecl *FirstQualifierInScope, 3317 const DeclarationNameInfo &MemberNameInfo, 3318 const TemplateArgumentListInfo *TemplateArgs) { 3319 CXXScopeSpec SS; 3320 SS.Adopt(QualifierLoc); 3321 3322 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3323 OperatorLoc, IsArrow, 3324 SS, TemplateKWLoc, 3325 FirstQualifierInScope, 3326 MemberNameInfo, 3327 TemplateArgs, /*S*/nullptr); 3328 } 3329 3330 /// Build a new member reference expression. 3331 /// 3332 /// By default, performs semantic analysis to build the new expression. 3333 /// Subclasses may override this routine to provide different behavior. 3334 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3335 SourceLocation OperatorLoc, 3336 bool IsArrow, 3337 NestedNameSpecifierLoc QualifierLoc, 3338 SourceLocation TemplateKWLoc, 3339 NamedDecl *FirstQualifierInScope, 3340 LookupResult &R, 3341 const TemplateArgumentListInfo *TemplateArgs) { 3342 CXXScopeSpec SS; 3343 SS.Adopt(QualifierLoc); 3344 3345 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3346 OperatorLoc, IsArrow, 3347 SS, TemplateKWLoc, 3348 FirstQualifierInScope, 3349 R, TemplateArgs, /*S*/nullptr); 3350 } 3351 3352 /// Build a new noexcept expression. 3353 /// 3354 /// By default, performs semantic analysis to build the new expression. 3355 /// Subclasses may override this routine to provide different behavior. 3356 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3357 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3358 } 3359 3360 /// Build a new expression to compute the length of a parameter pack. 3361 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3362 NamedDecl *Pack, 3363 SourceLocation PackLoc, 3364 SourceLocation RParenLoc, 3365 Optional<unsigned> Length, 3366 ArrayRef<TemplateArgument> PartialArgs) { 3367 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3368 RParenLoc, Length, PartialArgs); 3369 } 3370 3371 /// Build a new expression representing a call to a source location 3372 /// builtin. 3373 /// 3374 /// By default, performs semantic analysis to build the new expression. 3375 /// Subclasses may override this routine to provide different behavior. 3376 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3377 SourceLocation BuiltinLoc, 3378 SourceLocation RPLoc, 3379 DeclContext *ParentContext) { 3380 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3381 } 3382 3383 /// Build a new Objective-C boxed expression. 3384 /// 3385 /// By default, performs semantic analysis to build the new expression. 3386 /// Subclasses may override this routine to provide different behavior. 3387 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3388 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3389 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3390 TemplateArgumentListInfo *TALI) { 3391 CXXScopeSpec SS; 3392 SS.Adopt(NNS); 3393 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3394 ConceptNameInfo, 3395 FoundDecl, 3396 NamedConcept, TALI); 3397 if (Result.isInvalid()) 3398 return ExprError(); 3399 return Result; 3400 } 3401 3402 /// \brief Build a new requires expression. 3403 /// 3404 /// By default, performs semantic analysis to build the new expression. 3405 /// Subclasses may override this routine to provide different behavior. 3406 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3407 RequiresExprBodyDecl *Body, 3408 ArrayRef<ParmVarDecl *> LocalParameters, 3409 ArrayRef<concepts::Requirement *> Requirements, 3410 SourceLocation ClosingBraceLoc) { 3411 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3412 LocalParameters, Requirements, ClosingBraceLoc); 3413 } 3414 3415 concepts::TypeRequirement * 3416 RebuildTypeRequirement( 3417 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3418 return SemaRef.BuildTypeRequirement(SubstDiag); 3419 } 3420 3421 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3422 return SemaRef.BuildTypeRequirement(T); 3423 } 3424 3425 concepts::ExprRequirement * 3426 RebuildExprRequirement( 3427 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3428 SourceLocation NoexceptLoc, 3429 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3430 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3431 std::move(Ret)); 3432 } 3433 3434 concepts::ExprRequirement * 3435 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3436 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3437 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3438 std::move(Ret)); 3439 } 3440 3441 concepts::NestedRequirement * 3442 RebuildNestedRequirement( 3443 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3444 return SemaRef.BuildNestedRequirement(SubstDiag); 3445 } 3446 3447 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3448 return SemaRef.BuildNestedRequirement(Constraint); 3449 } 3450 3451 /// \brief Build a new Objective-C boxed expression. 3452 /// 3453 /// By default, performs semantic analysis to build the new expression. 3454 /// Subclasses may override this routine to provide different behavior. 3455 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3456 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3457 } 3458 3459 /// Build a new Objective-C array literal. 3460 /// 3461 /// By default, performs semantic analysis to build the new expression. 3462 /// Subclasses may override this routine to provide different behavior. 3463 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3464 Expr **Elements, unsigned NumElements) { 3465 return getSema().BuildObjCArrayLiteral(Range, 3466 MultiExprArg(Elements, NumElements)); 3467 } 3468 3469 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3470 Expr *Base, Expr *Key, 3471 ObjCMethodDecl *getterMethod, 3472 ObjCMethodDecl *setterMethod) { 3473 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3474 getterMethod, setterMethod); 3475 } 3476 3477 /// Build a new Objective-C dictionary literal. 3478 /// 3479 /// By default, performs semantic analysis to build the new expression. 3480 /// Subclasses may override this routine to provide different behavior. 3481 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3482 MutableArrayRef<ObjCDictionaryElement> Elements) { 3483 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3484 } 3485 3486 /// Build a new Objective-C \@encode expression. 3487 /// 3488 /// By default, performs semantic analysis to build the new expression. 3489 /// Subclasses may override this routine to provide different behavior. 3490 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3491 TypeSourceInfo *EncodeTypeInfo, 3492 SourceLocation RParenLoc) { 3493 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3494 } 3495 3496 /// Build a new Objective-C class message. 3497 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3498 Selector Sel, 3499 ArrayRef<SourceLocation> SelectorLocs, 3500 ObjCMethodDecl *Method, 3501 SourceLocation LBracLoc, 3502 MultiExprArg Args, 3503 SourceLocation RBracLoc) { 3504 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3505 ReceiverTypeInfo->getType(), 3506 /*SuperLoc=*/SourceLocation(), 3507 Sel, Method, LBracLoc, SelectorLocs, 3508 RBracLoc, Args); 3509 } 3510 3511 /// Build a new Objective-C instance message. 3512 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3513 Selector Sel, 3514 ArrayRef<SourceLocation> SelectorLocs, 3515 ObjCMethodDecl *Method, 3516 SourceLocation LBracLoc, 3517 MultiExprArg Args, 3518 SourceLocation RBracLoc) { 3519 return SemaRef.BuildInstanceMessage(Receiver, 3520 Receiver->getType(), 3521 /*SuperLoc=*/SourceLocation(), 3522 Sel, Method, LBracLoc, SelectorLocs, 3523 RBracLoc, Args); 3524 } 3525 3526 /// Build a new Objective-C instance/class message to 'super'. 3527 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3528 Selector Sel, 3529 ArrayRef<SourceLocation> SelectorLocs, 3530 QualType SuperType, 3531 ObjCMethodDecl *Method, 3532 SourceLocation LBracLoc, 3533 MultiExprArg Args, 3534 SourceLocation RBracLoc) { 3535 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3536 SuperType, 3537 SuperLoc, 3538 Sel, Method, LBracLoc, SelectorLocs, 3539 RBracLoc, Args) 3540 : SemaRef.BuildClassMessage(nullptr, 3541 SuperType, 3542 SuperLoc, 3543 Sel, Method, LBracLoc, SelectorLocs, 3544 RBracLoc, Args); 3545 3546 3547 } 3548 3549 /// Build a new Objective-C ivar reference expression. 3550 /// 3551 /// By default, performs semantic analysis to build the new expression. 3552 /// Subclasses may override this routine to provide different behavior. 3553 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3554 SourceLocation IvarLoc, 3555 bool IsArrow, bool IsFreeIvar) { 3556 CXXScopeSpec SS; 3557 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3558 ExprResult Result = getSema().BuildMemberReferenceExpr( 3559 BaseArg, BaseArg->getType(), 3560 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3561 /*FirstQualifierInScope=*/nullptr, NameInfo, 3562 /*TemplateArgs=*/nullptr, 3563 /*S=*/nullptr); 3564 if (IsFreeIvar && Result.isUsable()) 3565 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3566 return Result; 3567 } 3568 3569 /// Build a new Objective-C property reference expression. 3570 /// 3571 /// By default, performs semantic analysis to build the new expression. 3572 /// Subclasses may override this routine to provide different behavior. 3573 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3574 ObjCPropertyDecl *Property, 3575 SourceLocation PropertyLoc) { 3576 CXXScopeSpec SS; 3577 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3578 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3579 /*FIXME:*/PropertyLoc, 3580 /*IsArrow=*/false, 3581 SS, SourceLocation(), 3582 /*FirstQualifierInScope=*/nullptr, 3583 NameInfo, 3584 /*TemplateArgs=*/nullptr, 3585 /*S=*/nullptr); 3586 } 3587 3588 /// Build a new Objective-C property reference expression. 3589 /// 3590 /// By default, performs semantic analysis to build the new expression. 3591 /// Subclasses may override this routine to provide different behavior. 3592 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3593 ObjCMethodDecl *Getter, 3594 ObjCMethodDecl *Setter, 3595 SourceLocation PropertyLoc) { 3596 // Since these expressions can only be value-dependent, we do not 3597 // need to perform semantic analysis again. 3598 return Owned( 3599 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3600 VK_LValue, OK_ObjCProperty, 3601 PropertyLoc, Base)); 3602 } 3603 3604 /// Build a new Objective-C "isa" expression. 3605 /// 3606 /// By default, performs semantic analysis to build the new expression. 3607 /// Subclasses may override this routine to provide different behavior. 3608 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3609 SourceLocation OpLoc, bool IsArrow) { 3610 CXXScopeSpec SS; 3611 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3612 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3613 OpLoc, IsArrow, 3614 SS, SourceLocation(), 3615 /*FirstQualifierInScope=*/nullptr, 3616 NameInfo, 3617 /*TemplateArgs=*/nullptr, 3618 /*S=*/nullptr); 3619 } 3620 3621 /// Build a new shuffle vector expression. 3622 /// 3623 /// By default, performs semantic analysis to build the new expression. 3624 /// Subclasses may override this routine to provide different behavior. 3625 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3626 MultiExprArg SubExprs, 3627 SourceLocation RParenLoc) { 3628 // Find the declaration for __builtin_shufflevector 3629 const IdentifierInfo &Name 3630 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3631 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3632 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3633 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3634 3635 // Build a reference to the __builtin_shufflevector builtin 3636 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3637 Expr *Callee = new (SemaRef.Context) 3638 DeclRefExpr(SemaRef.Context, Builtin, false, 3639 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3640 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3641 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3642 CK_BuiltinFnToFnPtr).get(); 3643 3644 // Build the CallExpr 3645 ExprResult TheCall = CallExpr::Create( 3646 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3647 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3648 FPOptionsOverride()); 3649 3650 // Type-check the __builtin_shufflevector expression. 3651 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3652 } 3653 3654 /// Build a new convert vector expression. 3655 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3656 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3657 SourceLocation RParenLoc) { 3658 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3659 BuiltinLoc, RParenLoc); 3660 } 3661 3662 /// Build a new template argument pack expansion. 3663 /// 3664 /// By default, performs semantic analysis to build a new pack expansion 3665 /// for a template argument. Subclasses may override this routine to provide 3666 /// different behavior. 3667 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3668 SourceLocation EllipsisLoc, 3669 Optional<unsigned> NumExpansions) { 3670 switch (Pattern.getArgument().getKind()) { 3671 case TemplateArgument::Expression: { 3672 ExprResult Result 3673 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3674 EllipsisLoc, NumExpansions); 3675 if (Result.isInvalid()) 3676 return TemplateArgumentLoc(); 3677 3678 return TemplateArgumentLoc(Result.get(), Result.get()); 3679 } 3680 3681 case TemplateArgument::Template: 3682 return TemplateArgumentLoc( 3683 SemaRef.Context, 3684 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3685 NumExpansions), 3686 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3687 EllipsisLoc); 3688 3689 case TemplateArgument::Null: 3690 case TemplateArgument::Integral: 3691 case TemplateArgument::Declaration: 3692 case TemplateArgument::Pack: 3693 case TemplateArgument::TemplateExpansion: 3694 case TemplateArgument::NullPtr: 3695 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3696 3697 case TemplateArgument::Type: 3698 if (TypeSourceInfo *Expansion 3699 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3700 EllipsisLoc, 3701 NumExpansions)) 3702 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3703 Expansion); 3704 break; 3705 } 3706 3707 return TemplateArgumentLoc(); 3708 } 3709 3710 /// Build a new expression pack expansion. 3711 /// 3712 /// By default, performs semantic analysis to build a new pack expansion 3713 /// for an expression. Subclasses may override this routine to provide 3714 /// different behavior. 3715 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3716 Optional<unsigned> NumExpansions) { 3717 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3718 } 3719 3720 /// Build a new C++1z fold-expression. 3721 /// 3722 /// By default, performs semantic analysis in order to build a new fold 3723 /// expression. 3724 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3725 SourceLocation LParenLoc, Expr *LHS, 3726 BinaryOperatorKind Operator, 3727 SourceLocation EllipsisLoc, Expr *RHS, 3728 SourceLocation RParenLoc, 3729 Optional<unsigned> NumExpansions) { 3730 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3731 EllipsisLoc, RHS, RParenLoc, 3732 NumExpansions); 3733 } 3734 3735 /// Build an empty C++1z fold-expression with the given operator. 3736 /// 3737 /// By default, produces the fallback value for the fold-expression, or 3738 /// produce an error if there is no fallback value. 3739 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3740 BinaryOperatorKind Operator) { 3741 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3742 } 3743 3744 /// Build a new atomic operation expression. 3745 /// 3746 /// By default, performs semantic analysis to build the new expression. 3747 /// Subclasses may override this routine to provide different behavior. 3748 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3749 AtomicExpr::AtomicOp Op, 3750 SourceLocation RParenLoc) { 3751 // Use this for all of the locations, since we don't know the difference 3752 // between the call and the expr at this point. 3753 SourceRange Range{BuiltinLoc, RParenLoc}; 3754 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3755 Sema::AtomicArgumentOrder::AST); 3756 } 3757 3758 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3759 ArrayRef<Expr *> SubExprs, QualType Type) { 3760 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3761 } 3762 3763 private: 3764 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3765 QualType ObjectType, 3766 NamedDecl *FirstQualifierInScope, 3767 CXXScopeSpec &SS); 3768 3769 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3770 QualType ObjectType, 3771 NamedDecl *FirstQualifierInScope, 3772 CXXScopeSpec &SS); 3773 3774 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3775 NamedDecl *FirstQualifierInScope, 3776 CXXScopeSpec &SS); 3777 3778 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3779 DependentNameTypeLoc TL, 3780 bool DeducibleTSTContext); 3781 }; 3782 3783 template <typename Derived> 3784 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3785 if (!S) 3786 return S; 3787 3788 switch (S->getStmtClass()) { 3789 case Stmt::NoStmtClass: break; 3790 3791 // Transform individual statement nodes 3792 // Pass SDK into statements that can produce a value 3793 #define STMT(Node, Parent) \ 3794 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3795 #define VALUESTMT(Node, Parent) \ 3796 case Stmt::Node##Class: \ 3797 return getDerived().Transform##Node(cast<Node>(S), SDK); 3798 #define ABSTRACT_STMT(Node) 3799 #define EXPR(Node, Parent) 3800 #include "clang/AST/StmtNodes.inc" 3801 3802 // Transform expressions by calling TransformExpr. 3803 #define STMT(Node, Parent) 3804 #define ABSTRACT_STMT(Stmt) 3805 #define EXPR(Node, Parent) case Stmt::Node##Class: 3806 #include "clang/AST/StmtNodes.inc" 3807 { 3808 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3809 3810 if (SDK == SDK_StmtExprResult) 3811 E = getSema().ActOnStmtExprResult(E); 3812 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3813 } 3814 } 3815 3816 return S; 3817 } 3818 3819 template<typename Derived> 3820 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3821 if (!S) 3822 return S; 3823 3824 switch (S->getClauseKind()) { 3825 default: break; 3826 // Transform individual clause nodes 3827 #define GEN_CLANG_CLAUSE_CLASS 3828 #define CLAUSE_CLASS(Enum, Str, Class) \ 3829 case Enum: \ 3830 return getDerived().Transform##Class(cast<Class>(S)); 3831 #include "llvm/Frontend/OpenMP/OMP.inc" 3832 } 3833 3834 return S; 3835 } 3836 3837 3838 template<typename Derived> 3839 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3840 if (!E) 3841 return E; 3842 3843 switch (E->getStmtClass()) { 3844 case Stmt::NoStmtClass: break; 3845 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3846 #define ABSTRACT_STMT(Stmt) 3847 #define EXPR(Node, Parent) \ 3848 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3849 #include "clang/AST/StmtNodes.inc" 3850 } 3851 3852 return E; 3853 } 3854 3855 template<typename Derived> 3856 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3857 bool NotCopyInit) { 3858 // Initializers are instantiated like expressions, except that various outer 3859 // layers are stripped. 3860 if (!Init) 3861 return Init; 3862 3863 if (auto *FE = dyn_cast<FullExpr>(Init)) 3864 Init = FE->getSubExpr(); 3865 3866 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 3867 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 3868 Init = OVE->getSourceExpr(); 3869 } 3870 3871 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3872 Init = MTE->getSubExpr(); 3873 3874 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3875 Init = Binder->getSubExpr(); 3876 3877 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3878 Init = ICE->getSubExprAsWritten(); 3879 3880 if (CXXStdInitializerListExpr *ILE = 3881 dyn_cast<CXXStdInitializerListExpr>(Init)) 3882 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3883 3884 // If this is copy-initialization, we only need to reconstruct 3885 // InitListExprs. Other forms of copy-initialization will be a no-op if 3886 // the initializer is already the right type. 3887 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3888 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3889 return getDerived().TransformExpr(Init); 3890 3891 // Revert value-initialization back to empty parens. 3892 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3893 SourceRange Parens = VIE->getSourceRange(); 3894 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3895 Parens.getEnd()); 3896 } 3897 3898 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3899 if (isa<ImplicitValueInitExpr>(Init)) 3900 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3901 SourceLocation()); 3902 3903 // Revert initialization by constructor back to a parenthesized or braced list 3904 // of expressions. Any other form of initializer can just be reused directly. 3905 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3906 return getDerived().TransformExpr(Init); 3907 3908 // If the initialization implicitly converted an initializer list to a 3909 // std::initializer_list object, unwrap the std::initializer_list too. 3910 if (Construct && Construct->isStdInitListInitialization()) 3911 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3912 3913 // Enter a list-init context if this was list initialization. 3914 EnterExpressionEvaluationContext Context( 3915 getSema(), EnterExpressionEvaluationContext::InitList, 3916 Construct->isListInitialization()); 3917 3918 SmallVector<Expr*, 8> NewArgs; 3919 bool ArgChanged = false; 3920 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3921 /*IsCall*/true, NewArgs, &ArgChanged)) 3922 return ExprError(); 3923 3924 // If this was list initialization, revert to syntactic list form. 3925 if (Construct->isListInitialization()) 3926 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3927 Construct->getEndLoc()); 3928 3929 // Build a ParenListExpr to represent anything else. 3930 SourceRange Parens = Construct->getParenOrBraceRange(); 3931 if (Parens.isInvalid()) { 3932 // This was a variable declaration's initialization for which no initializer 3933 // was specified. 3934 assert(NewArgs.empty() && 3935 "no parens or braces but have direct init with arguments?"); 3936 return ExprEmpty(); 3937 } 3938 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3939 Parens.getEnd()); 3940 } 3941 3942 template<typename Derived> 3943 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3944 unsigned NumInputs, 3945 bool IsCall, 3946 SmallVectorImpl<Expr *> &Outputs, 3947 bool *ArgChanged) { 3948 for (unsigned I = 0; I != NumInputs; ++I) { 3949 // If requested, drop call arguments that need to be dropped. 3950 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3951 if (ArgChanged) 3952 *ArgChanged = true; 3953 3954 break; 3955 } 3956 3957 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3958 Expr *Pattern = Expansion->getPattern(); 3959 3960 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3961 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3962 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3963 3964 // Determine whether the set of unexpanded parameter packs can and should 3965 // be expanded. 3966 bool Expand = true; 3967 bool RetainExpansion = false; 3968 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3969 Optional<unsigned> NumExpansions = OrigNumExpansions; 3970 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3971 Pattern->getSourceRange(), 3972 Unexpanded, 3973 Expand, RetainExpansion, 3974 NumExpansions)) 3975 return true; 3976 3977 if (!Expand) { 3978 // The transform has determined that we should perform a simple 3979 // transformation on the pack expansion, producing another pack 3980 // expansion. 3981 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3982 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3983 if (OutPattern.isInvalid()) 3984 return true; 3985 3986 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3987 Expansion->getEllipsisLoc(), 3988 NumExpansions); 3989 if (Out.isInvalid()) 3990 return true; 3991 3992 if (ArgChanged) 3993 *ArgChanged = true; 3994 Outputs.push_back(Out.get()); 3995 continue; 3996 } 3997 3998 // Record right away that the argument was changed. This needs 3999 // to happen even if the array expands to nothing. 4000 if (ArgChanged) *ArgChanged = true; 4001 4002 // The transform has determined that we should perform an elementwise 4003 // expansion of the pattern. Do so. 4004 for (unsigned I = 0; I != *NumExpansions; ++I) { 4005 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4006 ExprResult Out = getDerived().TransformExpr(Pattern); 4007 if (Out.isInvalid()) 4008 return true; 4009 4010 if (Out.get()->containsUnexpandedParameterPack()) { 4011 Out = getDerived().RebuildPackExpansion( 4012 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4013 if (Out.isInvalid()) 4014 return true; 4015 } 4016 4017 Outputs.push_back(Out.get()); 4018 } 4019 4020 // If we're supposed to retain a pack expansion, do so by temporarily 4021 // forgetting the partially-substituted parameter pack. 4022 if (RetainExpansion) { 4023 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4024 4025 ExprResult Out = getDerived().TransformExpr(Pattern); 4026 if (Out.isInvalid()) 4027 return true; 4028 4029 Out = getDerived().RebuildPackExpansion( 4030 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4031 if (Out.isInvalid()) 4032 return true; 4033 4034 Outputs.push_back(Out.get()); 4035 } 4036 4037 continue; 4038 } 4039 4040 ExprResult Result = 4041 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4042 : getDerived().TransformExpr(Inputs[I]); 4043 if (Result.isInvalid()) 4044 return true; 4045 4046 if (Result.get() != Inputs[I] && ArgChanged) 4047 *ArgChanged = true; 4048 4049 Outputs.push_back(Result.get()); 4050 } 4051 4052 return false; 4053 } 4054 4055 template <typename Derived> 4056 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4057 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4058 if (Var) { 4059 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4060 getDerived().TransformDefinition(Var->getLocation(), Var)); 4061 4062 if (!ConditionVar) 4063 return Sema::ConditionError(); 4064 4065 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4066 } 4067 4068 if (Expr) { 4069 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4070 4071 if (CondExpr.isInvalid()) 4072 return Sema::ConditionError(); 4073 4074 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 4075 } 4076 4077 return Sema::ConditionResult(); 4078 } 4079 4080 template <typename Derived> 4081 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4082 NestedNameSpecifierLoc NNS, QualType ObjectType, 4083 NamedDecl *FirstQualifierInScope) { 4084 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4085 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4086 Qualifier = Qualifier.getPrefix()) 4087 Qualifiers.push_back(Qualifier); 4088 4089 CXXScopeSpec SS; 4090 while (!Qualifiers.empty()) { 4091 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4092 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4093 4094 switch (QNNS->getKind()) { 4095 case NestedNameSpecifier::Identifier: { 4096 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4097 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4098 ObjectType); 4099 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4100 SS, FirstQualifierInScope, false)) 4101 return NestedNameSpecifierLoc(); 4102 break; 4103 } 4104 4105 case NestedNameSpecifier::Namespace: { 4106 NamespaceDecl *NS = 4107 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4108 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4109 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4110 break; 4111 } 4112 4113 case NestedNameSpecifier::NamespaceAlias: { 4114 NamespaceAliasDecl *Alias = 4115 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4116 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4117 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4118 Q.getLocalEndLoc()); 4119 break; 4120 } 4121 4122 case NestedNameSpecifier::Global: 4123 // There is no meaningful transformation that one could perform on the 4124 // global scope. 4125 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4126 break; 4127 4128 case NestedNameSpecifier::Super: { 4129 CXXRecordDecl *RD = 4130 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4131 SourceLocation(), QNNS->getAsRecordDecl())); 4132 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4133 break; 4134 } 4135 4136 case NestedNameSpecifier::TypeSpecWithTemplate: 4137 case NestedNameSpecifier::TypeSpec: { 4138 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4139 FirstQualifierInScope, SS); 4140 4141 if (!TL) 4142 return NestedNameSpecifierLoc(); 4143 4144 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4145 (SemaRef.getLangOpts().CPlusPlus11 && 4146 TL.getType()->isEnumeralType())) { 4147 assert(!TL.getType().hasLocalQualifiers() && 4148 "Can't get cv-qualifiers here"); 4149 if (TL.getType()->isEnumeralType()) 4150 SemaRef.Diag(TL.getBeginLoc(), 4151 diag::warn_cxx98_compat_enum_nested_name_spec); 4152 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4153 Q.getLocalEndLoc()); 4154 break; 4155 } 4156 // If the nested-name-specifier is an invalid type def, don't emit an 4157 // error because a previous error should have already been emitted. 4158 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4159 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4160 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4161 << TL.getType() << SS.getRange(); 4162 } 4163 return NestedNameSpecifierLoc(); 4164 } 4165 } 4166 4167 // The qualifier-in-scope and object type only apply to the leftmost entity. 4168 FirstQualifierInScope = nullptr; 4169 ObjectType = QualType(); 4170 } 4171 4172 // Don't rebuild the nested-name-specifier if we don't have to. 4173 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4174 !getDerived().AlwaysRebuild()) 4175 return NNS; 4176 4177 // If we can re-use the source-location data from the original 4178 // nested-name-specifier, do so. 4179 if (SS.location_size() == NNS.getDataLength() && 4180 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4181 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4182 4183 // Allocate new nested-name-specifier location information. 4184 return SS.getWithLocInContext(SemaRef.Context); 4185 } 4186 4187 template<typename Derived> 4188 DeclarationNameInfo 4189 TreeTransform<Derived> 4190 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4191 DeclarationName Name = NameInfo.getName(); 4192 if (!Name) 4193 return DeclarationNameInfo(); 4194 4195 switch (Name.getNameKind()) { 4196 case DeclarationName::Identifier: 4197 case DeclarationName::ObjCZeroArgSelector: 4198 case DeclarationName::ObjCOneArgSelector: 4199 case DeclarationName::ObjCMultiArgSelector: 4200 case DeclarationName::CXXOperatorName: 4201 case DeclarationName::CXXLiteralOperatorName: 4202 case DeclarationName::CXXUsingDirective: 4203 return NameInfo; 4204 4205 case DeclarationName::CXXDeductionGuideName: { 4206 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4207 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4208 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4209 if (!NewTemplate) 4210 return DeclarationNameInfo(); 4211 4212 DeclarationNameInfo NewNameInfo(NameInfo); 4213 NewNameInfo.setName( 4214 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4215 return NewNameInfo; 4216 } 4217 4218 case DeclarationName::CXXConstructorName: 4219 case DeclarationName::CXXDestructorName: 4220 case DeclarationName::CXXConversionFunctionName: { 4221 TypeSourceInfo *NewTInfo; 4222 CanQualType NewCanTy; 4223 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4224 NewTInfo = getDerived().TransformType(OldTInfo); 4225 if (!NewTInfo) 4226 return DeclarationNameInfo(); 4227 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4228 } 4229 else { 4230 NewTInfo = nullptr; 4231 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4232 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4233 if (NewT.isNull()) 4234 return DeclarationNameInfo(); 4235 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4236 } 4237 4238 DeclarationName NewName 4239 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4240 NewCanTy); 4241 DeclarationNameInfo NewNameInfo(NameInfo); 4242 NewNameInfo.setName(NewName); 4243 NewNameInfo.setNamedTypeInfo(NewTInfo); 4244 return NewNameInfo; 4245 } 4246 } 4247 4248 llvm_unreachable("Unknown name kind."); 4249 } 4250 4251 template<typename Derived> 4252 TemplateName 4253 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4254 TemplateName Name, 4255 SourceLocation NameLoc, 4256 QualType ObjectType, 4257 NamedDecl *FirstQualifierInScope, 4258 bool AllowInjectedClassName) { 4259 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4260 TemplateDecl *Template = QTN->getTemplateDecl(); 4261 assert(Template && "qualified template name must refer to a template"); 4262 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 SS.getScopeRep() == QTN->getQualifier() && 4271 TransTemplate == Template) 4272 return Name; 4273 4274 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4275 TransTemplate); 4276 } 4277 4278 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4279 if (SS.getScopeRep()) { 4280 // These apply to the scope specifier, not the template. 4281 ObjectType = QualType(); 4282 FirstQualifierInScope = nullptr; 4283 } 4284 4285 if (!getDerived().AlwaysRebuild() && 4286 SS.getScopeRep() == DTN->getQualifier() && 4287 ObjectType.isNull()) 4288 return Name; 4289 4290 // FIXME: Preserve the location of the "template" keyword. 4291 SourceLocation TemplateKWLoc = NameLoc; 4292 4293 if (DTN->isIdentifier()) { 4294 return getDerived().RebuildTemplateName(SS, 4295 TemplateKWLoc, 4296 *DTN->getIdentifier(), 4297 NameLoc, 4298 ObjectType, 4299 FirstQualifierInScope, 4300 AllowInjectedClassName); 4301 } 4302 4303 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4304 DTN->getOperator(), NameLoc, 4305 ObjectType, AllowInjectedClassName); 4306 } 4307 4308 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4309 TemplateDecl *TransTemplate 4310 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4311 Template)); 4312 if (!TransTemplate) 4313 return TemplateName(); 4314 4315 if (!getDerived().AlwaysRebuild() && 4316 TransTemplate == Template) 4317 return Name; 4318 4319 return TemplateName(TransTemplate); 4320 } 4321 4322 if (SubstTemplateTemplateParmPackStorage *SubstPack 4323 = Name.getAsSubstTemplateTemplateParmPack()) { 4324 TemplateTemplateParmDecl *TransParam 4325 = cast_or_null<TemplateTemplateParmDecl>( 4326 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4327 if (!TransParam) 4328 return TemplateName(); 4329 4330 if (!getDerived().AlwaysRebuild() && 4331 TransParam == SubstPack->getParameterPack()) 4332 return Name; 4333 4334 return getDerived().RebuildTemplateName(TransParam, 4335 SubstPack->getArgumentPack()); 4336 } 4337 4338 // These should be getting filtered out before they reach the AST. 4339 llvm_unreachable("overloaded function decl survived to here"); 4340 } 4341 4342 template<typename Derived> 4343 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4344 const TemplateArgument &Arg, 4345 TemplateArgumentLoc &Output) { 4346 Output = getSema().getTrivialTemplateArgumentLoc( 4347 Arg, QualType(), getDerived().getBaseLocation()); 4348 } 4349 4350 template <typename Derived> 4351 bool TreeTransform<Derived>::TransformTemplateArgument( 4352 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4353 bool Uneval) { 4354 const TemplateArgument &Arg = Input.getArgument(); 4355 switch (Arg.getKind()) { 4356 case TemplateArgument::Null: 4357 case TemplateArgument::Pack: 4358 llvm_unreachable("Unexpected TemplateArgument"); 4359 4360 case TemplateArgument::Integral: 4361 case TemplateArgument::NullPtr: 4362 case TemplateArgument::Declaration: { 4363 // Transform a resolved template argument straight to a resolved template 4364 // argument. We get here when substituting into an already-substituted 4365 // template type argument during concept satisfaction checking. 4366 QualType T = Arg.getNonTypeTemplateArgumentType(); 4367 QualType NewT = getDerived().TransformType(T); 4368 if (NewT.isNull()) 4369 return true; 4370 4371 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4372 ? Arg.getAsDecl() 4373 : nullptr; 4374 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4375 getDerived().getBaseLocation(), D)) 4376 : nullptr; 4377 if (D && !NewD) 4378 return true; 4379 4380 if (NewT == T && D == NewD) 4381 Output = Input; 4382 else if (Arg.getKind() == TemplateArgument::Integral) 4383 Output = TemplateArgumentLoc( 4384 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4385 TemplateArgumentLocInfo()); 4386 else if (Arg.getKind() == TemplateArgument::NullPtr) 4387 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4388 TemplateArgumentLocInfo()); 4389 else 4390 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4391 TemplateArgumentLocInfo()); 4392 4393 return false; 4394 } 4395 4396 case TemplateArgument::Type: { 4397 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4398 if (!DI) 4399 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4400 4401 DI = getDerived().TransformType(DI); 4402 if (!DI) 4403 return true; 4404 4405 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4406 return false; 4407 } 4408 4409 case TemplateArgument::Template: { 4410 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4411 if (QualifierLoc) { 4412 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4413 if (!QualifierLoc) 4414 return true; 4415 } 4416 4417 CXXScopeSpec SS; 4418 SS.Adopt(QualifierLoc); 4419 TemplateName Template = getDerived().TransformTemplateName( 4420 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4421 if (Template.isNull()) 4422 return true; 4423 4424 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4425 QualifierLoc, Input.getTemplateNameLoc()); 4426 return false; 4427 } 4428 4429 case TemplateArgument::TemplateExpansion: 4430 llvm_unreachable("Caller should expand pack expansions"); 4431 4432 case TemplateArgument::Expression: { 4433 // Template argument expressions are constant expressions. 4434 EnterExpressionEvaluationContext Unevaluated( 4435 getSema(), 4436 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4437 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4438 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4439 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4440 4441 Expr *InputExpr = Input.getSourceExpression(); 4442 if (!InputExpr) 4443 InputExpr = Input.getArgument().getAsExpr(); 4444 4445 ExprResult E = getDerived().TransformExpr(InputExpr); 4446 E = SemaRef.ActOnConstantExpression(E); 4447 if (E.isInvalid()) 4448 return true; 4449 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4450 return false; 4451 } 4452 } 4453 4454 // Work around bogus GCC warning 4455 return true; 4456 } 4457 4458 /// Iterator adaptor that invents template argument location information 4459 /// for each of the template arguments in its underlying iterator. 4460 template<typename Derived, typename InputIterator> 4461 class TemplateArgumentLocInventIterator { 4462 TreeTransform<Derived> &Self; 4463 InputIterator Iter; 4464 4465 public: 4466 typedef TemplateArgumentLoc value_type; 4467 typedef TemplateArgumentLoc reference; 4468 typedef typename std::iterator_traits<InputIterator>::difference_type 4469 difference_type; 4470 typedef std::input_iterator_tag iterator_category; 4471 4472 class pointer { 4473 TemplateArgumentLoc Arg; 4474 4475 public: 4476 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4477 4478 const TemplateArgumentLoc *operator->() const { return &Arg; } 4479 }; 4480 4481 TemplateArgumentLocInventIterator() { } 4482 4483 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4484 InputIterator Iter) 4485 : Self(Self), Iter(Iter) { } 4486 4487 TemplateArgumentLocInventIterator &operator++() { 4488 ++Iter; 4489 return *this; 4490 } 4491 4492 TemplateArgumentLocInventIterator operator++(int) { 4493 TemplateArgumentLocInventIterator Old(*this); 4494 ++(*this); 4495 return Old; 4496 } 4497 4498 reference operator*() const { 4499 TemplateArgumentLoc Result; 4500 Self.InventTemplateArgumentLoc(*Iter, Result); 4501 return Result; 4502 } 4503 4504 pointer operator->() const { return pointer(**this); } 4505 4506 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4507 const TemplateArgumentLocInventIterator &Y) { 4508 return X.Iter == Y.Iter; 4509 } 4510 4511 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4512 const TemplateArgumentLocInventIterator &Y) { 4513 return X.Iter != Y.Iter; 4514 } 4515 }; 4516 4517 template<typename Derived> 4518 template<typename InputIterator> 4519 bool TreeTransform<Derived>::TransformTemplateArguments( 4520 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4521 bool Uneval) { 4522 for (; First != Last; ++First) { 4523 TemplateArgumentLoc Out; 4524 TemplateArgumentLoc In = *First; 4525 4526 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4527 // Unpack argument packs, which we translate them into separate 4528 // arguments. 4529 // FIXME: We could do much better if we could guarantee that the 4530 // TemplateArgumentLocInfo for the pack expansion would be usable for 4531 // all of the template arguments in the argument pack. 4532 typedef TemplateArgumentLocInventIterator<Derived, 4533 TemplateArgument::pack_iterator> 4534 PackLocIterator; 4535 if (TransformTemplateArguments(PackLocIterator(*this, 4536 In.getArgument().pack_begin()), 4537 PackLocIterator(*this, 4538 In.getArgument().pack_end()), 4539 Outputs, Uneval)) 4540 return true; 4541 4542 continue; 4543 } 4544 4545 if (In.getArgument().isPackExpansion()) { 4546 // We have a pack expansion, for which we will be substituting into 4547 // the pattern. 4548 SourceLocation Ellipsis; 4549 Optional<unsigned> OrigNumExpansions; 4550 TemplateArgumentLoc Pattern 4551 = getSema().getTemplateArgumentPackExpansionPattern( 4552 In, Ellipsis, OrigNumExpansions); 4553 4554 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4555 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4556 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4557 4558 // Determine whether the set of unexpanded parameter packs can and should 4559 // be expanded. 4560 bool Expand = true; 4561 bool RetainExpansion = false; 4562 Optional<unsigned> NumExpansions = OrigNumExpansions; 4563 if (getDerived().TryExpandParameterPacks(Ellipsis, 4564 Pattern.getSourceRange(), 4565 Unexpanded, 4566 Expand, 4567 RetainExpansion, 4568 NumExpansions)) 4569 return true; 4570 4571 if (!Expand) { 4572 // The transform has determined that we should perform a simple 4573 // transformation on the pack expansion, producing another pack 4574 // expansion. 4575 TemplateArgumentLoc OutPattern; 4576 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4577 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4578 return true; 4579 4580 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4581 NumExpansions); 4582 if (Out.getArgument().isNull()) 4583 return true; 4584 4585 Outputs.addArgument(Out); 4586 continue; 4587 } 4588 4589 // The transform has determined that we should perform an elementwise 4590 // expansion of the pattern. Do so. 4591 for (unsigned I = 0; I != *NumExpansions; ++I) { 4592 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4593 4594 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4595 return true; 4596 4597 if (Out.getArgument().containsUnexpandedParameterPack()) { 4598 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4599 OrigNumExpansions); 4600 if (Out.getArgument().isNull()) 4601 return true; 4602 } 4603 4604 Outputs.addArgument(Out); 4605 } 4606 4607 // If we're supposed to retain a pack expansion, do so by temporarily 4608 // forgetting the partially-substituted parameter pack. 4609 if (RetainExpansion) { 4610 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4611 4612 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4613 return true; 4614 4615 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4616 OrigNumExpansions); 4617 if (Out.getArgument().isNull()) 4618 return true; 4619 4620 Outputs.addArgument(Out); 4621 } 4622 4623 continue; 4624 } 4625 4626 // The simple case: 4627 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4628 return true; 4629 4630 Outputs.addArgument(Out); 4631 } 4632 4633 return false; 4634 4635 } 4636 4637 //===----------------------------------------------------------------------===// 4638 // Type transformation 4639 //===----------------------------------------------------------------------===// 4640 4641 template<typename Derived> 4642 QualType TreeTransform<Derived>::TransformType(QualType T) { 4643 if (getDerived().AlreadyTransformed(T)) 4644 return T; 4645 4646 // Temporary workaround. All of these transformations should 4647 // eventually turn into transformations on TypeLocs. 4648 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4649 getDerived().getBaseLocation()); 4650 4651 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4652 4653 if (!NewDI) 4654 return QualType(); 4655 4656 return NewDI->getType(); 4657 } 4658 4659 template<typename Derived> 4660 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4661 // Refine the base location to the type's location. 4662 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4663 getDerived().getBaseEntity()); 4664 if (getDerived().AlreadyTransformed(DI->getType())) 4665 return DI; 4666 4667 TypeLocBuilder TLB; 4668 4669 TypeLoc TL = DI->getTypeLoc(); 4670 TLB.reserve(TL.getFullDataSize()); 4671 4672 QualType Result = getDerived().TransformType(TLB, TL); 4673 if (Result.isNull()) 4674 return nullptr; 4675 4676 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4677 } 4678 4679 template<typename Derived> 4680 QualType 4681 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4682 switch (T.getTypeLocClass()) { 4683 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4684 #define TYPELOC(CLASS, PARENT) \ 4685 case TypeLoc::CLASS: \ 4686 return getDerived().Transform##CLASS##Type(TLB, \ 4687 T.castAs<CLASS##TypeLoc>()); 4688 #include "clang/AST/TypeLocNodes.def" 4689 } 4690 4691 llvm_unreachable("unhandled type loc!"); 4692 } 4693 4694 template<typename Derived> 4695 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4696 if (!isa<DependentNameType>(T)) 4697 return TransformType(T); 4698 4699 if (getDerived().AlreadyTransformed(T)) 4700 return T; 4701 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4702 getDerived().getBaseLocation()); 4703 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4704 return NewDI ? NewDI->getType() : QualType(); 4705 } 4706 4707 template<typename Derived> 4708 TypeSourceInfo * 4709 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4710 if (!isa<DependentNameType>(DI->getType())) 4711 return TransformType(DI); 4712 4713 // Refine the base location to the type's location. 4714 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4715 getDerived().getBaseEntity()); 4716 if (getDerived().AlreadyTransformed(DI->getType())) 4717 return DI; 4718 4719 TypeLocBuilder TLB; 4720 4721 TypeLoc TL = DI->getTypeLoc(); 4722 TLB.reserve(TL.getFullDataSize()); 4723 4724 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4725 if (QTL) 4726 TL = QTL.getUnqualifiedLoc(); 4727 4728 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4729 4730 QualType Result = getDerived().TransformDependentNameType( 4731 TLB, DNTL, /*DeducedTSTContext*/true); 4732 if (Result.isNull()) 4733 return nullptr; 4734 4735 if (QTL) { 4736 Result = getDerived().RebuildQualifiedType(Result, QTL); 4737 if (Result.isNull()) 4738 return nullptr; 4739 TLB.TypeWasModifiedSafely(Result); 4740 } 4741 4742 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4743 } 4744 4745 template<typename Derived> 4746 QualType 4747 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4748 QualifiedTypeLoc T) { 4749 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4750 if (Result.isNull()) 4751 return QualType(); 4752 4753 Result = getDerived().RebuildQualifiedType(Result, T); 4754 4755 if (Result.isNull()) 4756 return QualType(); 4757 4758 // RebuildQualifiedType might have updated the type, but not in a way 4759 // that invalidates the TypeLoc. (There's no location information for 4760 // qualifiers.) 4761 TLB.TypeWasModifiedSafely(Result); 4762 4763 return Result; 4764 } 4765 4766 template <typename Derived> 4767 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4768 QualifiedTypeLoc TL) { 4769 4770 SourceLocation Loc = TL.getBeginLoc(); 4771 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4772 4773 if ((T.getAddressSpace() != LangAS::Default && 4774 Quals.getAddressSpace() != LangAS::Default) && 4775 T.getAddressSpace() != Quals.getAddressSpace()) { 4776 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4777 << TL.getType() << T; 4778 return QualType(); 4779 } 4780 4781 // C++ [dcl.fct]p7: 4782 // [When] adding cv-qualifications on top of the function type [...] the 4783 // cv-qualifiers are ignored. 4784 if (T->isFunctionType()) { 4785 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4786 Quals.getAddressSpace()); 4787 return T; 4788 } 4789 4790 // C++ [dcl.ref]p1: 4791 // when the cv-qualifiers are introduced through the use of a typedef-name 4792 // or decltype-specifier [...] the cv-qualifiers are ignored. 4793 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4794 // applied to a reference type. 4795 if (T->isReferenceType()) { 4796 // The only qualifier that applies to a reference type is restrict. 4797 if (!Quals.hasRestrict()) 4798 return T; 4799 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4800 } 4801 4802 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4803 // resulting type. 4804 if (Quals.hasObjCLifetime()) { 4805 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4806 Quals.removeObjCLifetime(); 4807 else if (T.getObjCLifetime()) { 4808 // Objective-C ARC: 4809 // A lifetime qualifier applied to a substituted template parameter 4810 // overrides the lifetime qualifier from the template argument. 4811 const AutoType *AutoTy; 4812 if (const SubstTemplateTypeParmType *SubstTypeParam 4813 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4814 QualType Replacement = SubstTypeParam->getReplacementType(); 4815 Qualifiers Qs = Replacement.getQualifiers(); 4816 Qs.removeObjCLifetime(); 4817 Replacement = SemaRef.Context.getQualifiedType( 4818 Replacement.getUnqualifiedType(), Qs); 4819 T = SemaRef.Context.getSubstTemplateTypeParmType( 4820 SubstTypeParam->getReplacedParameter(), Replacement); 4821 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4822 // 'auto' types behave the same way as template parameters. 4823 QualType Deduced = AutoTy->getDeducedType(); 4824 Qualifiers Qs = Deduced.getQualifiers(); 4825 Qs.removeObjCLifetime(); 4826 Deduced = 4827 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4828 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4829 AutoTy->isDependentType(), 4830 /*isPack=*/false, 4831 AutoTy->getTypeConstraintConcept(), 4832 AutoTy->getTypeConstraintArguments()); 4833 } else { 4834 // Otherwise, complain about the addition of a qualifier to an 4835 // already-qualified type. 4836 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4837 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4838 Quals.removeObjCLifetime(); 4839 } 4840 } 4841 } 4842 4843 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4844 } 4845 4846 template<typename Derived> 4847 TypeLoc 4848 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4849 QualType ObjectType, 4850 NamedDecl *UnqualLookup, 4851 CXXScopeSpec &SS) { 4852 if (getDerived().AlreadyTransformed(TL.getType())) 4853 return TL; 4854 4855 TypeSourceInfo *TSI = 4856 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4857 if (TSI) 4858 return TSI->getTypeLoc(); 4859 return TypeLoc(); 4860 } 4861 4862 template<typename Derived> 4863 TypeSourceInfo * 4864 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4865 QualType ObjectType, 4866 NamedDecl *UnqualLookup, 4867 CXXScopeSpec &SS) { 4868 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4869 return TSInfo; 4870 4871 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4872 UnqualLookup, SS); 4873 } 4874 4875 template <typename Derived> 4876 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4877 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4878 CXXScopeSpec &SS) { 4879 QualType T = TL.getType(); 4880 assert(!getDerived().AlreadyTransformed(T)); 4881 4882 TypeLocBuilder TLB; 4883 QualType Result; 4884 4885 if (isa<TemplateSpecializationType>(T)) { 4886 TemplateSpecializationTypeLoc SpecTL = 4887 TL.castAs<TemplateSpecializationTypeLoc>(); 4888 4889 TemplateName Template = getDerived().TransformTemplateName( 4890 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4891 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4892 if (Template.isNull()) 4893 return nullptr; 4894 4895 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4896 Template); 4897 } else if (isa<DependentTemplateSpecializationType>(T)) { 4898 DependentTemplateSpecializationTypeLoc SpecTL = 4899 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4900 4901 TemplateName Template 4902 = getDerived().RebuildTemplateName(SS, 4903 SpecTL.getTemplateKeywordLoc(), 4904 *SpecTL.getTypePtr()->getIdentifier(), 4905 SpecTL.getTemplateNameLoc(), 4906 ObjectType, UnqualLookup, 4907 /*AllowInjectedClassName*/true); 4908 if (Template.isNull()) 4909 return nullptr; 4910 4911 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4912 SpecTL, 4913 Template, 4914 SS); 4915 } else { 4916 // Nothing special needs to be done for these. 4917 Result = getDerived().TransformType(TLB, TL); 4918 } 4919 4920 if (Result.isNull()) 4921 return nullptr; 4922 4923 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4924 } 4925 4926 template <class TyLoc> static inline 4927 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4928 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4929 NewT.setNameLoc(T.getNameLoc()); 4930 return T.getType(); 4931 } 4932 4933 template<typename Derived> 4934 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4935 BuiltinTypeLoc T) { 4936 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4937 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4938 if (T.needsExtraLocalData()) 4939 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4940 return T.getType(); 4941 } 4942 4943 template<typename Derived> 4944 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4945 ComplexTypeLoc T) { 4946 // FIXME: recurse? 4947 return TransformTypeSpecType(TLB, T); 4948 } 4949 4950 template <typename Derived> 4951 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4952 AdjustedTypeLoc TL) { 4953 // Adjustments applied during transformation are handled elsewhere. 4954 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4955 } 4956 4957 template<typename Derived> 4958 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4959 DecayedTypeLoc TL) { 4960 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4961 if (OriginalType.isNull()) 4962 return QualType(); 4963 4964 QualType Result = TL.getType(); 4965 if (getDerived().AlwaysRebuild() || 4966 OriginalType != TL.getOriginalLoc().getType()) 4967 Result = SemaRef.Context.getDecayedType(OriginalType); 4968 TLB.push<DecayedTypeLoc>(Result); 4969 // Nothing to set for DecayedTypeLoc. 4970 return Result; 4971 } 4972 4973 template<typename Derived> 4974 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4975 PointerTypeLoc TL) { 4976 QualType PointeeType 4977 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4978 if (PointeeType.isNull()) 4979 return QualType(); 4980 4981 QualType Result = TL.getType(); 4982 if (PointeeType->getAs<ObjCObjectType>()) { 4983 // A dependent pointer type 'T *' has is being transformed such 4984 // that an Objective-C class type is being replaced for 'T'. The 4985 // resulting pointer type is an ObjCObjectPointerType, not a 4986 // PointerType. 4987 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4988 4989 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4990 NewT.setStarLoc(TL.getStarLoc()); 4991 return Result; 4992 } 4993 4994 if (getDerived().AlwaysRebuild() || 4995 PointeeType != TL.getPointeeLoc().getType()) { 4996 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4997 if (Result.isNull()) 4998 return QualType(); 4999 } 5000 5001 // Objective-C ARC can add lifetime qualifiers to the type that we're 5002 // pointing to. 5003 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5004 5005 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5006 NewT.setSigilLoc(TL.getSigilLoc()); 5007 return Result; 5008 } 5009 5010 template<typename Derived> 5011 QualType 5012 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5013 BlockPointerTypeLoc TL) { 5014 QualType PointeeType 5015 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5016 if (PointeeType.isNull()) 5017 return QualType(); 5018 5019 QualType Result = TL.getType(); 5020 if (getDerived().AlwaysRebuild() || 5021 PointeeType != TL.getPointeeLoc().getType()) { 5022 Result = getDerived().RebuildBlockPointerType(PointeeType, 5023 TL.getSigilLoc()); 5024 if (Result.isNull()) 5025 return QualType(); 5026 } 5027 5028 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5029 NewT.setSigilLoc(TL.getSigilLoc()); 5030 return Result; 5031 } 5032 5033 /// Transforms a reference type. Note that somewhat paradoxically we 5034 /// don't care whether the type itself is an l-value type or an r-value 5035 /// type; we only care if the type was *written* as an l-value type 5036 /// or an r-value type. 5037 template<typename Derived> 5038 QualType 5039 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5040 ReferenceTypeLoc TL) { 5041 const ReferenceType *T = TL.getTypePtr(); 5042 5043 // Note that this works with the pointee-as-written. 5044 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5045 if (PointeeType.isNull()) 5046 return QualType(); 5047 5048 QualType Result = TL.getType(); 5049 if (getDerived().AlwaysRebuild() || 5050 PointeeType != T->getPointeeTypeAsWritten()) { 5051 Result = getDerived().RebuildReferenceType(PointeeType, 5052 T->isSpelledAsLValue(), 5053 TL.getSigilLoc()); 5054 if (Result.isNull()) 5055 return QualType(); 5056 } 5057 5058 // Objective-C ARC can add lifetime qualifiers to the type that we're 5059 // referring to. 5060 TLB.TypeWasModifiedSafely( 5061 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5062 5063 // r-value references can be rebuilt as l-value references. 5064 ReferenceTypeLoc NewTL; 5065 if (isa<LValueReferenceType>(Result)) 5066 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5067 else 5068 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5069 NewTL.setSigilLoc(TL.getSigilLoc()); 5070 5071 return Result; 5072 } 5073 5074 template<typename Derived> 5075 QualType 5076 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5077 LValueReferenceTypeLoc TL) { 5078 return TransformReferenceType(TLB, TL); 5079 } 5080 5081 template<typename Derived> 5082 QualType 5083 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5084 RValueReferenceTypeLoc TL) { 5085 return TransformReferenceType(TLB, TL); 5086 } 5087 5088 template<typename Derived> 5089 QualType 5090 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5091 MemberPointerTypeLoc TL) { 5092 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5093 if (PointeeType.isNull()) 5094 return QualType(); 5095 5096 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5097 TypeSourceInfo *NewClsTInfo = nullptr; 5098 if (OldClsTInfo) { 5099 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5100 if (!NewClsTInfo) 5101 return QualType(); 5102 } 5103 5104 const MemberPointerType *T = TL.getTypePtr(); 5105 QualType OldClsType = QualType(T->getClass(), 0); 5106 QualType NewClsType; 5107 if (NewClsTInfo) 5108 NewClsType = NewClsTInfo->getType(); 5109 else { 5110 NewClsType = getDerived().TransformType(OldClsType); 5111 if (NewClsType.isNull()) 5112 return QualType(); 5113 } 5114 5115 QualType Result = TL.getType(); 5116 if (getDerived().AlwaysRebuild() || 5117 PointeeType != T->getPointeeType() || 5118 NewClsType != OldClsType) { 5119 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5120 TL.getStarLoc()); 5121 if (Result.isNull()) 5122 return QualType(); 5123 } 5124 5125 // If we had to adjust the pointee type when building a member pointer, make 5126 // sure to push TypeLoc info for it. 5127 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5128 if (MPT && PointeeType != MPT->getPointeeType()) { 5129 assert(isa<AdjustedType>(MPT->getPointeeType())); 5130 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5131 } 5132 5133 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5134 NewTL.setSigilLoc(TL.getSigilLoc()); 5135 NewTL.setClassTInfo(NewClsTInfo); 5136 5137 return Result; 5138 } 5139 5140 template<typename Derived> 5141 QualType 5142 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5143 ConstantArrayTypeLoc TL) { 5144 const ConstantArrayType *T = TL.getTypePtr(); 5145 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5146 if (ElementType.isNull()) 5147 return QualType(); 5148 5149 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5150 Expr *OldSize = TL.getSizeExpr(); 5151 if (!OldSize) 5152 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5153 Expr *NewSize = nullptr; 5154 if (OldSize) { 5155 EnterExpressionEvaluationContext Unevaluated( 5156 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5157 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5158 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5159 } 5160 5161 QualType Result = TL.getType(); 5162 if (getDerived().AlwaysRebuild() || 5163 ElementType != T->getElementType() || 5164 (T->getSizeExpr() && NewSize != OldSize)) { 5165 Result = getDerived().RebuildConstantArrayType(ElementType, 5166 T->getSizeModifier(), 5167 T->getSize(), NewSize, 5168 T->getIndexTypeCVRQualifiers(), 5169 TL.getBracketsRange()); 5170 if (Result.isNull()) 5171 return QualType(); 5172 } 5173 5174 // We might have either a ConstantArrayType or a VariableArrayType now: 5175 // a ConstantArrayType is allowed to have an element type which is a 5176 // VariableArrayType if the type is dependent. Fortunately, all array 5177 // types have the same location layout. 5178 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5179 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5180 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5181 NewTL.setSizeExpr(NewSize); 5182 5183 return Result; 5184 } 5185 5186 template<typename Derived> 5187 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5188 TypeLocBuilder &TLB, 5189 IncompleteArrayTypeLoc TL) { 5190 const IncompleteArrayType *T = TL.getTypePtr(); 5191 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5192 if (ElementType.isNull()) 5193 return QualType(); 5194 5195 QualType Result = TL.getType(); 5196 if (getDerived().AlwaysRebuild() || 5197 ElementType != T->getElementType()) { 5198 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5199 T->getSizeModifier(), 5200 T->getIndexTypeCVRQualifiers(), 5201 TL.getBracketsRange()); 5202 if (Result.isNull()) 5203 return QualType(); 5204 } 5205 5206 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5207 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5208 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5209 NewTL.setSizeExpr(nullptr); 5210 5211 return Result; 5212 } 5213 5214 template<typename Derived> 5215 QualType 5216 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5217 VariableArrayTypeLoc TL) { 5218 const VariableArrayType *T = TL.getTypePtr(); 5219 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5220 if (ElementType.isNull()) 5221 return QualType(); 5222 5223 ExprResult SizeResult; 5224 { 5225 EnterExpressionEvaluationContext Context( 5226 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5227 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5228 } 5229 if (SizeResult.isInvalid()) 5230 return QualType(); 5231 SizeResult = 5232 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 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 != T->getSizeExpr()) { 5242 Result = getDerived().RebuildVariableArrayType(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 constant size array now, but fortunately it has the same 5252 // 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 5263 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5264 DependentSizedArrayTypeLoc TL) { 5265 const DependentSizedArrayType *T = TL.getTypePtr(); 5266 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5267 if (ElementType.isNull()) 5268 return QualType(); 5269 5270 // Array bounds are constant expressions. 5271 EnterExpressionEvaluationContext Unevaluated( 5272 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5273 5274 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5275 Expr *origSize = TL.getSizeExpr(); 5276 if (!origSize) origSize = T->getSizeExpr(); 5277 5278 ExprResult sizeResult 5279 = getDerived().TransformExpr(origSize); 5280 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5281 if (sizeResult.isInvalid()) 5282 return QualType(); 5283 5284 Expr *size = sizeResult.get(); 5285 5286 QualType Result = TL.getType(); 5287 if (getDerived().AlwaysRebuild() || 5288 ElementType != T->getElementType() || 5289 size != origSize) { 5290 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5291 T->getSizeModifier(), 5292 size, 5293 T->getIndexTypeCVRQualifiers(), 5294 TL.getBracketsRange()); 5295 if (Result.isNull()) 5296 return QualType(); 5297 } 5298 5299 // We might have any sort of array type now, but fortunately they 5300 // all have the same location layout. 5301 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5302 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5303 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5304 NewTL.setSizeExpr(size); 5305 5306 return Result; 5307 } 5308 5309 template <typename Derived> 5310 QualType TreeTransform<Derived>::TransformDependentVectorType( 5311 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5312 const DependentVectorType *T = TL.getTypePtr(); 5313 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5314 if (ElementType.isNull()) 5315 return QualType(); 5316 5317 EnterExpressionEvaluationContext Unevaluated( 5318 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5319 5320 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5321 Size = SemaRef.ActOnConstantExpression(Size); 5322 if (Size.isInvalid()) 5323 return QualType(); 5324 5325 QualType Result = TL.getType(); 5326 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5327 Size.get() != T->getSizeExpr()) { 5328 Result = getDerived().RebuildDependentVectorType( 5329 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5330 if (Result.isNull()) 5331 return QualType(); 5332 } 5333 5334 // Result might be dependent or not. 5335 if (isa<DependentVectorType>(Result)) { 5336 DependentVectorTypeLoc NewTL = 5337 TLB.push<DependentVectorTypeLoc>(Result); 5338 NewTL.setNameLoc(TL.getNameLoc()); 5339 } else { 5340 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5341 NewTL.setNameLoc(TL.getNameLoc()); 5342 } 5343 5344 return Result; 5345 } 5346 5347 template<typename Derived> 5348 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5349 TypeLocBuilder &TLB, 5350 DependentSizedExtVectorTypeLoc TL) { 5351 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5352 5353 // FIXME: ext vector locs should be nested 5354 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5355 if (ElementType.isNull()) 5356 return QualType(); 5357 5358 // Vector sizes are constant expressions. 5359 EnterExpressionEvaluationContext Unevaluated( 5360 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5361 5362 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5363 Size = SemaRef.ActOnConstantExpression(Size); 5364 if (Size.isInvalid()) 5365 return QualType(); 5366 5367 QualType Result = TL.getType(); 5368 if (getDerived().AlwaysRebuild() || 5369 ElementType != T->getElementType() || 5370 Size.get() != T->getSizeExpr()) { 5371 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5372 Size.get(), 5373 T->getAttributeLoc()); 5374 if (Result.isNull()) 5375 return QualType(); 5376 } 5377 5378 // Result might be dependent or not. 5379 if (isa<DependentSizedExtVectorType>(Result)) { 5380 DependentSizedExtVectorTypeLoc NewTL 5381 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5382 NewTL.setNameLoc(TL.getNameLoc()); 5383 } else { 5384 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5385 NewTL.setNameLoc(TL.getNameLoc()); 5386 } 5387 5388 return Result; 5389 } 5390 5391 template <typename Derived> 5392 QualType 5393 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5394 ConstantMatrixTypeLoc TL) { 5395 const ConstantMatrixType *T = TL.getTypePtr(); 5396 QualType ElementType = getDerived().TransformType(T->getElementType()); 5397 if (ElementType.isNull()) 5398 return QualType(); 5399 5400 QualType Result = TL.getType(); 5401 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5402 Result = getDerived().RebuildConstantMatrixType( 5403 ElementType, T->getNumRows(), T->getNumColumns()); 5404 if (Result.isNull()) 5405 return QualType(); 5406 } 5407 5408 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5409 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5410 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5411 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5412 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5413 5414 return Result; 5415 } 5416 5417 template <typename Derived> 5418 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5419 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5420 const DependentSizedMatrixType *T = TL.getTypePtr(); 5421 5422 QualType ElementType = getDerived().TransformType(T->getElementType()); 5423 if (ElementType.isNull()) { 5424 return QualType(); 5425 } 5426 5427 // Matrix dimensions are constant expressions. 5428 EnterExpressionEvaluationContext Unevaluated( 5429 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5430 5431 Expr *origRows = TL.getAttrRowOperand(); 5432 if (!origRows) 5433 origRows = T->getRowExpr(); 5434 Expr *origColumns = TL.getAttrColumnOperand(); 5435 if (!origColumns) 5436 origColumns = T->getColumnExpr(); 5437 5438 ExprResult rowResult = getDerived().TransformExpr(origRows); 5439 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5440 if (rowResult.isInvalid()) 5441 return QualType(); 5442 5443 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5444 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5445 if (columnResult.isInvalid()) 5446 return QualType(); 5447 5448 Expr *rows = rowResult.get(); 5449 Expr *columns = columnResult.get(); 5450 5451 QualType Result = TL.getType(); 5452 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5453 rows != origRows || columns != origColumns) { 5454 Result = getDerived().RebuildDependentSizedMatrixType( 5455 ElementType, rows, columns, T->getAttributeLoc()); 5456 5457 if (Result.isNull()) 5458 return QualType(); 5459 } 5460 5461 // We might have any sort of matrix type now, but fortunately they 5462 // all have the same location layout. 5463 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5464 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5465 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5466 NewTL.setAttrRowOperand(rows); 5467 NewTL.setAttrColumnOperand(columns); 5468 return Result; 5469 } 5470 5471 template <typename Derived> 5472 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5473 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5474 const DependentAddressSpaceType *T = TL.getTypePtr(); 5475 5476 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5477 5478 if (pointeeType.isNull()) 5479 return QualType(); 5480 5481 // Address spaces are constant expressions. 5482 EnterExpressionEvaluationContext Unevaluated( 5483 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5484 5485 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5486 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5487 if (AddrSpace.isInvalid()) 5488 return QualType(); 5489 5490 QualType Result = TL.getType(); 5491 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5492 AddrSpace.get() != T->getAddrSpaceExpr()) { 5493 Result = getDerived().RebuildDependentAddressSpaceType( 5494 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5495 if (Result.isNull()) 5496 return QualType(); 5497 } 5498 5499 // Result might be dependent or not. 5500 if (isa<DependentAddressSpaceType>(Result)) { 5501 DependentAddressSpaceTypeLoc NewTL = 5502 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5503 5504 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5505 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5506 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5507 5508 } else { 5509 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5510 Result, getDerived().getBaseLocation()); 5511 TransformType(TLB, DI->getTypeLoc()); 5512 } 5513 5514 return Result; 5515 } 5516 5517 template <typename Derived> 5518 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5519 VectorTypeLoc TL) { 5520 const VectorType *T = TL.getTypePtr(); 5521 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5522 if (ElementType.isNull()) 5523 return QualType(); 5524 5525 QualType Result = TL.getType(); 5526 if (getDerived().AlwaysRebuild() || 5527 ElementType != T->getElementType()) { 5528 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5529 T->getVectorKind()); 5530 if (Result.isNull()) 5531 return QualType(); 5532 } 5533 5534 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5535 NewTL.setNameLoc(TL.getNameLoc()); 5536 5537 return Result; 5538 } 5539 5540 template<typename Derived> 5541 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5542 ExtVectorTypeLoc TL) { 5543 const VectorType *T = TL.getTypePtr(); 5544 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5545 if (ElementType.isNull()) 5546 return QualType(); 5547 5548 QualType Result = TL.getType(); 5549 if (getDerived().AlwaysRebuild() || 5550 ElementType != T->getElementType()) { 5551 Result = getDerived().RebuildExtVectorType(ElementType, 5552 T->getNumElements(), 5553 /*FIXME*/ SourceLocation()); 5554 if (Result.isNull()) 5555 return QualType(); 5556 } 5557 5558 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5559 NewTL.setNameLoc(TL.getNameLoc()); 5560 5561 return Result; 5562 } 5563 5564 template <typename Derived> 5565 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5566 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5567 bool ExpectParameterPack) { 5568 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5569 TypeSourceInfo *NewDI = nullptr; 5570 5571 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5572 // If we're substituting into a pack expansion type and we know the 5573 // length we want to expand to, just substitute for the pattern. 5574 TypeLoc OldTL = OldDI->getTypeLoc(); 5575 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5576 5577 TypeLocBuilder TLB; 5578 TypeLoc NewTL = OldDI->getTypeLoc(); 5579 TLB.reserve(NewTL.getFullDataSize()); 5580 5581 QualType Result = getDerived().TransformType(TLB, 5582 OldExpansionTL.getPatternLoc()); 5583 if (Result.isNull()) 5584 return nullptr; 5585 5586 Result = RebuildPackExpansionType(Result, 5587 OldExpansionTL.getPatternLoc().getSourceRange(), 5588 OldExpansionTL.getEllipsisLoc(), 5589 NumExpansions); 5590 if (Result.isNull()) 5591 return nullptr; 5592 5593 PackExpansionTypeLoc NewExpansionTL 5594 = TLB.push<PackExpansionTypeLoc>(Result); 5595 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5596 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5597 } else 5598 NewDI = getDerived().TransformType(OldDI); 5599 if (!NewDI) 5600 return nullptr; 5601 5602 if (NewDI == OldDI && indexAdjustment == 0) 5603 return OldParm; 5604 5605 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5606 OldParm->getDeclContext(), 5607 OldParm->getInnerLocStart(), 5608 OldParm->getLocation(), 5609 OldParm->getIdentifier(), 5610 NewDI->getType(), 5611 NewDI, 5612 OldParm->getStorageClass(), 5613 /* DefArg */ nullptr); 5614 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5615 OldParm->getFunctionScopeIndex() + indexAdjustment); 5616 transformedLocalDecl(OldParm, {newParm}); 5617 return newParm; 5618 } 5619 5620 template <typename Derived> 5621 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5622 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5623 const QualType *ParamTypes, 5624 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5625 SmallVectorImpl<QualType> &OutParamTypes, 5626 SmallVectorImpl<ParmVarDecl *> *PVars, 5627 Sema::ExtParameterInfoBuilder &PInfos) { 5628 int indexAdjustment = 0; 5629 5630 unsigned NumParams = Params.size(); 5631 for (unsigned i = 0; i != NumParams; ++i) { 5632 if (ParmVarDecl *OldParm = Params[i]) { 5633 assert(OldParm->getFunctionScopeIndex() == i); 5634 5635 Optional<unsigned> NumExpansions; 5636 ParmVarDecl *NewParm = nullptr; 5637 if (OldParm->isParameterPack()) { 5638 // We have a function parameter pack that may need to be expanded. 5639 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5640 5641 // Find the parameter packs that could be expanded. 5642 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5643 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5644 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5645 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5646 5647 // Determine whether we should expand the parameter packs. 5648 bool ShouldExpand = false; 5649 bool RetainExpansion = false; 5650 Optional<unsigned> OrigNumExpansions; 5651 if (Unexpanded.size() > 0) { 5652 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5653 NumExpansions = OrigNumExpansions; 5654 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5655 Pattern.getSourceRange(), 5656 Unexpanded, 5657 ShouldExpand, 5658 RetainExpansion, 5659 NumExpansions)) { 5660 return true; 5661 } 5662 } else { 5663 #ifndef NDEBUG 5664 const AutoType *AT = 5665 Pattern.getType().getTypePtr()->getContainedAutoType(); 5666 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5667 "Could not find parameter packs or undeduced auto type!"); 5668 #endif 5669 } 5670 5671 if (ShouldExpand) { 5672 // Expand the function parameter pack into multiple, separate 5673 // parameters. 5674 getDerived().ExpandingFunctionParameterPack(OldParm); 5675 for (unsigned I = 0; I != *NumExpansions; ++I) { 5676 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5677 ParmVarDecl *NewParm 5678 = getDerived().TransformFunctionTypeParam(OldParm, 5679 indexAdjustment++, 5680 OrigNumExpansions, 5681 /*ExpectParameterPack=*/false); 5682 if (!NewParm) 5683 return true; 5684 5685 if (ParamInfos) 5686 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5687 OutParamTypes.push_back(NewParm->getType()); 5688 if (PVars) 5689 PVars->push_back(NewParm); 5690 } 5691 5692 // If we're supposed to retain a pack expansion, do so by temporarily 5693 // forgetting the partially-substituted parameter pack. 5694 if (RetainExpansion) { 5695 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5696 ParmVarDecl *NewParm 5697 = getDerived().TransformFunctionTypeParam(OldParm, 5698 indexAdjustment++, 5699 OrigNumExpansions, 5700 /*ExpectParameterPack=*/false); 5701 if (!NewParm) 5702 return true; 5703 5704 if (ParamInfos) 5705 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5706 OutParamTypes.push_back(NewParm->getType()); 5707 if (PVars) 5708 PVars->push_back(NewParm); 5709 } 5710 5711 // The next parameter should have the same adjustment as the 5712 // last thing we pushed, but we post-incremented indexAdjustment 5713 // on every push. Also, if we push nothing, the adjustment should 5714 // go down by one. 5715 indexAdjustment--; 5716 5717 // We're done with the pack expansion. 5718 continue; 5719 } 5720 5721 // We'll substitute the parameter now without expanding the pack 5722 // expansion. 5723 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5724 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5725 indexAdjustment, 5726 NumExpansions, 5727 /*ExpectParameterPack=*/true); 5728 assert(NewParm->isParameterPack() && 5729 "Parameter pack no longer a parameter pack after " 5730 "transformation."); 5731 } else { 5732 NewParm = getDerived().TransformFunctionTypeParam( 5733 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5734 } 5735 5736 if (!NewParm) 5737 return true; 5738 5739 if (ParamInfos) 5740 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5741 OutParamTypes.push_back(NewParm->getType()); 5742 if (PVars) 5743 PVars->push_back(NewParm); 5744 continue; 5745 } 5746 5747 // Deal with the possibility that we don't have a parameter 5748 // declaration for this parameter. 5749 QualType OldType = ParamTypes[i]; 5750 bool IsPackExpansion = false; 5751 Optional<unsigned> NumExpansions; 5752 QualType NewType; 5753 if (const PackExpansionType *Expansion 5754 = dyn_cast<PackExpansionType>(OldType)) { 5755 // We have a function parameter pack that may need to be expanded. 5756 QualType Pattern = Expansion->getPattern(); 5757 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5758 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5759 5760 // Determine whether we should expand the parameter packs. 5761 bool ShouldExpand = false; 5762 bool RetainExpansion = false; 5763 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5764 Unexpanded, 5765 ShouldExpand, 5766 RetainExpansion, 5767 NumExpansions)) { 5768 return true; 5769 } 5770 5771 if (ShouldExpand) { 5772 // Expand the function parameter pack into multiple, separate 5773 // parameters. 5774 for (unsigned I = 0; I != *NumExpansions; ++I) { 5775 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5776 QualType NewType = getDerived().TransformType(Pattern); 5777 if (NewType.isNull()) 5778 return true; 5779 5780 if (NewType->containsUnexpandedParameterPack()) { 5781 NewType = 5782 getSema().getASTContext().getPackExpansionType(NewType, None); 5783 5784 if (NewType.isNull()) 5785 return true; 5786 } 5787 5788 if (ParamInfos) 5789 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5790 OutParamTypes.push_back(NewType); 5791 if (PVars) 5792 PVars->push_back(nullptr); 5793 } 5794 5795 // We're done with the pack expansion. 5796 continue; 5797 } 5798 5799 // If we're supposed to retain a pack expansion, do so by temporarily 5800 // forgetting the partially-substituted parameter pack. 5801 if (RetainExpansion) { 5802 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5803 QualType NewType = getDerived().TransformType(Pattern); 5804 if (NewType.isNull()) 5805 return true; 5806 5807 if (ParamInfos) 5808 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5809 OutParamTypes.push_back(NewType); 5810 if (PVars) 5811 PVars->push_back(nullptr); 5812 } 5813 5814 // We'll substitute the parameter now without expanding the pack 5815 // expansion. 5816 OldType = Expansion->getPattern(); 5817 IsPackExpansion = true; 5818 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5819 NewType = getDerived().TransformType(OldType); 5820 } else { 5821 NewType = getDerived().TransformType(OldType); 5822 } 5823 5824 if (NewType.isNull()) 5825 return true; 5826 5827 if (IsPackExpansion) 5828 NewType = getSema().Context.getPackExpansionType(NewType, 5829 NumExpansions); 5830 5831 if (ParamInfos) 5832 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5833 OutParamTypes.push_back(NewType); 5834 if (PVars) 5835 PVars->push_back(nullptr); 5836 } 5837 5838 #ifndef NDEBUG 5839 if (PVars) { 5840 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5841 if (ParmVarDecl *parm = (*PVars)[i]) 5842 assert(parm->getFunctionScopeIndex() == i); 5843 } 5844 #endif 5845 5846 return false; 5847 } 5848 5849 template<typename Derived> 5850 QualType 5851 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5852 FunctionProtoTypeLoc TL) { 5853 SmallVector<QualType, 4> ExceptionStorage; 5854 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5855 return getDerived().TransformFunctionProtoType( 5856 TLB, TL, nullptr, Qualifiers(), 5857 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5858 return This->getDerived().TransformExceptionSpec( 5859 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 5860 }); 5861 } 5862 5863 template<typename Derived> template<typename Fn> 5864 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5865 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5866 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5867 5868 // Transform the parameters and return type. 5869 // 5870 // We are required to instantiate the params and return type in source order. 5871 // When the function has a trailing return type, we instantiate the 5872 // parameters before the return type, since the return type can then refer 5873 // to the parameters themselves (via decltype, sizeof, etc.). 5874 // 5875 SmallVector<QualType, 4> ParamTypes; 5876 SmallVector<ParmVarDecl*, 4> ParamDecls; 5877 Sema::ExtParameterInfoBuilder ExtParamInfos; 5878 const FunctionProtoType *T = TL.getTypePtr(); 5879 5880 QualType ResultType; 5881 5882 if (T->hasTrailingReturn()) { 5883 if (getDerived().TransformFunctionTypeParams( 5884 TL.getBeginLoc(), TL.getParams(), 5885 TL.getTypePtr()->param_type_begin(), 5886 T->getExtParameterInfosOrNull(), 5887 ParamTypes, &ParamDecls, ExtParamInfos)) 5888 return QualType(); 5889 5890 { 5891 // C++11 [expr.prim.general]p3: 5892 // If a declaration declares a member function or member function 5893 // template of a class X, the expression this is a prvalue of type 5894 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5895 // and the end of the function-definition, member-declarator, or 5896 // declarator. 5897 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5898 5899 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5900 if (ResultType.isNull()) 5901 return QualType(); 5902 } 5903 } 5904 else { 5905 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5906 if (ResultType.isNull()) 5907 return QualType(); 5908 5909 if (getDerived().TransformFunctionTypeParams( 5910 TL.getBeginLoc(), TL.getParams(), 5911 TL.getTypePtr()->param_type_begin(), 5912 T->getExtParameterInfosOrNull(), 5913 ParamTypes, &ParamDecls, ExtParamInfos)) 5914 return QualType(); 5915 } 5916 5917 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5918 5919 bool EPIChanged = false; 5920 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5921 return QualType(); 5922 5923 // Handle extended parameter information. 5924 if (auto NewExtParamInfos = 5925 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5926 if (!EPI.ExtParameterInfos || 5927 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5928 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5929 EPIChanged = true; 5930 } 5931 EPI.ExtParameterInfos = NewExtParamInfos; 5932 } else if (EPI.ExtParameterInfos) { 5933 EPIChanged = true; 5934 EPI.ExtParameterInfos = nullptr; 5935 } 5936 5937 QualType Result = TL.getType(); 5938 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5939 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5940 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5941 if (Result.isNull()) 5942 return QualType(); 5943 } 5944 5945 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5946 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5947 NewTL.setLParenLoc(TL.getLParenLoc()); 5948 NewTL.setRParenLoc(TL.getRParenLoc()); 5949 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5950 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5951 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5952 NewTL.setParam(i, ParamDecls[i]); 5953 5954 return Result; 5955 } 5956 5957 template<typename Derived> 5958 bool TreeTransform<Derived>::TransformExceptionSpec( 5959 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5960 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5961 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5962 5963 // Instantiate a dynamic noexcept expression, if any. 5964 if (isComputedNoexcept(ESI.Type)) { 5965 EnterExpressionEvaluationContext Unevaluated( 5966 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5967 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5968 if (NoexceptExpr.isInvalid()) 5969 return true; 5970 5971 ExceptionSpecificationType EST = ESI.Type; 5972 NoexceptExpr = 5973 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 5974 if (NoexceptExpr.isInvalid()) 5975 return true; 5976 5977 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5978 Changed = true; 5979 ESI.NoexceptExpr = NoexceptExpr.get(); 5980 ESI.Type = EST; 5981 } 5982 5983 if (ESI.Type != EST_Dynamic) 5984 return false; 5985 5986 // Instantiate a dynamic exception specification's type. 5987 for (QualType T : ESI.Exceptions) { 5988 if (const PackExpansionType *PackExpansion = 5989 T->getAs<PackExpansionType>()) { 5990 Changed = true; 5991 5992 // We have a pack expansion. Instantiate it. 5993 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5994 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5995 Unexpanded); 5996 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5997 5998 // Determine whether the set of unexpanded parameter packs can and 5999 // should 6000 // be expanded. 6001 bool Expand = false; 6002 bool RetainExpansion = false; 6003 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6004 // FIXME: Track the location of the ellipsis (and track source location 6005 // information for the types in the exception specification in general). 6006 if (getDerived().TryExpandParameterPacks( 6007 Loc, SourceRange(), Unexpanded, Expand, 6008 RetainExpansion, NumExpansions)) 6009 return true; 6010 6011 if (!Expand) { 6012 // We can't expand this pack expansion into separate arguments yet; 6013 // just substitute into the pattern and create a new pack expansion 6014 // type. 6015 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6016 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6017 if (U.isNull()) 6018 return true; 6019 6020 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6021 Exceptions.push_back(U); 6022 continue; 6023 } 6024 6025 // Substitute into the pack expansion pattern for each slice of the 6026 // pack. 6027 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6028 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6029 6030 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6031 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6032 return true; 6033 6034 Exceptions.push_back(U); 6035 } 6036 } else { 6037 QualType U = getDerived().TransformType(T); 6038 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6039 return true; 6040 if (T != U) 6041 Changed = true; 6042 6043 Exceptions.push_back(U); 6044 } 6045 } 6046 6047 ESI.Exceptions = Exceptions; 6048 if (ESI.Exceptions.empty()) 6049 ESI.Type = EST_DynamicNone; 6050 return false; 6051 } 6052 6053 template<typename Derived> 6054 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6055 TypeLocBuilder &TLB, 6056 FunctionNoProtoTypeLoc TL) { 6057 const FunctionNoProtoType *T = TL.getTypePtr(); 6058 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6059 if (ResultType.isNull()) 6060 return QualType(); 6061 6062 QualType Result = TL.getType(); 6063 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6064 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6065 6066 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6067 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6068 NewTL.setLParenLoc(TL.getLParenLoc()); 6069 NewTL.setRParenLoc(TL.getRParenLoc()); 6070 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6071 6072 return Result; 6073 } 6074 6075 template<typename Derived> QualType 6076 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 6077 UnresolvedUsingTypeLoc TL) { 6078 const UnresolvedUsingType *T = TL.getTypePtr(); 6079 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6080 if (!D) 6081 return QualType(); 6082 6083 QualType Result = TL.getType(); 6084 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6085 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6086 if (Result.isNull()) 6087 return QualType(); 6088 } 6089 6090 // We might get an arbitrary type spec type back. We should at 6091 // least always get a type spec type, though. 6092 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6093 NewTL.setNameLoc(TL.getNameLoc()); 6094 6095 return Result; 6096 } 6097 6098 template<typename Derived> 6099 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6100 TypedefTypeLoc TL) { 6101 const TypedefType *T = TL.getTypePtr(); 6102 TypedefNameDecl *Typedef 6103 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6104 T->getDecl())); 6105 if (!Typedef) 6106 return QualType(); 6107 6108 QualType Result = TL.getType(); 6109 if (getDerived().AlwaysRebuild() || 6110 Typedef != T->getDecl()) { 6111 Result = getDerived().RebuildTypedefType(Typedef); 6112 if (Result.isNull()) 6113 return QualType(); 6114 } 6115 6116 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6117 NewTL.setNameLoc(TL.getNameLoc()); 6118 6119 return Result; 6120 } 6121 6122 template<typename Derived> 6123 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6124 TypeOfExprTypeLoc TL) { 6125 // typeof expressions are not potentially evaluated contexts 6126 EnterExpressionEvaluationContext Unevaluated( 6127 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6128 Sema::ReuseLambdaContextDecl); 6129 6130 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6131 if (E.isInvalid()) 6132 return QualType(); 6133 6134 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6135 if (E.isInvalid()) 6136 return QualType(); 6137 6138 QualType Result = TL.getType(); 6139 if (getDerived().AlwaysRebuild() || 6140 E.get() != TL.getUnderlyingExpr()) { 6141 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6142 if (Result.isNull()) 6143 return QualType(); 6144 } 6145 else E.get(); 6146 6147 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6148 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6149 NewTL.setLParenLoc(TL.getLParenLoc()); 6150 NewTL.setRParenLoc(TL.getRParenLoc()); 6151 6152 return Result; 6153 } 6154 6155 template<typename Derived> 6156 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6157 TypeOfTypeLoc TL) { 6158 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6159 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6160 if (!New_Under_TI) 6161 return QualType(); 6162 6163 QualType Result = TL.getType(); 6164 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6165 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6166 if (Result.isNull()) 6167 return QualType(); 6168 } 6169 6170 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6171 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6172 NewTL.setLParenLoc(TL.getLParenLoc()); 6173 NewTL.setRParenLoc(TL.getRParenLoc()); 6174 NewTL.setUnderlyingTInfo(New_Under_TI); 6175 6176 return Result; 6177 } 6178 6179 template<typename Derived> 6180 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6181 DecltypeTypeLoc TL) { 6182 const DecltypeType *T = TL.getTypePtr(); 6183 6184 // decltype expressions are not potentially evaluated contexts 6185 EnterExpressionEvaluationContext Unevaluated( 6186 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6187 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6188 6189 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6190 if (E.isInvalid()) 6191 return QualType(); 6192 6193 E = getSema().ActOnDecltypeExpression(E.get()); 6194 if (E.isInvalid()) 6195 return QualType(); 6196 6197 QualType Result = TL.getType(); 6198 if (getDerived().AlwaysRebuild() || 6199 E.get() != T->getUnderlyingExpr()) { 6200 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6201 if (Result.isNull()) 6202 return QualType(); 6203 } 6204 else E.get(); 6205 6206 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6207 NewTL.setNameLoc(TL.getNameLoc()); 6208 6209 return Result; 6210 } 6211 6212 template<typename Derived> 6213 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6214 TypeLocBuilder &TLB, 6215 UnaryTransformTypeLoc TL) { 6216 QualType Result = TL.getType(); 6217 if (Result->isDependentType()) { 6218 const UnaryTransformType *T = TL.getTypePtr(); 6219 QualType NewBase = 6220 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6221 Result = getDerived().RebuildUnaryTransformType(NewBase, 6222 T->getUTTKind(), 6223 TL.getKWLoc()); 6224 if (Result.isNull()) 6225 return QualType(); 6226 } 6227 6228 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6229 NewTL.setKWLoc(TL.getKWLoc()); 6230 NewTL.setParensRange(TL.getParensRange()); 6231 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6232 return Result; 6233 } 6234 6235 template<typename Derived> 6236 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6237 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6238 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6239 6240 CXXScopeSpec SS; 6241 TemplateName TemplateName = getDerived().TransformTemplateName( 6242 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6243 if (TemplateName.isNull()) 6244 return QualType(); 6245 6246 QualType OldDeduced = T->getDeducedType(); 6247 QualType NewDeduced; 6248 if (!OldDeduced.isNull()) { 6249 NewDeduced = getDerived().TransformType(OldDeduced); 6250 if (NewDeduced.isNull()) 6251 return QualType(); 6252 } 6253 6254 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6255 TemplateName, NewDeduced); 6256 if (Result.isNull()) 6257 return QualType(); 6258 6259 DeducedTemplateSpecializationTypeLoc NewTL = 6260 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6261 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6262 6263 return Result; 6264 } 6265 6266 template<typename Derived> 6267 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6268 RecordTypeLoc TL) { 6269 const RecordType *T = TL.getTypePtr(); 6270 RecordDecl *Record 6271 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6272 T->getDecl())); 6273 if (!Record) 6274 return QualType(); 6275 6276 QualType Result = TL.getType(); 6277 if (getDerived().AlwaysRebuild() || 6278 Record != T->getDecl()) { 6279 Result = getDerived().RebuildRecordType(Record); 6280 if (Result.isNull()) 6281 return QualType(); 6282 } 6283 6284 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6285 NewTL.setNameLoc(TL.getNameLoc()); 6286 6287 return Result; 6288 } 6289 6290 template<typename Derived> 6291 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6292 EnumTypeLoc TL) { 6293 const EnumType *T = TL.getTypePtr(); 6294 EnumDecl *Enum 6295 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6296 T->getDecl())); 6297 if (!Enum) 6298 return QualType(); 6299 6300 QualType Result = TL.getType(); 6301 if (getDerived().AlwaysRebuild() || 6302 Enum != T->getDecl()) { 6303 Result = getDerived().RebuildEnumType(Enum); 6304 if (Result.isNull()) 6305 return QualType(); 6306 } 6307 6308 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6309 NewTL.setNameLoc(TL.getNameLoc()); 6310 6311 return Result; 6312 } 6313 6314 template<typename Derived> 6315 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6316 TypeLocBuilder &TLB, 6317 InjectedClassNameTypeLoc TL) { 6318 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6319 TL.getTypePtr()->getDecl()); 6320 if (!D) return QualType(); 6321 6322 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6323 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6324 return T; 6325 } 6326 6327 template<typename Derived> 6328 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6329 TypeLocBuilder &TLB, 6330 TemplateTypeParmTypeLoc TL) { 6331 return TransformTypeSpecType(TLB, TL); 6332 } 6333 6334 template<typename Derived> 6335 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6336 TypeLocBuilder &TLB, 6337 SubstTemplateTypeParmTypeLoc TL) { 6338 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6339 6340 // Substitute into the replacement type, which itself might involve something 6341 // that needs to be transformed. This only tends to occur with default 6342 // template arguments of template template parameters. 6343 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6344 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6345 if (Replacement.isNull()) 6346 return QualType(); 6347 6348 // Always canonicalize the replacement type. 6349 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6350 QualType Result 6351 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6352 Replacement); 6353 6354 // Propagate type-source information. 6355 SubstTemplateTypeParmTypeLoc NewTL 6356 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6357 NewTL.setNameLoc(TL.getNameLoc()); 6358 return Result; 6359 6360 } 6361 6362 template<typename Derived> 6363 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6364 TypeLocBuilder &TLB, 6365 SubstTemplateTypeParmPackTypeLoc TL) { 6366 return TransformTypeSpecType(TLB, TL); 6367 } 6368 6369 template<typename Derived> 6370 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6371 TypeLocBuilder &TLB, 6372 TemplateSpecializationTypeLoc TL) { 6373 const TemplateSpecializationType *T = TL.getTypePtr(); 6374 6375 // The nested-name-specifier never matters in a TemplateSpecializationType, 6376 // because we can't have a dependent nested-name-specifier anyway. 6377 CXXScopeSpec SS; 6378 TemplateName Template 6379 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6380 TL.getTemplateNameLoc()); 6381 if (Template.isNull()) 6382 return QualType(); 6383 6384 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6385 } 6386 6387 template<typename Derived> 6388 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6389 AtomicTypeLoc TL) { 6390 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6391 if (ValueType.isNull()) 6392 return QualType(); 6393 6394 QualType Result = TL.getType(); 6395 if (getDerived().AlwaysRebuild() || 6396 ValueType != TL.getValueLoc().getType()) { 6397 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6398 if (Result.isNull()) 6399 return QualType(); 6400 } 6401 6402 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6403 NewTL.setKWLoc(TL.getKWLoc()); 6404 NewTL.setLParenLoc(TL.getLParenLoc()); 6405 NewTL.setRParenLoc(TL.getRParenLoc()); 6406 6407 return Result; 6408 } 6409 6410 template <typename Derived> 6411 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6412 PipeTypeLoc TL) { 6413 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6414 if (ValueType.isNull()) 6415 return QualType(); 6416 6417 QualType Result = TL.getType(); 6418 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6419 const PipeType *PT = Result->castAs<PipeType>(); 6420 bool isReadPipe = PT->isReadOnly(); 6421 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6422 if (Result.isNull()) 6423 return QualType(); 6424 } 6425 6426 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6427 NewTL.setKWLoc(TL.getKWLoc()); 6428 6429 return Result; 6430 } 6431 6432 template <typename Derived> 6433 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6434 ExtIntTypeLoc TL) { 6435 const ExtIntType *EIT = TL.getTypePtr(); 6436 QualType Result = TL.getType(); 6437 6438 if (getDerived().AlwaysRebuild()) { 6439 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6440 EIT->getNumBits(), TL.getNameLoc()); 6441 if (Result.isNull()) 6442 return QualType(); 6443 } 6444 6445 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6446 NewTL.setNameLoc(TL.getNameLoc()); 6447 return Result; 6448 } 6449 6450 template <typename Derived> 6451 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6452 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6453 const DependentExtIntType *EIT = TL.getTypePtr(); 6454 6455 EnterExpressionEvaluationContext Unevaluated( 6456 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6457 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6458 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6459 6460 if (BitsExpr.isInvalid()) 6461 return QualType(); 6462 6463 QualType Result = TL.getType(); 6464 6465 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6466 Result = getDerived().RebuildDependentExtIntType( 6467 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6468 6469 if (Result.isNull()) 6470 return QualType(); 6471 } 6472 6473 if (isa<DependentExtIntType>(Result)) { 6474 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6475 NewTL.setNameLoc(TL.getNameLoc()); 6476 } else { 6477 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6478 NewTL.setNameLoc(TL.getNameLoc()); 6479 } 6480 return Result; 6481 } 6482 6483 /// Simple iterator that traverses the template arguments in a 6484 /// container that provides a \c getArgLoc() member function. 6485 /// 6486 /// This iterator is intended to be used with the iterator form of 6487 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6488 template<typename ArgLocContainer> 6489 class TemplateArgumentLocContainerIterator { 6490 ArgLocContainer *Container; 6491 unsigned Index; 6492 6493 public: 6494 typedef TemplateArgumentLoc value_type; 6495 typedef TemplateArgumentLoc reference; 6496 typedef int difference_type; 6497 typedef std::input_iterator_tag iterator_category; 6498 6499 class pointer { 6500 TemplateArgumentLoc Arg; 6501 6502 public: 6503 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6504 6505 const TemplateArgumentLoc *operator->() const { 6506 return &Arg; 6507 } 6508 }; 6509 6510 6511 TemplateArgumentLocContainerIterator() {} 6512 6513 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6514 unsigned Index) 6515 : Container(&Container), Index(Index) { } 6516 6517 TemplateArgumentLocContainerIterator &operator++() { 6518 ++Index; 6519 return *this; 6520 } 6521 6522 TemplateArgumentLocContainerIterator operator++(int) { 6523 TemplateArgumentLocContainerIterator Old(*this); 6524 ++(*this); 6525 return Old; 6526 } 6527 6528 TemplateArgumentLoc operator*() const { 6529 return Container->getArgLoc(Index); 6530 } 6531 6532 pointer operator->() const { 6533 return pointer(Container->getArgLoc(Index)); 6534 } 6535 6536 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6537 const TemplateArgumentLocContainerIterator &Y) { 6538 return X.Container == Y.Container && X.Index == Y.Index; 6539 } 6540 6541 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6542 const TemplateArgumentLocContainerIterator &Y) { 6543 return !(X == Y); 6544 } 6545 }; 6546 6547 template<typename Derived> 6548 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6549 AutoTypeLoc TL) { 6550 const AutoType *T = TL.getTypePtr(); 6551 QualType OldDeduced = T->getDeducedType(); 6552 QualType NewDeduced; 6553 if (!OldDeduced.isNull()) { 6554 NewDeduced = getDerived().TransformType(OldDeduced); 6555 if (NewDeduced.isNull()) 6556 return QualType(); 6557 } 6558 6559 ConceptDecl *NewCD = nullptr; 6560 TemplateArgumentListInfo NewTemplateArgs; 6561 NestedNameSpecifierLoc NewNestedNameSpec; 6562 if (T->isConstrained()) { 6563 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6564 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6565 6566 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6567 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6568 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6569 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6570 ArgIterator(TL, 6571 TL.getNumArgs()), 6572 NewTemplateArgs)) 6573 return QualType(); 6574 6575 if (TL.getNestedNameSpecifierLoc()) { 6576 NewNestedNameSpec 6577 = getDerived().TransformNestedNameSpecifierLoc( 6578 TL.getNestedNameSpecifierLoc()); 6579 if (!NewNestedNameSpec) 6580 return QualType(); 6581 } 6582 } 6583 6584 QualType Result = TL.getType(); 6585 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6586 T->isDependentType() || T->isConstrained()) { 6587 // FIXME: Maybe don't rebuild if all template arguments are the same. 6588 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6589 NewArgList.reserve(NewTemplateArgs.size()); 6590 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6591 NewArgList.push_back(ArgLoc.getArgument()); 6592 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6593 NewArgList); 6594 if (Result.isNull()) 6595 return QualType(); 6596 } 6597 6598 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6599 NewTL.setNameLoc(TL.getNameLoc()); 6600 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6601 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6602 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6603 NewTL.setFoundDecl(TL.getFoundDecl()); 6604 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6605 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6606 for (unsigned I = 0; I < NewTL.getNumArgs(); ++I) 6607 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6608 6609 return Result; 6610 } 6611 6612 template <typename Derived> 6613 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6614 TypeLocBuilder &TLB, 6615 TemplateSpecializationTypeLoc TL, 6616 TemplateName Template) { 6617 TemplateArgumentListInfo NewTemplateArgs; 6618 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6619 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6620 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6621 ArgIterator; 6622 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6623 ArgIterator(TL, TL.getNumArgs()), 6624 NewTemplateArgs)) 6625 return QualType(); 6626 6627 // FIXME: maybe don't rebuild if all the template arguments are the same. 6628 6629 QualType Result = 6630 getDerived().RebuildTemplateSpecializationType(Template, 6631 TL.getTemplateNameLoc(), 6632 NewTemplateArgs); 6633 6634 if (!Result.isNull()) { 6635 // Specializations of template template parameters are represented as 6636 // TemplateSpecializationTypes, and substitution of type alias templates 6637 // within a dependent context can transform them into 6638 // DependentTemplateSpecializationTypes. 6639 if (isa<DependentTemplateSpecializationType>(Result)) { 6640 DependentTemplateSpecializationTypeLoc NewTL 6641 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6642 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6643 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6644 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6645 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6646 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6647 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6648 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6649 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6650 return Result; 6651 } 6652 6653 TemplateSpecializationTypeLoc NewTL 6654 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6655 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6656 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6657 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6658 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6659 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6660 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6661 } 6662 6663 return Result; 6664 } 6665 6666 template <typename Derived> 6667 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6668 TypeLocBuilder &TLB, 6669 DependentTemplateSpecializationTypeLoc TL, 6670 TemplateName Template, 6671 CXXScopeSpec &SS) { 6672 TemplateArgumentListInfo NewTemplateArgs; 6673 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6674 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6675 typedef TemplateArgumentLocContainerIterator< 6676 DependentTemplateSpecializationTypeLoc> ArgIterator; 6677 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6678 ArgIterator(TL, TL.getNumArgs()), 6679 NewTemplateArgs)) 6680 return QualType(); 6681 6682 // FIXME: maybe don't rebuild if all the template arguments are the same. 6683 6684 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6685 QualType Result 6686 = getSema().Context.getDependentTemplateSpecializationType( 6687 TL.getTypePtr()->getKeyword(), 6688 DTN->getQualifier(), 6689 DTN->getIdentifier(), 6690 NewTemplateArgs); 6691 6692 DependentTemplateSpecializationTypeLoc NewTL 6693 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6694 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6695 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6696 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6697 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6698 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6699 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6700 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6701 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6702 return Result; 6703 } 6704 6705 QualType Result 6706 = getDerived().RebuildTemplateSpecializationType(Template, 6707 TL.getTemplateNameLoc(), 6708 NewTemplateArgs); 6709 6710 if (!Result.isNull()) { 6711 /// FIXME: Wrap this in an elaborated-type-specifier? 6712 TemplateSpecializationTypeLoc NewTL 6713 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6714 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6715 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6716 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6717 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6718 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6719 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6720 } 6721 6722 return Result; 6723 } 6724 6725 template<typename Derived> 6726 QualType 6727 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6728 ElaboratedTypeLoc TL) { 6729 const ElaboratedType *T = TL.getTypePtr(); 6730 6731 NestedNameSpecifierLoc QualifierLoc; 6732 // NOTE: the qualifier in an ElaboratedType is optional. 6733 if (TL.getQualifierLoc()) { 6734 QualifierLoc 6735 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6736 if (!QualifierLoc) 6737 return QualType(); 6738 } 6739 6740 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6741 if (NamedT.isNull()) 6742 return QualType(); 6743 6744 // C++0x [dcl.type.elab]p2: 6745 // If the identifier resolves to a typedef-name or the simple-template-id 6746 // resolves to an alias template specialization, the 6747 // elaborated-type-specifier is ill-formed. 6748 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6749 if (const TemplateSpecializationType *TST = 6750 NamedT->getAs<TemplateSpecializationType>()) { 6751 TemplateName Template = TST->getTemplateName(); 6752 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6753 Template.getAsTemplateDecl())) { 6754 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6755 diag::err_tag_reference_non_tag) 6756 << TAT << Sema::NTK_TypeAliasTemplate 6757 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6758 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6759 } 6760 } 6761 } 6762 6763 QualType Result = TL.getType(); 6764 if (getDerived().AlwaysRebuild() || 6765 QualifierLoc != TL.getQualifierLoc() || 6766 NamedT != T->getNamedType()) { 6767 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6768 T->getKeyword(), 6769 QualifierLoc, NamedT); 6770 if (Result.isNull()) 6771 return QualType(); 6772 } 6773 6774 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6775 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6776 NewTL.setQualifierLoc(QualifierLoc); 6777 return Result; 6778 } 6779 6780 template<typename Derived> 6781 QualType TreeTransform<Derived>::TransformAttributedType( 6782 TypeLocBuilder &TLB, 6783 AttributedTypeLoc TL) { 6784 const AttributedType *oldType = TL.getTypePtr(); 6785 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6786 if (modifiedType.isNull()) 6787 return QualType(); 6788 6789 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6790 const Attr *oldAttr = TL.getAttr(); 6791 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6792 if (oldAttr && !newAttr) 6793 return QualType(); 6794 6795 QualType result = TL.getType(); 6796 6797 // FIXME: dependent operand expressions? 6798 if (getDerived().AlwaysRebuild() || 6799 modifiedType != oldType->getModifiedType()) { 6800 // TODO: this is really lame; we should really be rebuilding the 6801 // equivalent type from first principles. 6802 QualType equivalentType 6803 = getDerived().TransformType(oldType->getEquivalentType()); 6804 if (equivalentType.isNull()) 6805 return QualType(); 6806 6807 // Check whether we can add nullability; it is only represented as 6808 // type sugar, and therefore cannot be diagnosed in any other way. 6809 if (auto nullability = oldType->getImmediateNullability()) { 6810 if (!modifiedType->canHaveNullability()) { 6811 SemaRef.Diag(TL.getAttr()->getLocation(), 6812 diag::err_nullability_nonpointer) 6813 << DiagNullabilityKind(*nullability, false) << modifiedType; 6814 return QualType(); 6815 } 6816 } 6817 6818 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6819 modifiedType, 6820 equivalentType); 6821 } 6822 6823 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6824 newTL.setAttr(newAttr); 6825 return result; 6826 } 6827 6828 template<typename Derived> 6829 QualType 6830 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6831 ParenTypeLoc TL) { 6832 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6833 if (Inner.isNull()) 6834 return QualType(); 6835 6836 QualType Result = TL.getType(); 6837 if (getDerived().AlwaysRebuild() || 6838 Inner != TL.getInnerLoc().getType()) { 6839 Result = getDerived().RebuildParenType(Inner); 6840 if (Result.isNull()) 6841 return QualType(); 6842 } 6843 6844 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6845 NewTL.setLParenLoc(TL.getLParenLoc()); 6846 NewTL.setRParenLoc(TL.getRParenLoc()); 6847 return Result; 6848 } 6849 6850 template <typename Derived> 6851 QualType 6852 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6853 MacroQualifiedTypeLoc TL) { 6854 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6855 if (Inner.isNull()) 6856 return QualType(); 6857 6858 QualType Result = TL.getType(); 6859 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6860 Result = 6861 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6862 if (Result.isNull()) 6863 return QualType(); 6864 } 6865 6866 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6867 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6868 return Result; 6869 } 6870 6871 template<typename Derived> 6872 QualType TreeTransform<Derived>::TransformDependentNameType( 6873 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6874 return TransformDependentNameType(TLB, TL, false); 6875 } 6876 6877 template<typename Derived> 6878 QualType TreeTransform<Derived>::TransformDependentNameType( 6879 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6880 const DependentNameType *T = TL.getTypePtr(); 6881 6882 NestedNameSpecifierLoc QualifierLoc 6883 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6884 if (!QualifierLoc) 6885 return QualType(); 6886 6887 QualType Result 6888 = getDerived().RebuildDependentNameType(T->getKeyword(), 6889 TL.getElaboratedKeywordLoc(), 6890 QualifierLoc, 6891 T->getIdentifier(), 6892 TL.getNameLoc(), 6893 DeducedTSTContext); 6894 if (Result.isNull()) 6895 return QualType(); 6896 6897 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6898 QualType NamedT = ElabT->getNamedType(); 6899 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6900 6901 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6902 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6903 NewTL.setQualifierLoc(QualifierLoc); 6904 } else { 6905 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6906 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6907 NewTL.setQualifierLoc(QualifierLoc); 6908 NewTL.setNameLoc(TL.getNameLoc()); 6909 } 6910 return Result; 6911 } 6912 6913 template<typename Derived> 6914 QualType TreeTransform<Derived>:: 6915 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6916 DependentTemplateSpecializationTypeLoc TL) { 6917 NestedNameSpecifierLoc QualifierLoc; 6918 if (TL.getQualifierLoc()) { 6919 QualifierLoc 6920 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6921 if (!QualifierLoc) 6922 return QualType(); 6923 } 6924 6925 return getDerived() 6926 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6927 } 6928 6929 template<typename Derived> 6930 QualType TreeTransform<Derived>:: 6931 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6932 DependentTemplateSpecializationTypeLoc TL, 6933 NestedNameSpecifierLoc QualifierLoc) { 6934 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6935 6936 TemplateArgumentListInfo NewTemplateArgs; 6937 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6938 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6939 6940 typedef TemplateArgumentLocContainerIterator< 6941 DependentTemplateSpecializationTypeLoc> ArgIterator; 6942 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6943 ArgIterator(TL, TL.getNumArgs()), 6944 NewTemplateArgs)) 6945 return QualType(); 6946 6947 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6948 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6949 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6950 /*AllowInjectedClassName*/ false); 6951 if (Result.isNull()) 6952 return QualType(); 6953 6954 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6955 QualType NamedT = ElabT->getNamedType(); 6956 6957 // Copy information relevant to the template specialization. 6958 TemplateSpecializationTypeLoc NamedTL 6959 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6960 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6961 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6962 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6963 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6964 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6965 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6966 6967 // Copy information relevant to the elaborated type. 6968 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6969 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6970 NewTL.setQualifierLoc(QualifierLoc); 6971 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6972 DependentTemplateSpecializationTypeLoc SpecTL 6973 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6974 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6975 SpecTL.setQualifierLoc(QualifierLoc); 6976 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6977 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6978 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6979 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6980 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6981 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6982 } else { 6983 TemplateSpecializationTypeLoc SpecTL 6984 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6985 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6986 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6987 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6988 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6989 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6990 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6991 } 6992 return Result; 6993 } 6994 6995 template<typename Derived> 6996 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6997 PackExpansionTypeLoc TL) { 6998 QualType Pattern 6999 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7000 if (Pattern.isNull()) 7001 return QualType(); 7002 7003 QualType Result = TL.getType(); 7004 if (getDerived().AlwaysRebuild() || 7005 Pattern != TL.getPatternLoc().getType()) { 7006 Result = getDerived().RebuildPackExpansionType(Pattern, 7007 TL.getPatternLoc().getSourceRange(), 7008 TL.getEllipsisLoc(), 7009 TL.getTypePtr()->getNumExpansions()); 7010 if (Result.isNull()) 7011 return QualType(); 7012 } 7013 7014 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7015 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7016 return Result; 7017 } 7018 7019 template<typename Derived> 7020 QualType 7021 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7022 ObjCInterfaceTypeLoc TL) { 7023 // ObjCInterfaceType is never dependent. 7024 TLB.pushFullCopy(TL); 7025 return TL.getType(); 7026 } 7027 7028 template<typename Derived> 7029 QualType 7030 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7031 ObjCTypeParamTypeLoc TL) { 7032 const ObjCTypeParamType *T = TL.getTypePtr(); 7033 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7034 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7035 if (!OTP) 7036 return QualType(); 7037 7038 QualType Result = TL.getType(); 7039 if (getDerived().AlwaysRebuild() || 7040 OTP != T->getDecl()) { 7041 Result = getDerived().RebuildObjCTypeParamType(OTP, 7042 TL.getProtocolLAngleLoc(), 7043 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7044 TL.getNumProtocols()), 7045 TL.getProtocolLocs(), 7046 TL.getProtocolRAngleLoc()); 7047 if (Result.isNull()) 7048 return QualType(); 7049 } 7050 7051 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7052 if (TL.getNumProtocols()) { 7053 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7054 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7055 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7056 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7057 } 7058 return Result; 7059 } 7060 7061 template<typename Derived> 7062 QualType 7063 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7064 ObjCObjectTypeLoc TL) { 7065 // Transform base type. 7066 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7067 if (BaseType.isNull()) 7068 return QualType(); 7069 7070 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7071 7072 // Transform type arguments. 7073 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7074 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7075 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7076 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7077 QualType TypeArg = TypeArgInfo->getType(); 7078 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7079 AnyChanged = true; 7080 7081 // We have a pack expansion. Instantiate it. 7082 const auto *PackExpansion = PackExpansionLoc.getType() 7083 ->castAs<PackExpansionType>(); 7084 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7085 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7086 Unexpanded); 7087 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7088 7089 // Determine whether the set of unexpanded parameter packs can 7090 // and should be expanded. 7091 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7092 bool Expand = false; 7093 bool RetainExpansion = false; 7094 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7095 if (getDerived().TryExpandParameterPacks( 7096 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7097 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7098 return QualType(); 7099 7100 if (!Expand) { 7101 // We can't expand this pack expansion into separate arguments yet; 7102 // just substitute into the pattern and create a new pack expansion 7103 // type. 7104 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7105 7106 TypeLocBuilder TypeArgBuilder; 7107 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7108 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7109 PatternLoc); 7110 if (NewPatternType.isNull()) 7111 return QualType(); 7112 7113 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7114 NewPatternType, NumExpansions); 7115 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7116 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7117 NewTypeArgInfos.push_back( 7118 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7119 continue; 7120 } 7121 7122 // Substitute into the pack expansion pattern for each slice of the 7123 // pack. 7124 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7125 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7126 7127 TypeLocBuilder TypeArgBuilder; 7128 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7129 7130 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7131 PatternLoc); 7132 if (NewTypeArg.isNull()) 7133 return QualType(); 7134 7135 NewTypeArgInfos.push_back( 7136 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7137 } 7138 7139 continue; 7140 } 7141 7142 TypeLocBuilder TypeArgBuilder; 7143 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7144 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7145 if (NewTypeArg.isNull()) 7146 return QualType(); 7147 7148 // If nothing changed, just keep the old TypeSourceInfo. 7149 if (NewTypeArg == TypeArg) { 7150 NewTypeArgInfos.push_back(TypeArgInfo); 7151 continue; 7152 } 7153 7154 NewTypeArgInfos.push_back( 7155 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7156 AnyChanged = true; 7157 } 7158 7159 QualType Result = TL.getType(); 7160 if (getDerived().AlwaysRebuild() || AnyChanged) { 7161 // Rebuild the type. 7162 Result = getDerived().RebuildObjCObjectType( 7163 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7164 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7165 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7166 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7167 7168 if (Result.isNull()) 7169 return QualType(); 7170 } 7171 7172 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7173 NewT.setHasBaseTypeAsWritten(true); 7174 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7175 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7176 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7177 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7178 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7179 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7180 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7181 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7182 return Result; 7183 } 7184 7185 template<typename Derived> 7186 QualType 7187 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7188 ObjCObjectPointerTypeLoc TL) { 7189 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7190 if (PointeeType.isNull()) 7191 return QualType(); 7192 7193 QualType Result = TL.getType(); 7194 if (getDerived().AlwaysRebuild() || 7195 PointeeType != TL.getPointeeLoc().getType()) { 7196 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7197 TL.getStarLoc()); 7198 if (Result.isNull()) 7199 return QualType(); 7200 } 7201 7202 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7203 NewT.setStarLoc(TL.getStarLoc()); 7204 return Result; 7205 } 7206 7207 //===----------------------------------------------------------------------===// 7208 // Statement transformation 7209 //===----------------------------------------------------------------------===// 7210 template<typename Derived> 7211 StmtResult 7212 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7213 return S; 7214 } 7215 7216 template<typename Derived> 7217 StmtResult 7218 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7219 return getDerived().TransformCompoundStmt(S, false); 7220 } 7221 7222 template<typename Derived> 7223 StmtResult 7224 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7225 bool IsStmtExpr) { 7226 Sema::CompoundScopeRAII CompoundScope(getSema()); 7227 7228 const Stmt *ExprResult = S->getStmtExprResult(); 7229 bool SubStmtInvalid = false; 7230 bool SubStmtChanged = false; 7231 SmallVector<Stmt*, 8> Statements; 7232 for (auto *B : S->body()) { 7233 StmtResult Result = getDerived().TransformStmt( 7234 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7235 7236 if (Result.isInvalid()) { 7237 // Immediately fail if this was a DeclStmt, since it's very 7238 // likely that this will cause problems for future statements. 7239 if (isa<DeclStmt>(B)) 7240 return StmtError(); 7241 7242 // Otherwise, just keep processing substatements and fail later. 7243 SubStmtInvalid = true; 7244 continue; 7245 } 7246 7247 SubStmtChanged = SubStmtChanged || Result.get() != B; 7248 Statements.push_back(Result.getAs<Stmt>()); 7249 } 7250 7251 if (SubStmtInvalid) 7252 return StmtError(); 7253 7254 if (!getDerived().AlwaysRebuild() && 7255 !SubStmtChanged) 7256 return S; 7257 7258 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7259 Statements, 7260 S->getRBracLoc(), 7261 IsStmtExpr); 7262 } 7263 7264 template<typename Derived> 7265 StmtResult 7266 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7267 ExprResult LHS, RHS; 7268 { 7269 EnterExpressionEvaluationContext Unevaluated( 7270 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7271 7272 // Transform the left-hand case value. 7273 LHS = getDerived().TransformExpr(S->getLHS()); 7274 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7275 if (LHS.isInvalid()) 7276 return StmtError(); 7277 7278 // Transform the right-hand case value (for the GNU case-range extension). 7279 RHS = getDerived().TransformExpr(S->getRHS()); 7280 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7281 if (RHS.isInvalid()) 7282 return StmtError(); 7283 } 7284 7285 // Build the case statement. 7286 // Case statements are always rebuilt so that they will attached to their 7287 // transformed switch statement. 7288 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7289 LHS.get(), 7290 S->getEllipsisLoc(), 7291 RHS.get(), 7292 S->getColonLoc()); 7293 if (Case.isInvalid()) 7294 return StmtError(); 7295 7296 // Transform the statement following the case 7297 StmtResult SubStmt = 7298 getDerived().TransformStmt(S->getSubStmt()); 7299 if (SubStmt.isInvalid()) 7300 return StmtError(); 7301 7302 // Attach the body to the case statement 7303 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7304 } 7305 7306 template <typename Derived> 7307 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7308 // Transform the statement following the default case 7309 StmtResult SubStmt = 7310 getDerived().TransformStmt(S->getSubStmt()); 7311 if (SubStmt.isInvalid()) 7312 return StmtError(); 7313 7314 // Default statements are always rebuilt 7315 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7316 SubStmt.get()); 7317 } 7318 7319 template<typename Derived> 7320 StmtResult 7321 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7322 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7323 if (SubStmt.isInvalid()) 7324 return StmtError(); 7325 7326 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7327 S->getDecl()); 7328 if (!LD) 7329 return StmtError(); 7330 7331 // If we're transforming "in-place" (we're not creating new local 7332 // declarations), assume we're replacing the old label statement 7333 // and clear out the reference to it. 7334 if (LD == S->getDecl()) 7335 S->getDecl()->setStmt(nullptr); 7336 7337 // FIXME: Pass the real colon location in. 7338 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7339 cast<LabelDecl>(LD), SourceLocation(), 7340 SubStmt.get()); 7341 } 7342 7343 template <typename Derived> 7344 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7345 if (!R) 7346 return R; 7347 7348 switch (R->getKind()) { 7349 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7350 #define ATTR(X) 7351 #define PRAGMA_SPELLING_ATTR(X) \ 7352 case attr::X: \ 7353 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7354 #include "clang/Basic/AttrList.inc" 7355 default: 7356 return R; 7357 } 7358 } 7359 7360 template <typename Derived> 7361 StmtResult 7362 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7363 StmtDiscardKind SDK) { 7364 bool AttrsChanged = false; 7365 SmallVector<const Attr *, 1> Attrs; 7366 7367 // Visit attributes and keep track if any are transformed. 7368 for (const auto *I : S->getAttrs()) { 7369 const Attr *R = getDerived().TransformAttr(I); 7370 AttrsChanged |= (I != R); 7371 if (R) 7372 Attrs.push_back(R); 7373 } 7374 7375 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7376 if (SubStmt.isInvalid()) 7377 return StmtError(); 7378 7379 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7380 return S; 7381 7382 // If transforming the attributes failed for all of the attributes in the 7383 // statement, don't make an AttributedStmt without attributes. 7384 if (Attrs.empty()) 7385 return SubStmt; 7386 7387 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7388 SubStmt.get()); 7389 } 7390 7391 template<typename Derived> 7392 StmtResult 7393 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7394 // Transform the initialization statement 7395 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7396 if (Init.isInvalid()) 7397 return StmtError(); 7398 7399 Sema::ConditionResult Cond; 7400 if (!S->isConsteval()) { 7401 // Transform the condition 7402 Cond = getDerived().TransformCondition( 7403 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7404 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7405 : Sema::ConditionKind::Boolean); 7406 if (Cond.isInvalid()) 7407 return StmtError(); 7408 } 7409 7410 // If this is a constexpr if, determine which arm we should instantiate. 7411 llvm::Optional<bool> ConstexprConditionValue; 7412 if (S->isConstexpr()) 7413 ConstexprConditionValue = Cond.getKnownValue(); 7414 7415 // Transform the "then" branch. 7416 StmtResult Then; 7417 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7418 Then = getDerived().TransformStmt(S->getThen()); 7419 if (Then.isInvalid()) 7420 return StmtError(); 7421 } else { 7422 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7423 } 7424 7425 // Transform the "else" branch. 7426 StmtResult Else; 7427 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7428 Else = getDerived().TransformStmt(S->getElse()); 7429 if (Else.isInvalid()) 7430 return StmtError(); 7431 } 7432 7433 if (!getDerived().AlwaysRebuild() && 7434 Init.get() == S->getInit() && 7435 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7436 Then.get() == S->getThen() && 7437 Else.get() == S->getElse()) 7438 return S; 7439 7440 return getDerived().RebuildIfStmt( 7441 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7442 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7443 } 7444 7445 template<typename Derived> 7446 StmtResult 7447 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7448 // Transform the initialization statement 7449 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7450 if (Init.isInvalid()) 7451 return StmtError(); 7452 7453 // Transform the condition. 7454 Sema::ConditionResult Cond = getDerived().TransformCondition( 7455 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7456 Sema::ConditionKind::Switch); 7457 if (Cond.isInvalid()) 7458 return StmtError(); 7459 7460 // Rebuild the switch statement. 7461 StmtResult Switch = 7462 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7463 Init.get(), Cond, S->getRParenLoc()); 7464 if (Switch.isInvalid()) 7465 return StmtError(); 7466 7467 // Transform the body of the switch statement. 7468 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7469 if (Body.isInvalid()) 7470 return StmtError(); 7471 7472 // Complete the switch statement. 7473 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7474 Body.get()); 7475 } 7476 7477 template<typename Derived> 7478 StmtResult 7479 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7480 // Transform the condition 7481 Sema::ConditionResult Cond = getDerived().TransformCondition( 7482 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7483 Sema::ConditionKind::Boolean); 7484 if (Cond.isInvalid()) 7485 return StmtError(); 7486 7487 // Transform the body 7488 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7489 if (Body.isInvalid()) 7490 return StmtError(); 7491 7492 if (!getDerived().AlwaysRebuild() && 7493 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7494 Body.get() == S->getBody()) 7495 return Owned(S); 7496 7497 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7498 Cond, S->getRParenLoc(), Body.get()); 7499 } 7500 7501 template<typename Derived> 7502 StmtResult 7503 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7504 // Transform the body 7505 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7506 if (Body.isInvalid()) 7507 return StmtError(); 7508 7509 // Transform the condition 7510 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7511 if (Cond.isInvalid()) 7512 return StmtError(); 7513 7514 if (!getDerived().AlwaysRebuild() && 7515 Cond.get() == S->getCond() && 7516 Body.get() == S->getBody()) 7517 return S; 7518 7519 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7520 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7521 S->getRParenLoc()); 7522 } 7523 7524 template<typename Derived> 7525 StmtResult 7526 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7527 if (getSema().getLangOpts().OpenMP) 7528 getSema().startOpenMPLoop(); 7529 7530 // Transform the initialization statement 7531 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7532 if (Init.isInvalid()) 7533 return StmtError(); 7534 7535 // In OpenMP loop region loop control variable must be captured and be 7536 // private. Perform analysis of first part (if any). 7537 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7538 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7539 7540 // Transform the condition 7541 Sema::ConditionResult Cond = getDerived().TransformCondition( 7542 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7543 Sema::ConditionKind::Boolean); 7544 if (Cond.isInvalid()) 7545 return StmtError(); 7546 7547 // Transform the increment 7548 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7549 if (Inc.isInvalid()) 7550 return StmtError(); 7551 7552 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7553 if (S->getInc() && !FullInc.get()) 7554 return StmtError(); 7555 7556 // Transform the body 7557 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7558 if (Body.isInvalid()) 7559 return StmtError(); 7560 7561 if (!getDerived().AlwaysRebuild() && 7562 Init.get() == S->getInit() && 7563 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7564 Inc.get() == S->getInc() && 7565 Body.get() == S->getBody()) 7566 return S; 7567 7568 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7569 Init.get(), Cond, FullInc, 7570 S->getRParenLoc(), Body.get()); 7571 } 7572 7573 template<typename Derived> 7574 StmtResult 7575 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7576 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7577 S->getLabel()); 7578 if (!LD) 7579 return StmtError(); 7580 7581 // Goto statements must always be rebuilt, to resolve the label. 7582 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7583 cast<LabelDecl>(LD)); 7584 } 7585 7586 template<typename Derived> 7587 StmtResult 7588 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7589 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7590 if (Target.isInvalid()) 7591 return StmtError(); 7592 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7593 7594 if (!getDerived().AlwaysRebuild() && 7595 Target.get() == S->getTarget()) 7596 return S; 7597 7598 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7599 Target.get()); 7600 } 7601 7602 template<typename Derived> 7603 StmtResult 7604 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7605 return S; 7606 } 7607 7608 template<typename Derived> 7609 StmtResult 7610 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7611 return S; 7612 } 7613 7614 template<typename Derived> 7615 StmtResult 7616 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7617 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7618 /*NotCopyInit*/false); 7619 if (Result.isInvalid()) 7620 return StmtError(); 7621 7622 // FIXME: We always rebuild the return statement because there is no way 7623 // to tell whether the return type of the function has changed. 7624 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7625 } 7626 7627 template<typename Derived> 7628 StmtResult 7629 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7630 bool DeclChanged = false; 7631 SmallVector<Decl *, 4> Decls; 7632 for (auto *D : S->decls()) { 7633 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7634 if (!Transformed) 7635 return StmtError(); 7636 7637 if (Transformed != D) 7638 DeclChanged = true; 7639 7640 Decls.push_back(Transformed); 7641 } 7642 7643 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7644 return S; 7645 7646 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7647 } 7648 7649 template<typename Derived> 7650 StmtResult 7651 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7652 7653 SmallVector<Expr*, 8> Constraints; 7654 SmallVector<Expr*, 8> Exprs; 7655 SmallVector<IdentifierInfo *, 4> Names; 7656 7657 ExprResult AsmString; 7658 SmallVector<Expr*, 8> Clobbers; 7659 7660 bool ExprsChanged = false; 7661 7662 // Go through the outputs. 7663 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7664 Names.push_back(S->getOutputIdentifier(I)); 7665 7666 // No need to transform the constraint literal. 7667 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7668 7669 // Transform the output expr. 7670 Expr *OutputExpr = S->getOutputExpr(I); 7671 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7672 if (Result.isInvalid()) 7673 return StmtError(); 7674 7675 ExprsChanged |= Result.get() != OutputExpr; 7676 7677 Exprs.push_back(Result.get()); 7678 } 7679 7680 // Go through the inputs. 7681 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7682 Names.push_back(S->getInputIdentifier(I)); 7683 7684 // No need to transform the constraint literal. 7685 Constraints.push_back(S->getInputConstraintLiteral(I)); 7686 7687 // Transform the input expr. 7688 Expr *InputExpr = S->getInputExpr(I); 7689 ExprResult Result = getDerived().TransformExpr(InputExpr); 7690 if (Result.isInvalid()) 7691 return StmtError(); 7692 7693 ExprsChanged |= Result.get() != InputExpr; 7694 7695 Exprs.push_back(Result.get()); 7696 } 7697 7698 // Go through the Labels. 7699 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7700 Names.push_back(S->getLabelIdentifier(I)); 7701 7702 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7703 if (Result.isInvalid()) 7704 return StmtError(); 7705 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7706 Exprs.push_back(Result.get()); 7707 } 7708 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7709 return S; 7710 7711 // Go through the clobbers. 7712 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7713 Clobbers.push_back(S->getClobberStringLiteral(I)); 7714 7715 // No need to transform the asm string literal. 7716 AsmString = S->getAsmString(); 7717 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7718 S->isVolatile(), S->getNumOutputs(), 7719 S->getNumInputs(), Names.data(), 7720 Constraints, Exprs, AsmString.get(), 7721 Clobbers, S->getNumLabels(), 7722 S->getRParenLoc()); 7723 } 7724 7725 template<typename Derived> 7726 StmtResult 7727 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7728 ArrayRef<Token> AsmToks = 7729 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7730 7731 bool HadError = false, HadChange = false; 7732 7733 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7734 SmallVector<Expr*, 8> TransformedExprs; 7735 TransformedExprs.reserve(SrcExprs.size()); 7736 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7737 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7738 if (!Result.isUsable()) { 7739 HadError = true; 7740 } else { 7741 HadChange |= (Result.get() != SrcExprs[i]); 7742 TransformedExprs.push_back(Result.get()); 7743 } 7744 } 7745 7746 if (HadError) return StmtError(); 7747 if (!HadChange && !getDerived().AlwaysRebuild()) 7748 return Owned(S); 7749 7750 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7751 AsmToks, S->getAsmString(), 7752 S->getNumOutputs(), S->getNumInputs(), 7753 S->getAllConstraints(), S->getClobbers(), 7754 TransformedExprs, S->getEndLoc()); 7755 } 7756 7757 // C++ Coroutines TS 7758 7759 template<typename Derived> 7760 StmtResult 7761 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7762 auto *ScopeInfo = SemaRef.getCurFunction(); 7763 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7764 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7765 ScopeInfo->NeedsCoroutineSuspends && 7766 ScopeInfo->CoroutineSuspends.first == nullptr && 7767 ScopeInfo->CoroutineSuspends.second == nullptr && 7768 "expected clean scope info"); 7769 7770 // Set that we have (possibly-invalid) suspend points before we do anything 7771 // that may fail. 7772 ScopeInfo->setNeedsCoroutineSuspends(false); 7773 7774 // We re-build the coroutine promise object (and the coroutine parameters its 7775 // type and constructor depend on) based on the types used in our current 7776 // function. We must do so, and set it on the current FunctionScopeInfo, 7777 // before attempting to transform the other parts of the coroutine body 7778 // statement, such as the implicit suspend statements (because those 7779 // statements reference the FunctionScopeInfo::CoroutinePromise). 7780 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7781 return StmtError(); 7782 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7783 if (!Promise) 7784 return StmtError(); 7785 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7786 ScopeInfo->CoroutinePromise = Promise; 7787 7788 // Transform the implicit coroutine statements constructed using dependent 7789 // types during the previous parse: initial and final suspensions, the return 7790 // object, and others. We also transform the coroutine function's body. 7791 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7792 if (InitSuspend.isInvalid()) 7793 return StmtError(); 7794 StmtResult FinalSuspend = 7795 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7796 if (FinalSuspend.isInvalid() || 7797 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7798 return StmtError(); 7799 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7800 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7801 7802 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7803 if (BodyRes.isInvalid()) 7804 return StmtError(); 7805 7806 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7807 if (Builder.isInvalid()) 7808 return StmtError(); 7809 7810 Expr *ReturnObject = S->getReturnValueInit(); 7811 assert(ReturnObject && "the return object is expected to be valid"); 7812 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7813 /*NoCopyInit*/ false); 7814 if (Res.isInvalid()) 7815 return StmtError(); 7816 Builder.ReturnValue = Res.get(); 7817 7818 // If during the previous parse the coroutine still had a dependent promise 7819 // statement, we may need to build some implicit coroutine statements 7820 // (such as exception and fallthrough handlers) for the first time. 7821 if (S->hasDependentPromiseType()) { 7822 // We can only build these statements, however, if the current promise type 7823 // is not dependent. 7824 if (!Promise->getType()->isDependentType()) { 7825 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7826 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7827 "these nodes should not have been built yet"); 7828 if (!Builder.buildDependentStatements()) 7829 return StmtError(); 7830 } 7831 } else { 7832 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7833 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7834 if (Res.isInvalid()) 7835 return StmtError(); 7836 Builder.OnFallthrough = Res.get(); 7837 } 7838 7839 if (auto *OnException = S->getExceptionHandler()) { 7840 StmtResult Res = getDerived().TransformStmt(OnException); 7841 if (Res.isInvalid()) 7842 return StmtError(); 7843 Builder.OnException = Res.get(); 7844 } 7845 7846 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7847 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7848 if (Res.isInvalid()) 7849 return StmtError(); 7850 Builder.ReturnStmtOnAllocFailure = Res.get(); 7851 } 7852 7853 // Transform any additional statements we may have already built 7854 assert(S->getAllocate() && S->getDeallocate() && 7855 "allocation and deallocation calls must already be built"); 7856 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7857 if (AllocRes.isInvalid()) 7858 return StmtError(); 7859 Builder.Allocate = AllocRes.get(); 7860 7861 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7862 if (DeallocRes.isInvalid()) 7863 return StmtError(); 7864 Builder.Deallocate = DeallocRes.get(); 7865 7866 assert(S->getResultDecl() && "ResultDecl must already be built"); 7867 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7868 if (ResultDecl.isInvalid()) 7869 return StmtError(); 7870 Builder.ResultDecl = ResultDecl.get(); 7871 7872 if (auto *ReturnStmt = S->getReturnStmt()) { 7873 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7874 if (Res.isInvalid()) 7875 return StmtError(); 7876 Builder.ReturnStmt = Res.get(); 7877 } 7878 } 7879 7880 return getDerived().RebuildCoroutineBodyStmt(Builder); 7881 } 7882 7883 template<typename Derived> 7884 StmtResult 7885 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7886 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7887 /*NotCopyInit*/false); 7888 if (Result.isInvalid()) 7889 return StmtError(); 7890 7891 // Always rebuild; we don't know if this needs to be injected into a new 7892 // context or if the promise type has changed. 7893 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7894 S->isImplicit()); 7895 } 7896 7897 template<typename Derived> 7898 ExprResult 7899 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7900 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7901 /*NotCopyInit*/false); 7902 if (Result.isInvalid()) 7903 return ExprError(); 7904 7905 // Always rebuild; we don't know if this needs to be injected into a new 7906 // context or if the promise type has changed. 7907 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7908 E->isImplicit()); 7909 } 7910 7911 template <typename Derived> 7912 ExprResult 7913 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7914 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7915 /*NotCopyInit*/ false); 7916 if (OperandResult.isInvalid()) 7917 return ExprError(); 7918 7919 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7920 E->getOperatorCoawaitLookup()); 7921 7922 if (LookupResult.isInvalid()) 7923 return ExprError(); 7924 7925 // Always rebuild; we don't know if this needs to be injected into a new 7926 // context or if the promise type has changed. 7927 return getDerived().RebuildDependentCoawaitExpr( 7928 E->getKeywordLoc(), OperandResult.get(), 7929 cast<UnresolvedLookupExpr>(LookupResult.get())); 7930 } 7931 7932 template<typename Derived> 7933 ExprResult 7934 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7935 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7936 /*NotCopyInit*/false); 7937 if (Result.isInvalid()) 7938 return ExprError(); 7939 7940 // Always rebuild; we don't know if this needs to be injected into a new 7941 // context or if the promise type has changed. 7942 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7943 } 7944 7945 // Objective-C Statements. 7946 7947 template<typename Derived> 7948 StmtResult 7949 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7950 // Transform the body of the @try. 7951 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7952 if (TryBody.isInvalid()) 7953 return StmtError(); 7954 7955 // Transform the @catch statements (if present). 7956 bool AnyCatchChanged = false; 7957 SmallVector<Stmt*, 8> CatchStmts; 7958 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7959 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7960 if (Catch.isInvalid()) 7961 return StmtError(); 7962 if (Catch.get() != S->getCatchStmt(I)) 7963 AnyCatchChanged = true; 7964 CatchStmts.push_back(Catch.get()); 7965 } 7966 7967 // Transform the @finally statement (if present). 7968 StmtResult Finally; 7969 if (S->getFinallyStmt()) { 7970 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7971 if (Finally.isInvalid()) 7972 return StmtError(); 7973 } 7974 7975 // If nothing changed, just retain this statement. 7976 if (!getDerived().AlwaysRebuild() && 7977 TryBody.get() == S->getTryBody() && 7978 !AnyCatchChanged && 7979 Finally.get() == S->getFinallyStmt()) 7980 return S; 7981 7982 // Build a new statement. 7983 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7984 CatchStmts, Finally.get()); 7985 } 7986 7987 template<typename Derived> 7988 StmtResult 7989 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7990 // Transform the @catch parameter, if there is one. 7991 VarDecl *Var = nullptr; 7992 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7993 TypeSourceInfo *TSInfo = nullptr; 7994 if (FromVar->getTypeSourceInfo()) { 7995 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7996 if (!TSInfo) 7997 return StmtError(); 7998 } 7999 8000 QualType T; 8001 if (TSInfo) 8002 T = TSInfo->getType(); 8003 else { 8004 T = getDerived().TransformType(FromVar->getType()); 8005 if (T.isNull()) 8006 return StmtError(); 8007 } 8008 8009 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8010 if (!Var) 8011 return StmtError(); 8012 } 8013 8014 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8015 if (Body.isInvalid()) 8016 return StmtError(); 8017 8018 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8019 S->getRParenLoc(), 8020 Var, Body.get()); 8021 } 8022 8023 template<typename Derived> 8024 StmtResult 8025 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8026 // Transform the body. 8027 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8028 if (Body.isInvalid()) 8029 return StmtError(); 8030 8031 // If nothing changed, just retain this statement. 8032 if (!getDerived().AlwaysRebuild() && 8033 Body.get() == S->getFinallyBody()) 8034 return S; 8035 8036 // Build a new statement. 8037 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8038 Body.get()); 8039 } 8040 8041 template<typename Derived> 8042 StmtResult 8043 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8044 ExprResult Operand; 8045 if (S->getThrowExpr()) { 8046 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8047 if (Operand.isInvalid()) 8048 return StmtError(); 8049 } 8050 8051 if (!getDerived().AlwaysRebuild() && 8052 Operand.get() == S->getThrowExpr()) 8053 return S; 8054 8055 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8056 } 8057 8058 template<typename Derived> 8059 StmtResult 8060 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8061 ObjCAtSynchronizedStmt *S) { 8062 // Transform the object we are locking. 8063 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8064 if (Object.isInvalid()) 8065 return StmtError(); 8066 Object = 8067 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8068 Object.get()); 8069 if (Object.isInvalid()) 8070 return StmtError(); 8071 8072 // Transform the body. 8073 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8074 if (Body.isInvalid()) 8075 return StmtError(); 8076 8077 // If nothing change, just retain the current statement. 8078 if (!getDerived().AlwaysRebuild() && 8079 Object.get() == S->getSynchExpr() && 8080 Body.get() == S->getSynchBody()) 8081 return S; 8082 8083 // Build a new statement. 8084 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8085 Object.get(), Body.get()); 8086 } 8087 8088 template<typename Derived> 8089 StmtResult 8090 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8091 ObjCAutoreleasePoolStmt *S) { 8092 // Transform the body. 8093 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8094 if (Body.isInvalid()) 8095 return StmtError(); 8096 8097 // If nothing changed, just retain this statement. 8098 if (!getDerived().AlwaysRebuild() && 8099 Body.get() == S->getSubStmt()) 8100 return S; 8101 8102 // Build a new statement. 8103 return getDerived().RebuildObjCAutoreleasePoolStmt( 8104 S->getAtLoc(), Body.get()); 8105 } 8106 8107 template<typename Derived> 8108 StmtResult 8109 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8110 ObjCForCollectionStmt *S) { 8111 // Transform the element statement. 8112 StmtResult Element = 8113 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8114 if (Element.isInvalid()) 8115 return StmtError(); 8116 8117 // Transform the collection expression. 8118 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8119 if (Collection.isInvalid()) 8120 return StmtError(); 8121 8122 // Transform the body. 8123 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8124 if (Body.isInvalid()) 8125 return StmtError(); 8126 8127 // If nothing changed, just retain this statement. 8128 if (!getDerived().AlwaysRebuild() && 8129 Element.get() == S->getElement() && 8130 Collection.get() == S->getCollection() && 8131 Body.get() == S->getBody()) 8132 return S; 8133 8134 // Build a new statement. 8135 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8136 Element.get(), 8137 Collection.get(), 8138 S->getRParenLoc(), 8139 Body.get()); 8140 } 8141 8142 template <typename Derived> 8143 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8144 // Transform the exception declaration, if any. 8145 VarDecl *Var = nullptr; 8146 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8147 TypeSourceInfo *T = 8148 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8149 if (!T) 8150 return StmtError(); 8151 8152 Var = getDerived().RebuildExceptionDecl( 8153 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8154 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8155 if (!Var || Var->isInvalidDecl()) 8156 return StmtError(); 8157 } 8158 8159 // Transform the actual exception handler. 8160 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8161 if (Handler.isInvalid()) 8162 return StmtError(); 8163 8164 if (!getDerived().AlwaysRebuild() && !Var && 8165 Handler.get() == S->getHandlerBlock()) 8166 return S; 8167 8168 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8169 } 8170 8171 template <typename Derived> 8172 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8173 // Transform the try block itself. 8174 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8175 if (TryBlock.isInvalid()) 8176 return StmtError(); 8177 8178 // Transform the handlers. 8179 bool HandlerChanged = false; 8180 SmallVector<Stmt *, 8> Handlers; 8181 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8182 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8183 if (Handler.isInvalid()) 8184 return StmtError(); 8185 8186 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8187 Handlers.push_back(Handler.getAs<Stmt>()); 8188 } 8189 8190 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8191 !HandlerChanged) 8192 return S; 8193 8194 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8195 Handlers); 8196 } 8197 8198 template<typename Derived> 8199 StmtResult 8200 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8201 StmtResult Init = 8202 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8203 if (Init.isInvalid()) 8204 return StmtError(); 8205 8206 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8207 if (Range.isInvalid()) 8208 return StmtError(); 8209 8210 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8211 if (Begin.isInvalid()) 8212 return StmtError(); 8213 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8214 if (End.isInvalid()) 8215 return StmtError(); 8216 8217 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8218 if (Cond.isInvalid()) 8219 return StmtError(); 8220 if (Cond.get()) 8221 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8222 if (Cond.isInvalid()) 8223 return StmtError(); 8224 if (Cond.get()) 8225 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8226 8227 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8228 if (Inc.isInvalid()) 8229 return StmtError(); 8230 if (Inc.get()) 8231 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8232 8233 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8234 if (LoopVar.isInvalid()) 8235 return StmtError(); 8236 8237 StmtResult NewStmt = S; 8238 if (getDerived().AlwaysRebuild() || 8239 Init.get() != S->getInit() || 8240 Range.get() != S->getRangeStmt() || 8241 Begin.get() != S->getBeginStmt() || 8242 End.get() != S->getEndStmt() || 8243 Cond.get() != S->getCond() || 8244 Inc.get() != S->getInc() || 8245 LoopVar.get() != S->getLoopVarStmt()) { 8246 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8247 S->getCoawaitLoc(), Init.get(), 8248 S->getColonLoc(), Range.get(), 8249 Begin.get(), End.get(), 8250 Cond.get(), 8251 Inc.get(), LoopVar.get(), 8252 S->getRParenLoc()); 8253 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8254 // Might not have attached any initializer to the loop variable. 8255 getSema().ActOnInitializerError( 8256 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8257 return StmtError(); 8258 } 8259 } 8260 8261 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8262 if (Body.isInvalid()) 8263 return StmtError(); 8264 8265 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8266 // it now so we have a new statement to attach the body to. 8267 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8268 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8269 S->getCoawaitLoc(), Init.get(), 8270 S->getColonLoc(), Range.get(), 8271 Begin.get(), End.get(), 8272 Cond.get(), 8273 Inc.get(), LoopVar.get(), 8274 S->getRParenLoc()); 8275 if (NewStmt.isInvalid()) 8276 return StmtError(); 8277 } 8278 8279 if (NewStmt.get() == S) 8280 return S; 8281 8282 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8283 } 8284 8285 template<typename Derived> 8286 StmtResult 8287 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8288 MSDependentExistsStmt *S) { 8289 // Transform the nested-name-specifier, if any. 8290 NestedNameSpecifierLoc QualifierLoc; 8291 if (S->getQualifierLoc()) { 8292 QualifierLoc 8293 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8294 if (!QualifierLoc) 8295 return StmtError(); 8296 } 8297 8298 // Transform the declaration name. 8299 DeclarationNameInfo NameInfo = S->getNameInfo(); 8300 if (NameInfo.getName()) { 8301 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8302 if (!NameInfo.getName()) 8303 return StmtError(); 8304 } 8305 8306 // Check whether anything changed. 8307 if (!getDerived().AlwaysRebuild() && 8308 QualifierLoc == S->getQualifierLoc() && 8309 NameInfo.getName() == S->getNameInfo().getName()) 8310 return S; 8311 8312 // Determine whether this name exists, if we can. 8313 CXXScopeSpec SS; 8314 SS.Adopt(QualifierLoc); 8315 bool Dependent = false; 8316 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8317 case Sema::IER_Exists: 8318 if (S->isIfExists()) 8319 break; 8320 8321 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8322 8323 case Sema::IER_DoesNotExist: 8324 if (S->isIfNotExists()) 8325 break; 8326 8327 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8328 8329 case Sema::IER_Dependent: 8330 Dependent = true; 8331 break; 8332 8333 case Sema::IER_Error: 8334 return StmtError(); 8335 } 8336 8337 // We need to continue with the instantiation, so do so now. 8338 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8339 if (SubStmt.isInvalid()) 8340 return StmtError(); 8341 8342 // If we have resolved the name, just transform to the substatement. 8343 if (!Dependent) 8344 return SubStmt; 8345 8346 // The name is still dependent, so build a dependent expression again. 8347 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8348 S->isIfExists(), 8349 QualifierLoc, 8350 NameInfo, 8351 SubStmt.get()); 8352 } 8353 8354 template<typename Derived> 8355 ExprResult 8356 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8357 NestedNameSpecifierLoc QualifierLoc; 8358 if (E->getQualifierLoc()) { 8359 QualifierLoc 8360 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8361 if (!QualifierLoc) 8362 return ExprError(); 8363 } 8364 8365 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8366 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8367 if (!PD) 8368 return ExprError(); 8369 8370 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8371 if (Base.isInvalid()) 8372 return ExprError(); 8373 8374 return new (SemaRef.getASTContext()) 8375 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8376 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8377 QualifierLoc, E->getMemberLoc()); 8378 } 8379 8380 template <typename Derived> 8381 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8382 MSPropertySubscriptExpr *E) { 8383 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8384 if (BaseRes.isInvalid()) 8385 return ExprError(); 8386 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8387 if (IdxRes.isInvalid()) 8388 return ExprError(); 8389 8390 if (!getDerived().AlwaysRebuild() && 8391 BaseRes.get() == E->getBase() && 8392 IdxRes.get() == E->getIdx()) 8393 return E; 8394 8395 return getDerived().RebuildArraySubscriptExpr( 8396 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8397 } 8398 8399 template <typename Derived> 8400 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8401 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8402 if (TryBlock.isInvalid()) 8403 return StmtError(); 8404 8405 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8406 if (Handler.isInvalid()) 8407 return StmtError(); 8408 8409 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8410 Handler.get() == S->getHandler()) 8411 return S; 8412 8413 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8414 TryBlock.get(), Handler.get()); 8415 } 8416 8417 template <typename Derived> 8418 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8419 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8420 if (Block.isInvalid()) 8421 return StmtError(); 8422 8423 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8424 } 8425 8426 template <typename Derived> 8427 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8428 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8429 if (FilterExpr.isInvalid()) 8430 return StmtError(); 8431 8432 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8433 if (Block.isInvalid()) 8434 return StmtError(); 8435 8436 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8437 Block.get()); 8438 } 8439 8440 template <typename Derived> 8441 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8442 if (isa<SEHFinallyStmt>(Handler)) 8443 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8444 else 8445 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8446 } 8447 8448 template<typename Derived> 8449 StmtResult 8450 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8451 return S; 8452 } 8453 8454 //===----------------------------------------------------------------------===// 8455 // OpenMP directive transformation 8456 //===----------------------------------------------------------------------===// 8457 8458 template <typename Derived> 8459 StmtResult 8460 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8461 // OMPCanonicalLoops are eliminated during transformation, since they will be 8462 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8463 // after transformation. 8464 return getDerived().TransformStmt(L->getLoopStmt()); 8465 } 8466 8467 template <typename Derived> 8468 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8469 OMPExecutableDirective *D) { 8470 8471 // Transform the clauses 8472 llvm::SmallVector<OMPClause *, 16> TClauses; 8473 ArrayRef<OMPClause *> Clauses = D->clauses(); 8474 TClauses.reserve(Clauses.size()); 8475 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8476 I != E; ++I) { 8477 if (*I) { 8478 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8479 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8480 getDerived().getSema().EndOpenMPClause(); 8481 if (Clause) 8482 TClauses.push_back(Clause); 8483 } else { 8484 TClauses.push_back(nullptr); 8485 } 8486 } 8487 StmtResult AssociatedStmt; 8488 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8489 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8490 /*CurScope=*/nullptr); 8491 StmtResult Body; 8492 { 8493 Sema::CompoundScopeRAII CompoundScope(getSema()); 8494 Stmt *CS; 8495 if (D->getDirectiveKind() == OMPD_atomic || 8496 D->getDirectiveKind() == OMPD_critical || 8497 D->getDirectiveKind() == OMPD_section || 8498 D->getDirectiveKind() == OMPD_master) 8499 CS = D->getAssociatedStmt(); 8500 else 8501 CS = D->getRawStmt(); 8502 Body = getDerived().TransformStmt(CS); 8503 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8504 getSema().getLangOpts().OpenMPIRBuilder) 8505 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8506 } 8507 AssociatedStmt = 8508 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8509 if (AssociatedStmt.isInvalid()) { 8510 return StmtError(); 8511 } 8512 } 8513 if (TClauses.size() != Clauses.size()) { 8514 return StmtError(); 8515 } 8516 8517 // Transform directive name for 'omp critical' directive. 8518 DeclarationNameInfo DirName; 8519 if (D->getDirectiveKind() == OMPD_critical) { 8520 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8521 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8522 } 8523 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8524 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8525 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8526 } else if (D->getDirectiveKind() == OMPD_cancel) { 8527 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8528 } 8529 8530 return getDerived().RebuildOMPExecutableDirective( 8531 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8532 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8533 } 8534 8535 template <typename Derived> 8536 StmtResult 8537 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8538 // TODO: Fix This 8539 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8540 << getOpenMPDirectiveName(D->getDirectiveKind()); 8541 return StmtError(); 8542 } 8543 8544 template <typename Derived> 8545 StmtResult 8546 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8547 DeclarationNameInfo DirName; 8548 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8549 D->getBeginLoc()); 8550 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8551 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8552 return Res; 8553 } 8554 8555 template <typename Derived> 8556 StmtResult 8557 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8558 DeclarationNameInfo DirName; 8559 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8560 D->getBeginLoc()); 8561 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8562 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8563 return Res; 8564 } 8565 8566 template <typename Derived> 8567 StmtResult 8568 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8569 DeclarationNameInfo DirName; 8570 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8571 nullptr, D->getBeginLoc()); 8572 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8573 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8574 return Res; 8575 } 8576 8577 template <typename Derived> 8578 StmtResult 8579 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8580 DeclarationNameInfo DirName; 8581 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8582 nullptr, D->getBeginLoc()); 8583 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8584 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8585 return Res; 8586 } 8587 8588 template <typename Derived> 8589 StmtResult 8590 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8591 DeclarationNameInfo DirName; 8592 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8593 D->getBeginLoc()); 8594 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8595 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8596 return Res; 8597 } 8598 8599 template <typename Derived> 8600 StmtResult 8601 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8602 DeclarationNameInfo DirName; 8603 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8604 D->getBeginLoc()); 8605 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8606 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8607 return Res; 8608 } 8609 8610 template <typename Derived> 8611 StmtResult 8612 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8613 DeclarationNameInfo DirName; 8614 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8615 D->getBeginLoc()); 8616 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8617 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8618 return Res; 8619 } 8620 8621 template <typename Derived> 8622 StmtResult 8623 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8624 DeclarationNameInfo DirName; 8625 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8626 D->getBeginLoc()); 8627 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8628 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8629 return Res; 8630 } 8631 8632 template <typename Derived> 8633 StmtResult 8634 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8635 DeclarationNameInfo DirName; 8636 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8637 D->getBeginLoc()); 8638 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8639 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8640 return Res; 8641 } 8642 8643 template <typename Derived> 8644 StmtResult 8645 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8646 DeclarationNameInfo DirName; 8647 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8648 D->getBeginLoc()); 8649 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8650 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8651 return Res; 8652 } 8653 8654 template <typename Derived> 8655 StmtResult 8656 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8657 getDerived().getSema().StartOpenMPDSABlock( 8658 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8659 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8660 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8661 return Res; 8662 } 8663 8664 template <typename Derived> 8665 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8666 OMPParallelForDirective *D) { 8667 DeclarationNameInfo DirName; 8668 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8669 nullptr, D->getBeginLoc()); 8670 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8671 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8672 return Res; 8673 } 8674 8675 template <typename Derived> 8676 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8677 OMPParallelForSimdDirective *D) { 8678 DeclarationNameInfo DirName; 8679 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8680 nullptr, D->getBeginLoc()); 8681 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8682 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8683 return Res; 8684 } 8685 8686 template <typename Derived> 8687 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8688 OMPParallelMasterDirective *D) { 8689 DeclarationNameInfo DirName; 8690 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8691 nullptr, D->getBeginLoc()); 8692 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8693 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8694 return Res; 8695 } 8696 8697 template <typename Derived> 8698 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8699 OMPParallelSectionsDirective *D) { 8700 DeclarationNameInfo DirName; 8701 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8702 nullptr, D->getBeginLoc()); 8703 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8704 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8705 return Res; 8706 } 8707 8708 template <typename Derived> 8709 StmtResult 8710 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8711 DeclarationNameInfo DirName; 8712 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8713 D->getBeginLoc()); 8714 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8715 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8716 return Res; 8717 } 8718 8719 template <typename Derived> 8720 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8721 OMPTaskyieldDirective *D) { 8722 DeclarationNameInfo DirName; 8723 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8724 D->getBeginLoc()); 8725 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8726 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8727 return Res; 8728 } 8729 8730 template <typename Derived> 8731 StmtResult 8732 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8733 DeclarationNameInfo DirName; 8734 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8735 D->getBeginLoc()); 8736 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8737 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8738 return Res; 8739 } 8740 8741 template <typename Derived> 8742 StmtResult 8743 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8744 DeclarationNameInfo DirName; 8745 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8746 D->getBeginLoc()); 8747 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8748 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8749 return Res; 8750 } 8751 8752 template <typename Derived> 8753 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8754 OMPTaskgroupDirective *D) { 8755 DeclarationNameInfo DirName; 8756 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8757 D->getBeginLoc()); 8758 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8759 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8760 return Res; 8761 } 8762 8763 template <typename Derived> 8764 StmtResult 8765 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8766 DeclarationNameInfo DirName; 8767 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8768 D->getBeginLoc()); 8769 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8770 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8771 return Res; 8772 } 8773 8774 template <typename Derived> 8775 StmtResult 8776 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8777 DeclarationNameInfo DirName; 8778 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8779 D->getBeginLoc()); 8780 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8781 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8782 return Res; 8783 } 8784 8785 template <typename Derived> 8786 StmtResult 8787 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8788 DeclarationNameInfo DirName; 8789 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8790 D->getBeginLoc()); 8791 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8792 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8793 return Res; 8794 } 8795 8796 template <typename Derived> 8797 StmtResult 8798 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8799 DeclarationNameInfo DirName; 8800 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8801 D->getBeginLoc()); 8802 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8803 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8804 return Res; 8805 } 8806 8807 template <typename Derived> 8808 StmtResult 8809 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8810 DeclarationNameInfo DirName; 8811 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8812 D->getBeginLoc()); 8813 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8814 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8815 return Res; 8816 } 8817 8818 template <typename Derived> 8819 StmtResult 8820 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8821 DeclarationNameInfo DirName; 8822 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8823 D->getBeginLoc()); 8824 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8825 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8826 return Res; 8827 } 8828 8829 template <typename Derived> 8830 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8831 OMPTargetDataDirective *D) { 8832 DeclarationNameInfo DirName; 8833 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8834 D->getBeginLoc()); 8835 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8836 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8837 return Res; 8838 } 8839 8840 template <typename Derived> 8841 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8842 OMPTargetEnterDataDirective *D) { 8843 DeclarationNameInfo DirName; 8844 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8845 nullptr, D->getBeginLoc()); 8846 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8847 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8848 return Res; 8849 } 8850 8851 template <typename Derived> 8852 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8853 OMPTargetExitDataDirective *D) { 8854 DeclarationNameInfo DirName; 8855 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8856 nullptr, D->getBeginLoc()); 8857 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8858 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8859 return Res; 8860 } 8861 8862 template <typename Derived> 8863 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8864 OMPTargetParallelDirective *D) { 8865 DeclarationNameInfo DirName; 8866 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8867 nullptr, D->getBeginLoc()); 8868 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8869 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8870 return Res; 8871 } 8872 8873 template <typename Derived> 8874 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8875 OMPTargetParallelForDirective *D) { 8876 DeclarationNameInfo DirName; 8877 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8878 nullptr, D->getBeginLoc()); 8879 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8880 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8881 return Res; 8882 } 8883 8884 template <typename Derived> 8885 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8886 OMPTargetUpdateDirective *D) { 8887 DeclarationNameInfo DirName; 8888 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8889 nullptr, D->getBeginLoc()); 8890 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8891 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8892 return Res; 8893 } 8894 8895 template <typename Derived> 8896 StmtResult 8897 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8898 DeclarationNameInfo DirName; 8899 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8900 D->getBeginLoc()); 8901 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8902 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8903 return Res; 8904 } 8905 8906 template <typename Derived> 8907 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8908 OMPCancellationPointDirective *D) { 8909 DeclarationNameInfo DirName; 8910 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8911 nullptr, D->getBeginLoc()); 8912 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8913 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8914 return Res; 8915 } 8916 8917 template <typename Derived> 8918 StmtResult 8919 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8920 DeclarationNameInfo DirName; 8921 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8922 D->getBeginLoc()); 8923 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8924 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8925 return Res; 8926 } 8927 8928 template <typename Derived> 8929 StmtResult 8930 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8931 DeclarationNameInfo DirName; 8932 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8933 D->getBeginLoc()); 8934 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8935 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8936 return Res; 8937 } 8938 8939 template <typename Derived> 8940 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8941 OMPTaskLoopSimdDirective *D) { 8942 DeclarationNameInfo DirName; 8943 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8944 nullptr, D->getBeginLoc()); 8945 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8946 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8947 return Res; 8948 } 8949 8950 template <typename Derived> 8951 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8952 OMPMasterTaskLoopDirective *D) { 8953 DeclarationNameInfo DirName; 8954 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8955 nullptr, D->getBeginLoc()); 8956 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8957 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8958 return Res; 8959 } 8960 8961 template <typename Derived> 8962 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8963 OMPMasterTaskLoopSimdDirective *D) { 8964 DeclarationNameInfo DirName; 8965 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8966 nullptr, D->getBeginLoc()); 8967 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8968 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8969 return Res; 8970 } 8971 8972 template <typename Derived> 8973 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8974 OMPParallelMasterTaskLoopDirective *D) { 8975 DeclarationNameInfo DirName; 8976 getDerived().getSema().StartOpenMPDSABlock( 8977 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8978 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8979 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8980 return Res; 8981 } 8982 8983 template <typename Derived> 8984 StmtResult 8985 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8986 OMPParallelMasterTaskLoopSimdDirective *D) { 8987 DeclarationNameInfo DirName; 8988 getDerived().getSema().StartOpenMPDSABlock( 8989 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8990 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8991 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8992 return Res; 8993 } 8994 8995 template <typename Derived> 8996 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8997 OMPDistributeDirective *D) { 8998 DeclarationNameInfo DirName; 8999 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9000 D->getBeginLoc()); 9001 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9002 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9003 return Res; 9004 } 9005 9006 template <typename Derived> 9007 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 9008 OMPDistributeParallelForDirective *D) { 9009 DeclarationNameInfo DirName; 9010 getDerived().getSema().StartOpenMPDSABlock( 9011 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9012 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9013 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9014 return Res; 9015 } 9016 9017 template <typename Derived> 9018 StmtResult 9019 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9020 OMPDistributeParallelForSimdDirective *D) { 9021 DeclarationNameInfo DirName; 9022 getDerived().getSema().StartOpenMPDSABlock( 9023 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9024 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9025 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9026 return Res; 9027 } 9028 9029 template <typename Derived> 9030 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9031 OMPDistributeSimdDirective *D) { 9032 DeclarationNameInfo DirName; 9033 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9034 nullptr, D->getBeginLoc()); 9035 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9036 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9037 return Res; 9038 } 9039 9040 template <typename Derived> 9041 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9042 OMPTargetParallelForSimdDirective *D) { 9043 DeclarationNameInfo DirName; 9044 getDerived().getSema().StartOpenMPDSABlock( 9045 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9046 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9047 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9048 return Res; 9049 } 9050 9051 template <typename Derived> 9052 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9053 OMPTargetSimdDirective *D) { 9054 DeclarationNameInfo DirName; 9055 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 9056 D->getBeginLoc()); 9057 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9058 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9059 return Res; 9060 } 9061 9062 template <typename Derived> 9063 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9064 OMPTeamsDistributeDirective *D) { 9065 DeclarationNameInfo DirName; 9066 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9067 nullptr, D->getBeginLoc()); 9068 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9069 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9070 return Res; 9071 } 9072 9073 template <typename Derived> 9074 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9075 OMPTeamsDistributeSimdDirective *D) { 9076 DeclarationNameInfo DirName; 9077 getDerived().getSema().StartOpenMPDSABlock( 9078 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9079 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9080 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9081 return Res; 9082 } 9083 9084 template <typename Derived> 9085 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9086 OMPTeamsDistributeParallelForSimdDirective *D) { 9087 DeclarationNameInfo DirName; 9088 getDerived().getSema().StartOpenMPDSABlock( 9089 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9090 D->getBeginLoc()); 9091 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9092 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9093 return Res; 9094 } 9095 9096 template <typename Derived> 9097 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9098 OMPTeamsDistributeParallelForDirective *D) { 9099 DeclarationNameInfo DirName; 9100 getDerived().getSema().StartOpenMPDSABlock( 9101 OMPD_teams_distribute_parallel_for, DirName, nullptr, 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 TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9109 OMPTargetTeamsDirective *D) { 9110 DeclarationNameInfo DirName; 9111 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9112 nullptr, D->getBeginLoc()); 9113 auto Res = getDerived().TransformOMPExecutableDirective(D); 9114 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9115 return Res; 9116 } 9117 9118 template <typename Derived> 9119 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9120 OMPTargetTeamsDistributeDirective *D) { 9121 DeclarationNameInfo DirName; 9122 getDerived().getSema().StartOpenMPDSABlock( 9123 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9124 auto Res = getDerived().TransformOMPExecutableDirective(D); 9125 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9126 return Res; 9127 } 9128 9129 template <typename Derived> 9130 StmtResult 9131 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9132 OMPTargetTeamsDistributeParallelForDirective *D) { 9133 DeclarationNameInfo DirName; 9134 getDerived().getSema().StartOpenMPDSABlock( 9135 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9136 D->getBeginLoc()); 9137 auto Res = getDerived().TransformOMPExecutableDirective(D); 9138 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9139 return Res; 9140 } 9141 9142 template <typename Derived> 9143 StmtResult TreeTransform<Derived>:: 9144 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9145 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9146 DeclarationNameInfo DirName; 9147 getDerived().getSema().StartOpenMPDSABlock( 9148 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9149 D->getBeginLoc()); 9150 auto Res = getDerived().TransformOMPExecutableDirective(D); 9151 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9152 return Res; 9153 } 9154 9155 template <typename Derived> 9156 StmtResult 9157 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9158 OMPTargetTeamsDistributeSimdDirective *D) { 9159 DeclarationNameInfo DirName; 9160 getDerived().getSema().StartOpenMPDSABlock( 9161 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9162 auto Res = getDerived().TransformOMPExecutableDirective(D); 9163 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9164 return Res; 9165 } 9166 9167 template <typename Derived> 9168 StmtResult 9169 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9170 DeclarationNameInfo DirName; 9171 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9172 D->getBeginLoc()); 9173 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9174 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9175 return Res; 9176 } 9177 9178 template <typename Derived> 9179 StmtResult 9180 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9181 DeclarationNameInfo DirName; 9182 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9183 D->getBeginLoc()); 9184 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9185 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9186 return Res; 9187 } 9188 9189 template <typename Derived> 9190 StmtResult 9191 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9192 DeclarationNameInfo DirName; 9193 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9194 D->getBeginLoc()); 9195 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9196 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9197 return Res; 9198 } 9199 9200 template <typename Derived> 9201 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9202 OMPGenericLoopDirective *D) { 9203 DeclarationNameInfo DirName; 9204 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9205 D->getBeginLoc()); 9206 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9207 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9208 return Res; 9209 } 9210 9211 //===----------------------------------------------------------------------===// 9212 // OpenMP clause transformation 9213 //===----------------------------------------------------------------------===// 9214 template <typename Derived> 9215 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9216 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9217 if (Cond.isInvalid()) 9218 return nullptr; 9219 return getDerived().RebuildOMPIfClause( 9220 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9221 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9222 } 9223 9224 template <typename Derived> 9225 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9226 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9227 if (Cond.isInvalid()) 9228 return nullptr; 9229 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9230 C->getLParenLoc(), C->getEndLoc()); 9231 } 9232 9233 template <typename Derived> 9234 OMPClause * 9235 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9236 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9237 if (NumThreads.isInvalid()) 9238 return nullptr; 9239 return getDerived().RebuildOMPNumThreadsClause( 9240 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9241 } 9242 9243 template <typename Derived> 9244 OMPClause * 9245 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9246 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9247 if (E.isInvalid()) 9248 return nullptr; 9249 return getDerived().RebuildOMPSafelenClause( 9250 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9251 } 9252 9253 template <typename Derived> 9254 OMPClause * 9255 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9256 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9257 if (E.isInvalid()) 9258 return nullptr; 9259 return getDerived().RebuildOMPAllocatorClause( 9260 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9261 } 9262 9263 template <typename Derived> 9264 OMPClause * 9265 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9266 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9267 if (E.isInvalid()) 9268 return nullptr; 9269 return getDerived().RebuildOMPSimdlenClause( 9270 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9271 } 9272 9273 template <typename Derived> 9274 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9275 SmallVector<Expr *, 4> TransformedSizes; 9276 TransformedSizes.reserve(C->getNumSizes()); 9277 bool Changed = false; 9278 for (Expr *E : C->getSizesRefs()) { 9279 if (!E) { 9280 TransformedSizes.push_back(nullptr); 9281 continue; 9282 } 9283 9284 ExprResult T = getDerived().TransformExpr(E); 9285 if (T.isInvalid()) 9286 return nullptr; 9287 if (E != T.get()) 9288 Changed = true; 9289 TransformedSizes.push_back(T.get()); 9290 } 9291 9292 if (!Changed && !getDerived().AlwaysRebuild()) 9293 return C; 9294 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9295 C->getLParenLoc(), C->getEndLoc()); 9296 } 9297 9298 template <typename Derived> 9299 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9300 if (!getDerived().AlwaysRebuild()) 9301 return C; 9302 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9303 } 9304 9305 template <typename Derived> 9306 OMPClause * 9307 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9308 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9309 if (T.isInvalid()) 9310 return nullptr; 9311 Expr *Factor = T.get(); 9312 bool Changed = Factor != C->getFactor(); 9313 9314 if (!Changed && !getDerived().AlwaysRebuild()) 9315 return C; 9316 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9317 C->getEndLoc()); 9318 } 9319 9320 template <typename Derived> 9321 OMPClause * 9322 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9323 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9324 if (E.isInvalid()) 9325 return nullptr; 9326 return getDerived().RebuildOMPCollapseClause( 9327 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9328 } 9329 9330 template <typename Derived> 9331 OMPClause * 9332 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9333 return getDerived().RebuildOMPDefaultClause( 9334 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9335 C->getLParenLoc(), C->getEndLoc()); 9336 } 9337 9338 template <typename Derived> 9339 OMPClause * 9340 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9341 return getDerived().RebuildOMPProcBindClause( 9342 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9343 C->getLParenLoc(), C->getEndLoc()); 9344 } 9345 9346 template <typename Derived> 9347 OMPClause * 9348 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9349 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9350 if (E.isInvalid()) 9351 return nullptr; 9352 return getDerived().RebuildOMPScheduleClause( 9353 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9354 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9355 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9356 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9357 } 9358 9359 template <typename Derived> 9360 OMPClause * 9361 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9362 ExprResult E; 9363 if (auto *Num = C->getNumForLoops()) { 9364 E = getDerived().TransformExpr(Num); 9365 if (E.isInvalid()) 9366 return nullptr; 9367 } 9368 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9369 C->getLParenLoc(), E.get()); 9370 } 9371 9372 template <typename Derived> 9373 OMPClause * 9374 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9375 ExprResult E; 9376 if (Expr *Evt = C->getEventHandler()) { 9377 E = getDerived().TransformExpr(Evt); 9378 if (E.isInvalid()) 9379 return nullptr; 9380 } 9381 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9382 C->getLParenLoc(), C->getEndLoc()); 9383 } 9384 9385 template <typename Derived> 9386 OMPClause * 9387 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9388 // No need to rebuild this clause, no template-dependent parameters. 9389 return C; 9390 } 9391 9392 template <typename Derived> 9393 OMPClause * 9394 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9395 // No need to rebuild this clause, no template-dependent parameters. 9396 return C; 9397 } 9398 9399 template <typename Derived> 9400 OMPClause * 9401 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9402 // No need to rebuild this clause, no template-dependent parameters. 9403 return C; 9404 } 9405 9406 template <typename Derived> 9407 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9408 // No need to rebuild this clause, no template-dependent parameters. 9409 return C; 9410 } 9411 9412 template <typename Derived> 9413 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9414 // No need to rebuild this clause, no template-dependent parameters. 9415 return C; 9416 } 9417 9418 template <typename Derived> 9419 OMPClause * 9420 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9421 // No need to rebuild this clause, no template-dependent parameters. 9422 return C; 9423 } 9424 9425 template <typename Derived> 9426 OMPClause * 9427 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9428 // No need to rebuild this clause, no template-dependent parameters. 9429 return C; 9430 } 9431 9432 template <typename Derived> 9433 OMPClause * 9434 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9435 // No need to rebuild this clause, no template-dependent parameters. 9436 return C; 9437 } 9438 9439 template <typename Derived> 9440 OMPClause * 9441 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9442 // No need to rebuild this clause, no template-dependent parameters. 9443 return C; 9444 } 9445 9446 template <typename Derived> 9447 OMPClause * 9448 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9449 // No need to rebuild this clause, no template-dependent parameters. 9450 return C; 9451 } 9452 9453 template <typename Derived> 9454 OMPClause * 9455 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9456 // No need to rebuild this clause, no template-dependent parameters. 9457 return C; 9458 } 9459 9460 template <typename Derived> 9461 OMPClause * 9462 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9463 // No need to rebuild this clause, no template-dependent parameters. 9464 return C; 9465 } 9466 9467 template <typename Derived> 9468 OMPClause * 9469 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9470 // No need to rebuild this clause, no template-dependent parameters. 9471 return C; 9472 } 9473 9474 template <typename Derived> 9475 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9476 // No need to rebuild this clause, no template-dependent parameters. 9477 return C; 9478 } 9479 9480 template <typename Derived> 9481 OMPClause * 9482 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9483 // No need to rebuild this clause, no template-dependent parameters. 9484 return C; 9485 } 9486 9487 template <typename Derived> 9488 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9489 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9490 if (IVR.isInvalid()) 9491 return nullptr; 9492 9493 llvm::SmallVector<Expr *, 8> PrefExprs; 9494 PrefExprs.reserve(C->varlist_size() - 1); 9495 for (Expr *E : llvm::drop_begin(C->varlists())) { 9496 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9497 if (ER.isInvalid()) 9498 return nullptr; 9499 PrefExprs.push_back(ER.get()); 9500 } 9501 return getDerived().RebuildOMPInitClause( 9502 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9503 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9504 } 9505 9506 template <typename Derived> 9507 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9508 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9509 if (ER.isInvalid()) 9510 return nullptr; 9511 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9512 C->getLParenLoc(), C->getVarLoc(), 9513 C->getEndLoc()); 9514 } 9515 9516 template <typename Derived> 9517 OMPClause * 9518 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9519 ExprResult ER; 9520 if (Expr *IV = C->getInteropVar()) { 9521 ER = getDerived().TransformExpr(IV); 9522 if (ER.isInvalid()) 9523 return nullptr; 9524 } 9525 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9526 C->getLParenLoc(), C->getVarLoc(), 9527 C->getEndLoc()); 9528 } 9529 9530 template <typename Derived> 9531 OMPClause * 9532 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9533 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9534 if (Cond.isInvalid()) 9535 return nullptr; 9536 return getDerived().RebuildOMPNovariantsClause( 9537 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9538 } 9539 9540 template <typename Derived> 9541 OMPClause * 9542 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9543 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9544 if (Cond.isInvalid()) 9545 return nullptr; 9546 return getDerived().RebuildOMPNocontextClause( 9547 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9548 } 9549 9550 template <typename Derived> 9551 OMPClause * 9552 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9553 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9554 if (ThreadID.isInvalid()) 9555 return nullptr; 9556 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9557 C->getLParenLoc(), C->getEndLoc()); 9558 } 9559 9560 template <typename Derived> 9561 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 9562 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 9563 if (E.isInvalid()) 9564 return nullptr; 9565 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 9566 C->getLParenLoc(), C->getEndLoc()); 9567 } 9568 9569 template <typename Derived> 9570 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9571 OMPUnifiedAddressClause *C) { 9572 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9573 } 9574 9575 template <typename Derived> 9576 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9577 OMPUnifiedSharedMemoryClause *C) { 9578 llvm_unreachable( 9579 "unified_shared_memory clause cannot appear in dependent context"); 9580 } 9581 9582 template <typename Derived> 9583 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9584 OMPReverseOffloadClause *C) { 9585 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9586 } 9587 9588 template <typename Derived> 9589 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9590 OMPDynamicAllocatorsClause *C) { 9591 llvm_unreachable( 9592 "dynamic_allocators clause cannot appear in dependent context"); 9593 } 9594 9595 template <typename Derived> 9596 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9597 OMPAtomicDefaultMemOrderClause *C) { 9598 llvm_unreachable( 9599 "atomic_default_mem_order clause cannot appear in dependent context"); 9600 } 9601 9602 template <typename Derived> 9603 OMPClause * 9604 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9605 llvm::SmallVector<Expr *, 16> Vars; 9606 Vars.reserve(C->varlist_size()); 9607 for (auto *VE : C->varlists()) { 9608 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9609 if (EVar.isInvalid()) 9610 return nullptr; 9611 Vars.push_back(EVar.get()); 9612 } 9613 return getDerived().RebuildOMPPrivateClause( 9614 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9615 } 9616 9617 template <typename Derived> 9618 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9619 OMPFirstprivateClause *C) { 9620 llvm::SmallVector<Expr *, 16> Vars; 9621 Vars.reserve(C->varlist_size()); 9622 for (auto *VE : C->varlists()) { 9623 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9624 if (EVar.isInvalid()) 9625 return nullptr; 9626 Vars.push_back(EVar.get()); 9627 } 9628 return getDerived().RebuildOMPFirstprivateClause( 9629 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9630 } 9631 9632 template <typename Derived> 9633 OMPClause * 9634 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9635 llvm::SmallVector<Expr *, 16> Vars; 9636 Vars.reserve(C->varlist_size()); 9637 for (auto *VE : C->varlists()) { 9638 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9639 if (EVar.isInvalid()) 9640 return nullptr; 9641 Vars.push_back(EVar.get()); 9642 } 9643 return getDerived().RebuildOMPLastprivateClause( 9644 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9645 C->getLParenLoc(), C->getEndLoc()); 9646 } 9647 9648 template <typename Derived> 9649 OMPClause * 9650 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9651 llvm::SmallVector<Expr *, 16> Vars; 9652 Vars.reserve(C->varlist_size()); 9653 for (auto *VE : C->varlists()) { 9654 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9655 if (EVar.isInvalid()) 9656 return nullptr; 9657 Vars.push_back(EVar.get()); 9658 } 9659 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9660 C->getLParenLoc(), C->getEndLoc()); 9661 } 9662 9663 template <typename Derived> 9664 OMPClause * 9665 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9666 llvm::SmallVector<Expr *, 16> Vars; 9667 Vars.reserve(C->varlist_size()); 9668 for (auto *VE : C->varlists()) { 9669 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9670 if (EVar.isInvalid()) 9671 return nullptr; 9672 Vars.push_back(EVar.get()); 9673 } 9674 CXXScopeSpec ReductionIdScopeSpec; 9675 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9676 9677 DeclarationNameInfo NameInfo = C->getNameInfo(); 9678 if (NameInfo.getName()) { 9679 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9680 if (!NameInfo.getName()) 9681 return nullptr; 9682 } 9683 // Build a list of all UDR decls with the same names ranged by the Scopes. 9684 // The Scope boundary is a duplication of the previous decl. 9685 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9686 for (auto *E : C->reduction_ops()) { 9687 // Transform all the decls. 9688 if (E) { 9689 auto *ULE = cast<UnresolvedLookupExpr>(E); 9690 UnresolvedSet<8> Decls; 9691 for (auto *D : ULE->decls()) { 9692 NamedDecl *InstD = 9693 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9694 Decls.addDecl(InstD, InstD->getAccess()); 9695 } 9696 UnresolvedReductions.push_back( 9697 UnresolvedLookupExpr::Create( 9698 SemaRef.Context, /*NamingClass=*/nullptr, 9699 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9700 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9701 Decls.begin(), Decls.end())); 9702 } else 9703 UnresolvedReductions.push_back(nullptr); 9704 } 9705 return getDerived().RebuildOMPReductionClause( 9706 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9707 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9708 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9709 } 9710 9711 template <typename Derived> 9712 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9713 OMPTaskReductionClause *C) { 9714 llvm::SmallVector<Expr *, 16> Vars; 9715 Vars.reserve(C->varlist_size()); 9716 for (auto *VE : C->varlists()) { 9717 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9718 if (EVar.isInvalid()) 9719 return nullptr; 9720 Vars.push_back(EVar.get()); 9721 } 9722 CXXScopeSpec ReductionIdScopeSpec; 9723 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9724 9725 DeclarationNameInfo NameInfo = C->getNameInfo(); 9726 if (NameInfo.getName()) { 9727 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9728 if (!NameInfo.getName()) 9729 return nullptr; 9730 } 9731 // Build a list of all UDR decls with the same names ranged by the Scopes. 9732 // The Scope boundary is a duplication of the previous decl. 9733 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9734 for (auto *E : C->reduction_ops()) { 9735 // Transform all the decls. 9736 if (E) { 9737 auto *ULE = cast<UnresolvedLookupExpr>(E); 9738 UnresolvedSet<8> Decls; 9739 for (auto *D : ULE->decls()) { 9740 NamedDecl *InstD = 9741 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9742 Decls.addDecl(InstD, InstD->getAccess()); 9743 } 9744 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9745 SemaRef.Context, /*NamingClass=*/nullptr, 9746 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9747 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9748 } else 9749 UnresolvedReductions.push_back(nullptr); 9750 } 9751 return getDerived().RebuildOMPTaskReductionClause( 9752 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9753 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9754 } 9755 9756 template <typename Derived> 9757 OMPClause * 9758 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9759 llvm::SmallVector<Expr *, 16> Vars; 9760 Vars.reserve(C->varlist_size()); 9761 for (auto *VE : C->varlists()) { 9762 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9763 if (EVar.isInvalid()) 9764 return nullptr; 9765 Vars.push_back(EVar.get()); 9766 } 9767 CXXScopeSpec ReductionIdScopeSpec; 9768 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9769 9770 DeclarationNameInfo NameInfo = C->getNameInfo(); 9771 if (NameInfo.getName()) { 9772 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9773 if (!NameInfo.getName()) 9774 return nullptr; 9775 } 9776 // Build a list of all UDR decls with the same names ranged by the Scopes. 9777 // The Scope boundary is a duplication of the previous decl. 9778 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9779 for (auto *E : C->reduction_ops()) { 9780 // Transform all the decls. 9781 if (E) { 9782 auto *ULE = cast<UnresolvedLookupExpr>(E); 9783 UnresolvedSet<8> Decls; 9784 for (auto *D : ULE->decls()) { 9785 NamedDecl *InstD = 9786 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9787 Decls.addDecl(InstD, InstD->getAccess()); 9788 } 9789 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9790 SemaRef.Context, /*NamingClass=*/nullptr, 9791 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9792 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9793 } else 9794 UnresolvedReductions.push_back(nullptr); 9795 } 9796 return getDerived().RebuildOMPInReductionClause( 9797 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9798 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9799 } 9800 9801 template <typename Derived> 9802 OMPClause * 9803 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9804 llvm::SmallVector<Expr *, 16> Vars; 9805 Vars.reserve(C->varlist_size()); 9806 for (auto *VE : C->varlists()) { 9807 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9808 if (EVar.isInvalid()) 9809 return nullptr; 9810 Vars.push_back(EVar.get()); 9811 } 9812 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9813 if (Step.isInvalid()) 9814 return nullptr; 9815 return getDerived().RebuildOMPLinearClause( 9816 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9817 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9818 } 9819 9820 template <typename Derived> 9821 OMPClause * 9822 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9823 llvm::SmallVector<Expr *, 16> Vars; 9824 Vars.reserve(C->varlist_size()); 9825 for (auto *VE : C->varlists()) { 9826 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9827 if (EVar.isInvalid()) 9828 return nullptr; 9829 Vars.push_back(EVar.get()); 9830 } 9831 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9832 if (Alignment.isInvalid()) 9833 return nullptr; 9834 return getDerived().RebuildOMPAlignedClause( 9835 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9836 C->getColonLoc(), C->getEndLoc()); 9837 } 9838 9839 template <typename Derived> 9840 OMPClause * 9841 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9842 llvm::SmallVector<Expr *, 16> Vars; 9843 Vars.reserve(C->varlist_size()); 9844 for (auto *VE : C->varlists()) { 9845 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9846 if (EVar.isInvalid()) 9847 return nullptr; 9848 Vars.push_back(EVar.get()); 9849 } 9850 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9851 C->getLParenLoc(), C->getEndLoc()); 9852 } 9853 9854 template <typename Derived> 9855 OMPClause * 9856 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9857 llvm::SmallVector<Expr *, 16> Vars; 9858 Vars.reserve(C->varlist_size()); 9859 for (auto *VE : C->varlists()) { 9860 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9861 if (EVar.isInvalid()) 9862 return nullptr; 9863 Vars.push_back(EVar.get()); 9864 } 9865 return getDerived().RebuildOMPCopyprivateClause( 9866 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9867 } 9868 9869 template <typename Derived> 9870 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9871 llvm::SmallVector<Expr *, 16> Vars; 9872 Vars.reserve(C->varlist_size()); 9873 for (auto *VE : C->varlists()) { 9874 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9875 if (EVar.isInvalid()) 9876 return nullptr; 9877 Vars.push_back(EVar.get()); 9878 } 9879 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9880 C->getLParenLoc(), C->getEndLoc()); 9881 } 9882 9883 template <typename Derived> 9884 OMPClause * 9885 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9886 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9887 if (E.isInvalid()) 9888 return nullptr; 9889 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9890 C->getLParenLoc(), C->getEndLoc()); 9891 } 9892 9893 template <typename Derived> 9894 OMPClause * 9895 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9896 llvm::SmallVector<Expr *, 16> Vars; 9897 Expr *DepModifier = C->getModifier(); 9898 if (DepModifier) { 9899 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9900 if (DepModRes.isInvalid()) 9901 return nullptr; 9902 DepModifier = DepModRes.get(); 9903 } 9904 Vars.reserve(C->varlist_size()); 9905 for (auto *VE : C->varlists()) { 9906 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9907 if (EVar.isInvalid()) 9908 return nullptr; 9909 Vars.push_back(EVar.get()); 9910 } 9911 return getDerived().RebuildOMPDependClause( 9912 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9913 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9914 C->getEndLoc()); 9915 } 9916 9917 template <typename Derived> 9918 OMPClause * 9919 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9920 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9921 if (E.isInvalid()) 9922 return nullptr; 9923 return getDerived().RebuildOMPDeviceClause( 9924 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9925 C->getModifierLoc(), C->getEndLoc()); 9926 } 9927 9928 template <typename Derived, class T> 9929 bool transformOMPMappableExprListClause( 9930 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9931 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9932 DeclarationNameInfo &MapperIdInfo, 9933 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9934 // Transform expressions in the list. 9935 Vars.reserve(C->varlist_size()); 9936 for (auto *VE : C->varlists()) { 9937 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9938 if (EVar.isInvalid()) 9939 return true; 9940 Vars.push_back(EVar.get()); 9941 } 9942 // Transform mapper scope specifier and identifier. 9943 NestedNameSpecifierLoc QualifierLoc; 9944 if (C->getMapperQualifierLoc()) { 9945 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9946 C->getMapperQualifierLoc()); 9947 if (!QualifierLoc) 9948 return true; 9949 } 9950 MapperIdScopeSpec.Adopt(QualifierLoc); 9951 MapperIdInfo = C->getMapperIdInfo(); 9952 if (MapperIdInfo.getName()) { 9953 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9954 if (!MapperIdInfo.getName()) 9955 return true; 9956 } 9957 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9958 // the previous user-defined mapper lookup in dependent environment. 9959 for (auto *E : C->mapperlists()) { 9960 // Transform all the decls. 9961 if (E) { 9962 auto *ULE = cast<UnresolvedLookupExpr>(E); 9963 UnresolvedSet<8> Decls; 9964 for (auto *D : ULE->decls()) { 9965 NamedDecl *InstD = 9966 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9967 Decls.addDecl(InstD, InstD->getAccess()); 9968 } 9969 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9970 TT.getSema().Context, /*NamingClass=*/nullptr, 9971 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9972 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9973 Decls.end())); 9974 } else { 9975 UnresolvedMappers.push_back(nullptr); 9976 } 9977 } 9978 return false; 9979 } 9980 9981 template <typename Derived> 9982 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9983 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9984 llvm::SmallVector<Expr *, 16> Vars; 9985 CXXScopeSpec MapperIdScopeSpec; 9986 DeclarationNameInfo MapperIdInfo; 9987 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9988 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9989 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9990 return nullptr; 9991 return getDerived().RebuildOMPMapClause( 9992 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9993 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9994 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9995 } 9996 9997 template <typename Derived> 9998 OMPClause * 9999 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10000 Expr *Allocator = C->getAllocator(); 10001 if (Allocator) { 10002 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10003 if (AllocatorRes.isInvalid()) 10004 return nullptr; 10005 Allocator = AllocatorRes.get(); 10006 } 10007 llvm::SmallVector<Expr *, 16> Vars; 10008 Vars.reserve(C->varlist_size()); 10009 for (auto *VE : C->varlists()) { 10010 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10011 if (EVar.isInvalid()) 10012 return nullptr; 10013 Vars.push_back(EVar.get()); 10014 } 10015 return getDerived().RebuildOMPAllocateClause( 10016 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10017 C->getEndLoc()); 10018 } 10019 10020 template <typename Derived> 10021 OMPClause * 10022 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10023 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10024 if (E.isInvalid()) 10025 return nullptr; 10026 return getDerived().RebuildOMPNumTeamsClause( 10027 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10028 } 10029 10030 template <typename Derived> 10031 OMPClause * 10032 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10033 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10034 if (E.isInvalid()) 10035 return nullptr; 10036 return getDerived().RebuildOMPThreadLimitClause( 10037 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10038 } 10039 10040 template <typename Derived> 10041 OMPClause * 10042 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10043 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10044 if (E.isInvalid()) 10045 return nullptr; 10046 return getDerived().RebuildOMPPriorityClause( 10047 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10048 } 10049 10050 template <typename Derived> 10051 OMPClause * 10052 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10053 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10054 if (E.isInvalid()) 10055 return nullptr; 10056 return getDerived().RebuildOMPGrainsizeClause( 10057 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10058 } 10059 10060 template <typename Derived> 10061 OMPClause * 10062 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10063 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10064 if (E.isInvalid()) 10065 return nullptr; 10066 return getDerived().RebuildOMPNumTasksClause( 10067 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10068 } 10069 10070 template <typename Derived> 10071 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10072 ExprResult E = getDerived().TransformExpr(C->getHint()); 10073 if (E.isInvalid()) 10074 return nullptr; 10075 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10076 C->getLParenLoc(), C->getEndLoc()); 10077 } 10078 10079 template <typename Derived> 10080 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10081 OMPDistScheduleClause *C) { 10082 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10083 if (E.isInvalid()) 10084 return nullptr; 10085 return getDerived().RebuildOMPDistScheduleClause( 10086 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10087 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10088 } 10089 10090 template <typename Derived> 10091 OMPClause * 10092 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10093 // Rebuild Defaultmap Clause since we need to invoke the checking of 10094 // defaultmap(none:variable-category) after template initialization. 10095 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10096 C->getDefaultmapKind(), 10097 C->getBeginLoc(), 10098 C->getLParenLoc(), 10099 C->getDefaultmapModifierLoc(), 10100 C->getDefaultmapKindLoc(), 10101 C->getEndLoc()); 10102 } 10103 10104 template <typename Derived> 10105 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10106 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10107 llvm::SmallVector<Expr *, 16> Vars; 10108 CXXScopeSpec MapperIdScopeSpec; 10109 DeclarationNameInfo MapperIdInfo; 10110 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10111 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10112 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10113 return nullptr; 10114 return getDerived().RebuildOMPToClause( 10115 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10116 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10117 } 10118 10119 template <typename Derived> 10120 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10121 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10122 llvm::SmallVector<Expr *, 16> Vars; 10123 CXXScopeSpec MapperIdScopeSpec; 10124 DeclarationNameInfo MapperIdInfo; 10125 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10126 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10127 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10128 return nullptr; 10129 return getDerived().RebuildOMPFromClause( 10130 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10131 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10132 } 10133 10134 template <typename Derived> 10135 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10136 OMPUseDevicePtrClause *C) { 10137 llvm::SmallVector<Expr *, 16> Vars; 10138 Vars.reserve(C->varlist_size()); 10139 for (auto *VE : C->varlists()) { 10140 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10141 if (EVar.isInvalid()) 10142 return nullptr; 10143 Vars.push_back(EVar.get()); 10144 } 10145 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10146 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10147 } 10148 10149 template <typename Derived> 10150 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10151 OMPUseDeviceAddrClause *C) { 10152 llvm::SmallVector<Expr *, 16> Vars; 10153 Vars.reserve(C->varlist_size()); 10154 for (auto *VE : C->varlists()) { 10155 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10156 if (EVar.isInvalid()) 10157 return nullptr; 10158 Vars.push_back(EVar.get()); 10159 } 10160 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10161 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10162 } 10163 10164 template <typename Derived> 10165 OMPClause * 10166 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10167 llvm::SmallVector<Expr *, 16> Vars; 10168 Vars.reserve(C->varlist_size()); 10169 for (auto *VE : C->varlists()) { 10170 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10171 if (EVar.isInvalid()) 10172 return nullptr; 10173 Vars.push_back(EVar.get()); 10174 } 10175 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10176 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10177 } 10178 10179 template <typename Derived> 10180 OMPClause * 10181 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10182 llvm::SmallVector<Expr *, 16> Vars; 10183 Vars.reserve(C->varlist_size()); 10184 for (auto *VE : C->varlists()) { 10185 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10186 if (EVar.isInvalid()) 10187 return nullptr; 10188 Vars.push_back(EVar.get()); 10189 } 10190 return getDerived().RebuildOMPNontemporalClause( 10191 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10192 } 10193 10194 template <typename Derived> 10195 OMPClause * 10196 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10197 llvm::SmallVector<Expr *, 16> Vars; 10198 Vars.reserve(C->varlist_size()); 10199 for (auto *VE : C->varlists()) { 10200 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10201 if (EVar.isInvalid()) 10202 return nullptr; 10203 Vars.push_back(EVar.get()); 10204 } 10205 return getDerived().RebuildOMPInclusiveClause( 10206 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10207 } 10208 10209 template <typename Derived> 10210 OMPClause * 10211 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10212 llvm::SmallVector<Expr *, 16> Vars; 10213 Vars.reserve(C->varlist_size()); 10214 for (auto *VE : C->varlists()) { 10215 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10216 if (EVar.isInvalid()) 10217 return nullptr; 10218 Vars.push_back(EVar.get()); 10219 } 10220 return getDerived().RebuildOMPExclusiveClause( 10221 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10222 } 10223 10224 template <typename Derived> 10225 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10226 OMPUsesAllocatorsClause *C) { 10227 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10228 Data.reserve(C->getNumberOfAllocators()); 10229 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10230 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10231 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10232 if (Allocator.isInvalid()) 10233 continue; 10234 ExprResult AllocatorTraits; 10235 if (Expr *AT = D.AllocatorTraits) { 10236 AllocatorTraits = getDerived().TransformExpr(AT); 10237 if (AllocatorTraits.isInvalid()) 10238 continue; 10239 } 10240 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10241 NewD.Allocator = Allocator.get(); 10242 NewD.AllocatorTraits = AllocatorTraits.get(); 10243 NewD.LParenLoc = D.LParenLoc; 10244 NewD.RParenLoc = D.RParenLoc; 10245 } 10246 return getDerived().RebuildOMPUsesAllocatorsClause( 10247 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10248 } 10249 10250 template <typename Derived> 10251 OMPClause * 10252 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10253 SmallVector<Expr *, 4> Locators; 10254 Locators.reserve(C->varlist_size()); 10255 ExprResult ModifierRes; 10256 if (Expr *Modifier = C->getModifier()) { 10257 ModifierRes = getDerived().TransformExpr(Modifier); 10258 if (ModifierRes.isInvalid()) 10259 return nullptr; 10260 } 10261 for (Expr *E : C->varlists()) { 10262 ExprResult Locator = getDerived().TransformExpr(E); 10263 if (Locator.isInvalid()) 10264 continue; 10265 Locators.push_back(Locator.get()); 10266 } 10267 return getDerived().RebuildOMPAffinityClause( 10268 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10269 ModifierRes.get(), Locators); 10270 } 10271 10272 template <typename Derived> 10273 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10274 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10275 C->getBeginLoc(), C->getLParenLoc(), 10276 C->getEndLoc()); 10277 } 10278 10279 template <typename Derived> 10280 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10281 return getDerived().RebuildOMPBindClause( 10282 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10283 C->getLParenLoc(), C->getEndLoc()); 10284 } 10285 10286 //===----------------------------------------------------------------------===// 10287 // Expression transformation 10288 //===----------------------------------------------------------------------===// 10289 template<typename Derived> 10290 ExprResult 10291 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10292 return TransformExpr(E->getSubExpr()); 10293 } 10294 10295 template <typename Derived> 10296 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10297 SYCLUniqueStableNameExpr *E) { 10298 if (!E->isTypeDependent()) 10299 return E; 10300 10301 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10302 10303 if (!NewT) 10304 return ExprError(); 10305 10306 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10307 return E; 10308 10309 return getDerived().RebuildSYCLUniqueStableNameExpr( 10310 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10311 } 10312 10313 template<typename Derived> 10314 ExprResult 10315 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10316 if (!E->isTypeDependent()) 10317 return E; 10318 10319 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10320 E->getIdentKind()); 10321 } 10322 10323 template<typename Derived> 10324 ExprResult 10325 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10326 NestedNameSpecifierLoc QualifierLoc; 10327 if (E->getQualifierLoc()) { 10328 QualifierLoc 10329 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10330 if (!QualifierLoc) 10331 return ExprError(); 10332 } 10333 10334 ValueDecl *ND 10335 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10336 E->getDecl())); 10337 if (!ND) 10338 return ExprError(); 10339 10340 NamedDecl *Found = ND; 10341 if (E->getFoundDecl() != E->getDecl()) { 10342 Found = cast_or_null<NamedDecl>( 10343 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10344 if (!Found) 10345 return ExprError(); 10346 } 10347 10348 DeclarationNameInfo NameInfo = E->getNameInfo(); 10349 if (NameInfo.getName()) { 10350 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10351 if (!NameInfo.getName()) 10352 return ExprError(); 10353 } 10354 10355 if (!getDerived().AlwaysRebuild() && 10356 QualifierLoc == E->getQualifierLoc() && 10357 ND == E->getDecl() && 10358 Found == E->getFoundDecl() && 10359 NameInfo.getName() == E->getDecl()->getDeclName() && 10360 !E->hasExplicitTemplateArgs()) { 10361 10362 // Mark it referenced in the new context regardless. 10363 // FIXME: this is a bit instantiation-specific. 10364 SemaRef.MarkDeclRefReferenced(E); 10365 10366 return E; 10367 } 10368 10369 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10370 if (E->hasExplicitTemplateArgs()) { 10371 TemplateArgs = &TransArgs; 10372 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10373 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10374 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10375 E->getNumTemplateArgs(), 10376 TransArgs)) 10377 return ExprError(); 10378 } 10379 10380 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10381 Found, TemplateArgs); 10382 } 10383 10384 template<typename Derived> 10385 ExprResult 10386 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10387 return E; 10388 } 10389 10390 template <typename Derived> 10391 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10392 FixedPointLiteral *E) { 10393 return E; 10394 } 10395 10396 template<typename Derived> 10397 ExprResult 10398 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10399 return E; 10400 } 10401 10402 template<typename Derived> 10403 ExprResult 10404 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10405 return E; 10406 } 10407 10408 template<typename Derived> 10409 ExprResult 10410 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10411 return E; 10412 } 10413 10414 template<typename Derived> 10415 ExprResult 10416 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10417 return E; 10418 } 10419 10420 template<typename Derived> 10421 ExprResult 10422 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10423 if (FunctionDecl *FD = E->getDirectCallee()) 10424 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10425 return SemaRef.MaybeBindToTemporary(E); 10426 } 10427 10428 template<typename Derived> 10429 ExprResult 10430 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10431 ExprResult ControllingExpr = 10432 getDerived().TransformExpr(E->getControllingExpr()); 10433 if (ControllingExpr.isInvalid()) 10434 return ExprError(); 10435 10436 SmallVector<Expr *, 4> AssocExprs; 10437 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10438 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10439 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10440 if (TSI) { 10441 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10442 if (!AssocType) 10443 return ExprError(); 10444 AssocTypes.push_back(AssocType); 10445 } else { 10446 AssocTypes.push_back(nullptr); 10447 } 10448 10449 ExprResult AssocExpr = 10450 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10451 if (AssocExpr.isInvalid()) 10452 return ExprError(); 10453 AssocExprs.push_back(AssocExpr.get()); 10454 } 10455 10456 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10457 E->getDefaultLoc(), 10458 E->getRParenLoc(), 10459 ControllingExpr.get(), 10460 AssocTypes, 10461 AssocExprs); 10462 } 10463 10464 template<typename Derived> 10465 ExprResult 10466 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10467 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10468 if (SubExpr.isInvalid()) 10469 return ExprError(); 10470 10471 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10472 return E; 10473 10474 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10475 E->getRParen()); 10476 } 10477 10478 /// The operand of a unary address-of operator has special rules: it's 10479 /// allowed to refer to a non-static member of a class even if there's no 'this' 10480 /// object available. 10481 template<typename Derived> 10482 ExprResult 10483 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10484 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10485 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10486 else 10487 return getDerived().TransformExpr(E); 10488 } 10489 10490 template<typename Derived> 10491 ExprResult 10492 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10493 ExprResult SubExpr; 10494 if (E->getOpcode() == UO_AddrOf) 10495 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10496 else 10497 SubExpr = TransformExpr(E->getSubExpr()); 10498 if (SubExpr.isInvalid()) 10499 return ExprError(); 10500 10501 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10502 return E; 10503 10504 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10505 E->getOpcode(), 10506 SubExpr.get()); 10507 } 10508 10509 template<typename Derived> 10510 ExprResult 10511 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10512 // Transform the type. 10513 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10514 if (!Type) 10515 return ExprError(); 10516 10517 // Transform all of the components into components similar to what the 10518 // parser uses. 10519 // FIXME: It would be slightly more efficient in the non-dependent case to 10520 // just map FieldDecls, rather than requiring the rebuilder to look for 10521 // the fields again. However, __builtin_offsetof is rare enough in 10522 // template code that we don't care. 10523 bool ExprChanged = false; 10524 typedef Sema::OffsetOfComponent Component; 10525 SmallVector<Component, 4> Components; 10526 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10527 const OffsetOfNode &ON = E->getComponent(I); 10528 Component Comp; 10529 Comp.isBrackets = true; 10530 Comp.LocStart = ON.getSourceRange().getBegin(); 10531 Comp.LocEnd = ON.getSourceRange().getEnd(); 10532 switch (ON.getKind()) { 10533 case OffsetOfNode::Array: { 10534 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10535 ExprResult Index = getDerived().TransformExpr(FromIndex); 10536 if (Index.isInvalid()) 10537 return ExprError(); 10538 10539 ExprChanged = ExprChanged || Index.get() != FromIndex; 10540 Comp.isBrackets = true; 10541 Comp.U.E = Index.get(); 10542 break; 10543 } 10544 10545 case OffsetOfNode::Field: 10546 case OffsetOfNode::Identifier: 10547 Comp.isBrackets = false; 10548 Comp.U.IdentInfo = ON.getFieldName(); 10549 if (!Comp.U.IdentInfo) 10550 continue; 10551 10552 break; 10553 10554 case OffsetOfNode::Base: 10555 // Will be recomputed during the rebuild. 10556 continue; 10557 } 10558 10559 Components.push_back(Comp); 10560 } 10561 10562 // If nothing changed, retain the existing expression. 10563 if (!getDerived().AlwaysRebuild() && 10564 Type == E->getTypeSourceInfo() && 10565 !ExprChanged) 10566 return E; 10567 10568 // Build a new offsetof expression. 10569 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10570 Components, E->getRParenLoc()); 10571 } 10572 10573 template<typename Derived> 10574 ExprResult 10575 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10576 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10577 "opaque value expression requires transformation"); 10578 return E; 10579 } 10580 10581 template<typename Derived> 10582 ExprResult 10583 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10584 return E; 10585 } 10586 10587 template <typename Derived> 10588 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10589 llvm::SmallVector<Expr *, 8> Children; 10590 bool Changed = false; 10591 for (Expr *C : E->subExpressions()) { 10592 ExprResult NewC = getDerived().TransformExpr(C); 10593 if (NewC.isInvalid()) 10594 return ExprError(); 10595 Children.push_back(NewC.get()); 10596 10597 Changed |= NewC.get() != C; 10598 } 10599 if (!getDerived().AlwaysRebuild() && !Changed) 10600 return E; 10601 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10602 Children, E->getType()); 10603 } 10604 10605 template<typename Derived> 10606 ExprResult 10607 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10608 // Rebuild the syntactic form. The original syntactic form has 10609 // opaque-value expressions in it, so strip those away and rebuild 10610 // the result. This is a really awful way of doing this, but the 10611 // better solution (rebuilding the semantic expressions and 10612 // rebinding OVEs as necessary) doesn't work; we'd need 10613 // TreeTransform to not strip away implicit conversions. 10614 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10615 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10616 if (result.isInvalid()) return ExprError(); 10617 10618 // If that gives us a pseudo-object result back, the pseudo-object 10619 // expression must have been an lvalue-to-rvalue conversion which we 10620 // should reapply. 10621 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10622 result = SemaRef.checkPseudoObjectRValue(result.get()); 10623 10624 return result; 10625 } 10626 10627 template<typename Derived> 10628 ExprResult 10629 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10630 UnaryExprOrTypeTraitExpr *E) { 10631 if (E->isArgumentType()) { 10632 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10633 10634 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10635 if (!NewT) 10636 return ExprError(); 10637 10638 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10639 return E; 10640 10641 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10642 E->getKind(), 10643 E->getSourceRange()); 10644 } 10645 10646 // C++0x [expr.sizeof]p1: 10647 // The operand is either an expression, which is an unevaluated operand 10648 // [...] 10649 EnterExpressionEvaluationContext Unevaluated( 10650 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10651 Sema::ReuseLambdaContextDecl); 10652 10653 // Try to recover if we have something like sizeof(T::X) where X is a type. 10654 // Notably, there must be *exactly* one set of parens if X is a type. 10655 TypeSourceInfo *RecoveryTSI = nullptr; 10656 ExprResult SubExpr; 10657 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10658 if (auto *DRE = 10659 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10660 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10661 PE, DRE, false, &RecoveryTSI); 10662 else 10663 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10664 10665 if (RecoveryTSI) { 10666 return getDerived().RebuildUnaryExprOrTypeTrait( 10667 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10668 } else if (SubExpr.isInvalid()) 10669 return ExprError(); 10670 10671 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10672 return E; 10673 10674 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10675 E->getOperatorLoc(), 10676 E->getKind(), 10677 E->getSourceRange()); 10678 } 10679 10680 template<typename Derived> 10681 ExprResult 10682 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10683 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10684 if (LHS.isInvalid()) 10685 return ExprError(); 10686 10687 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10688 if (RHS.isInvalid()) 10689 return ExprError(); 10690 10691 10692 if (!getDerived().AlwaysRebuild() && 10693 LHS.get() == E->getLHS() && 10694 RHS.get() == E->getRHS()) 10695 return E; 10696 10697 return getDerived().RebuildArraySubscriptExpr( 10698 LHS.get(), 10699 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10700 } 10701 10702 template <typename Derived> 10703 ExprResult 10704 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10705 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10706 if (Base.isInvalid()) 10707 return ExprError(); 10708 10709 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10710 if (RowIdx.isInvalid()) 10711 return ExprError(); 10712 10713 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10714 if (ColumnIdx.isInvalid()) 10715 return ExprError(); 10716 10717 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10718 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10719 return E; 10720 10721 return getDerived().RebuildMatrixSubscriptExpr( 10722 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10723 } 10724 10725 template <typename Derived> 10726 ExprResult 10727 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10728 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10729 if (Base.isInvalid()) 10730 return ExprError(); 10731 10732 ExprResult LowerBound; 10733 if (E->getLowerBound()) { 10734 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10735 if (LowerBound.isInvalid()) 10736 return ExprError(); 10737 } 10738 10739 ExprResult Length; 10740 if (E->getLength()) { 10741 Length = getDerived().TransformExpr(E->getLength()); 10742 if (Length.isInvalid()) 10743 return ExprError(); 10744 } 10745 10746 ExprResult Stride; 10747 if (Expr *Str = E->getStride()) { 10748 Stride = getDerived().TransformExpr(Str); 10749 if (Stride.isInvalid()) 10750 return ExprError(); 10751 } 10752 10753 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10754 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10755 return E; 10756 10757 return getDerived().RebuildOMPArraySectionExpr( 10758 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10759 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10760 E->getRBracketLoc()); 10761 } 10762 10763 template <typename Derived> 10764 ExprResult 10765 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10766 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10767 if (Base.isInvalid()) 10768 return ExprError(); 10769 10770 SmallVector<Expr *, 4> Dims; 10771 bool ErrorFound = false; 10772 for (Expr *Dim : E->getDimensions()) { 10773 ExprResult DimRes = getDerived().TransformExpr(Dim); 10774 if (DimRes.isInvalid()) { 10775 ErrorFound = true; 10776 continue; 10777 } 10778 Dims.push_back(DimRes.get()); 10779 } 10780 10781 if (ErrorFound) 10782 return ExprError(); 10783 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10784 E->getRParenLoc(), Dims, 10785 E->getBracketsRanges()); 10786 } 10787 10788 template <typename Derived> 10789 ExprResult 10790 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10791 unsigned NumIterators = E->numOfIterators(); 10792 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10793 10794 bool ErrorFound = false; 10795 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10796 for (unsigned I = 0; I < NumIterators; ++I) { 10797 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10798 Data[I].DeclIdent = D->getIdentifier(); 10799 Data[I].DeclIdentLoc = D->getLocation(); 10800 if (D->getLocation() == D->getBeginLoc()) { 10801 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10802 "Implicit type must be int."); 10803 } else { 10804 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10805 QualType DeclTy = getDerived().TransformType(D->getType()); 10806 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10807 } 10808 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10809 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10810 ExprResult End = getDerived().TransformExpr(Range.End); 10811 ExprResult Step = getDerived().TransformExpr(Range.Step); 10812 ErrorFound = ErrorFound || 10813 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10814 !Data[I].Type.get().isNull())) || 10815 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10816 if (ErrorFound) 10817 continue; 10818 Data[I].Range.Begin = Begin.get(); 10819 Data[I].Range.End = End.get(); 10820 Data[I].Range.Step = Step.get(); 10821 Data[I].AssignLoc = E->getAssignLoc(I); 10822 Data[I].ColonLoc = E->getColonLoc(I); 10823 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10824 NeedToRebuild = 10825 NeedToRebuild || 10826 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10827 D->getType().getTypePtrOrNull()) || 10828 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10829 Range.Step != Data[I].Range.Step; 10830 } 10831 if (ErrorFound) 10832 return ExprError(); 10833 if (!NeedToRebuild) 10834 return E; 10835 10836 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10837 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10838 if (!Res.isUsable()) 10839 return Res; 10840 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10841 for (unsigned I = 0; I < NumIterators; ++I) 10842 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10843 IE->getIteratorDecl(I)); 10844 return Res; 10845 } 10846 10847 template<typename Derived> 10848 ExprResult 10849 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10850 // Transform the callee. 10851 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10852 if (Callee.isInvalid()) 10853 return ExprError(); 10854 10855 // Transform arguments. 10856 bool ArgChanged = false; 10857 SmallVector<Expr*, 8> Args; 10858 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10859 &ArgChanged)) 10860 return ExprError(); 10861 10862 if (!getDerived().AlwaysRebuild() && 10863 Callee.get() == E->getCallee() && 10864 !ArgChanged) 10865 return SemaRef.MaybeBindToTemporary(E); 10866 10867 // FIXME: Wrong source location information for the '('. 10868 SourceLocation FakeLParenLoc 10869 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10870 10871 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10872 if (E->hasStoredFPFeatures()) { 10873 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10874 getSema().CurFPFeatures = 10875 NewOverrides.applyOverrides(getSema().getLangOpts()); 10876 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10877 } 10878 10879 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10880 Args, 10881 E->getRParenLoc()); 10882 } 10883 10884 template<typename Derived> 10885 ExprResult 10886 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10887 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10888 if (Base.isInvalid()) 10889 return ExprError(); 10890 10891 NestedNameSpecifierLoc QualifierLoc; 10892 if (E->hasQualifier()) { 10893 QualifierLoc 10894 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10895 10896 if (!QualifierLoc) 10897 return ExprError(); 10898 } 10899 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10900 10901 ValueDecl *Member 10902 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10903 E->getMemberDecl())); 10904 if (!Member) 10905 return ExprError(); 10906 10907 NamedDecl *FoundDecl = E->getFoundDecl(); 10908 if (FoundDecl == E->getMemberDecl()) { 10909 FoundDecl = Member; 10910 } else { 10911 FoundDecl = cast_or_null<NamedDecl>( 10912 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10913 if (!FoundDecl) 10914 return ExprError(); 10915 } 10916 10917 if (!getDerived().AlwaysRebuild() && 10918 Base.get() == E->getBase() && 10919 QualifierLoc == E->getQualifierLoc() && 10920 Member == E->getMemberDecl() && 10921 FoundDecl == E->getFoundDecl() && 10922 !E->hasExplicitTemplateArgs()) { 10923 10924 // Mark it referenced in the new context regardless. 10925 // FIXME: this is a bit instantiation-specific. 10926 SemaRef.MarkMemberReferenced(E); 10927 10928 return E; 10929 } 10930 10931 TemplateArgumentListInfo TransArgs; 10932 if (E->hasExplicitTemplateArgs()) { 10933 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10934 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10935 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10936 E->getNumTemplateArgs(), 10937 TransArgs)) 10938 return ExprError(); 10939 } 10940 10941 // FIXME: Bogus source location for the operator 10942 SourceLocation FakeOperatorLoc = 10943 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10944 10945 // FIXME: to do this check properly, we will need to preserve the 10946 // first-qualifier-in-scope here, just in case we had a dependent 10947 // base (and therefore couldn't do the check) and a 10948 // nested-name-qualifier (and therefore could do the lookup). 10949 NamedDecl *FirstQualifierInScope = nullptr; 10950 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10951 if (MemberNameInfo.getName()) { 10952 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10953 if (!MemberNameInfo.getName()) 10954 return ExprError(); 10955 } 10956 10957 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10958 E->isArrow(), 10959 QualifierLoc, 10960 TemplateKWLoc, 10961 MemberNameInfo, 10962 Member, 10963 FoundDecl, 10964 (E->hasExplicitTemplateArgs() 10965 ? &TransArgs : nullptr), 10966 FirstQualifierInScope); 10967 } 10968 10969 template<typename Derived> 10970 ExprResult 10971 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10972 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10973 if (LHS.isInvalid()) 10974 return ExprError(); 10975 10976 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10977 if (RHS.isInvalid()) 10978 return ExprError(); 10979 10980 if (!getDerived().AlwaysRebuild() && 10981 LHS.get() == E->getLHS() && 10982 RHS.get() == E->getRHS()) 10983 return E; 10984 10985 if (E->isCompoundAssignmentOp()) 10986 // FPFeatures has already been established from trailing storage 10987 return getDerived().RebuildBinaryOperator( 10988 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10989 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10990 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10991 getSema().CurFPFeatures = 10992 NewOverrides.applyOverrides(getSema().getLangOpts()); 10993 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10994 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10995 LHS.get(), RHS.get()); 10996 } 10997 10998 template <typename Derived> 10999 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11000 CXXRewrittenBinaryOperator *E) { 11001 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11002 11003 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11004 if (LHS.isInvalid()) 11005 return ExprError(); 11006 11007 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11008 if (RHS.isInvalid()) 11009 return ExprError(); 11010 11011 // Extract the already-resolved callee declarations so that we can restrict 11012 // ourselves to using them as the unqualified lookup results when rebuilding. 11013 UnresolvedSet<2> UnqualLookups; 11014 bool ChangedAnyLookups = false; 11015 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11016 const_cast<Expr *>(Decomp.InnerBinOp)}; 11017 for (Expr *PossibleBinOp : PossibleBinOps) { 11018 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11019 if (!Op) 11020 continue; 11021 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11022 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11023 continue; 11024 11025 // Transform the callee in case we built a call to a local extern 11026 // declaration. 11027 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11028 E->getOperatorLoc(), Callee->getFoundDecl())); 11029 if (!Found) 11030 return ExprError(); 11031 if (Found != Callee->getFoundDecl()) 11032 ChangedAnyLookups = true; 11033 UnqualLookups.addDecl(Found); 11034 } 11035 11036 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11037 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11038 // Mark all functions used in the rewrite as referenced. Note that when 11039 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11040 // function calls, and/or there might be a user-defined conversion sequence 11041 // applied to the operands of the <. 11042 // FIXME: this is a bit instantiation-specific. 11043 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11044 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11045 return E; 11046 } 11047 11048 return getDerived().RebuildCXXRewrittenBinaryOperator( 11049 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11050 } 11051 11052 template<typename Derived> 11053 ExprResult 11054 TreeTransform<Derived>::TransformCompoundAssignOperator( 11055 CompoundAssignOperator *E) { 11056 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11057 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11058 getSema().CurFPFeatures = 11059 NewOverrides.applyOverrides(getSema().getLangOpts()); 11060 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11061 return getDerived().TransformBinaryOperator(E); 11062 } 11063 11064 template<typename Derived> 11065 ExprResult TreeTransform<Derived>:: 11066 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11067 // Just rebuild the common and RHS expressions and see whether we 11068 // get any changes. 11069 11070 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11071 if (commonExpr.isInvalid()) 11072 return ExprError(); 11073 11074 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11075 if (rhs.isInvalid()) 11076 return ExprError(); 11077 11078 if (!getDerived().AlwaysRebuild() && 11079 commonExpr.get() == e->getCommon() && 11080 rhs.get() == e->getFalseExpr()) 11081 return e; 11082 11083 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11084 e->getQuestionLoc(), 11085 nullptr, 11086 e->getColonLoc(), 11087 rhs.get()); 11088 } 11089 11090 template<typename Derived> 11091 ExprResult 11092 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11093 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11094 if (Cond.isInvalid()) 11095 return ExprError(); 11096 11097 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11098 if (LHS.isInvalid()) 11099 return ExprError(); 11100 11101 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11102 if (RHS.isInvalid()) 11103 return ExprError(); 11104 11105 if (!getDerived().AlwaysRebuild() && 11106 Cond.get() == E->getCond() && 11107 LHS.get() == E->getLHS() && 11108 RHS.get() == E->getRHS()) 11109 return E; 11110 11111 return getDerived().RebuildConditionalOperator(Cond.get(), 11112 E->getQuestionLoc(), 11113 LHS.get(), 11114 E->getColonLoc(), 11115 RHS.get()); 11116 } 11117 11118 template<typename Derived> 11119 ExprResult 11120 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11121 // Implicit casts are eliminated during transformation, since they 11122 // will be recomputed by semantic analysis after transformation. 11123 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11124 } 11125 11126 template<typename Derived> 11127 ExprResult 11128 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11129 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11130 if (!Type) 11131 return ExprError(); 11132 11133 ExprResult SubExpr 11134 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11135 if (SubExpr.isInvalid()) 11136 return ExprError(); 11137 11138 if (!getDerived().AlwaysRebuild() && 11139 Type == E->getTypeInfoAsWritten() && 11140 SubExpr.get() == E->getSubExpr()) 11141 return E; 11142 11143 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11144 Type, 11145 E->getRParenLoc(), 11146 SubExpr.get()); 11147 } 11148 11149 template<typename Derived> 11150 ExprResult 11151 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11152 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11153 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11154 if (!NewT) 11155 return ExprError(); 11156 11157 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11158 if (Init.isInvalid()) 11159 return ExprError(); 11160 11161 if (!getDerived().AlwaysRebuild() && 11162 OldT == NewT && 11163 Init.get() == E->getInitializer()) 11164 return SemaRef.MaybeBindToTemporary(E); 11165 11166 // Note: the expression type doesn't necessarily match the 11167 // type-as-written, but that's okay, because it should always be 11168 // derivable from the initializer. 11169 11170 return getDerived().RebuildCompoundLiteralExpr( 11171 E->getLParenLoc(), NewT, 11172 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11173 } 11174 11175 template<typename Derived> 11176 ExprResult 11177 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11178 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11179 if (Base.isInvalid()) 11180 return ExprError(); 11181 11182 if (!getDerived().AlwaysRebuild() && 11183 Base.get() == E->getBase()) 11184 return E; 11185 11186 // FIXME: Bad source location 11187 SourceLocation FakeOperatorLoc = 11188 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11189 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11190 E->getAccessorLoc(), 11191 E->getAccessor()); 11192 } 11193 11194 template<typename Derived> 11195 ExprResult 11196 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11197 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11198 E = Syntactic; 11199 11200 bool InitChanged = false; 11201 11202 EnterExpressionEvaluationContext Context( 11203 getSema(), EnterExpressionEvaluationContext::InitList); 11204 11205 SmallVector<Expr*, 4> Inits; 11206 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11207 Inits, &InitChanged)) 11208 return ExprError(); 11209 11210 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11211 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11212 // in some cases. We can't reuse it in general, because the syntactic and 11213 // semantic forms are linked, and we can't know that semantic form will 11214 // match even if the syntactic form does. 11215 } 11216 11217 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11218 E->getRBraceLoc()); 11219 } 11220 11221 template<typename Derived> 11222 ExprResult 11223 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11224 Designation Desig; 11225 11226 // transform the initializer value 11227 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11228 if (Init.isInvalid()) 11229 return ExprError(); 11230 11231 // transform the designators. 11232 SmallVector<Expr*, 4> ArrayExprs; 11233 bool ExprChanged = false; 11234 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11235 if (D.isFieldDesignator()) { 11236 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11237 D.getDotLoc(), 11238 D.getFieldLoc())); 11239 if (D.getField()) { 11240 FieldDecl *Field = cast_or_null<FieldDecl>( 11241 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11242 if (Field != D.getField()) 11243 // Rebuild the expression when the transformed FieldDecl is 11244 // different to the already assigned FieldDecl. 11245 ExprChanged = true; 11246 } else { 11247 // Ensure that the designator expression is rebuilt when there isn't 11248 // a resolved FieldDecl in the designator as we don't want to assign 11249 // a FieldDecl to a pattern designator that will be instantiated again. 11250 ExprChanged = true; 11251 } 11252 continue; 11253 } 11254 11255 if (D.isArrayDesignator()) { 11256 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11257 if (Index.isInvalid()) 11258 return ExprError(); 11259 11260 Desig.AddDesignator( 11261 Designator::getArray(Index.get(), D.getLBracketLoc())); 11262 11263 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11264 ArrayExprs.push_back(Index.get()); 11265 continue; 11266 } 11267 11268 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11269 ExprResult Start 11270 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11271 if (Start.isInvalid()) 11272 return ExprError(); 11273 11274 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11275 if (End.isInvalid()) 11276 return ExprError(); 11277 11278 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11279 End.get(), 11280 D.getLBracketLoc(), 11281 D.getEllipsisLoc())); 11282 11283 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11284 End.get() != E->getArrayRangeEnd(D); 11285 11286 ArrayExprs.push_back(Start.get()); 11287 ArrayExprs.push_back(End.get()); 11288 } 11289 11290 if (!getDerived().AlwaysRebuild() && 11291 Init.get() == E->getInit() && 11292 !ExprChanged) 11293 return E; 11294 11295 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11296 E->getEqualOrColonLoc(), 11297 E->usesGNUSyntax(), Init.get()); 11298 } 11299 11300 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11301 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11302 template<typename Derived> 11303 ExprResult 11304 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11305 DesignatedInitUpdateExpr *E) { 11306 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11307 "initializer"); 11308 return ExprError(); 11309 } 11310 11311 template<typename Derived> 11312 ExprResult 11313 TreeTransform<Derived>::TransformNoInitExpr( 11314 NoInitExpr *E) { 11315 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11316 return ExprError(); 11317 } 11318 11319 template<typename Derived> 11320 ExprResult 11321 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11322 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11323 return ExprError(); 11324 } 11325 11326 template<typename Derived> 11327 ExprResult 11328 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11329 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11330 return ExprError(); 11331 } 11332 11333 template<typename Derived> 11334 ExprResult 11335 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11336 ImplicitValueInitExpr *E) { 11337 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11338 11339 // FIXME: Will we ever have proper type location here? Will we actually 11340 // need to transform the type? 11341 QualType T = getDerived().TransformType(E->getType()); 11342 if (T.isNull()) 11343 return ExprError(); 11344 11345 if (!getDerived().AlwaysRebuild() && 11346 T == E->getType()) 11347 return E; 11348 11349 return getDerived().RebuildImplicitValueInitExpr(T); 11350 } 11351 11352 template<typename Derived> 11353 ExprResult 11354 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11355 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11356 if (!TInfo) 11357 return ExprError(); 11358 11359 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11360 if (SubExpr.isInvalid()) 11361 return ExprError(); 11362 11363 if (!getDerived().AlwaysRebuild() && 11364 TInfo == E->getWrittenTypeInfo() && 11365 SubExpr.get() == E->getSubExpr()) 11366 return E; 11367 11368 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11369 TInfo, E->getRParenLoc()); 11370 } 11371 11372 template<typename Derived> 11373 ExprResult 11374 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11375 bool ArgumentChanged = false; 11376 SmallVector<Expr*, 4> Inits; 11377 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11378 &ArgumentChanged)) 11379 return ExprError(); 11380 11381 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11382 Inits, 11383 E->getRParenLoc()); 11384 } 11385 11386 /// Transform an address-of-label expression. 11387 /// 11388 /// By default, the transformation of an address-of-label expression always 11389 /// rebuilds the expression, so that the label identifier can be resolved to 11390 /// the corresponding label statement by semantic analysis. 11391 template<typename Derived> 11392 ExprResult 11393 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11394 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11395 E->getLabel()); 11396 if (!LD) 11397 return ExprError(); 11398 11399 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11400 cast<LabelDecl>(LD)); 11401 } 11402 11403 template<typename Derived> 11404 ExprResult 11405 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11406 SemaRef.ActOnStartStmtExpr(); 11407 StmtResult SubStmt 11408 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11409 if (SubStmt.isInvalid()) { 11410 SemaRef.ActOnStmtExprError(); 11411 return ExprError(); 11412 } 11413 11414 unsigned OldDepth = E->getTemplateDepth(); 11415 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11416 11417 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11418 SubStmt.get() == E->getSubStmt()) { 11419 // Calling this an 'error' is unintuitive, but it does the right thing. 11420 SemaRef.ActOnStmtExprError(); 11421 return SemaRef.MaybeBindToTemporary(E); 11422 } 11423 11424 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11425 E->getRParenLoc(), NewDepth); 11426 } 11427 11428 template<typename Derived> 11429 ExprResult 11430 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11431 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11432 if (Cond.isInvalid()) 11433 return ExprError(); 11434 11435 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11436 if (LHS.isInvalid()) 11437 return ExprError(); 11438 11439 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11440 if (RHS.isInvalid()) 11441 return ExprError(); 11442 11443 if (!getDerived().AlwaysRebuild() && 11444 Cond.get() == E->getCond() && 11445 LHS.get() == E->getLHS() && 11446 RHS.get() == E->getRHS()) 11447 return E; 11448 11449 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11450 Cond.get(), LHS.get(), RHS.get(), 11451 E->getRParenLoc()); 11452 } 11453 11454 template<typename Derived> 11455 ExprResult 11456 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11457 return E; 11458 } 11459 11460 template<typename Derived> 11461 ExprResult 11462 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11463 switch (E->getOperator()) { 11464 case OO_New: 11465 case OO_Delete: 11466 case OO_Array_New: 11467 case OO_Array_Delete: 11468 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11469 11470 case OO_Call: { 11471 // This is a call to an object's operator(). 11472 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11473 11474 // Transform the object itself. 11475 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11476 if (Object.isInvalid()) 11477 return ExprError(); 11478 11479 // FIXME: Poor location information 11480 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11481 static_cast<Expr *>(Object.get())->getEndLoc()); 11482 11483 // Transform the call arguments. 11484 SmallVector<Expr*, 8> Args; 11485 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11486 Args)) 11487 return ExprError(); 11488 11489 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11490 E->getEndLoc()); 11491 } 11492 11493 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11494 case OO_##Name: 11495 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11496 #include "clang/Basic/OperatorKinds.def" 11497 case OO_Subscript: 11498 // Handled below. 11499 break; 11500 11501 case OO_Conditional: 11502 llvm_unreachable("conditional operator is not actually overloadable"); 11503 11504 case OO_None: 11505 case NUM_OVERLOADED_OPERATORS: 11506 llvm_unreachable("not an overloaded operator?"); 11507 } 11508 11509 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11510 if (Callee.isInvalid()) 11511 return ExprError(); 11512 11513 ExprResult First; 11514 if (E->getOperator() == OO_Amp) 11515 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11516 else 11517 First = getDerived().TransformExpr(E->getArg(0)); 11518 if (First.isInvalid()) 11519 return ExprError(); 11520 11521 ExprResult Second; 11522 if (E->getNumArgs() == 2) { 11523 Second = getDerived().TransformExpr(E->getArg(1)); 11524 if (Second.isInvalid()) 11525 return ExprError(); 11526 } 11527 11528 if (!getDerived().AlwaysRebuild() && 11529 Callee.get() == E->getCallee() && 11530 First.get() == E->getArg(0) && 11531 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11532 return SemaRef.MaybeBindToTemporary(E); 11533 11534 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11535 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11536 getSema().CurFPFeatures = 11537 NewOverrides.applyOverrides(getSema().getLangOpts()); 11538 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11539 11540 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11541 E->getOperatorLoc(), 11542 Callee.get(), 11543 First.get(), 11544 Second.get()); 11545 } 11546 11547 template<typename Derived> 11548 ExprResult 11549 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11550 return getDerived().TransformCallExpr(E); 11551 } 11552 11553 template <typename Derived> 11554 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11555 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11556 getSema().CurContext != E->getParentContext(); 11557 11558 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11559 return E; 11560 11561 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11562 E->getEndLoc(), 11563 getSema().CurContext); 11564 } 11565 11566 template<typename Derived> 11567 ExprResult 11568 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11569 // Transform the callee. 11570 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11571 if (Callee.isInvalid()) 11572 return ExprError(); 11573 11574 // Transform exec config. 11575 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11576 if (EC.isInvalid()) 11577 return ExprError(); 11578 11579 // Transform arguments. 11580 bool ArgChanged = false; 11581 SmallVector<Expr*, 8> Args; 11582 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11583 &ArgChanged)) 11584 return ExprError(); 11585 11586 if (!getDerived().AlwaysRebuild() && 11587 Callee.get() == E->getCallee() && 11588 !ArgChanged) 11589 return SemaRef.MaybeBindToTemporary(E); 11590 11591 // FIXME: Wrong source location information for the '('. 11592 SourceLocation FakeLParenLoc 11593 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11594 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11595 Args, 11596 E->getRParenLoc(), EC.get()); 11597 } 11598 11599 template<typename Derived> 11600 ExprResult 11601 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11602 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11603 if (!Type) 11604 return ExprError(); 11605 11606 ExprResult SubExpr 11607 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11608 if (SubExpr.isInvalid()) 11609 return ExprError(); 11610 11611 if (!getDerived().AlwaysRebuild() && 11612 Type == E->getTypeInfoAsWritten() && 11613 SubExpr.get() == E->getSubExpr()) 11614 return E; 11615 return getDerived().RebuildCXXNamedCastExpr( 11616 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11617 Type, E->getAngleBrackets().getEnd(), 11618 // FIXME. this should be '(' location 11619 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11620 } 11621 11622 template<typename Derived> 11623 ExprResult 11624 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11625 TypeSourceInfo *TSI = 11626 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11627 if (!TSI) 11628 return ExprError(); 11629 11630 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11631 if (Sub.isInvalid()) 11632 return ExprError(); 11633 11634 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11635 Sub.get(), BCE->getEndLoc()); 11636 } 11637 11638 template<typename Derived> 11639 ExprResult 11640 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11641 return getDerived().TransformCXXNamedCastExpr(E); 11642 } 11643 11644 template<typename Derived> 11645 ExprResult 11646 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11647 return getDerived().TransformCXXNamedCastExpr(E); 11648 } 11649 11650 template<typename Derived> 11651 ExprResult 11652 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11653 CXXReinterpretCastExpr *E) { 11654 return getDerived().TransformCXXNamedCastExpr(E); 11655 } 11656 11657 template<typename Derived> 11658 ExprResult 11659 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11660 return getDerived().TransformCXXNamedCastExpr(E); 11661 } 11662 11663 template<typename Derived> 11664 ExprResult 11665 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11666 return getDerived().TransformCXXNamedCastExpr(E); 11667 } 11668 11669 template<typename Derived> 11670 ExprResult 11671 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11672 CXXFunctionalCastExpr *E) { 11673 TypeSourceInfo *Type = 11674 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11675 if (!Type) 11676 return ExprError(); 11677 11678 ExprResult SubExpr 11679 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11680 if (SubExpr.isInvalid()) 11681 return ExprError(); 11682 11683 if (!getDerived().AlwaysRebuild() && 11684 Type == E->getTypeInfoAsWritten() && 11685 SubExpr.get() == E->getSubExpr()) 11686 return E; 11687 11688 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11689 E->getLParenLoc(), 11690 SubExpr.get(), 11691 E->getRParenLoc(), 11692 E->isListInitialization()); 11693 } 11694 11695 template<typename Derived> 11696 ExprResult 11697 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11698 if (E->isTypeOperand()) { 11699 TypeSourceInfo *TInfo 11700 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11701 if (!TInfo) 11702 return ExprError(); 11703 11704 if (!getDerived().AlwaysRebuild() && 11705 TInfo == E->getTypeOperandSourceInfo()) 11706 return E; 11707 11708 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11709 TInfo, E->getEndLoc()); 11710 } 11711 11712 // Typeid's operand is an unevaluated context, unless it's a polymorphic 11713 // type. We must not unilaterally enter unevaluated context here, as then 11714 // semantic processing can re-transform an already transformed operand. 11715 Expr *Op = E->getExprOperand(); 11716 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 11717 if (E->isGLValue()) 11718 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 11719 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 11720 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 11721 11722 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 11723 Sema::ReuseLambdaContextDecl); 11724 11725 ExprResult SubExpr = getDerived().TransformExpr(Op); 11726 if (SubExpr.isInvalid()) 11727 return ExprError(); 11728 11729 if (!getDerived().AlwaysRebuild() && 11730 SubExpr.get() == E->getExprOperand()) 11731 return E; 11732 11733 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11734 SubExpr.get(), E->getEndLoc()); 11735 } 11736 11737 template<typename Derived> 11738 ExprResult 11739 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11740 if (E->isTypeOperand()) { 11741 TypeSourceInfo *TInfo 11742 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11743 if (!TInfo) 11744 return ExprError(); 11745 11746 if (!getDerived().AlwaysRebuild() && 11747 TInfo == E->getTypeOperandSourceInfo()) 11748 return E; 11749 11750 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11751 TInfo, E->getEndLoc()); 11752 } 11753 11754 EnterExpressionEvaluationContext Unevaluated( 11755 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11756 11757 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11758 if (SubExpr.isInvalid()) 11759 return ExprError(); 11760 11761 if (!getDerived().AlwaysRebuild() && 11762 SubExpr.get() == E->getExprOperand()) 11763 return E; 11764 11765 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11766 SubExpr.get(), E->getEndLoc()); 11767 } 11768 11769 template<typename Derived> 11770 ExprResult 11771 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11772 return E; 11773 } 11774 11775 template<typename Derived> 11776 ExprResult 11777 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11778 CXXNullPtrLiteralExpr *E) { 11779 return E; 11780 } 11781 11782 template<typename Derived> 11783 ExprResult 11784 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11785 QualType T = getSema().getCurrentThisType(); 11786 11787 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11788 // Mark it referenced in the new context regardless. 11789 // FIXME: this is a bit instantiation-specific. 11790 getSema().MarkThisReferenced(E); 11791 return E; 11792 } 11793 11794 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11795 } 11796 11797 template<typename Derived> 11798 ExprResult 11799 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11800 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11801 if (SubExpr.isInvalid()) 11802 return ExprError(); 11803 11804 if (!getDerived().AlwaysRebuild() && 11805 SubExpr.get() == E->getSubExpr()) 11806 return E; 11807 11808 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11809 E->isThrownVariableInScope()); 11810 } 11811 11812 template<typename Derived> 11813 ExprResult 11814 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11815 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11816 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11817 if (!Param) 11818 return ExprError(); 11819 11820 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11821 E->getUsedContext() == SemaRef.CurContext) 11822 return E; 11823 11824 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11825 } 11826 11827 template<typename Derived> 11828 ExprResult 11829 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11830 FieldDecl *Field = cast_or_null<FieldDecl>( 11831 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11832 if (!Field) 11833 return ExprError(); 11834 11835 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11836 E->getUsedContext() == SemaRef.CurContext) 11837 return E; 11838 11839 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11840 } 11841 11842 template<typename Derived> 11843 ExprResult 11844 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11845 CXXScalarValueInitExpr *E) { 11846 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11847 if (!T) 11848 return ExprError(); 11849 11850 if (!getDerived().AlwaysRebuild() && 11851 T == E->getTypeSourceInfo()) 11852 return E; 11853 11854 return getDerived().RebuildCXXScalarValueInitExpr(T, 11855 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11856 E->getRParenLoc()); 11857 } 11858 11859 template<typename Derived> 11860 ExprResult 11861 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11862 // Transform the type that we're allocating 11863 TypeSourceInfo *AllocTypeInfo = 11864 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11865 if (!AllocTypeInfo) 11866 return ExprError(); 11867 11868 // Transform the size of the array we're allocating (if any). 11869 Optional<Expr *> ArraySize; 11870 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11871 ExprResult NewArraySize; 11872 if (*OldArraySize) { 11873 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11874 if (NewArraySize.isInvalid()) 11875 return ExprError(); 11876 } 11877 ArraySize = NewArraySize.get(); 11878 } 11879 11880 // Transform the placement arguments (if any). 11881 bool ArgumentChanged = false; 11882 SmallVector<Expr*, 8> PlacementArgs; 11883 if (getDerived().TransformExprs(E->getPlacementArgs(), 11884 E->getNumPlacementArgs(), true, 11885 PlacementArgs, &ArgumentChanged)) 11886 return ExprError(); 11887 11888 // Transform the initializer (if any). 11889 Expr *OldInit = E->getInitializer(); 11890 ExprResult NewInit; 11891 if (OldInit) 11892 NewInit = getDerived().TransformInitializer(OldInit, true); 11893 if (NewInit.isInvalid()) 11894 return ExprError(); 11895 11896 // Transform new operator and delete operator. 11897 FunctionDecl *OperatorNew = nullptr; 11898 if (E->getOperatorNew()) { 11899 OperatorNew = cast_or_null<FunctionDecl>( 11900 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11901 if (!OperatorNew) 11902 return ExprError(); 11903 } 11904 11905 FunctionDecl *OperatorDelete = nullptr; 11906 if (E->getOperatorDelete()) { 11907 OperatorDelete = cast_or_null<FunctionDecl>( 11908 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11909 if (!OperatorDelete) 11910 return ExprError(); 11911 } 11912 11913 if (!getDerived().AlwaysRebuild() && 11914 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11915 ArraySize == E->getArraySize() && 11916 NewInit.get() == OldInit && 11917 OperatorNew == E->getOperatorNew() && 11918 OperatorDelete == E->getOperatorDelete() && 11919 !ArgumentChanged) { 11920 // Mark any declarations we need as referenced. 11921 // FIXME: instantiation-specific. 11922 if (OperatorNew) 11923 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11924 if (OperatorDelete) 11925 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11926 11927 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11928 QualType ElementType 11929 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11930 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11931 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11932 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11933 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11934 } 11935 } 11936 } 11937 11938 return E; 11939 } 11940 11941 QualType AllocType = AllocTypeInfo->getType(); 11942 if (!ArraySize) { 11943 // If no array size was specified, but the new expression was 11944 // instantiated with an array type (e.g., "new T" where T is 11945 // instantiated with "int[4]"), extract the outer bound from the 11946 // array type as our array size. We do this with constant and 11947 // dependently-sized array types. 11948 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11949 if (!ArrayT) { 11950 // Do nothing 11951 } else if (const ConstantArrayType *ConsArrayT 11952 = dyn_cast<ConstantArrayType>(ArrayT)) { 11953 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11954 SemaRef.Context.getSizeType(), 11955 /*FIXME:*/ E->getBeginLoc()); 11956 AllocType = ConsArrayT->getElementType(); 11957 } else if (const DependentSizedArrayType *DepArrayT 11958 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11959 if (DepArrayT->getSizeExpr()) { 11960 ArraySize = DepArrayT->getSizeExpr(); 11961 AllocType = DepArrayT->getElementType(); 11962 } 11963 } 11964 } 11965 11966 return getDerived().RebuildCXXNewExpr( 11967 E->getBeginLoc(), E->isGlobalNew(), 11968 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11969 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11970 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11971 } 11972 11973 template<typename Derived> 11974 ExprResult 11975 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11976 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11977 if (Operand.isInvalid()) 11978 return ExprError(); 11979 11980 // Transform the delete operator, if known. 11981 FunctionDecl *OperatorDelete = nullptr; 11982 if (E->getOperatorDelete()) { 11983 OperatorDelete = cast_or_null<FunctionDecl>( 11984 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11985 if (!OperatorDelete) 11986 return ExprError(); 11987 } 11988 11989 if (!getDerived().AlwaysRebuild() && 11990 Operand.get() == E->getArgument() && 11991 OperatorDelete == E->getOperatorDelete()) { 11992 // Mark any declarations we need as referenced. 11993 // FIXME: instantiation-specific. 11994 if (OperatorDelete) 11995 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11996 11997 if (!E->getArgument()->isTypeDependent()) { 11998 QualType Destroyed = SemaRef.Context.getBaseElementType( 11999 E->getDestroyedType()); 12000 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12001 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12002 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12003 SemaRef.LookupDestructor(Record)); 12004 } 12005 } 12006 12007 return E; 12008 } 12009 12010 return getDerived().RebuildCXXDeleteExpr( 12011 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12012 } 12013 12014 template<typename Derived> 12015 ExprResult 12016 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12017 CXXPseudoDestructorExpr *E) { 12018 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12019 if (Base.isInvalid()) 12020 return ExprError(); 12021 12022 ParsedType ObjectTypePtr; 12023 bool MayBePseudoDestructor = false; 12024 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12025 E->getOperatorLoc(), 12026 E->isArrow()? tok::arrow : tok::period, 12027 ObjectTypePtr, 12028 MayBePseudoDestructor); 12029 if (Base.isInvalid()) 12030 return ExprError(); 12031 12032 QualType ObjectType = ObjectTypePtr.get(); 12033 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12034 if (QualifierLoc) { 12035 QualifierLoc 12036 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12037 if (!QualifierLoc) 12038 return ExprError(); 12039 } 12040 CXXScopeSpec SS; 12041 SS.Adopt(QualifierLoc); 12042 12043 PseudoDestructorTypeStorage Destroyed; 12044 if (E->getDestroyedTypeInfo()) { 12045 TypeSourceInfo *DestroyedTypeInfo 12046 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12047 ObjectType, nullptr, SS); 12048 if (!DestroyedTypeInfo) 12049 return ExprError(); 12050 Destroyed = DestroyedTypeInfo; 12051 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12052 // We aren't likely to be able to resolve the identifier down to a type 12053 // now anyway, so just retain the identifier. 12054 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12055 E->getDestroyedTypeLoc()); 12056 } else { 12057 // Look for a destructor known with the given name. 12058 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 12059 *E->getDestroyedTypeIdentifier(), 12060 E->getDestroyedTypeLoc(), 12061 /*Scope=*/nullptr, 12062 SS, ObjectTypePtr, 12063 false); 12064 if (!T) 12065 return ExprError(); 12066 12067 Destroyed 12068 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12069 E->getDestroyedTypeLoc()); 12070 } 12071 12072 TypeSourceInfo *ScopeTypeInfo = nullptr; 12073 if (E->getScopeTypeInfo()) { 12074 CXXScopeSpec EmptySS; 12075 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12076 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12077 if (!ScopeTypeInfo) 12078 return ExprError(); 12079 } 12080 12081 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12082 E->getOperatorLoc(), 12083 E->isArrow(), 12084 SS, 12085 ScopeTypeInfo, 12086 E->getColonColonLoc(), 12087 E->getTildeLoc(), 12088 Destroyed); 12089 } 12090 12091 template <typename Derived> 12092 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12093 bool RequiresADL, 12094 LookupResult &R) { 12095 // Transform all the decls. 12096 bool AllEmptyPacks = true; 12097 for (auto *OldD : Old->decls()) { 12098 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12099 if (!InstD) { 12100 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12101 // This can happen because of dependent hiding. 12102 if (isa<UsingShadowDecl>(OldD)) 12103 continue; 12104 else { 12105 R.clear(); 12106 return true; 12107 } 12108 } 12109 12110 // Expand using pack declarations. 12111 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12112 ArrayRef<NamedDecl*> Decls = SingleDecl; 12113 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12114 Decls = UPD->expansions(); 12115 12116 // Expand using declarations. 12117 for (auto *D : Decls) { 12118 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12119 for (auto *SD : UD->shadows()) 12120 R.addDecl(SD); 12121 } else { 12122 R.addDecl(D); 12123 } 12124 } 12125 12126 AllEmptyPacks &= Decls.empty(); 12127 }; 12128 12129 // C++ [temp.res]/8.4.2: 12130 // The program is ill-formed, no diagnostic required, if [...] lookup for 12131 // a name in the template definition found a using-declaration, but the 12132 // lookup in the corresponding scope in the instantiation odoes not find 12133 // any declarations because the using-declaration was a pack expansion and 12134 // the corresponding pack is empty 12135 if (AllEmptyPacks && !RequiresADL) { 12136 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12137 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12138 return true; 12139 } 12140 12141 // Resolve a kind, but don't do any further analysis. If it's 12142 // ambiguous, the callee needs to deal with it. 12143 R.resolveKind(); 12144 return false; 12145 } 12146 12147 template<typename Derived> 12148 ExprResult 12149 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12150 UnresolvedLookupExpr *Old) { 12151 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12152 Sema::LookupOrdinaryName); 12153 12154 // Transform the declaration set. 12155 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12156 return ExprError(); 12157 12158 // Rebuild the nested-name qualifier, if present. 12159 CXXScopeSpec SS; 12160 if (Old->getQualifierLoc()) { 12161 NestedNameSpecifierLoc QualifierLoc 12162 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12163 if (!QualifierLoc) 12164 return ExprError(); 12165 12166 SS.Adopt(QualifierLoc); 12167 } 12168 12169 if (Old->getNamingClass()) { 12170 CXXRecordDecl *NamingClass 12171 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12172 Old->getNameLoc(), 12173 Old->getNamingClass())); 12174 if (!NamingClass) { 12175 R.clear(); 12176 return ExprError(); 12177 } 12178 12179 R.setNamingClass(NamingClass); 12180 } 12181 12182 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12183 12184 // If we have neither explicit template arguments, nor the template keyword, 12185 // it's a normal declaration name or member reference. 12186 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12187 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12188 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12189 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12190 // give a good diagnostic. 12191 if (D && D->isCXXInstanceMember()) { 12192 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12193 /*TemplateArgs=*/nullptr, 12194 /*Scope=*/nullptr); 12195 } 12196 12197 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12198 } 12199 12200 // If we have template arguments, rebuild them, then rebuild the 12201 // templateid expression. 12202 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12203 if (Old->hasExplicitTemplateArgs() && 12204 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12205 Old->getNumTemplateArgs(), 12206 TransArgs)) { 12207 R.clear(); 12208 return ExprError(); 12209 } 12210 12211 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12212 Old->requiresADL(), &TransArgs); 12213 } 12214 12215 template<typename Derived> 12216 ExprResult 12217 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12218 bool ArgChanged = false; 12219 SmallVector<TypeSourceInfo *, 4> Args; 12220 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12221 TypeSourceInfo *From = E->getArg(I); 12222 TypeLoc FromTL = From->getTypeLoc(); 12223 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12224 TypeLocBuilder TLB; 12225 TLB.reserve(FromTL.getFullDataSize()); 12226 QualType To = getDerived().TransformType(TLB, FromTL); 12227 if (To.isNull()) 12228 return ExprError(); 12229 12230 if (To == From->getType()) 12231 Args.push_back(From); 12232 else { 12233 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12234 ArgChanged = true; 12235 } 12236 continue; 12237 } 12238 12239 ArgChanged = true; 12240 12241 // We have a pack expansion. Instantiate it. 12242 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12243 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12244 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12245 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12246 12247 // Determine whether the set of unexpanded parameter packs can and should 12248 // be expanded. 12249 bool Expand = true; 12250 bool RetainExpansion = false; 12251 Optional<unsigned> OrigNumExpansions = 12252 ExpansionTL.getTypePtr()->getNumExpansions(); 12253 Optional<unsigned> NumExpansions = OrigNumExpansions; 12254 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12255 PatternTL.getSourceRange(), 12256 Unexpanded, 12257 Expand, RetainExpansion, 12258 NumExpansions)) 12259 return ExprError(); 12260 12261 if (!Expand) { 12262 // The transform has determined that we should perform a simple 12263 // transformation on the pack expansion, producing another pack 12264 // expansion. 12265 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12266 12267 TypeLocBuilder TLB; 12268 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12269 12270 QualType To = getDerived().TransformType(TLB, PatternTL); 12271 if (To.isNull()) 12272 return ExprError(); 12273 12274 To = getDerived().RebuildPackExpansionType(To, 12275 PatternTL.getSourceRange(), 12276 ExpansionTL.getEllipsisLoc(), 12277 NumExpansions); 12278 if (To.isNull()) 12279 return ExprError(); 12280 12281 PackExpansionTypeLoc ToExpansionTL 12282 = TLB.push<PackExpansionTypeLoc>(To); 12283 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12284 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12285 continue; 12286 } 12287 12288 // Expand the pack expansion by substituting for each argument in the 12289 // pack(s). 12290 for (unsigned I = 0; I != *NumExpansions; ++I) { 12291 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12292 TypeLocBuilder TLB; 12293 TLB.reserve(PatternTL.getFullDataSize()); 12294 QualType To = getDerived().TransformType(TLB, PatternTL); 12295 if (To.isNull()) 12296 return ExprError(); 12297 12298 if (To->containsUnexpandedParameterPack()) { 12299 To = getDerived().RebuildPackExpansionType(To, 12300 PatternTL.getSourceRange(), 12301 ExpansionTL.getEllipsisLoc(), 12302 NumExpansions); 12303 if (To.isNull()) 12304 return ExprError(); 12305 12306 PackExpansionTypeLoc ToExpansionTL 12307 = TLB.push<PackExpansionTypeLoc>(To); 12308 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12309 } 12310 12311 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12312 } 12313 12314 if (!RetainExpansion) 12315 continue; 12316 12317 // If we're supposed to retain a pack expansion, do so by temporarily 12318 // forgetting the partially-substituted parameter pack. 12319 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12320 12321 TypeLocBuilder TLB; 12322 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12323 12324 QualType To = getDerived().TransformType(TLB, PatternTL); 12325 if (To.isNull()) 12326 return ExprError(); 12327 12328 To = getDerived().RebuildPackExpansionType(To, 12329 PatternTL.getSourceRange(), 12330 ExpansionTL.getEllipsisLoc(), 12331 NumExpansions); 12332 if (To.isNull()) 12333 return ExprError(); 12334 12335 PackExpansionTypeLoc ToExpansionTL 12336 = TLB.push<PackExpansionTypeLoc>(To); 12337 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12338 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12339 } 12340 12341 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12342 return E; 12343 12344 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12345 E->getEndLoc()); 12346 } 12347 12348 template<typename Derived> 12349 ExprResult 12350 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12351 ConceptSpecializationExpr *E) { 12352 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12353 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12354 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12355 Old->NumTemplateArgs, TransArgs)) 12356 return ExprError(); 12357 12358 return getDerived().RebuildConceptSpecializationExpr( 12359 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12360 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12361 &TransArgs); 12362 } 12363 12364 template<typename Derived> 12365 ExprResult 12366 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12367 SmallVector<ParmVarDecl*, 4> TransParams; 12368 SmallVector<QualType, 4> TransParamTypes; 12369 Sema::ExtParameterInfoBuilder ExtParamInfos; 12370 12371 // C++2a [expr.prim.req]p2 12372 // Expressions appearing within a requirement-body are unevaluated operands. 12373 EnterExpressionEvaluationContext Ctx( 12374 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12375 12376 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12377 getSema().Context, getSema().CurContext, 12378 E->getBody()->getBeginLoc()); 12379 12380 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12381 12382 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12383 E->getLocalParameters(), 12384 /*ParamTypes=*/nullptr, 12385 /*ParamInfos=*/nullptr, 12386 TransParamTypes, &TransParams, 12387 ExtParamInfos)) 12388 return ExprError(); 12389 12390 for (ParmVarDecl *Param : TransParams) 12391 Param->setDeclContext(Body); 12392 12393 SmallVector<concepts::Requirement *, 4> TransReqs; 12394 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12395 TransReqs)) 12396 return ExprError(); 12397 12398 for (concepts::Requirement *Req : TransReqs) { 12399 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12400 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12401 ER->getReturnTypeRequirement() 12402 .getTypeConstraintTemplateParameterList()->getParam(0) 12403 ->setDeclContext(Body); 12404 } 12405 } 12406 } 12407 12408 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12409 TransParams, TransReqs, 12410 E->getRBraceLoc()); 12411 } 12412 12413 template<typename Derived> 12414 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12415 ArrayRef<concepts::Requirement *> Reqs, 12416 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12417 for (concepts::Requirement *Req : Reqs) { 12418 concepts::Requirement *TransReq = nullptr; 12419 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12420 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12421 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12422 TransReq = getDerived().TransformExprRequirement(ExprReq); 12423 else 12424 TransReq = getDerived().TransformNestedRequirement( 12425 cast<concepts::NestedRequirement>(Req)); 12426 if (!TransReq) 12427 return true; 12428 Transformed.push_back(TransReq); 12429 } 12430 return false; 12431 } 12432 12433 template<typename Derived> 12434 concepts::TypeRequirement * 12435 TreeTransform<Derived>::TransformTypeRequirement( 12436 concepts::TypeRequirement *Req) { 12437 if (Req->isSubstitutionFailure()) { 12438 if (getDerived().AlwaysRebuild()) 12439 return getDerived().RebuildTypeRequirement( 12440 Req->getSubstitutionDiagnostic()); 12441 return Req; 12442 } 12443 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12444 if (!TransType) 12445 return nullptr; 12446 return getDerived().RebuildTypeRequirement(TransType); 12447 } 12448 12449 template<typename Derived> 12450 concepts::ExprRequirement * 12451 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12452 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12453 if (Req->isExprSubstitutionFailure()) 12454 TransExpr = Req->getExprSubstitutionDiagnostic(); 12455 else { 12456 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12457 if (TransExprRes.isInvalid()) 12458 return nullptr; 12459 TransExpr = TransExprRes.get(); 12460 } 12461 12462 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12463 const auto &RetReq = Req->getReturnTypeRequirement(); 12464 if (RetReq.isEmpty()) 12465 TransRetReq.emplace(); 12466 else if (RetReq.isSubstitutionFailure()) 12467 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12468 else if (RetReq.isTypeConstraint()) { 12469 TemplateParameterList *OrigTPL = 12470 RetReq.getTypeConstraintTemplateParameterList(); 12471 TemplateParameterList *TPL = 12472 getDerived().TransformTemplateParameterList(OrigTPL); 12473 if (!TPL) 12474 return nullptr; 12475 TransRetReq.emplace(TPL); 12476 } 12477 assert(TransRetReq.hasValue() && 12478 "All code paths leading here must set TransRetReq"); 12479 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12480 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12481 Req->getNoexceptLoc(), 12482 std::move(*TransRetReq)); 12483 return getDerived().RebuildExprRequirement( 12484 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12485 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12486 } 12487 12488 template<typename Derived> 12489 concepts::NestedRequirement * 12490 TreeTransform<Derived>::TransformNestedRequirement( 12491 concepts::NestedRequirement *Req) { 12492 if (Req->isSubstitutionFailure()) { 12493 if (getDerived().AlwaysRebuild()) 12494 return getDerived().RebuildNestedRequirement( 12495 Req->getSubstitutionDiagnostic()); 12496 return Req; 12497 } 12498 ExprResult TransConstraint = 12499 getDerived().TransformExpr(Req->getConstraintExpr()); 12500 if (TransConstraint.isInvalid()) 12501 return nullptr; 12502 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12503 } 12504 12505 template<typename Derived> 12506 ExprResult 12507 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12508 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12509 if (!T) 12510 return ExprError(); 12511 12512 if (!getDerived().AlwaysRebuild() && 12513 T == E->getQueriedTypeSourceInfo()) 12514 return E; 12515 12516 ExprResult SubExpr; 12517 { 12518 EnterExpressionEvaluationContext Unevaluated( 12519 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12520 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12521 if (SubExpr.isInvalid()) 12522 return ExprError(); 12523 12524 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12525 return E; 12526 } 12527 12528 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12529 SubExpr.get(), E->getEndLoc()); 12530 } 12531 12532 template<typename Derived> 12533 ExprResult 12534 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12535 ExprResult SubExpr; 12536 { 12537 EnterExpressionEvaluationContext Unevaluated( 12538 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12539 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12540 if (SubExpr.isInvalid()) 12541 return ExprError(); 12542 12543 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12544 return E; 12545 } 12546 12547 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12548 SubExpr.get(), E->getEndLoc()); 12549 } 12550 12551 template <typename Derived> 12552 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12553 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12554 TypeSourceInfo **RecoveryTSI) { 12555 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12556 DRE, AddrTaken, RecoveryTSI); 12557 12558 // Propagate both errors and recovered types, which return ExprEmpty. 12559 if (!NewDRE.isUsable()) 12560 return NewDRE; 12561 12562 // We got an expr, wrap it up in parens. 12563 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12564 return PE; 12565 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12566 PE->getRParen()); 12567 } 12568 12569 template <typename Derived> 12570 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12571 DependentScopeDeclRefExpr *E) { 12572 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12573 nullptr); 12574 } 12575 12576 template <typename Derived> 12577 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12578 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 12579 TypeSourceInfo **RecoveryTSI) { 12580 assert(E->getQualifierLoc()); 12581 NestedNameSpecifierLoc QualifierLoc = 12582 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12583 if (!QualifierLoc) 12584 return ExprError(); 12585 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12586 12587 // TODO: If this is a conversion-function-id, verify that the 12588 // destination type name (if present) resolves the same way after 12589 // instantiation as it did in the local scope. 12590 12591 DeclarationNameInfo NameInfo = 12592 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12593 if (!NameInfo.getName()) 12594 return ExprError(); 12595 12596 if (!E->hasExplicitTemplateArgs()) { 12597 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 12598 // Note: it is sufficient to compare the Name component of NameInfo: 12599 // if name has not changed, DNLoc has not changed either. 12600 NameInfo.getName() == E->getDeclName()) 12601 return E; 12602 12603 return getDerived().RebuildDependentScopeDeclRefExpr( 12604 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12605 IsAddressOfOperand, RecoveryTSI); 12606 } 12607 12608 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12609 if (getDerived().TransformTemplateArguments( 12610 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 12611 return ExprError(); 12612 12613 return getDerived().RebuildDependentScopeDeclRefExpr( 12614 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12615 RecoveryTSI); 12616 } 12617 12618 template<typename Derived> 12619 ExprResult 12620 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12621 // CXXConstructExprs other than for list-initialization and 12622 // CXXTemporaryObjectExpr are always implicit, so when we have 12623 // a 1-argument construction we just transform that argument. 12624 if (getDerived().AllowSkippingCXXConstructExpr() && 12625 ((E->getNumArgs() == 1 || 12626 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12627 (!getDerived().DropCallArgument(E->getArg(0))) && 12628 !E->isListInitialization())) 12629 return getDerived().TransformInitializer(E->getArg(0), 12630 /*DirectInit*/ false); 12631 12632 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12633 12634 QualType T = getDerived().TransformType(E->getType()); 12635 if (T.isNull()) 12636 return ExprError(); 12637 12638 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12639 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12640 if (!Constructor) 12641 return ExprError(); 12642 12643 bool ArgumentChanged = false; 12644 SmallVector<Expr*, 8> Args; 12645 { 12646 EnterExpressionEvaluationContext Context( 12647 getSema(), EnterExpressionEvaluationContext::InitList, 12648 E->isListInitialization()); 12649 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12650 &ArgumentChanged)) 12651 return ExprError(); 12652 } 12653 12654 if (!getDerived().AlwaysRebuild() && 12655 T == E->getType() && 12656 Constructor == E->getConstructor() && 12657 !ArgumentChanged) { 12658 // Mark the constructor as referenced. 12659 // FIXME: Instantiation-specific 12660 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12661 return E; 12662 } 12663 12664 return getDerived().RebuildCXXConstructExpr( 12665 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12666 E->hadMultipleCandidates(), E->isListInitialization(), 12667 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12668 E->getConstructionKind(), E->getParenOrBraceRange()); 12669 } 12670 12671 template<typename Derived> 12672 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12673 CXXInheritedCtorInitExpr *E) { 12674 QualType T = getDerived().TransformType(E->getType()); 12675 if (T.isNull()) 12676 return ExprError(); 12677 12678 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12679 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12680 if (!Constructor) 12681 return ExprError(); 12682 12683 if (!getDerived().AlwaysRebuild() && 12684 T == E->getType() && 12685 Constructor == E->getConstructor()) { 12686 // Mark the constructor as referenced. 12687 // FIXME: Instantiation-specific 12688 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12689 return E; 12690 } 12691 12692 return getDerived().RebuildCXXInheritedCtorInitExpr( 12693 T, E->getLocation(), Constructor, 12694 E->constructsVBase(), E->inheritedFromVBase()); 12695 } 12696 12697 /// Transform a C++ temporary-binding expression. 12698 /// 12699 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12700 /// transform the subexpression and return that. 12701 template<typename Derived> 12702 ExprResult 12703 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12704 return getDerived().TransformExpr(E->getSubExpr()); 12705 } 12706 12707 /// Transform a C++ expression that contains cleanups that should 12708 /// be run after the expression is evaluated. 12709 /// 12710 /// Since ExprWithCleanups nodes are implicitly generated, we 12711 /// just transform the subexpression and return that. 12712 template<typename Derived> 12713 ExprResult 12714 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12715 return getDerived().TransformExpr(E->getSubExpr()); 12716 } 12717 12718 template<typename Derived> 12719 ExprResult 12720 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12721 CXXTemporaryObjectExpr *E) { 12722 TypeSourceInfo *T = 12723 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12724 if (!T) 12725 return ExprError(); 12726 12727 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12728 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12729 if (!Constructor) 12730 return ExprError(); 12731 12732 bool ArgumentChanged = false; 12733 SmallVector<Expr*, 8> Args; 12734 Args.reserve(E->getNumArgs()); 12735 { 12736 EnterExpressionEvaluationContext Context( 12737 getSema(), EnterExpressionEvaluationContext::InitList, 12738 E->isListInitialization()); 12739 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12740 &ArgumentChanged)) 12741 return ExprError(); 12742 } 12743 12744 if (!getDerived().AlwaysRebuild() && 12745 T == E->getTypeSourceInfo() && 12746 Constructor == E->getConstructor() && 12747 !ArgumentChanged) { 12748 // FIXME: Instantiation-specific 12749 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12750 return SemaRef.MaybeBindToTemporary(E); 12751 } 12752 12753 // FIXME: We should just pass E->isListInitialization(), but we're not 12754 // prepared to handle list-initialization without a child InitListExpr. 12755 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12756 return getDerived().RebuildCXXTemporaryObjectExpr( 12757 T, LParenLoc, Args, E->getEndLoc(), 12758 /*ListInitialization=*/LParenLoc.isInvalid()); 12759 } 12760 12761 template<typename Derived> 12762 ExprResult 12763 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12764 // Transform any init-capture expressions before entering the scope of the 12765 // lambda body, because they are not semantically within that scope. 12766 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12767 struct TransformedInitCapture { 12768 // The location of the ... if the result is retaining a pack expansion. 12769 SourceLocation EllipsisLoc; 12770 // Zero or more expansions of the init-capture. 12771 SmallVector<InitCaptureInfoTy, 4> Expansions; 12772 }; 12773 SmallVector<TransformedInitCapture, 4> InitCaptures; 12774 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12775 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12776 CEnd = E->capture_end(); 12777 C != CEnd; ++C) { 12778 if (!E->isInitCapture(C)) 12779 continue; 12780 12781 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12782 VarDecl *OldVD = C->getCapturedVar(); 12783 12784 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12785 Optional<unsigned> NumExpansions) { 12786 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12787 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12788 12789 if (NewExprInitResult.isInvalid()) { 12790 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12791 return; 12792 } 12793 Expr *NewExprInit = NewExprInitResult.get(); 12794 12795 QualType NewInitCaptureType = 12796 getSema().buildLambdaInitCaptureInitialization( 12797 C->getLocation(), OldVD->getType()->isReferenceType(), 12798 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12799 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12800 NewExprInit); 12801 Result.Expansions.push_back( 12802 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12803 }; 12804 12805 // If this is an init-capture pack, consider expanding the pack now. 12806 if (OldVD->isParameterPack()) { 12807 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12808 ->getTypeLoc() 12809 .castAs<PackExpansionTypeLoc>(); 12810 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12811 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12812 12813 // Determine whether the set of unexpanded parameter packs can and should 12814 // be expanded. 12815 bool Expand = true; 12816 bool RetainExpansion = false; 12817 Optional<unsigned> OrigNumExpansions = 12818 ExpansionTL.getTypePtr()->getNumExpansions(); 12819 Optional<unsigned> NumExpansions = OrigNumExpansions; 12820 if (getDerived().TryExpandParameterPacks( 12821 ExpansionTL.getEllipsisLoc(), 12822 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12823 RetainExpansion, NumExpansions)) 12824 return ExprError(); 12825 if (Expand) { 12826 for (unsigned I = 0; I != *NumExpansions; ++I) { 12827 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12828 SubstInitCapture(SourceLocation(), None); 12829 } 12830 } 12831 if (!Expand || RetainExpansion) { 12832 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12833 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12834 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12835 } 12836 } else { 12837 SubstInitCapture(SourceLocation(), None); 12838 } 12839 } 12840 12841 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12842 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12843 12844 // Transform the template parameters, and add them to the current 12845 // instantiation scope. The null case is handled correctly. 12846 auto TPL = getDerived().TransformTemplateParameterList( 12847 E->getTemplateParameterList()); 12848 LSI->GLTemplateParameterList = TPL; 12849 12850 // Transform the type of the original lambda's call operator. 12851 // The transformation MUST be done in the CurrentInstantiationScope since 12852 // it introduces a mapping of the original to the newly created 12853 // transformed parameters. 12854 TypeSourceInfo *NewCallOpTSI = nullptr; 12855 { 12856 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12857 FunctionProtoTypeLoc OldCallOpFPTL = 12858 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12859 12860 TypeLocBuilder NewCallOpTLBuilder; 12861 SmallVector<QualType, 4> ExceptionStorage; 12862 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12863 QualType NewCallOpType = TransformFunctionProtoType( 12864 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12865 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12866 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12867 ExceptionStorage, Changed); 12868 }); 12869 if (NewCallOpType.isNull()) 12870 return ExprError(); 12871 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12872 NewCallOpType); 12873 } 12874 12875 // Transform the trailing requires clause 12876 ExprResult NewTrailingRequiresClause; 12877 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12878 // FIXME: Concepts: Substitution into requires clause should only happen 12879 // when checking satisfaction. 12880 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12881 12882 // Create the local class that will describe the lambda. 12883 // FIXME: KnownDependent below is wrong when substituting inside a templated 12884 // context that isn't a DeclContext (such as a variable template). 12885 CXXRecordDecl *OldClass = E->getLambdaClass(); 12886 CXXRecordDecl *Class 12887 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12888 NewCallOpTSI, 12889 /*KnownDependent=*/false, 12890 E->getCaptureDefault()); 12891 getDerived().transformedLocalDecl(OldClass, {Class}); 12892 12893 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12894 if (getDerived().ReplacingOriginal()) 12895 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12896 OldClass->getLambdaManglingNumber(), 12897 OldClass->getDeviceLambdaManglingNumber(), 12898 OldClass->getLambdaContextDecl()); 12899 12900 // Build the call operator. 12901 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12902 Class, E->getIntroducerRange(), NewCallOpTSI, 12903 E->getCallOperator()->getEndLoc(), 12904 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12905 E->getCallOperator()->getConstexprKind(), 12906 NewTrailingRequiresClause.get()); 12907 12908 LSI->CallOperator = NewCallOperator; 12909 12910 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12911 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12912 12913 // Number the lambda for linkage purposes if necessary. 12914 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12915 12916 // Introduce the context of the call operator. 12917 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12918 /*NewThisContext*/false); 12919 12920 // Enter the scope of the lambda. 12921 getSema().buildLambdaScope(LSI, NewCallOperator, 12922 E->getIntroducerRange(), 12923 E->getCaptureDefault(), 12924 E->getCaptureDefaultLoc(), 12925 E->hasExplicitParameters(), 12926 E->hasExplicitResultType(), 12927 E->isMutable()); 12928 12929 bool Invalid = false; 12930 12931 // Transform captures. 12932 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12933 CEnd = E->capture_end(); 12934 C != CEnd; ++C) { 12935 // When we hit the first implicit capture, tell Sema that we've finished 12936 // the list of explicit captures. 12937 if (C->isImplicit()) 12938 break; 12939 12940 // Capturing 'this' is trivial. 12941 if (C->capturesThis()) { 12942 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12943 /*BuildAndDiagnose*/ true, nullptr, 12944 C->getCaptureKind() == LCK_StarThis); 12945 continue; 12946 } 12947 // Captured expression will be recaptured during captured variables 12948 // rebuilding. 12949 if (C->capturesVLAType()) 12950 continue; 12951 12952 // Rebuild init-captures, including the implied field declaration. 12953 if (E->isInitCapture(C)) { 12954 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12955 12956 VarDecl *OldVD = C->getCapturedVar(); 12957 llvm::SmallVector<Decl*, 4> NewVDs; 12958 12959 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12960 ExprResult Init = Info.first; 12961 QualType InitQualType = Info.second; 12962 if (Init.isInvalid() || InitQualType.isNull()) { 12963 Invalid = true; 12964 break; 12965 } 12966 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12967 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12968 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12969 if (!NewVD) { 12970 Invalid = true; 12971 break; 12972 } 12973 NewVDs.push_back(NewVD); 12974 getSema().addInitCapture(LSI, NewVD); 12975 } 12976 12977 if (Invalid) 12978 break; 12979 12980 getDerived().transformedLocalDecl(OldVD, NewVDs); 12981 continue; 12982 } 12983 12984 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12985 12986 // Determine the capture kind for Sema. 12987 Sema::TryCaptureKind Kind 12988 = C->isImplicit()? Sema::TryCapture_Implicit 12989 : C->getCaptureKind() == LCK_ByCopy 12990 ? Sema::TryCapture_ExplicitByVal 12991 : Sema::TryCapture_ExplicitByRef; 12992 SourceLocation EllipsisLoc; 12993 if (C->isPackExpansion()) { 12994 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12995 bool ShouldExpand = false; 12996 bool RetainExpansion = false; 12997 Optional<unsigned> NumExpansions; 12998 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12999 C->getLocation(), 13000 Unexpanded, 13001 ShouldExpand, RetainExpansion, 13002 NumExpansions)) { 13003 Invalid = true; 13004 continue; 13005 } 13006 13007 if (ShouldExpand) { 13008 // The transform has determined that we should perform an expansion; 13009 // transform and capture each of the arguments. 13010 // expansion of the pattern. Do so. 13011 VarDecl *Pack = C->getCapturedVar(); 13012 for (unsigned I = 0; I != *NumExpansions; ++I) { 13013 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13014 VarDecl *CapturedVar 13015 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13016 Pack)); 13017 if (!CapturedVar) { 13018 Invalid = true; 13019 continue; 13020 } 13021 13022 // Capture the transformed variable. 13023 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13024 } 13025 13026 // FIXME: Retain a pack expansion if RetainExpansion is true. 13027 13028 continue; 13029 } 13030 13031 EllipsisLoc = C->getEllipsisLoc(); 13032 } 13033 13034 // Transform the captured variable. 13035 VarDecl *CapturedVar 13036 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13037 C->getCapturedVar())); 13038 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13039 Invalid = true; 13040 continue; 13041 } 13042 13043 // Capture the transformed variable. 13044 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13045 EllipsisLoc); 13046 } 13047 getSema().finishLambdaExplicitCaptures(LSI); 13048 13049 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13050 // evaluation context even if we're not transforming the function body. 13051 getSema().PushExpressionEvaluationContext( 13052 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13053 13054 // Instantiate the body of the lambda expression. 13055 StmtResult Body = 13056 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13057 13058 // ActOnLambda* will pop the function scope for us. 13059 FuncScopeCleanup.disable(); 13060 13061 if (Body.isInvalid()) { 13062 SavedContext.pop(); 13063 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13064 /*IsInstantiation=*/true); 13065 return ExprError(); 13066 } 13067 13068 // Copy the LSI before ActOnFinishFunctionBody removes it. 13069 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13070 // the call operator. 13071 auto LSICopy = *LSI; 13072 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13073 /*IsInstantiation*/ true); 13074 SavedContext.pop(); 13075 13076 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13077 &LSICopy); 13078 } 13079 13080 template<typename Derived> 13081 StmtResult 13082 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13083 return TransformStmt(S); 13084 } 13085 13086 template<typename Derived> 13087 StmtResult 13088 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13089 // Transform captures. 13090 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13091 CEnd = E->capture_end(); 13092 C != CEnd; ++C) { 13093 // When we hit the first implicit capture, tell Sema that we've finished 13094 // the list of explicit captures. 13095 if (!C->isImplicit()) 13096 continue; 13097 13098 // Capturing 'this' is trivial. 13099 if (C->capturesThis()) { 13100 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13101 /*BuildAndDiagnose*/ true, nullptr, 13102 C->getCaptureKind() == LCK_StarThis); 13103 continue; 13104 } 13105 // Captured expression will be recaptured during captured variables 13106 // rebuilding. 13107 if (C->capturesVLAType()) 13108 continue; 13109 13110 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13111 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13112 13113 // Transform the captured variable. 13114 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13115 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13116 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13117 return StmtError(); 13118 13119 // Capture the transformed variable. 13120 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13121 } 13122 13123 return S; 13124 } 13125 13126 template<typename Derived> 13127 ExprResult 13128 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13129 CXXUnresolvedConstructExpr *E) { 13130 TypeSourceInfo *T = 13131 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13132 if (!T) 13133 return ExprError(); 13134 13135 bool ArgumentChanged = false; 13136 SmallVector<Expr*, 8> Args; 13137 Args.reserve(E->getNumArgs()); 13138 { 13139 EnterExpressionEvaluationContext Context( 13140 getSema(), EnterExpressionEvaluationContext::InitList, 13141 E->isListInitialization()); 13142 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13143 &ArgumentChanged)) 13144 return ExprError(); 13145 } 13146 13147 if (!getDerived().AlwaysRebuild() && 13148 T == E->getTypeSourceInfo() && 13149 !ArgumentChanged) 13150 return E; 13151 13152 // FIXME: we're faking the locations of the commas 13153 return getDerived().RebuildCXXUnresolvedConstructExpr( 13154 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13155 } 13156 13157 template<typename Derived> 13158 ExprResult 13159 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13160 CXXDependentScopeMemberExpr *E) { 13161 // Transform the base of the expression. 13162 ExprResult Base((Expr*) nullptr); 13163 Expr *OldBase; 13164 QualType BaseType; 13165 QualType ObjectType; 13166 if (!E->isImplicitAccess()) { 13167 OldBase = E->getBase(); 13168 Base = getDerived().TransformExpr(OldBase); 13169 if (Base.isInvalid()) 13170 return ExprError(); 13171 13172 // Start the member reference and compute the object's type. 13173 ParsedType ObjectTy; 13174 bool MayBePseudoDestructor = false; 13175 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13176 E->getOperatorLoc(), 13177 E->isArrow()? tok::arrow : tok::period, 13178 ObjectTy, 13179 MayBePseudoDestructor); 13180 if (Base.isInvalid()) 13181 return ExprError(); 13182 13183 ObjectType = ObjectTy.get(); 13184 BaseType = ((Expr*) Base.get())->getType(); 13185 } else { 13186 OldBase = nullptr; 13187 BaseType = getDerived().TransformType(E->getBaseType()); 13188 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13189 } 13190 13191 // Transform the first part of the nested-name-specifier that qualifies 13192 // the member name. 13193 NamedDecl *FirstQualifierInScope 13194 = getDerived().TransformFirstQualifierInScope( 13195 E->getFirstQualifierFoundInScope(), 13196 E->getQualifierLoc().getBeginLoc()); 13197 13198 NestedNameSpecifierLoc QualifierLoc; 13199 if (E->getQualifier()) { 13200 QualifierLoc 13201 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13202 ObjectType, 13203 FirstQualifierInScope); 13204 if (!QualifierLoc) 13205 return ExprError(); 13206 } 13207 13208 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13209 13210 // TODO: If this is a conversion-function-id, verify that the 13211 // destination type name (if present) resolves the same way after 13212 // instantiation as it did in the local scope. 13213 13214 DeclarationNameInfo NameInfo 13215 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13216 if (!NameInfo.getName()) 13217 return ExprError(); 13218 13219 if (!E->hasExplicitTemplateArgs()) { 13220 // This is a reference to a member without an explicitly-specified 13221 // template argument list. Optimize for this common case. 13222 if (!getDerived().AlwaysRebuild() && 13223 Base.get() == OldBase && 13224 BaseType == E->getBaseType() && 13225 QualifierLoc == E->getQualifierLoc() && 13226 NameInfo.getName() == E->getMember() && 13227 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13228 return E; 13229 13230 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13231 BaseType, 13232 E->isArrow(), 13233 E->getOperatorLoc(), 13234 QualifierLoc, 13235 TemplateKWLoc, 13236 FirstQualifierInScope, 13237 NameInfo, 13238 /*TemplateArgs*/nullptr); 13239 } 13240 13241 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13242 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13243 E->getNumTemplateArgs(), 13244 TransArgs)) 13245 return ExprError(); 13246 13247 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13248 BaseType, 13249 E->isArrow(), 13250 E->getOperatorLoc(), 13251 QualifierLoc, 13252 TemplateKWLoc, 13253 FirstQualifierInScope, 13254 NameInfo, 13255 &TransArgs); 13256 } 13257 13258 template <typename Derived> 13259 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13260 UnresolvedMemberExpr *Old) { 13261 // Transform the base of the expression. 13262 ExprResult Base((Expr *)nullptr); 13263 QualType BaseType; 13264 if (!Old->isImplicitAccess()) { 13265 Base = getDerived().TransformExpr(Old->getBase()); 13266 if (Base.isInvalid()) 13267 return ExprError(); 13268 Base = 13269 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13270 if (Base.isInvalid()) 13271 return ExprError(); 13272 BaseType = Base.get()->getType(); 13273 } else { 13274 BaseType = getDerived().TransformType(Old->getBaseType()); 13275 } 13276 13277 NestedNameSpecifierLoc QualifierLoc; 13278 if (Old->getQualifierLoc()) { 13279 QualifierLoc = 13280 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13281 if (!QualifierLoc) 13282 return ExprError(); 13283 } 13284 13285 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13286 13287 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13288 13289 // Transform the declaration set. 13290 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13291 return ExprError(); 13292 13293 // Determine the naming class. 13294 if (Old->getNamingClass()) { 13295 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13296 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13297 if (!NamingClass) 13298 return ExprError(); 13299 13300 R.setNamingClass(NamingClass); 13301 } 13302 13303 TemplateArgumentListInfo TransArgs; 13304 if (Old->hasExplicitTemplateArgs()) { 13305 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13306 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13307 if (getDerived().TransformTemplateArguments( 13308 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13309 return ExprError(); 13310 } 13311 13312 // FIXME: to do this check properly, we will need to preserve the 13313 // first-qualifier-in-scope here, just in case we had a dependent 13314 // base (and therefore couldn't do the check) and a 13315 // nested-name-qualifier (and therefore could do the lookup). 13316 NamedDecl *FirstQualifierInScope = nullptr; 13317 13318 return getDerived().RebuildUnresolvedMemberExpr( 13319 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13320 TemplateKWLoc, FirstQualifierInScope, R, 13321 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13322 } 13323 13324 template<typename Derived> 13325 ExprResult 13326 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13327 EnterExpressionEvaluationContext Unevaluated( 13328 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13329 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13330 if (SubExpr.isInvalid()) 13331 return ExprError(); 13332 13333 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13334 return E; 13335 13336 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13337 } 13338 13339 template<typename Derived> 13340 ExprResult 13341 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13342 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13343 if (Pattern.isInvalid()) 13344 return ExprError(); 13345 13346 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13347 return E; 13348 13349 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13350 E->getNumExpansions()); 13351 } 13352 13353 template<typename Derived> 13354 ExprResult 13355 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13356 // If E is not value-dependent, then nothing will change when we transform it. 13357 // Note: This is an instantiation-centric view. 13358 if (!E->isValueDependent()) 13359 return E; 13360 13361 EnterExpressionEvaluationContext Unevaluated( 13362 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13363 13364 ArrayRef<TemplateArgument> PackArgs; 13365 TemplateArgument ArgStorage; 13366 13367 // Find the argument list to transform. 13368 if (E->isPartiallySubstituted()) { 13369 PackArgs = E->getPartialArguments(); 13370 } else if (E->isValueDependent()) { 13371 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13372 bool ShouldExpand = false; 13373 bool RetainExpansion = false; 13374 Optional<unsigned> NumExpansions; 13375 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13376 Unexpanded, 13377 ShouldExpand, RetainExpansion, 13378 NumExpansions)) 13379 return ExprError(); 13380 13381 // If we need to expand the pack, build a template argument from it and 13382 // expand that. 13383 if (ShouldExpand) { 13384 auto *Pack = E->getPack(); 13385 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13386 ArgStorage = getSema().Context.getPackExpansionType( 13387 getSema().Context.getTypeDeclType(TTPD), None); 13388 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13389 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13390 } else { 13391 auto *VD = cast<ValueDecl>(Pack); 13392 ExprResult DRE = getSema().BuildDeclRefExpr( 13393 VD, VD->getType().getNonLValueExprType(getSema().Context), 13394 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 13395 E->getPackLoc()); 13396 if (DRE.isInvalid()) 13397 return ExprError(); 13398 ArgStorage = new (getSema().Context) PackExpansionExpr( 13399 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13400 } 13401 PackArgs = ArgStorage; 13402 } 13403 } 13404 13405 // If we're not expanding the pack, just transform the decl. 13406 if (!PackArgs.size()) { 13407 auto *Pack = cast_or_null<NamedDecl>( 13408 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13409 if (!Pack) 13410 return ExprError(); 13411 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13412 E->getPackLoc(), 13413 E->getRParenLoc(), None, None); 13414 } 13415 13416 // Try to compute the result without performing a partial substitution. 13417 Optional<unsigned> Result = 0; 13418 for (const TemplateArgument &Arg : PackArgs) { 13419 if (!Arg.isPackExpansion()) { 13420 Result = *Result + 1; 13421 continue; 13422 } 13423 13424 TemplateArgumentLoc ArgLoc; 13425 InventTemplateArgumentLoc(Arg, ArgLoc); 13426 13427 // Find the pattern of the pack expansion. 13428 SourceLocation Ellipsis; 13429 Optional<unsigned> OrigNumExpansions; 13430 TemplateArgumentLoc Pattern = 13431 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13432 OrigNumExpansions); 13433 13434 // Substitute under the pack expansion. Do not expand the pack (yet). 13435 TemplateArgumentLoc OutPattern; 13436 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13437 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13438 /*Uneval*/ true)) 13439 return true; 13440 13441 // See if we can determine the number of arguments from the result. 13442 Optional<unsigned> NumExpansions = 13443 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13444 if (!NumExpansions) { 13445 // No: we must be in an alias template expansion, and we're going to need 13446 // to actually expand the packs. 13447 Result = None; 13448 break; 13449 } 13450 13451 Result = *Result + *NumExpansions; 13452 } 13453 13454 // Common case: we could determine the number of expansions without 13455 // substituting. 13456 if (Result) 13457 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13458 E->getPackLoc(), 13459 E->getRParenLoc(), *Result, None); 13460 13461 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13462 E->getPackLoc()); 13463 { 13464 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13465 typedef TemplateArgumentLocInventIterator< 13466 Derived, const TemplateArgument*> PackLocIterator; 13467 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13468 PackLocIterator(*this, PackArgs.end()), 13469 TransformedPackArgs, /*Uneval*/true)) 13470 return ExprError(); 13471 } 13472 13473 // Check whether we managed to fully-expand the pack. 13474 // FIXME: Is it possible for us to do so and not hit the early exit path? 13475 SmallVector<TemplateArgument, 8> Args; 13476 bool PartialSubstitution = false; 13477 for (auto &Loc : TransformedPackArgs.arguments()) { 13478 Args.push_back(Loc.getArgument()); 13479 if (Loc.getArgument().isPackExpansion()) 13480 PartialSubstitution = true; 13481 } 13482 13483 if (PartialSubstitution) 13484 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13485 E->getPackLoc(), 13486 E->getRParenLoc(), None, Args); 13487 13488 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13489 E->getPackLoc(), E->getRParenLoc(), 13490 Args.size(), None); 13491 } 13492 13493 template<typename Derived> 13494 ExprResult 13495 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13496 SubstNonTypeTemplateParmPackExpr *E) { 13497 // Default behavior is to do nothing with this transformation. 13498 return E; 13499 } 13500 13501 template<typename Derived> 13502 ExprResult 13503 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13504 SubstNonTypeTemplateParmExpr *E) { 13505 // Default behavior is to do nothing with this transformation. 13506 return E; 13507 } 13508 13509 template<typename Derived> 13510 ExprResult 13511 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13512 // Default behavior is to do nothing with this transformation. 13513 return E; 13514 } 13515 13516 template<typename Derived> 13517 ExprResult 13518 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13519 MaterializeTemporaryExpr *E) { 13520 return getDerived().TransformExpr(E->getSubExpr()); 13521 } 13522 13523 template<typename Derived> 13524 ExprResult 13525 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13526 UnresolvedLookupExpr *Callee = nullptr; 13527 if (Expr *OldCallee = E->getCallee()) { 13528 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13529 if (CalleeResult.isInvalid()) 13530 return ExprError(); 13531 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13532 } 13533 13534 Expr *Pattern = E->getPattern(); 13535 13536 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13537 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13538 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13539 13540 // Determine whether the set of unexpanded parameter packs can and should 13541 // be expanded. 13542 bool Expand = true; 13543 bool RetainExpansion = false; 13544 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13545 NumExpansions = OrigNumExpansions; 13546 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13547 Pattern->getSourceRange(), 13548 Unexpanded, 13549 Expand, RetainExpansion, 13550 NumExpansions)) 13551 return true; 13552 13553 if (!Expand) { 13554 // Do not expand any packs here, just transform and rebuild a fold 13555 // expression. 13556 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13557 13558 ExprResult LHS = 13559 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13560 if (LHS.isInvalid()) 13561 return true; 13562 13563 ExprResult RHS = 13564 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13565 if (RHS.isInvalid()) 13566 return true; 13567 13568 if (!getDerived().AlwaysRebuild() && 13569 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13570 return E; 13571 13572 return getDerived().RebuildCXXFoldExpr( 13573 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13574 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13575 } 13576 13577 // Formally a fold expression expands to nested parenthesized expressions. 13578 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13579 // them. 13580 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13581 SemaRef.Diag(E->getEllipsisLoc(), 13582 clang::diag::err_fold_expression_limit_exceeded) 13583 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13584 << E->getSourceRange(); 13585 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13586 return ExprError(); 13587 } 13588 13589 // The transform has determined that we should perform an elementwise 13590 // expansion of the pattern. Do so. 13591 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13592 if (Result.isInvalid()) 13593 return true; 13594 bool LeftFold = E->isLeftFold(); 13595 13596 // If we're retaining an expansion for a right fold, it is the innermost 13597 // component and takes the init (if any). 13598 if (!LeftFold && RetainExpansion) { 13599 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13600 13601 ExprResult Out = getDerived().TransformExpr(Pattern); 13602 if (Out.isInvalid()) 13603 return true; 13604 13605 Result = getDerived().RebuildCXXFoldExpr( 13606 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13607 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13608 if (Result.isInvalid()) 13609 return true; 13610 } 13611 13612 for (unsigned I = 0; I != *NumExpansions; ++I) { 13613 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13614 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13615 ExprResult Out = getDerived().TransformExpr(Pattern); 13616 if (Out.isInvalid()) 13617 return true; 13618 13619 if (Out.get()->containsUnexpandedParameterPack()) { 13620 // We still have a pack; retain a pack expansion for this slice. 13621 Result = getDerived().RebuildCXXFoldExpr( 13622 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13623 E->getOperator(), E->getEllipsisLoc(), 13624 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13625 OrigNumExpansions); 13626 } else if (Result.isUsable()) { 13627 // We've got down to a single element; build a binary operator. 13628 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13629 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13630 if (Callee) 13631 Result = getDerived().RebuildCXXOperatorCallExpr( 13632 BinaryOperator::getOverloadedOperator(E->getOperator()), 13633 E->getEllipsisLoc(), Callee, LHS, RHS); 13634 else 13635 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13636 E->getOperator(), LHS, RHS); 13637 } else 13638 Result = Out; 13639 13640 if (Result.isInvalid()) 13641 return true; 13642 } 13643 13644 // If we're retaining an expansion for a left fold, it is the outermost 13645 // component and takes the complete expansion so far as its init (if any). 13646 if (LeftFold && RetainExpansion) { 13647 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13648 13649 ExprResult Out = getDerived().TransformExpr(Pattern); 13650 if (Out.isInvalid()) 13651 return true; 13652 13653 Result = getDerived().RebuildCXXFoldExpr( 13654 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13655 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13656 if (Result.isInvalid()) 13657 return true; 13658 } 13659 13660 // If we had no init and an empty pack, and we're not retaining an expansion, 13661 // then produce a fallback value or error. 13662 if (Result.isUnset()) 13663 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13664 E->getOperator()); 13665 13666 return Result; 13667 } 13668 13669 template<typename Derived> 13670 ExprResult 13671 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13672 CXXStdInitializerListExpr *E) { 13673 return getDerived().TransformExpr(E->getSubExpr()); 13674 } 13675 13676 template<typename Derived> 13677 ExprResult 13678 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13679 return SemaRef.MaybeBindToTemporary(E); 13680 } 13681 13682 template<typename Derived> 13683 ExprResult 13684 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13685 return E; 13686 } 13687 13688 template<typename Derived> 13689 ExprResult 13690 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13691 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13692 if (SubExpr.isInvalid()) 13693 return ExprError(); 13694 13695 if (!getDerived().AlwaysRebuild() && 13696 SubExpr.get() == E->getSubExpr()) 13697 return E; 13698 13699 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13700 } 13701 13702 template<typename Derived> 13703 ExprResult 13704 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13705 // Transform each of the elements. 13706 SmallVector<Expr *, 8> Elements; 13707 bool ArgChanged = false; 13708 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13709 /*IsCall=*/false, Elements, &ArgChanged)) 13710 return ExprError(); 13711 13712 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13713 return SemaRef.MaybeBindToTemporary(E); 13714 13715 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13716 Elements.data(), 13717 Elements.size()); 13718 } 13719 13720 template<typename Derived> 13721 ExprResult 13722 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13723 ObjCDictionaryLiteral *E) { 13724 // Transform each of the elements. 13725 SmallVector<ObjCDictionaryElement, 8> Elements; 13726 bool ArgChanged = false; 13727 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13728 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13729 13730 if (OrigElement.isPackExpansion()) { 13731 // This key/value element is a pack expansion. 13732 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13733 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13734 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13735 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13736 13737 // Determine whether the set of unexpanded parameter packs can 13738 // and should be expanded. 13739 bool Expand = true; 13740 bool RetainExpansion = false; 13741 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13742 Optional<unsigned> NumExpansions = OrigNumExpansions; 13743 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13744 OrigElement.Value->getEndLoc()); 13745 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13746 PatternRange, Unexpanded, Expand, 13747 RetainExpansion, NumExpansions)) 13748 return ExprError(); 13749 13750 if (!Expand) { 13751 // The transform has determined that we should perform a simple 13752 // transformation on the pack expansion, producing another pack 13753 // expansion. 13754 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13755 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13756 if (Key.isInvalid()) 13757 return ExprError(); 13758 13759 if (Key.get() != OrigElement.Key) 13760 ArgChanged = true; 13761 13762 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13763 if (Value.isInvalid()) 13764 return ExprError(); 13765 13766 if (Value.get() != OrigElement.Value) 13767 ArgChanged = true; 13768 13769 ObjCDictionaryElement Expansion = { 13770 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13771 }; 13772 Elements.push_back(Expansion); 13773 continue; 13774 } 13775 13776 // Record right away that the argument was changed. This needs 13777 // to happen even if the array expands to nothing. 13778 ArgChanged = true; 13779 13780 // The transform has determined that we should perform an elementwise 13781 // expansion of the pattern. Do so. 13782 for (unsigned I = 0; I != *NumExpansions; ++I) { 13783 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13784 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13785 if (Key.isInvalid()) 13786 return ExprError(); 13787 13788 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13789 if (Value.isInvalid()) 13790 return ExprError(); 13791 13792 ObjCDictionaryElement Element = { 13793 Key.get(), Value.get(), SourceLocation(), NumExpansions 13794 }; 13795 13796 // If any unexpanded parameter packs remain, we still have a 13797 // pack expansion. 13798 // FIXME: Can this really happen? 13799 if (Key.get()->containsUnexpandedParameterPack() || 13800 Value.get()->containsUnexpandedParameterPack()) 13801 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13802 13803 Elements.push_back(Element); 13804 } 13805 13806 // FIXME: Retain a pack expansion if RetainExpansion is true. 13807 13808 // We've finished with this pack expansion. 13809 continue; 13810 } 13811 13812 // Transform and check key. 13813 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13814 if (Key.isInvalid()) 13815 return ExprError(); 13816 13817 if (Key.get() != OrigElement.Key) 13818 ArgChanged = true; 13819 13820 // Transform and check value. 13821 ExprResult Value 13822 = getDerived().TransformExpr(OrigElement.Value); 13823 if (Value.isInvalid()) 13824 return ExprError(); 13825 13826 if (Value.get() != OrigElement.Value) 13827 ArgChanged = true; 13828 13829 ObjCDictionaryElement Element = { 13830 Key.get(), Value.get(), SourceLocation(), None 13831 }; 13832 Elements.push_back(Element); 13833 } 13834 13835 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13836 return SemaRef.MaybeBindToTemporary(E); 13837 13838 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13839 Elements); 13840 } 13841 13842 template<typename Derived> 13843 ExprResult 13844 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13845 TypeSourceInfo *EncodedTypeInfo 13846 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13847 if (!EncodedTypeInfo) 13848 return ExprError(); 13849 13850 if (!getDerived().AlwaysRebuild() && 13851 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13852 return E; 13853 13854 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13855 EncodedTypeInfo, 13856 E->getRParenLoc()); 13857 } 13858 13859 template<typename Derived> 13860 ExprResult TreeTransform<Derived>:: 13861 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13862 // This is a kind of implicit conversion, and it needs to get dropped 13863 // and recomputed for the same general reasons that ImplicitCastExprs 13864 // do, as well a more specific one: this expression is only valid when 13865 // it appears *immediately* as an argument expression. 13866 return getDerived().TransformExpr(E->getSubExpr()); 13867 } 13868 13869 template<typename Derived> 13870 ExprResult TreeTransform<Derived>:: 13871 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13872 TypeSourceInfo *TSInfo 13873 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13874 if (!TSInfo) 13875 return ExprError(); 13876 13877 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13878 if (Result.isInvalid()) 13879 return ExprError(); 13880 13881 if (!getDerived().AlwaysRebuild() && 13882 TSInfo == E->getTypeInfoAsWritten() && 13883 Result.get() == E->getSubExpr()) 13884 return E; 13885 13886 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13887 E->getBridgeKeywordLoc(), TSInfo, 13888 Result.get()); 13889 } 13890 13891 template <typename Derived> 13892 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13893 ObjCAvailabilityCheckExpr *E) { 13894 return E; 13895 } 13896 13897 template<typename Derived> 13898 ExprResult 13899 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13900 // Transform arguments. 13901 bool ArgChanged = false; 13902 SmallVector<Expr*, 8> Args; 13903 Args.reserve(E->getNumArgs()); 13904 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13905 &ArgChanged)) 13906 return ExprError(); 13907 13908 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13909 // Class message: transform the receiver type. 13910 TypeSourceInfo *ReceiverTypeInfo 13911 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13912 if (!ReceiverTypeInfo) 13913 return ExprError(); 13914 13915 // If nothing changed, just retain the existing message send. 13916 if (!getDerived().AlwaysRebuild() && 13917 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13918 return SemaRef.MaybeBindToTemporary(E); 13919 13920 // Build a new class message send. 13921 SmallVector<SourceLocation, 16> SelLocs; 13922 E->getSelectorLocs(SelLocs); 13923 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13924 E->getSelector(), 13925 SelLocs, 13926 E->getMethodDecl(), 13927 E->getLeftLoc(), 13928 Args, 13929 E->getRightLoc()); 13930 } 13931 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13932 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13933 if (!E->getMethodDecl()) 13934 return ExprError(); 13935 13936 // Build a new class message send to 'super'. 13937 SmallVector<SourceLocation, 16> SelLocs; 13938 E->getSelectorLocs(SelLocs); 13939 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13940 E->getSelector(), 13941 SelLocs, 13942 E->getReceiverType(), 13943 E->getMethodDecl(), 13944 E->getLeftLoc(), 13945 Args, 13946 E->getRightLoc()); 13947 } 13948 13949 // Instance message: transform the receiver 13950 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13951 "Only class and instance messages may be instantiated"); 13952 ExprResult Receiver 13953 = getDerived().TransformExpr(E->getInstanceReceiver()); 13954 if (Receiver.isInvalid()) 13955 return ExprError(); 13956 13957 // If nothing changed, just retain the existing message send. 13958 if (!getDerived().AlwaysRebuild() && 13959 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13960 return SemaRef.MaybeBindToTemporary(E); 13961 13962 // Build a new instance message send. 13963 SmallVector<SourceLocation, 16> SelLocs; 13964 E->getSelectorLocs(SelLocs); 13965 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13966 E->getSelector(), 13967 SelLocs, 13968 E->getMethodDecl(), 13969 E->getLeftLoc(), 13970 Args, 13971 E->getRightLoc()); 13972 } 13973 13974 template<typename Derived> 13975 ExprResult 13976 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13977 return E; 13978 } 13979 13980 template<typename Derived> 13981 ExprResult 13982 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13983 return E; 13984 } 13985 13986 template<typename Derived> 13987 ExprResult 13988 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13989 // Transform the base expression. 13990 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13991 if (Base.isInvalid()) 13992 return ExprError(); 13993 13994 // We don't need to transform the ivar; it will never change. 13995 13996 // If nothing changed, just retain the existing expression. 13997 if (!getDerived().AlwaysRebuild() && 13998 Base.get() == E->getBase()) 13999 return E; 14000 14001 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14002 E->getLocation(), 14003 E->isArrow(), E->isFreeIvar()); 14004 } 14005 14006 template<typename Derived> 14007 ExprResult 14008 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14009 // 'super' and types never change. Property never changes. Just 14010 // retain the existing expression. 14011 if (!E->isObjectReceiver()) 14012 return E; 14013 14014 // Transform the base expression. 14015 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14016 if (Base.isInvalid()) 14017 return ExprError(); 14018 14019 // We don't need to transform the property; it will never change. 14020 14021 // If nothing changed, just retain the existing expression. 14022 if (!getDerived().AlwaysRebuild() && 14023 Base.get() == E->getBase()) 14024 return E; 14025 14026 if (E->isExplicitProperty()) 14027 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14028 E->getExplicitProperty(), 14029 E->getLocation()); 14030 14031 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14032 SemaRef.Context.PseudoObjectTy, 14033 E->getImplicitPropertyGetter(), 14034 E->getImplicitPropertySetter(), 14035 E->getLocation()); 14036 } 14037 14038 template<typename Derived> 14039 ExprResult 14040 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14041 // Transform the base expression. 14042 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14043 if (Base.isInvalid()) 14044 return ExprError(); 14045 14046 // Transform the key expression. 14047 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14048 if (Key.isInvalid()) 14049 return ExprError(); 14050 14051 // If nothing changed, just retain the existing expression. 14052 if (!getDerived().AlwaysRebuild() && 14053 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14054 return E; 14055 14056 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14057 Base.get(), Key.get(), 14058 E->getAtIndexMethodDecl(), 14059 E->setAtIndexMethodDecl()); 14060 } 14061 14062 template<typename Derived> 14063 ExprResult 14064 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14065 // Transform the base expression. 14066 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14067 if (Base.isInvalid()) 14068 return ExprError(); 14069 14070 // If nothing changed, just retain the existing expression. 14071 if (!getDerived().AlwaysRebuild() && 14072 Base.get() == E->getBase()) 14073 return E; 14074 14075 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14076 E->getOpLoc(), 14077 E->isArrow()); 14078 } 14079 14080 template<typename Derived> 14081 ExprResult 14082 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14083 bool ArgumentChanged = false; 14084 SmallVector<Expr*, 8> SubExprs; 14085 SubExprs.reserve(E->getNumSubExprs()); 14086 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14087 SubExprs, &ArgumentChanged)) 14088 return ExprError(); 14089 14090 if (!getDerived().AlwaysRebuild() && 14091 !ArgumentChanged) 14092 return E; 14093 14094 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14095 SubExprs, 14096 E->getRParenLoc()); 14097 } 14098 14099 template<typename Derived> 14100 ExprResult 14101 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14102 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14103 if (SrcExpr.isInvalid()) 14104 return ExprError(); 14105 14106 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14107 if (!Type) 14108 return ExprError(); 14109 14110 if (!getDerived().AlwaysRebuild() && 14111 Type == E->getTypeSourceInfo() && 14112 SrcExpr.get() == E->getSrcExpr()) 14113 return E; 14114 14115 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14116 SrcExpr.get(), Type, 14117 E->getRParenLoc()); 14118 } 14119 14120 template<typename Derived> 14121 ExprResult 14122 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14123 BlockDecl *oldBlock = E->getBlockDecl(); 14124 14125 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14126 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14127 14128 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14129 blockScope->TheDecl->setBlockMissingReturnType( 14130 oldBlock->blockMissingReturnType()); 14131 14132 SmallVector<ParmVarDecl*, 4> params; 14133 SmallVector<QualType, 4> paramTypes; 14134 14135 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14136 14137 // Parameter substitution. 14138 Sema::ExtParameterInfoBuilder extParamInfos; 14139 if (getDerived().TransformFunctionTypeParams( 14140 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14141 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14142 extParamInfos)) { 14143 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14144 return ExprError(); 14145 } 14146 14147 QualType exprResultType = 14148 getDerived().TransformType(exprFunctionType->getReturnType()); 14149 14150 auto epi = exprFunctionType->getExtProtoInfo(); 14151 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14152 14153 QualType functionType = 14154 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14155 blockScope->FunctionType = functionType; 14156 14157 // Set the parameters on the block decl. 14158 if (!params.empty()) 14159 blockScope->TheDecl->setParams(params); 14160 14161 if (!oldBlock->blockMissingReturnType()) { 14162 blockScope->HasImplicitReturnType = false; 14163 blockScope->ReturnType = exprResultType; 14164 } 14165 14166 // Transform the body 14167 StmtResult body = getDerived().TransformStmt(E->getBody()); 14168 if (body.isInvalid()) { 14169 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14170 return ExprError(); 14171 } 14172 14173 #ifndef NDEBUG 14174 // In builds with assertions, make sure that we captured everything we 14175 // captured before. 14176 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14177 for (const auto &I : oldBlock->captures()) { 14178 VarDecl *oldCapture = I.getVariable(); 14179 14180 // Ignore parameter packs. 14181 if (oldCapture->isParameterPack()) 14182 continue; 14183 14184 VarDecl *newCapture = 14185 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14186 oldCapture)); 14187 assert(blockScope->CaptureMap.count(newCapture)); 14188 } 14189 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14190 } 14191 #endif 14192 14193 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14194 /*Scope=*/nullptr); 14195 } 14196 14197 template<typename Derived> 14198 ExprResult 14199 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14200 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14201 if (SrcExpr.isInvalid()) 14202 return ExprError(); 14203 14204 QualType Type = getDerived().TransformType(E->getType()); 14205 14206 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14207 E->getRParenLoc()); 14208 } 14209 14210 template<typename Derived> 14211 ExprResult 14212 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14213 bool ArgumentChanged = false; 14214 SmallVector<Expr*, 8> SubExprs; 14215 SubExprs.reserve(E->getNumSubExprs()); 14216 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14217 SubExprs, &ArgumentChanged)) 14218 return ExprError(); 14219 14220 if (!getDerived().AlwaysRebuild() && 14221 !ArgumentChanged) 14222 return E; 14223 14224 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14225 E->getOp(), E->getRParenLoc()); 14226 } 14227 14228 //===----------------------------------------------------------------------===// 14229 // Type reconstruction 14230 //===----------------------------------------------------------------------===// 14231 14232 template<typename Derived> 14233 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14234 SourceLocation Star) { 14235 return SemaRef.BuildPointerType(PointeeType, Star, 14236 getDerived().getBaseEntity()); 14237 } 14238 14239 template<typename Derived> 14240 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14241 SourceLocation Star) { 14242 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14243 getDerived().getBaseEntity()); 14244 } 14245 14246 template<typename Derived> 14247 QualType 14248 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14249 bool WrittenAsLValue, 14250 SourceLocation Sigil) { 14251 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14252 Sigil, getDerived().getBaseEntity()); 14253 } 14254 14255 template<typename Derived> 14256 QualType 14257 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14258 QualType ClassType, 14259 SourceLocation Sigil) { 14260 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14261 getDerived().getBaseEntity()); 14262 } 14263 14264 template<typename Derived> 14265 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14266 const ObjCTypeParamDecl *Decl, 14267 SourceLocation ProtocolLAngleLoc, 14268 ArrayRef<ObjCProtocolDecl *> Protocols, 14269 ArrayRef<SourceLocation> ProtocolLocs, 14270 SourceLocation ProtocolRAngleLoc) { 14271 return SemaRef.BuildObjCTypeParamType(Decl, 14272 ProtocolLAngleLoc, Protocols, 14273 ProtocolLocs, ProtocolRAngleLoc, 14274 /*FailOnError=*/true); 14275 } 14276 14277 template<typename Derived> 14278 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14279 QualType BaseType, 14280 SourceLocation Loc, 14281 SourceLocation TypeArgsLAngleLoc, 14282 ArrayRef<TypeSourceInfo *> TypeArgs, 14283 SourceLocation TypeArgsRAngleLoc, 14284 SourceLocation ProtocolLAngleLoc, 14285 ArrayRef<ObjCProtocolDecl *> Protocols, 14286 ArrayRef<SourceLocation> ProtocolLocs, 14287 SourceLocation ProtocolRAngleLoc) { 14288 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14289 TypeArgs, TypeArgsRAngleLoc, 14290 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14291 ProtocolRAngleLoc, 14292 /*FailOnError=*/true); 14293 } 14294 14295 template<typename Derived> 14296 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14297 QualType PointeeType, 14298 SourceLocation Star) { 14299 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14300 } 14301 14302 template<typename Derived> 14303 QualType 14304 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14305 ArrayType::ArraySizeModifier SizeMod, 14306 const llvm::APInt *Size, 14307 Expr *SizeExpr, 14308 unsigned IndexTypeQuals, 14309 SourceRange BracketsRange) { 14310 if (SizeExpr || !Size) 14311 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14312 IndexTypeQuals, BracketsRange, 14313 getDerived().getBaseEntity()); 14314 14315 QualType Types[] = { 14316 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14317 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14318 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14319 }; 14320 const unsigned NumTypes = llvm::array_lengthof(Types); 14321 QualType SizeType; 14322 for (unsigned I = 0; I != NumTypes; ++I) 14323 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14324 SizeType = Types[I]; 14325 break; 14326 } 14327 14328 // Note that we can return a VariableArrayType here in the case where 14329 // the element type was a dependent VariableArrayType. 14330 IntegerLiteral *ArraySize 14331 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14332 /*FIXME*/BracketsRange.getBegin()); 14333 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14334 IndexTypeQuals, BracketsRange, 14335 getDerived().getBaseEntity()); 14336 } 14337 14338 template<typename Derived> 14339 QualType 14340 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14341 ArrayType::ArraySizeModifier SizeMod, 14342 const llvm::APInt &Size, 14343 Expr *SizeExpr, 14344 unsigned IndexTypeQuals, 14345 SourceRange BracketsRange) { 14346 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14347 IndexTypeQuals, BracketsRange); 14348 } 14349 14350 template<typename Derived> 14351 QualType 14352 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14353 ArrayType::ArraySizeModifier SizeMod, 14354 unsigned IndexTypeQuals, 14355 SourceRange BracketsRange) { 14356 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14357 IndexTypeQuals, BracketsRange); 14358 } 14359 14360 template<typename Derived> 14361 QualType 14362 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14363 ArrayType::ArraySizeModifier SizeMod, 14364 Expr *SizeExpr, 14365 unsigned IndexTypeQuals, 14366 SourceRange BracketsRange) { 14367 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14368 SizeExpr, 14369 IndexTypeQuals, BracketsRange); 14370 } 14371 14372 template<typename Derived> 14373 QualType 14374 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14375 ArrayType::ArraySizeModifier SizeMod, 14376 Expr *SizeExpr, 14377 unsigned IndexTypeQuals, 14378 SourceRange BracketsRange) { 14379 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14380 SizeExpr, 14381 IndexTypeQuals, BracketsRange); 14382 } 14383 14384 template <typename Derived> 14385 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14386 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14387 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14388 AttributeLoc); 14389 } 14390 14391 template <typename Derived> 14392 QualType 14393 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14394 unsigned NumElements, 14395 VectorType::VectorKind VecKind) { 14396 // FIXME: semantic checking! 14397 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14398 } 14399 14400 template <typename Derived> 14401 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14402 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14403 VectorType::VectorKind VecKind) { 14404 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14405 } 14406 14407 template<typename Derived> 14408 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14409 unsigned NumElements, 14410 SourceLocation AttributeLoc) { 14411 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14412 NumElements, true); 14413 IntegerLiteral *VectorSize 14414 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14415 AttributeLoc); 14416 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14417 } 14418 14419 template<typename Derived> 14420 QualType 14421 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14422 Expr *SizeExpr, 14423 SourceLocation AttributeLoc) { 14424 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14425 } 14426 14427 template <typename Derived> 14428 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14429 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14430 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14431 NumColumns); 14432 } 14433 14434 template <typename Derived> 14435 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14436 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14437 SourceLocation AttributeLoc) { 14438 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14439 AttributeLoc); 14440 } 14441 14442 template<typename Derived> 14443 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14444 QualType T, 14445 MutableArrayRef<QualType> ParamTypes, 14446 const FunctionProtoType::ExtProtoInfo &EPI) { 14447 return SemaRef.BuildFunctionType(T, ParamTypes, 14448 getDerived().getBaseLocation(), 14449 getDerived().getBaseEntity(), 14450 EPI); 14451 } 14452 14453 template<typename Derived> 14454 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14455 return SemaRef.Context.getFunctionNoProtoType(T); 14456 } 14457 14458 template<typename Derived> 14459 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14460 Decl *D) { 14461 assert(D && "no decl found"); 14462 if (D->isInvalidDecl()) return QualType(); 14463 14464 // FIXME: Doesn't account for ObjCInterfaceDecl! 14465 TypeDecl *Ty; 14466 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14467 // A valid resolved using typename pack expansion decl can have multiple 14468 // UsingDecls, but they must each have exactly one type, and it must be 14469 // the same type in every case. But we must have at least one expansion! 14470 if (UPD->expansions().empty()) { 14471 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14472 << UPD->isCXXClassMember() << UPD; 14473 return QualType(); 14474 } 14475 14476 // We might still have some unresolved types. Try to pick a resolved type 14477 // if we can. The final instantiation will check that the remaining 14478 // unresolved types instantiate to the type we pick. 14479 QualType FallbackT; 14480 QualType T; 14481 for (auto *E : UPD->expansions()) { 14482 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14483 if (ThisT.isNull()) 14484 continue; 14485 else if (ThisT->getAs<UnresolvedUsingType>()) 14486 FallbackT = ThisT; 14487 else if (T.isNull()) 14488 T = ThisT; 14489 else 14490 assert(getSema().Context.hasSameType(ThisT, T) && 14491 "mismatched resolved types in using pack expansion"); 14492 } 14493 return T.isNull() ? FallbackT : T; 14494 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14495 assert(Using->hasTypename() && 14496 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14497 14498 // A valid resolved using typename decl points to exactly one type decl. 14499 assert(++Using->shadow_begin() == Using->shadow_end()); 14500 14501 NamedDecl *Target = Using->shadow_begin()->getTargetDecl(); 14502 if (SemaRef.DiagnoseUseOfDecl(Target, Loc)) 14503 return QualType(); 14504 Ty = cast<TypeDecl>(Target); 14505 } else { 14506 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14507 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14508 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14509 } 14510 14511 return SemaRef.Context.getTypeDeclType(Ty); 14512 } 14513 14514 template <typename Derived> 14515 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14516 SourceLocation) { 14517 return SemaRef.BuildTypeofExprType(E); 14518 } 14519 14520 template<typename Derived> 14521 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14522 return SemaRef.Context.getTypeOfType(Underlying); 14523 } 14524 14525 template <typename Derived> 14526 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 14527 return SemaRef.BuildDecltypeType(E); 14528 } 14529 14530 template<typename Derived> 14531 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14532 UnaryTransformType::UTTKind UKind, 14533 SourceLocation Loc) { 14534 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14535 } 14536 14537 template<typename Derived> 14538 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14539 TemplateName Template, 14540 SourceLocation TemplateNameLoc, 14541 TemplateArgumentListInfo &TemplateArgs) { 14542 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14543 } 14544 14545 template<typename Derived> 14546 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14547 SourceLocation KWLoc) { 14548 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14549 } 14550 14551 template<typename Derived> 14552 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14553 SourceLocation KWLoc, 14554 bool isReadPipe) { 14555 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14556 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14557 } 14558 14559 template <typename Derived> 14560 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14561 unsigned NumBits, 14562 SourceLocation Loc) { 14563 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14564 NumBits, true); 14565 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14566 SemaRef.Context.IntTy, Loc); 14567 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14568 } 14569 14570 template <typename Derived> 14571 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14572 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14573 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14574 } 14575 14576 template<typename Derived> 14577 TemplateName 14578 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14579 bool TemplateKW, 14580 TemplateDecl *Template) { 14581 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14582 Template); 14583 } 14584 14585 template<typename Derived> 14586 TemplateName 14587 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14588 SourceLocation TemplateKWLoc, 14589 const IdentifierInfo &Name, 14590 SourceLocation NameLoc, 14591 QualType ObjectType, 14592 NamedDecl *FirstQualifierInScope, 14593 bool AllowInjectedClassName) { 14594 UnqualifiedId TemplateName; 14595 TemplateName.setIdentifier(&Name, NameLoc); 14596 Sema::TemplateTy Template; 14597 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14598 TemplateName, ParsedType::make(ObjectType), 14599 /*EnteringContext=*/false, Template, 14600 AllowInjectedClassName); 14601 return Template.get(); 14602 } 14603 14604 template<typename Derived> 14605 TemplateName 14606 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14607 SourceLocation TemplateKWLoc, 14608 OverloadedOperatorKind Operator, 14609 SourceLocation NameLoc, 14610 QualType ObjectType, 14611 bool AllowInjectedClassName) { 14612 UnqualifiedId Name; 14613 // FIXME: Bogus location information. 14614 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14615 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14616 Sema::TemplateTy Template; 14617 getSema().ActOnTemplateName( 14618 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14619 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14620 return Template.get(); 14621 } 14622 14623 template<typename Derived> 14624 ExprResult 14625 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14626 SourceLocation OpLoc, 14627 Expr *OrigCallee, 14628 Expr *First, 14629 Expr *Second) { 14630 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14631 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14632 14633 if (First->getObjectKind() == OK_ObjCProperty) { 14634 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14635 if (BinaryOperator::isAssignmentOp(Opc)) 14636 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14637 First, Second); 14638 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14639 if (Result.isInvalid()) 14640 return ExprError(); 14641 First = Result.get(); 14642 } 14643 14644 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14645 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14646 if (Result.isInvalid()) 14647 return ExprError(); 14648 Second = Result.get(); 14649 } 14650 14651 // Determine whether this should be a builtin operation. 14652 if (Op == OO_Subscript) { 14653 if (!First->getType()->isOverloadableType() && 14654 !Second->getType()->isOverloadableType()) 14655 return getSema().CreateBuiltinArraySubscriptExpr( 14656 First, Callee->getBeginLoc(), Second, OpLoc); 14657 } else if (Op == OO_Arrow) { 14658 // -> is never a builtin operation. 14659 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14660 } else if (Second == nullptr || isPostIncDec) { 14661 if (!First->getType()->isOverloadableType() || 14662 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14663 // The argument is not of overloadable type, or this is an expression 14664 // of the form &Class::member, so try to create a built-in unary 14665 // operation. 14666 UnaryOperatorKind Opc 14667 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14668 14669 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14670 } 14671 } else { 14672 if (!First->getType()->isOverloadableType() && 14673 !Second->getType()->isOverloadableType()) { 14674 // Neither of the arguments is an overloadable type, so try to 14675 // create a built-in binary operation. 14676 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14677 ExprResult Result 14678 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14679 if (Result.isInvalid()) 14680 return ExprError(); 14681 14682 return Result; 14683 } 14684 } 14685 14686 // Compute the transformed set of functions (and function templates) to be 14687 // used during overload resolution. 14688 UnresolvedSet<16> Functions; 14689 bool RequiresADL; 14690 14691 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14692 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14693 // If the overload could not be resolved in the template definition 14694 // (because we had a dependent argument), ADL is performed as part of 14695 // template instantiation. 14696 RequiresADL = ULE->requiresADL(); 14697 } else { 14698 // If we've resolved this to a particular non-member function, just call 14699 // that function. If we resolved it to a member function, 14700 // CreateOverloaded* will find that function for us. 14701 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14702 if (!isa<CXXMethodDecl>(ND)) 14703 Functions.addDecl(ND); 14704 RequiresADL = false; 14705 } 14706 14707 // Add any functions found via argument-dependent lookup. 14708 Expr *Args[2] = { First, Second }; 14709 unsigned NumArgs = 1 + (Second != nullptr); 14710 14711 // Create the overloaded operator invocation for unary operators. 14712 if (NumArgs == 1 || isPostIncDec) { 14713 UnaryOperatorKind Opc 14714 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14715 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14716 RequiresADL); 14717 } 14718 14719 if (Op == OO_Subscript) { 14720 SourceLocation LBrace; 14721 SourceLocation RBrace; 14722 14723 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14724 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14725 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14726 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14727 } else { 14728 LBrace = Callee->getBeginLoc(); 14729 RBrace = OpLoc; 14730 } 14731 14732 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14733 First, Second); 14734 } 14735 14736 // Create the overloaded operator invocation for binary operators. 14737 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14738 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14739 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14740 if (Result.isInvalid()) 14741 return ExprError(); 14742 14743 return Result; 14744 } 14745 14746 template<typename Derived> 14747 ExprResult 14748 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14749 SourceLocation OperatorLoc, 14750 bool isArrow, 14751 CXXScopeSpec &SS, 14752 TypeSourceInfo *ScopeType, 14753 SourceLocation CCLoc, 14754 SourceLocation TildeLoc, 14755 PseudoDestructorTypeStorage Destroyed) { 14756 QualType BaseType = Base->getType(); 14757 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14758 (!isArrow && !BaseType->getAs<RecordType>()) || 14759 (isArrow && BaseType->getAs<PointerType>() && 14760 !BaseType->castAs<PointerType>()->getPointeeType() 14761 ->template getAs<RecordType>())){ 14762 // This pseudo-destructor expression is still a pseudo-destructor. 14763 return SemaRef.BuildPseudoDestructorExpr( 14764 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14765 CCLoc, TildeLoc, Destroyed); 14766 } 14767 14768 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14769 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14770 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14771 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14772 NameInfo.setNamedTypeInfo(DestroyedType); 14773 14774 // The scope type is now known to be a valid nested name specifier 14775 // component. Tack it on to the end of the nested name specifier. 14776 if (ScopeType) { 14777 if (!ScopeType->getType()->getAs<TagType>()) { 14778 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14779 diag::err_expected_class_or_namespace) 14780 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14781 return ExprError(); 14782 } 14783 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14784 CCLoc); 14785 } 14786 14787 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14788 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14789 OperatorLoc, isArrow, 14790 SS, TemplateKWLoc, 14791 /*FIXME: FirstQualifier*/ nullptr, 14792 NameInfo, 14793 /*TemplateArgs*/ nullptr, 14794 /*S*/nullptr); 14795 } 14796 14797 template<typename Derived> 14798 StmtResult 14799 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14800 SourceLocation Loc = S->getBeginLoc(); 14801 CapturedDecl *CD = S->getCapturedDecl(); 14802 unsigned NumParams = CD->getNumParams(); 14803 unsigned ContextParamPos = CD->getContextParamPosition(); 14804 SmallVector<Sema::CapturedParamNameType, 4> Params; 14805 for (unsigned I = 0; I < NumParams; ++I) { 14806 if (I != ContextParamPos) { 14807 Params.push_back( 14808 std::make_pair( 14809 CD->getParam(I)->getName(), 14810 getDerived().TransformType(CD->getParam(I)->getType()))); 14811 } else { 14812 Params.push_back(std::make_pair(StringRef(), QualType())); 14813 } 14814 } 14815 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14816 S->getCapturedRegionKind(), Params); 14817 StmtResult Body; 14818 { 14819 Sema::CompoundScopeRAII CompoundScope(getSema()); 14820 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14821 } 14822 14823 if (Body.isInvalid()) { 14824 getSema().ActOnCapturedRegionError(); 14825 return StmtError(); 14826 } 14827 14828 return getSema().ActOnCapturedRegionEnd(Body.get()); 14829 } 14830 14831 } // end namespace clang 14832 14833 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14834